'ok'); } function getURLInfo($url) { $url = rawurldecode($url); $data = $this->urlToData($url); $hash = $data['hash']; if(!$hash) return array('status'=>'ERR','Reason'=>'Image not found'); $file = $this->getCacheName($data); $html = new HTML; $path = ROOT.DS.'upload'.DS.$hash.DS.$file; if(file_exists($path)) { $byte = filesize($path); return array('status'=>'ok','hash'=>$hash,'cachename'=>$file,'size'=>$byte,'humansize'=>$html->renderSize($byte)); } else return array('status'=>'ERR','Reason'=>'Image not found'); } function urlToData($url) { $html = new HTML; $url = explode("/",$url); foreach($url as $el) { $el = $html->sanatizeString($el); $el = strtolower($el); if(!$el) continue; if(IMAGE_CHANGE_CODE && substr($el,0,10)=='changecode') $data['changecode'] = substr($el,11); if($this->isImage($el)) $data['hash']=$el; else if($this->isSize($el)) $data['size'] = $el; else if($this->isRotation($el)) $data['rotate'] = $el; else if($this->isFilter($el)) $data['filter'][] = $el; else if($legacy = $this->isLegacyThumbnail($el)) //so old uploads will still work { $data['hash'] = $legacy['hash']; $data['size'] = $legacy['size']; } else if($el=='forcesize') $data['forcesize'] = true; else if(strlen(MASTER_DELETE_CODE)>10 && $el=='delete_'.MASTER_DELETE_CODE) $data['delete'] = true; } if($data['delete'] && $data['hash']) { $this->deleteImage($data['hash']); return false; } return $data; } function deleteImage($hash) { $base_path = ROOT.DS.'upload'.DS.$hash.DS; if(!is_dir($base_path)) return false; if ($handle = opendir($base_path)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { unlink($base_path.$entry); } } closedir($handle); } rmdir($base_path); return true; } function isLegacyThumbnail($val) { if(strpos($val,'_')) { $a = explode('_',$val); $size = $a[0]; $hash = $a[1]; if(!$this->isSize($size) || !$this->isImage($hash)) return false; return array('hash'=>$hash,'size'=>$size); } else return false; } function isFilter($var) { if(strpos($var,'_')) { $a = explode('_',$var); $var = $a[0]; $val = $a[1]; if(!is_numeric($val)) return false; } switch($var) { case 'negative': case 'grayscale': case 'brightness': case 'edgedetect': case 'smooth': case 'contrast': case 'blur': case 'sepia': case 'sharpen': case 'emboss': case 'cool': case 'light': case 'aqua': case 'fuzzy': case 'boost': case 'gray': case 'pixelate': return true; default: return false; } } function isRotation($var) { switch($var) { case 'upside': case 'left': case 'right': return true; default: return false; } } function renderLegacyResized($path) { $a = explode('_',$path); if(count($a)!=2) return false; $hash = $a[1]; $size = $a[0]; if(!$this->hashExists($hash)) return false; renderResizedImage($size,$hash); } function getCacheName($data) { ksort($data); $name = false; foreach($data as $key=>$val) { if($key!='hash') { if(!is_array($val)) $name[] = $key.'_'.$val; else foreach($val as $valdata) $name[] = $valdata; } } if(is_array($name)) $name = implode('.',$name); return ($name?$name.'.':'').$data['hash']; } function isSize($var) { if(is_numeric($var)) return true; $a = explode('x',$var); if(count($a)!=2 || !is_numeric($a[0]) || !is_numeric($a[1])) return false; return true; } function isImage($hash) { if(!$hash) return false; return $this->hashExists($hash); } function renderUploadForm() { $maxfilesize = (int)(ini_get('upload_max_filesize')); if(UPLOAD_CODE) $upload_code_form = ''.$this->translate(20).':
'; return '
'.$this->translate(0).': '.$maxfilesize.'MB / File
'.$this->translate(1).'

'.$upload_code_form.' '.$this->translate(4).':

'; } function getNewHash($type,$length=10) { while(1) { $hash = substr(md5(time().$type.rand(1,1000000).microtime()),0,$length).'.'.$type; if(!$this->hashExists($hash)) return $hash; } } function hashExists($hash) { return is_dir(ROOT.DS.'upload'.DS.$hash); } function countResizedImages($hash) { $fi = new FilesystemIterator(ROOT.DS.'upload'.DS.$hash.DS, FilesystemIterator::SKIP_DOTS); return iterator_count($fi); } function getTypeOfFile($url) { $fi = new finfo(FILEINFO_MIME); $type = $fi->buffer(file_get_contents($url)); $arr = explode(';', trim($type)); if(count($arr)>1) { $a2 = explode('/', $arr[0]); return $a2[1]; } $a2 = explode('/', $type); return $a2[1]; } function isTypeAllowed($type) { switch($type) { case 'image/png': return 'png'; case 'image/x-png': return 'png'; case 'x-png': return 'png'; case 'png': return 'png'; case 'image/jpeg': return 'jpg'; case 'jpeg': return 'jpg'; case 'pjpeg': return 'jpg'; case 'image/gif': return 'gif'; case 'gif': return 'gif'; default: return false; } } function uploadImageFromURL($url) { $type = $this->getTypeOfFile($url); $type = $this->isTypeAllowed($type); $dup_id = $this->isDuplicate($url); if($dup_id) { $hash = $dup_id; $url = ROOT.DS.'upload'.DS.$hash.DS.$hash; } else { $hash = $this->getNewHash($type); $this->saveSHAOfFile($url,$hash); } if(!$type) return array('status'=>'ERR','reason'=>'wrong filetype'); if($dup_id) return array('status'=>'OK','type'=>$type,'hash'=>$hash,'url'=>DOMAINPATH.$hash,'domain'=>DOMAINPATH); mkdir(ROOT.DS.'upload'.DS.$hash); $file = ROOT.DS.'upload'.DS.$hash.DS.$hash; $status = file_put_contents($file, file_get_contents($url)); //remove all exif data from jpeg if($type=='jpg') { $res = imagecreatefromjpeg($file); imagejpeg($res, $file, 100); } if(LOG_UPLOADER) { $fh = fopen(ROOT.DS.'upload'.DS.'uploads.txt', 'a'); fwrite($fh, time().';'.$url.';'.$hash.';'.$_SERVER['REMOTE_ADDR']."\n"); fclose($fh); } return array('status'=>'OK','type'=>$type,'hash'=>$hash,'url'=>DOMAINPATH.$hash,'domain'=>DOMAINPATH); } function uploadCodeExists($code) { if(strpos(UPLOAD_CODE,';')) { $codes = explode(';',UPLOAD_CODE); foreach($codes as $ucode) if($code==$ucode) return true; } if($code==UPLOAD_CODE) return true; return false; } function changeCodeExists($code) { if(!IMAGE_CHANGE_CODE) return true; if(strpos(IMAGE_CHANGE_CODE,';')) { $codes = explode(';',IMAGE_CHANGE_CODE); foreach($codes as $ucode) if($code==$ucode) return true; } if($code==IMAGE_CHANGE_CODE) return true; return false; } function processSingleUpload($file,$name) { if(UPLOAD_CODE && !$pm->uploadCodeExists($_REQUEST['upload_code'])) exit(json_encode(array('status'=>'ERR','reason'=>$this->translate(21)))); $im = new Image(); if ($_FILES[$name]["error"] == UPLOAD_ERR_OK) { $type = $this->getTypeOfFile($_FILES[$name]["tmp_name"]); $type = $this->isTypeAllowed($type); if(!$type) exit(json_encode(array('status'=>'ERR','reason'=>'Unsupported type'))); $data = $this->uploadImageFromURL($_FILES[$name]["tmp_name"]); if($data['status']=='OK') { $hash = $data['hash']; return array('status'=>'OK','type'=>$type,'hash'=>$hash,'url'=>DOMAINPATH.$hash,'domain'=>DOMAINPATH); } } return $o; } function ProcessUploads() { if($_POST['submit']!=$this->translate(3)) return false; if(UPLOAD_CODE && !$this->uploadCodeExists($_REQUEST['upload_code'])) return '' . $this->translate(21) . ''; $im = new Image(); $i = 0; foreach ($_FILES["pic"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $data = $this->uploadImageFromURL($_FILES["pic"]["tmp_name"][$key]); if($data['status']=='OK') { $o.= '

'.$this->translate(4).' '.++$i.'


'; } } } return $o; } function saveSHAOfFile($filepath,$hash) { $sha_file = ROOT.DS.'upload'.DS.'hashes.csv'; $sha = sha1_file($filepath); $fp = fopen($sha_file,'a'); fwrite($fp,"$sha;$hash\n"); fclose($fp); } function isDuplicate($file) { $sha_file = ROOT.DS.'upload'.DS.'hashes.csv'; $sha = sha1_file($file); if(!file_exists($sha_file)) return false; $fp = fopen($sha_file,'r'); while (($line = fgets($fp)) !== false) { $line = trim($line); if(!$line) contine; $sha_upload = substr($line,0,40); if($sha_upload==$sha) //when it's a duplicate return the hash of the original file { fclose($fp); return substr($line,41); } } fclose($fp); return false; } function translate($index,$params="") { $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); //$lang = 'en'; switch ($lang){ case "de": $words[0] = 'Maximale Dateigröße'; $words[1] = 'Es können auch mehrere Bilder auf einmal ausgewählt werden!'; $words[2] = 'einfach, gratis, genial'; $words[3] = 'Foto hinaufladen'; $words[4] = 'Bild'; $words[5] = 'Die Datei '.$params[0].' kann nicht hinaufgeladen werden, da der Dateityp "'.$params[1].'" nicht unterstützt wird.'; $words[6] = 'Fehler beim Upload von '.$params; $words[7] = 'Bild "'.$params.'"" wurde erfolgreich hochgeladen'; $words[8] = 'Skaliert auf'; $words[9] = 'Kleinansicht'; $words[10] = 'für Verlinkungen und Miniaturvorschau in Foren'; $words[11] = 'Allgemeiner Fehler'; $words[12] = 'Fehler 404 - nicht gefunden'; $words[13] = 'Fehler 403 - nicht erlaubt'; $words[14] = 'Kein refferer'; $words[15] = 'Verlinkte Seiten'; $words[16] = 'Hinweis: Zugriffe über pictshare.net werden nicht gerechnet'; $words[17] = 'Dieses Bild wurde '.$params[0].' mal von '.$params[1].' verschiedenen IPs gesehen und hat '.$params[2].' Traffic verursacht'; $words[18] = 'Dieses Bild wurde von folgenden Ländern aufgerufen: '; $words[19] = $params[0].' Aufrufe aus '.$params[1]; $words[20] = 'Upload-Code'; $words[21] = 'Falscher Upload Code eingegeben. Upload abgebrochen'; break; default: $words[0] = 'Max filesize'; $words[1] = 'You can select multiple pictures at once!'; $words[2] = 'easy, free, engenious'; $words[3] = 'Upload'; $words[4] = 'Picture'; $words[5] = 'The file '.$params[0].' can\'t be uploaded since the filetype "'.$params[1].'" is not supported.'; $words[6] = 'Error uploading '.$params; $words[7] = 'Picture "'.$params.'"" was uploaded successfully'; $words[8] = 'Scaled to'; $words[9] = 'Thumbnail'; $words[10] = 'for pasting in Forums, etc..'; $words[11] = 'Unspecified error'; $words[12] = 'Error 404 - not found'; $words[13] = 'Error 403 - not allowed'; $words[14] = 'No referrer'; $words[15] = 'Linked sites'; $words[16] = 'Note: Views from pictshare.net will not be counted'; $words[17] = 'Was seen '.$params[0].' times by '.$params[1].' unique IPs and produced '.$params[2].' traffic'; $words[18] = 'This picture was seen from the following countries: '; $words[19] = $params[0].' views from '.$params[1]; $words[20] = 'Upload code'; $words[21] = 'Invalid upload code provided'; } return $words[$index]; } function uploadImageFromBase64($data,$type=false) { $type = $this->base64_to_type($data); if(!$type) return array('status'=>'ERR','reason'=>'wrong filetype','type'=>$type); $hash = $this->getNewHash($type); $picname = $hash; $file = ROOT.DS.'tmp'.DS.$hash; $this->base64_to_image($data,$file,$type); return $this->uploadImageFromURL($file); } function base64_to_type($base64_string) { $data = explode(',', $base64_string); $data = $data[1]; $data = str_replace(' ','+',$data); $data = base64_decode($data); $info = getimagesizefromstring($data); trigger_error("########## FILETYPE: ".$info['mime']); $f = finfo_open(); $type = $this->isTypeAllowed(finfo_buffer($f, $data, FILEINFO_MIME_TYPE)); return $type; } function base64_to_image($base64_string, $output_file,$type) { $data = explode(',', $base64_string); $data = $data[1]; $data = str_replace(' ','+',$data); $data = base64_decode($data); $source = imagecreatefromstring($data); switch($type) { case 'jpg': imagejpeg($source,$output_file,100); trigger_error("========= SAVING AS ".$type." TO ".$output_file); break; case 'png': imagepng($source,$output_file,5); trigger_error("========= SAVING AS ".$type." TO ".$output_file); break; case 'gif': imagegif($source,$output_file); trigger_error("========= SAVING AS ".$type." TO ".$output_file); break; default: imagepng($source,$output_file,5); break; } //$imageSave = imagejpeg($source,$output_file,100); imagedestroy($source); return $type; } }