From 19d7cb060ea70854e958d081fafa11cbaa7a4db9 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 26 Aug 2023 22:39:08 +0200 Subject: [PATCH] added support for dynamic content controllers Also implemented a placeholder generator to showcase it --- README.md | 3 +- .../image/image.controller.php | 1 + .../fonts/RonysiswadiArchitect5-1GErv.ttf | Bin 0 -> 16352 bytes .../placeholder/placeholder.controller.php | 52 +++++ .../placeholder/placeholdergenerator.php | 88 ++++++++ content-controllers/text/text.controller.php | 2 + content-controllers/url/url.controller.php | 2 + .../video/video.controller.php | 2 + inc/core.php | 191 +++++++++++++++++- interfaces/contentcontroller.interface.php | 8 + 10 files changed, 346 insertions(+), 3 deletions(-) create mode 100644 content-controllers/placeholder/fonts/RonysiswadiArchitect5-1GErv.ttf create mode 100644 content-controllers/placeholder/placeholder.controller.php create mode 100644 content-controllers/placeholder/placeholdergenerator.php diff --git a/README.md b/README.md index 19cd589..91c854a 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ Then open http://localhost:8080 in your browser ## New Features in v2 +- Generate placeholder images by specifying the size in the URL. [example](https://pictshare.net/placeholder/555x250/color-white-blue) - Added support for external storage - [Encryption of files in external storage](/rtfm/ENCRYPTION.md) - Added text hosting (like pastebin) @@ -105,13 +106,13 @@ Read [here](/rtfm/CONFIG.md) what those options do - [x] MASTER_DELETE_CODE - [x] MASTER_DELETE_IP - [x] UPLOAD_FORM_LOCATION +- [x] S3 Backend - [ ] UPLOAD_QUOTA - [ ] UPLOAD_CODE - [ ] LOW_PROFILE - [ ] IMAGE_CHANGE_CODE - [ ] MAX_RESIZED_IMAGES - [ ] ALLOW_BLOATING -- [ ] BACKBLAZE ### Image hosting - [x] Resizing diff --git a/content-controllers/image/image.controller.php b/content-controllers/image/image.controller.php index 6c92102..319820d 100644 --- a/content-controllers/image/image.controller.php +++ b/content-controllers/image/image.controller.php @@ -10,6 +10,7 @@ class ImageController implements ContentController { + public const ctype = 'static'; //returns all extensions registered by this type of content public function getRegisteredExtensions(){return array('png','bmp','gif','jpg','jpeg','x-png','webp');} diff --git a/content-controllers/placeholder/fonts/RonysiswadiArchitect5-1GErv.ttf b/content-controllers/placeholder/fonts/RonysiswadiArchitect5-1GErv.ttf new file mode 100644 index 0000000000000000000000000000000000000000..25800e976f24da6e125e90e979888090be2559c9 GIT binary patch literal 16352 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 ZgFj69AHMpR@#8PMOJCK6KNV+%{{}n49*h70 literal 0 HcmV?d00001 diff --git a/content-controllers/placeholder/placeholder.controller.php b/content-controllers/placeholder/placeholder.controller.php new file mode 100644 index 0000000..3395d41 --- /dev/null +++ b/content-controllers/placeholder/placeholder.controller.php @@ -0,0 +1,52 @@ +4) + $modifiers['colors'] = array_slice($modifiers['colors'],0,4); + } + } + + $img = $pg->generateImage($modifiers); + + $img = $pg->gradient($img, $modifiers['colors']); + $img = $pg->addSizeText($img,$modifiers); + + header ("Content-type: image/jpeg"); + header ("ETag: $hash"); + header('Cache-control: public, max-age=31536000'); + + imagejpeg($img,null,(defined('JPEG_COMPRESSION')?JPEG_COMPRESSION:90)); + } + + public function handleUpload($tmpfile,$hash=false) + { + return array('status'=>'err','hash'=>$hash,'reason'=>'Cannot upload to placeholder image'); + } + + +} \ No newline at end of file diff --git a/content-controllers/placeholder/placeholdergenerator.php b/content-controllers/placeholder/placeholdergenerator.php new file mode 100644 index 0000000..1701ad0 --- /dev/null +++ b/content-controllers/placeholder/placeholdergenerator.php @@ -0,0 +1,88 @@ + imagesx($im) || $textheight > imagesy($im)) + return $im; + + $x = (imagesx($im) - $textwidth) / 2; + $y = (imagesy($im) - $textheight) / 2 + $textheight; + imagettftext($im, $fontsize, 0, $x, $y, $textcolor, $font, $text); + + return $im; + } + + function gradient($im, $c) { + + $w = imagesx($im); + $h = imagesy($im); + + if(!$c[0]) $c = ['ffffff','ffffff','ffffff','ffffff']; + else if(!$c[1]) $c = [$c[0],$c[0],$c[0],$c[0]]; + else if(!$c[2]) $c = [$c[0],$c[0],$c[1],$c[1]]; + else if(!$c[3]) $c = [$c[0],$c[1],$c[2],$c[0]]; + + for($i=0;$i<=3;$i++) { + $c[$i]=$this->hex2rgb($c[$i]); + } + + $rgb=$c[0]; // start with top left color + for($x=0;$x<=$w;$x++) { // loop columns + for($y=0;$y<=$h;$y++) { // loop rows + // set pixel color + $col=imagecolorallocate($im,$rgb[0],$rgb[1],$rgb[2]); + imagesetpixel($im,$x-1,$y-1,$col); + // calculate new color + for($i=0;$i<=2;$i++) { + $rgb[$i]= + $c[0][$i]*(($w-$x)*($h-$y)/($w*$h)) + + $c[1][$i]*($x *($h-$y)/($w*$h)) + + $c[2][$i]*(($w-$x)*$y /($w*$h)) + + $c[3][$i]*($x *$y /($w*$h)); + } + } + } + return $im; + } + + function hex2rgb($hex) + { + $rgb[0]=hexdec(substr($hex,0,2)); + $rgb[1]=hexdec(substr($hex,2,2)); + $rgb[2]=hexdec(substr($hex,4,2)); + return($rgb); + } +} \ No newline at end of file diff --git a/content-controllers/text/text.controller.php b/content-controllers/text/text.controller.php index 8d4c54a..6644ce8 100644 --- a/content-controllers/text/text.controller.php +++ b/content-controllers/text/text.controller.php @@ -2,6 +2,8 @@ class TextController implements ContentController { + public const ctype = 'static'; + //returns all extensions registered by this type of content public function getRegisteredExtensions(){return array('txt','text','csv');} diff --git a/content-controllers/url/url.controller.php b/content-controllers/url/url.controller.php index d113f30..8f382be 100644 --- a/content-controllers/url/url.controller.php +++ b/content-controllers/url/url.controller.php @@ -2,6 +2,8 @@ class UrlController implements ContentController { + public const ctype = 'static'; + //returns all extensions registered by this type of content public function getRegisteredExtensions(){return array('url');} public function handleHash($hash,$url){} diff --git a/content-controllers/video/video.controller.php b/content-controllers/video/video.controller.php index 61b4449..959f997 100644 --- a/content-controllers/video/video.controller.php +++ b/content-controllers/video/video.controller.php @@ -2,6 +2,8 @@ class VideoController implements ContentController { + public const ctype = 'static'; + //returns all extensions registered by this type of content public function getRegisteredExtensions(){return array('mp4');} diff --git a/inc/core.php b/inc/core.php index efe20a4..86c3c0b 100644 --- a/inc/core.php +++ b/inc/core.php @@ -76,7 +76,21 @@ function architect($url) break; // we break here because we already have the file. no need to check other storage controllers } } - } + + + } + // if it's still false, we only have one hope: Maybe it's from a dynamic controller and the cache hasn't been created yet + else if($hash===false) + { + foreach(loadAllContentControllers(true) as $cc) + { + if((new $cc)::ctype=='dynamic' && in_array((new $cc)->getRegisteredExtensions()[0],$u) ) + { + $hash = true; + break; + } + } + } } @@ -112,7 +126,10 @@ function architect($url) foreach(loadAllContentControllers(true) as $cc) { - if(in_array($extension,(new $cc)->getRegisteredExtensions())) + if( + ((new $cc)::ctype=='dynamic' && in_array((new $cc)->getRegisteredExtensions()[0],$u)) || + ((new $cc)::ctype=='static' && in_array($extension,(new $cc)->getRegisteredExtensions())) + ) { (new $cc())->handleHash($hash,$u); return; @@ -464,6 +481,176 @@ function isSize($var) return true; } +function isColor($var) +{ + if(strlen($var)==6 && ctype_xdigit($var)) return true; + else + { + $col = color_name_to_hex($var); + if($col) return true; + else return false; + } +} + +function color_name_to_hex($color_name) + { + // standard 147 HTML color names + $colors = array( + 'aliceblue'=>'F0F8FF', + 'antiquewhite'=>'FAEBD7', + 'aqua'=>'00FFFF', + 'aquamarine'=>'7FFFD4', + 'azure'=>'F0FFFF', + 'beige'=>'F5F5DC', + 'bisque'=>'FFE4C4', + 'black'=>'000000', + 'blanchedalmond '=>'FFEBCD', + 'blue'=>'0000FF', + 'blueviolet'=>'8A2BE2', + 'brown'=>'A52A2A', + 'burlywood'=>'DEB887', + 'cadetblue'=>'5F9EA0', + 'chartreuse'=>'7FFF00', + 'chocolate'=>'D2691E', + 'coral'=>'FF7F50', + 'cornflowerblue'=>'6495ED', + 'cornsilk'=>'FFF8DC', + 'crimson'=>'DC143C', + 'cyan'=>'00FFFF', + 'darkblue'=>'00008B', + 'darkcyan'=>'008B8B', + 'darkgoldenrod'=>'B8860B', + 'darkgray'=>'A9A9A9', + 'darkgreen'=>'006400', + 'darkgrey'=>'A9A9A9', + 'darkkhaki'=>'BDB76B', + 'darkmagenta'=>'8B008B', + 'darkolivegreen'=>'556B2F', + 'darkorange'=>'FF8C00', + 'darkorchid'=>'9932CC', + 'darkred'=>'8B0000', + 'darksalmon'=>'E9967A', + 'darkseagreen'=>'8FBC8F', + 'darkslateblue'=>'483D8B', + 'darkslategray'=>'2F4F4F', + 'darkslategrey'=>'2F4F4F', + 'darkturquoise'=>'00CED1', + 'darkviolet'=>'9400D3', + 'deeppink'=>'FF1493', + 'deepskyblue'=>'00BFFF', + 'dimgray'=>'696969', + 'dimgrey'=>'696969', + 'dodgerblue'=>'1E90FF', + 'firebrick'=>'B22222', + 'floralwhite'=>'FFFAF0', + 'forestgreen'=>'228B22', + 'fuchsia'=>'FF00FF', + 'gainsboro'=>'DCDCDC', + 'ghostwhite'=>'F8F8FF', + 'gold'=>'FFD700', + 'goldenrod'=>'DAA520', + 'gray'=>'808080', + 'green'=>'008000', + 'greenyellow'=>'ADFF2F', + 'grey'=>'808080', + 'honeydew'=>'F0FFF0', + 'hotpink'=>'FF69B4', + 'indianred'=>'CD5C5C', + 'indigo'=>'4B0082', + 'ivory'=>'FFFFF0', + 'khaki'=>'F0E68C', + 'lavender'=>'E6E6FA', + 'lavenderblush'=>'FFF0F5', + 'lawngreen'=>'7CFC00', + 'lemonchiffon'=>'FFFACD', + 'lightblue'=>'ADD8E6', + 'lightcoral'=>'F08080', + 'lightcyan'=>'E0FFFF', + 'lightgoldenrodyellow'=>'FAFAD2', + 'lightgray'=>'D3D3D3', + 'lightgreen'=>'90EE90', + 'lightgrey'=>'D3D3D3', + 'lightpink'=>'FFB6C1', + 'lightsalmon'=>'FFA07A', + 'lightseagreen'=>'20B2AA', + 'lightskyblue'=>'87CEFA', + 'lightslategray'=>'778899', + 'lightslategrey'=>'778899', + 'lightsteelblue'=>'B0C4DE', + 'lightyellow'=>'FFFFE0', + 'lime'=>'00FF00', + 'limegreen'=>'32CD32', + 'linen'=>'FAF0E6', + 'magenta'=>'FF00FF', + 'maroon'=>'800000', + 'mediumaquamarine'=>'66CDAA', + 'mediumblue'=>'0000CD', + 'mediumorchid'=>'BA55D3', + 'mediumpurple'=>'9370D0', + 'mediumseagreen'=>'3CB371', + 'mediumslateblue'=>'7B68EE', + 'mediumspringgreen'=>'00FA9A', + 'mediumturquoise'=>'48D1CC', + 'mediumvioletred'=>'C71585', + 'midnightblue'=>'191970', + 'mintcream'=>'F5FFFA', + 'mistyrose'=>'FFE4E1', + 'moccasin'=>'FFE4B5', + 'navajowhite'=>'FFDEAD', + 'navy'=>'000080', + 'oldlace'=>'FDF5E6', + 'olive'=>'808000', + 'olivedrab'=>'6B8E23', + 'orange'=>'FFA500', + 'orangered'=>'FF4500', + 'orchid'=>'DA70D6', + 'palegoldenrod'=>'EEE8AA', + 'palegreen'=>'98FB98', + 'paleturquoise'=>'AFEEEE', + 'palevioletred'=>'DB7093', + 'papayawhip'=>'FFEFD5', + 'peachpuff'=>'FFDAB9', + 'peru'=>'CD853F', + 'pink'=>'FFC0CB', + 'plum'=>'DDA0DD', + 'powderblue'=>'B0E0E6', + 'purple'=>'800080', + 'red'=>'FF0000', + 'rosybrown'=>'BC8F8F', + 'royalblue'=>'4169E1', + 'saddlebrown'=>'8B4513', + 'salmon'=>'FA8072', + 'sandybrown'=>'F4A460', + 'seagreen'=>'2E8B57', + 'seashell'=>'FFF5EE', + 'sienna'=>'A0522D', + 'silver'=>'C0C0C0', + 'skyblue'=>'87CEEB', + 'slateblue'=>'6A5ACD', + 'slategray'=>'708090', + 'slategrey'=>'708090', + 'snow'=>'FFFAFA', + 'springgreen'=>'00FF7F', + 'steelblue'=>'4682B4', + 'tan'=>'D2B48C', + 'teal'=>'008080', + 'thistle'=>'D8BFD8', + 'tomato'=>'FF6347', + 'turquoise'=>'40E0D0', + 'violet'=>'EE82EE', + 'wheat'=>'F5DEB3', + 'white'=>'FFFFFF', + 'whitesmoke'=>'F5F5F5', + 'yellow'=>'FFFF00', + 'yellowgreen'=>'9ACD32'); + + $color_name = strtolower($color_name); + if (isset($colors[$color_name])) + return $colors[$color_name]; + else + return false; + } + function getStorageControllers() { $controllers = array(); diff --git a/interfaces/contentcontroller.interface.php b/interfaces/contentcontroller.interface.php index c358ab5..c51307c 100644 --- a/interfaces/contentcontroller.interface.php +++ b/interfaces/contentcontroller.interface.php @@ -6,6 +6,14 @@ interface ContentController { + /** + * When implementing a new content controller, you must specify a constant with the name of "ctype" + * This constant will be used to distinguish static controllers (which have files on disk) from dynamic ones (which don't, like the placeholder controller) + * + * Possible values: 'static' or 'dynamic' + */ + //const ctype = 'static'; + /** This method will return all file extensions that will be associated with this content type * for example 'pdf' but it could be anything really. You just need a way later to confirm that a type is what it says it is *