X-Git-Url: http://git.roojs.org/?p=Pman.Core;a=blobdiff_plain;f=Images.php;h=bfda2826ca553b7843eda775815488e85a9443ac;hp=bc1dc0faba5213873ca3f6b8c5056906cf053041;hb=HEAD;hpb=cb376a6a29e629db850e4168266862740277dabf
diff --git a/Images.php b/Images.php
index bc1dc0fa..bcedb003 100644
--- a/Images.php
+++ b/Images.php
@@ -42,7 +42,9 @@ class Pman_Core_Images extends Pman
{
// tables that do not need authentication checks before serving.
- var $public_image_tables = array();
+ var $public_image_tables = array(
+ 'crm_mailing_list_message' // we know these are ok...
+ );
var $sizes = array(
'100',
@@ -75,6 +77,9 @@ class Pman_Core_Images extends Pman
var $as_mimetype = false;
var $method = 'inline';
var $page = false;
+ var $is_local = false;
+ var $size;
+
function get($s, $opts=array()) // determin what to serve!!!!
{
@@ -82,6 +87,10 @@ class Pman_Core_Images extends Pman
//if (!empty($_GET['_post'])) {
// return $this->post();
//}
+
+
+
+ $this->is_local = (!empty($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == 'localhost') ? true : false;
$this->as_mimetype = empty($_REQUEST['as']) ? '' : $_REQUEST['as'];
@@ -121,7 +130,7 @@ class Pman_Core_Images extends Pman
}
if (strpos($id,':') > 0) { // id format tablename:id:-imgtype
-
+ //DB_DataObject::debugLevel(1);
if (!$this->authUser) {
$this->imgErr("not-authenticated-using-colon-format",$s);
@@ -176,16 +185,19 @@ class Pman_Core_Images extends Pman
}
-
-
$img = DB_DataObjecT::factory('Images');
- if (!$id || !$img->get($id)) {
+ if (!$id || !$img->get($id) || !$img->exists()) {
+ //print_r($img); die("HERE");
$this->imgErr("image has been removed or deleted.",$s);
}
+ if($this->is_local) {
+ return $this->serve($img);
+ }
+
if (!$this->authUser && !in_array($img->ontable,$this->public_image_tables)) {
-
+
if ($img->ontable != 'core_company') {
$this->imgErr("not-authenticated {$img->ontable}",$s);
}
@@ -196,15 +208,13 @@ class Pman_Core_Images extends Pman
if ($comp->comptype != 'OWNER') {
$this->imgErr("not-owner-company",$s);
}
+
return $this->serve($img);
-
}
-
if(!$this->hasPermission($img)){
$this->imgErr("access to this image/file has been denied.",$s);
-
}
$this->serve($img);
@@ -212,8 +222,9 @@ class Pman_Core_Images extends Pman
}
function imgErr($reason,$path) {
- header('Location: ' . $this->rootURL . '/Pman/templates/images/file-broken.png?reason=' .
- urlencode($reason) .'&path='.urlencode($path));
+ header('Location: ' . $this->rootURL . '/Pman/templates/images/file-broken.png?reason=' . urlencode($reason) );
+ header('X-Error: ' . $reason . ':' . $path);
+ echo $reason . ':' . $path;
exit;
}
@@ -224,6 +235,9 @@ class Pman_Core_Images extends Pman
function post($v)
{
+ if (!empty($_REQUEST['_get'])) {
+ return $this->get($v);
+ }
if (!$this->authUser) {
$this->jerr("image conversion only allowed by registered users");
@@ -274,23 +288,27 @@ class Pman_Core_Images extends Pman
function serve($img)
{
- $this->sessionState(0); // turn off session... - locking...
+ $this->sessionState(0); // turn off session... - locking...
require_once 'File/Convert.php';
- if (!file_exists($img->getStoreName())) {
-// print_r($img);exit;
- header('Location: ' . $this->rootURL . '/Pman/templates/images/file-broken.png?reason=' .
- urlencode("Original file was missing : " . $img->getStoreName()));
-
+ if (!$img->exists()) {
+ $this->imgErr("serve = missing-image", $img->getStoreName());
+
}
// print_r($img);exit;
$x = $img->toFileConvert();
if (empty($this->as_mimetype) || $img->mimetype == 'image/gif') {
$this->as_mimetype = $img->mimetype;
}
+
+
if (!$this->thumb) {
+ if ($x->mimetype == $this->as_mimetype) {
+ $x->serveOnly($this->method, $img->filename);
+ exit;
+ }
$x->convert( $this->as_mimetype);
- $x->serve($this->method);
+ $x->serve($this->method, $img->filename);
exit;
}
//echo "SKALING? $this->size";
@@ -315,6 +333,7 @@ class Pman_Core_Images extends Pman
if (!file_exists($fn)) {
$this->validateSize();
}
+
if(!empty($this->page) && !is_nan($this->page * 1)){
$x->convert( $this->as_mimetype, $this->size, 0, $this->page);
@@ -331,6 +350,10 @@ class Pman_Core_Images extends Pman
}
function validateSize()
{
+ if($this->is_local) {
+ return true;
+ }
+
if (($this->authUser && !empty($this->authUser->company_id) && $this->authUser->company()->comptype=='OWNER')
|| $_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']) {
return true;
@@ -382,7 +405,7 @@ class Pman_Core_Images extends Pman
*/
- static function replaceImageURLS($html)
+ static function replaceImageURLS($html, $obj = false)
{
$ff = HTML_FlexyFramework::get();
@@ -392,61 +415,142 @@ class Pman_Core_Images extends Pman
//var_dump($ff->Pman_Images['public_baseURL']);
$baseURL = $ff->Pman_Images['public_baseURL'];
- preg_match_all('/]+>/i',$html, $result);
- //print_r($result);
- $matches = array_unique($result[0]);
- foreach($matches as $img) {
- $imatch = array();
- preg_match_all('/(width|height|src)="([^"]*)"/i',$img, $imatch);
- // build a keymap
- $attr = array();
-
- foreach($imatch[1] as $i=>$key) {
- $attr[$key] = $imatch[2][$i];
- }
- // does it contain baseURL??? --- well what about relative paths...
- //print_R($attr);
-
- if (empty($attr['src'])) {
+ libxml_use_internal_errors(true);
+ $dom = new DOMDocument();
+ $dom->loadHTML("
{$html}
");
+ $imgs = $dom->getElementsByTagName('img');
+
+
+ foreach($imgs as $img) {
+ $src = $img->getAttribute('src');
+ if (!$src|| !strlen(trim($src))) {
continue;
}
- if (0 !== strpos($attr['src'], $baseURL)) {
- // it starts with our 'new' baseURL?
- $html = self::replaceImgUrl($html, $baseURL, $img, $attr, 'src' );
+
+ if (0 === strpos($src, 'data:')) {
+ if (!$obj) {
+ HTML_FlexyFramework::get()->page->jerr("no object to attach data url");
+ }
+
+ self::replaceDataUrl($baseURL, $img, $obj);
continue;
}
- if (false !== strpos($attr['src'], '//') && false === strpos($attr['src'], $baseURL)) {
- // contains an absolute path.. that is probably not us...
+
+
+ if (false !== strpos($src, '//') && false === strpos($src, $baseURL)) {
+ // contains an absolute path.. and not our baseURL.
continue;
}
+
+ $img->setAttribute('src', self::domImgUrl($baseURL, $img));
+
// what about mailto or data... - just ignore?? for images...
- $html = self::replaceImgUrl($html, $baseURL, $img, $attr, 'src' );
}
-
+ $anchors = $dom->getElementsByTagName('a');
$result = array();
preg_match_all('/]+>/i',$html, $result);
$matches = array_unique($result[0]);
- foreach($matches as $img) {
- $imatch = array();
- preg_match_all('/(href)="([^"]*)"/i',$img, $imatch);
- // build a keymap
- $attr = array();
-
- foreach($imatch[1] as $i=>$key) {
- $attr[$key] = $imatch[2][$i];
- }
- if (!isset($attr['href']) || 0 !== strpos($attr['href'], $baseURL)) {
+ foreach($anchors as $anc) {
+ $href = $anc->getAttribute('href');
+ if (!empty($href) || 0 !== strpos($href, $baseURL)) {
continue;
}
- $html = self::replaceImgUrl($html, $baseURL, $img, $attr, 'href' );
+ $anc->setAttribute('href', self::domImgUrl($baseURL, $href));
}
+
+ $inner = $dom->getElementById("tmp_dom_wrapper");
+ $html = '';
+ foreach ($inner->childNodes as $child) {
+ $html .= ($dom->saveHTML($child));
+ }
return $html;
}
+
+ static function domImgUrl($baseURL, $dom)
+ {
+ $url = $dom;
+ if (!is_string($url)) {
+ $url = $dom->getAttribute('src');
+ }
+ $umatch = false;
+ if(!preg_match('#/(Images|Images/Thumb/[a-z0-9]+|Images/Download)/([0-9]+)/(.*)$#', $url, $umatch)) {
+ return $url;
+ }
+ $id = $umatch[2];
+ $hash = '';
+
+ if (!empty($umatch[3]) && strpos($umatch[3],'#')) {
+ $hh = explode('#',$umatch[3]);
+ $hash = '#'. array_pop($hh);
+ }
+
+
+ $img = DB_DataObject::factory('Images');
+ if (!$img->get($id)) {
+ return $url;
+ }
+ $type = explode('/', $umatch[1]);
+ $thumbsize = -1;
+
+ if (count($type) > 2 && $type[1] == 'Thumb') {
+ $thumbsize = $type[2];
+ $provider = '/Images/Thumb';
+ } else {
+ $provider = '/'.$umatch[1];
+ }
+
+ $w = is_string($dom) ? false : $dom->getAttribute('width');
+ $h = is_string($dom) ? false : $dom->getAttribute('height');
+
+ if (!is_string($dom) && (!empty($w) || !empty($h) ) && is_numeric($w) && is_numeric($h))
+ {
+ // no support for %...
+ $thumbsize =
+ (empty($w) ? '0' : intval($w) * 1) .
+ 'x' .
+ (empty($h) ? '0' : intval($h) * 1);
+ $provider = '/Images/Thumb';
+
+ }
+
+ if ($thumbsize !== -1) {
+ // change in size..
+ // need to regenerate it..
+
+ $type = array('Images', 'Thumb', $thumbsize);
+
+ $fc = $img->toFileConvert();
+ // make sure it's available..
+ $fc->convert($img->mimetype, $thumbsize);
+
+
+ } else {
+ $provider = $provider == 'Images/Thumb' ? 'Images' : $provider;
+ }
+
+
+ // finally replace the original TAG with the new version..
+
+ return $img->URL($thumbsize, $provider, $baseURL) . $hash ;
+
+
+ }
+
+ static function replaceDataUrl($baseURL, $img, $obj)
+ {
+ $d = DB_DataObject::Factory('Images');
+ $d->object($obj);
+
+
+ $d->createFromData($img->getAttribute('src'));
+ $img->setAttribute('src', $d->URL(-1, '/Images' , $baseURL));
+ }
+
static function replaceImgUrl($html, $baseURL, $tag, $attr, $attr_name)
{
@@ -465,7 +569,8 @@ class Pman_Core_Images extends Pman
$id = $umatch[2];
$hash = '';
if (!empty($umatch[3]) && strpos($umatch[3],'#')) {
- $hash = '#'. array_pop(explode('#',$umatch[3]));
+ $hh = explode('#',$umatch[3]);
+ $hash = '#'. array_pop($hh);
}
@@ -525,7 +630,6 @@ class Pman_Core_Images extends Pman
function downloadEvent($bits)
{
-// $popts = PEAR::getStaticProperty('Pman','options');
$ev = DB_DAtaObject::Factory('events');
if (!$ev->get($bits[1])) {
die("could not find event id");
@@ -538,18 +642,23 @@ class Pman_Core_Images extends Pman
$user = getenv('USERNAME'); // windows.
}
$ff = HTML_FlexyFramework::get();
- $file = $ff->Pman['event_log_dir']. '/'. $user. date('/Y/m/d/',strtotime($ev->event_when)). $ev->id . ".json";
+
+ $file = $ev->logDir() . date('/Y/m/d/',strtotime($ev->event_when)). $ev->id . ".json";
+
+ if(!$file || !file_exists($file)){
+ die("file was not saved");
+ }
+
$filesJ = json_decode(file_get_contents($file));
- //print_r($filesJ);
-
foreach($filesJ->FILES as $k=>$f){
if ($f->tmp_name != $bits[2]) {
continue;
}
- $src = $ff->Pman['event_log_dir']. '/'. $user. date('/Y/m/d/', strtotime($ev->event_when)). $f->tmp_name ;
- if (!file_exists($src)) {
+ $src = $file = $ev->logDir() . date('/Y/m/d/', strtotime($ev->event_when)). $f->tmp_name ;
+
+ if (!$src || !file_exists($src)) {
die("file was not saved");
}
header ('Content-Type: ' . $f->type);
@@ -562,4 +671,8 @@ class Pman_Core_Images extends Pman
}
}
+
+
+
+
}