X-Git-Url: https://git.p6c8.net/jirafeau_project.git/blobdiff_plain/134fa87d899035f4ca5ebd2755f3ff4c425c2959..95433dc6baab9cc71f2a8b7a139bd0e6f6505b70:/lib/functions.php diff --git a/lib/functions.php b/lib/functions.php index 592e841..50ab345 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -23,12 +23,12 @@ * Transform a string in a path by seperating each letters by a '/'. * @return path finishing with a '/' */ -function -s2p ($s) +function s2p($s) { $p = ''; - for ($i = 0; $i < strlen ($s); $i++) + for ($i = 0; $i < strlen($s); $i++) { $p .= $s{$i} . '/'; + } return $p; } @@ -36,11 +36,10 @@ s2p ($s) * Convert base 16 to base 64 * @returns A string based on 64 characters (0-9, a-z, A-Z, "-" and "_") */ -function -base_16_to_64 ($num) +function base_16_to_64($num) { $m = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'; - $hex2bin = array ('0000', # 0 + $hex2bin = array('0000', # 0 '0001', # 1 '0010', # 2 '0011', # 3 @@ -56,20 +55,23 @@ base_16_to_64 ($num) '1101', # d '1110', # e '1111'); # f - $o = ''; + $o = ''; $b = ''; $i = 0; # Convert long hex string to bin. - $size = strlen ($num); - for ($i = 0; $i < $size; $i++) - $b .= $hex2bin{hexdec ($num{$i})}; + $size = strlen($num); + for ($i = 0; $i < $size; $i++) { + $b .= $hex2bin{hexdec($num{$i})}; + } # Convert long bin to base 64. $size *= 4; - for ($i = $size - 6; $i >= 0; $i -= 6) - $o = $m{bindec (substr ($b, $i, 6))} . $o; + for ($i = $size - 6; $i >= 0; $i -= 6) { + $o = $m{bindec(substr($b, $i, 6))} . $o; + } # Some few bits remaining ? - if ($i < 0 && $i > -6) - $o = $m{bindec (substr ($b, 0, $i + 6))} . $o; + if ($i < 0 && $i > -6) { + $o = $m{bindec(substr($b, 0, $i + 6))} . $o; + } return $o; } @@ -78,80 +80,89 @@ base_16_to_64 ($num) * @param $l code length * @return random code. */ -function -jirafeau_gen_random ($l) +function jirafeau_gen_random($l) { - if ($l <= 0) + if ($l <= 0) { return 42; + } $code=""; - for ($i = 0; $i < $l; $i++) - $code .= dechex (rand (0, 15)); + for ($i = 0; $i < $l; $i++) { + $code .= dechex(rand(0, 15)); + } return $code; } -function -is_ssl() { - if ( isset($_SERVER['HTTPS']) ) { - if ( 'on' == strtolower($_SERVER['HTTPS']) || - '1' == $_SERVER['HTTPS'] ) +function is_ssl() +{ + if (isset($_SERVER['HTTPS'])) { + if ('on' == strtolower($_SERVER['HTTPS']) || + '1' == $_SERVER['HTTPS']) { return true; - } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { + } + } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) { return true; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { - if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') + if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { return true; + } } return false; } -function -jirafeau_human_size ($octets) +function jirafeau_human_size($octets) +{ + $u = array('B', 'KB', 'MB', 'GB', 'TB'); + $o = max($octets, 0); + $p = min(floor(($o ? log($o) : 0) / log(1024)), count($u) - 1); + $o /= pow(1024, $p); + return round($o, 1) . $u[$p]; +} + +// Convert UTC timestamp to a datetime field +function jirafeau_get_datetimefield($timestamp) { - $u = array ('B', 'KB', 'MB', 'GB', 'TB'); - $o = max ($octets, 0); - $p = min (floor (($o ? log ($o) : 0) / log (1024)), count ($u) - 1); - $o /= pow (1024, $p); - return round ($o, 1) . $u[$p]; -} - -function -jirafeau_clean_rm_link ($link) + $content = '' + . strftime('%Y-%m-%d %H:%M', $timestamp) . ' (GMT)'; + return $content; +} + +function jirafeau_clean_rm_link($link) { - $p = s2p ("$link"); - if (file_exists (VAR_LINKS . $p . $link)) - unlink (VAR_LINKS . $p . $link); + $p = s2p("$link"); + if (file_exists(VAR_LINKS . $p . $link)) { + unlink(VAR_LINKS . $p . $link); + } $parse = VAR_LINKS . $p; $scan = array(); - while (file_exists ($parse) - && ($scan = scandir ($parse)) - && count ($scan) == 2 // '.' and '..' folders => empty. - && basename ($parse) != basename (VAR_LINKS)) - { - rmdir ($parse); - $parse = substr ($parse, 0, strlen($parse) - strlen(basename ($parse)) - 1); + while (file_exists($parse) + && ($scan = scandir($parse)) + && count($scan) == 2 // '.' and '..' folders => empty. + && basename($parse) != basename(VAR_LINKS)) { + rmdir($parse); + $parse = substr($parse, 0, strlen($parse) - strlen(basename($parse)) - 1); } } -function -jirafeau_clean_rm_file ($md5) +function jirafeau_clean_rm_file($md5) { - $p = s2p ("$md5"); + $p = s2p("$md5"); $f = VAR_FILES . $p . $md5; - if (file_exists ($f) && is_file ($f)) - unlink ($f); - if (file_exists ($f . '_count') && is_file ($f . '_count')) - unlink ($f . '_count'); + if (file_exists($f) && is_file($f)) { + unlink($f); + } + if (file_exists($f . '_count') && is_file($f . '_count')) { + unlink($f . '_count'); + } $parse = VAR_FILES . $p; $scan = array(); - while (file_exists ($parse) - && ($scan = scandir ($parse)) - && count ($scan) == 2 // '.' and '..' folders => empty. - && basename ($parse) != basename (VAR_FILES)) - { - rmdir ($parse); - $parse = substr ($parse, 0, strlen($parse) - strlen(basename ($parse)) - 1); + while (file_exists($parse) + && ($scan = scandir($parse)) + && count($scan) == 2 // '.' and '..' folders => empty. + && basename($parse) != basename(VAR_FILES)) { + rmdir($parse); + $parse = substr($parse, 0, strlen($parse) - strlen(basename($parse)) - 1); } } @@ -160,13 +171,11 @@ jirafeau_clean_rm_file ($md5) * @param $value the value from php.ini * @returns an integer for this value */ -function -jirafeau_ini_to_bytes ($value) +function jirafeau_ini_to_bytes($value) { - $modifier = substr ($value, -1); - $bytes = substr ($value, 0, -1); - switch (strtoupper ($modifier)) - { + $modifier = substr($value, -1); + $bytes = substr($value, 0, -1); + switch (strtoupper($modifier)) { case 'P': $bytes *= 1024; case 'T': @@ -185,23 +194,21 @@ jirafeau_ini_to_bytes ($value) * gets the maximum upload size according to php.ini * @returns the maximum upload size in bytes */ -function -jirafeau_get_max_upload_size_bytes () +function jirafeau_get_max_upload_size_bytes() { - return min (jirafeau_ini_to_bytes (ini_get ('post_max_size')), - jirafeau_ini_to_bytes (ini_get ('upload_max_filesize'))); + return min(jirafeau_ini_to_bytes(ini_get('post_max_size')), + jirafeau_ini_to_bytes(ini_get('upload_max_filesize'))); } /** * gets the maximum upload size according to php.ini * @returns the maximum upload size string */ -function -jirafeau_get_max_upload_size () +function jirafeau_get_max_upload_size() { return jirafeau_human_size( - min (jirafeau_ini_to_bytes (ini_get ('post_max_size')), - jirafeau_ini_to_bytes (ini_get ('upload_max_filesize')))); + min(jirafeau_ini_to_bytes(ini_get('post_max_size')), + jirafeau_ini_to_bytes(ini_get('upload_max_filesize')))); } /** @@ -209,11 +216,9 @@ jirafeau_get_max_upload_size () * @param $code the error code * @returns a string explaining the error */ -function -jirafeau_upload_errstr ($code) +function jirafeau_upload_errstr($code) { - switch ($code) - { + switch ($code) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: return t('Your file exceeds the maximum authorized file size. '); @@ -235,76 +240,70 @@ jirafeau_upload_errstr ($code) * @param $link the link's name (hash) */ -function -jirafeau_delete_link ($link) +function jirafeau_delete_link($link) { - $l = jirafeau_get_link ($link); - if (!count ($l)) + $l = jirafeau_get_link($link); + if (!count($l)) { return; + } - jirafeau_clean_rm_link ($link); + jirafeau_clean_rm_link($link); $md5 = $l['md5']; - $p = s2p ("$md5"); + $p = s2p("$md5"); $counter = 1; - if (file_exists (VAR_FILES . $p . $md5. '_count')) - { - $content = file (VAR_FILES . $p . $md5. '_count'); - $counter = trim ($content[0]); + if (file_exists(VAR_FILES . $p . $md5. '_count')) { + $content = file(VAR_FILES . $p . $md5. '_count'); + $counter = trim($content[0]); } $counter--; - if ($counter >= 1) - { - $handle = fopen (VAR_FILES . $p . $md5. '_count', 'w'); - fwrite ($handle, $counter); - fclose ($handle); + if ($counter >= 1) { + $handle = fopen(VAR_FILES . $p . $md5. '_count', 'w'); + fwrite($handle, $counter); + fclose($handle); } - if ($counter == 0) - jirafeau_clean_rm_file ($md5); + if ($counter == 0) { + jirafeau_clean_rm_file($md5); + } } /** * Delete a file and it's links. */ -function -jirafeau_delete_file ($md5) +function jirafeau_delete_file($md5) { $count = 0; /* Get all links files. */ - $stack = array (VAR_LINKS); - while (($d = array_shift ($stack)) && $d != NULL) - { - $dir = scandir ($d); + $stack = array(VAR_LINKS); + while (($d = array_shift($stack)) && $d != null) { + $dir = scandir($d); - foreach ($dir as $node) - { - if (strcmp ($node, '.') == 0 || strcmp ($node, '..') == 0 || - preg_match ('/\.tmp/i', "$node")) + foreach ($dir as $node) { + if (strcmp($node, '.') == 0 || strcmp($node, '..') == 0 || + preg_match('/\.tmp/i', "$node")) { continue; - - if (is_dir ($d . $node)) - { + } + + if (is_dir($d . $node)) { /* Push new found directory. */ $stack[] = $d . $node . '/'; - } - elseif (is_file ($d . $node)) - { + } elseif (is_file($d . $node)) { /* Read link informations. */ - $l = jirafeau_get_link (basename ($node)); - if (!count ($l)) + $l = jirafeau_get_link(basename($node)); + if (!count($l)) { continue; - if ($l['md5'] == $md5) - { + } + if ($l['md5'] == $md5) { $count++; - jirafeau_delete_link ($node); - } + jirafeau_delete_link($node); + } } } } - jirafeau_clean_rm_file ($md5); + jirafeau_clean_rm_file($md5); return $count; } @@ -322,57 +321,52 @@ jirafeau_delete_file ($md5) * 'link' => the link name of the uploaded file * 'delete_link' => the link code to delete file */ -function -jirafeau_upload ($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length) +function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length) { - if (empty ($file['tmp_name']) || !is_uploaded_file ($file['tmp_name'])) - { + if (empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) { return (array( 'error' => - array ('has_error' => true, - 'why' => jirafeau_upload_errstr ($file['error'])), + array('has_error' => true, + 'why' => jirafeau_upload_errstr($file['error'])), 'link' => '', 'delete_link' => '')); } /* array representing no error */ - $noerr = array ('has_error' => false, 'why' => ''); + $noerr = array('has_error' => false, 'why' => ''); /* Crypt file if option is enabled. */ $crypted = false; $crypt_key = ''; - if ($crypt == true && !(extension_loaded('mcrypt') == true)) - error_log ("PHP extension mcrypt not loaded, won't encrypt in Jirafeau"); - if ($crypt == true && extension_loaded('mcrypt') == true) - { - $crypt_key = jirafeau_encrypt_file ($file['tmp_name'], $file['tmp_name']); - if (strlen($crypt_key) > 0) + if ($crypt == true && !(extension_loaded('mcrypt') == true)) { + error_log("PHP extension mcrypt not loaded, won't encrypt in Jirafeau"); + } + if ($crypt == true && extension_loaded('mcrypt') == true) { + $crypt_key = jirafeau_encrypt_file($file['tmp_name'], $file['tmp_name']); + if (strlen($crypt_key) > 0) { $crypted = true; + } } /* file informations */ - $md5 = md5_file ($file['tmp_name']); - $name = str_replace (NL, '', trim ($file['name'])); + $md5 = md5_file($file['tmp_name']); + $name = str_replace(NL, '', trim($file['name'])); $mime_type = $file['type']; $size = $file['size']; /* does file already exist ? */ $rc = false; - $p = s2p ("$md5"); - if (file_exists (VAR_FILES . $p . $md5)) - { - $rc = unlink ($file['tmp_name']); - } - elseif ((file_exists (VAR_FILES . $p) || @mkdir (VAR_FILES . $p, 0755, true)) - && move_uploaded_file ($file['tmp_name'], VAR_FILES . $p . $md5)) - { + $p = s2p("$md5"); + if (file_exists(VAR_FILES . $p . $md5)) { + $rc = unlink($file['tmp_name']); + } elseif ((file_exists(VAR_FILES . $p) || @mkdir(VAR_FILES . $p, 0755, true)) + && move_uploaded_file($file['tmp_name'], VAR_FILES . $p . $md5)) { $rc = true; } - if (!$rc) - { + if (!$rc) { return (array( 'error' => - array ('has_error' => true, + array('has_error' => true, 'why' => t('Internal error during file creation.')), 'link' =>'', 'delete_link' => '')); @@ -380,59 +374,56 @@ jirafeau_upload ($file, $one_time_download, $key, $time, $ip, $crypt, $link_name /* Increment or create count file. */ $counter = 0; - if (file_exists (VAR_FILES . $p . $md5 . '_count')) - { - $content = file (VAR_FILES . $p . $md5. '_count'); - $counter = trim ($content[0]); + if (file_exists(VAR_FILES . $p . $md5 . '_count')) { + $content = file(VAR_FILES . $p . $md5. '_count'); + $counter = trim($content[0]); } $counter++; - $handle = fopen (VAR_FILES . $p . $md5. '_count', 'w'); - fwrite ($handle, $counter); - fclose ($handle); + $handle = fopen(VAR_FILES . $p . $md5. '_count', 'w'); + fwrite($handle, $counter); + fclose($handle); /* Create delete code. */ - $delete_link_code = jirafeau_gen_random (5); + $delete_link_code = jirafeau_gen_random(5); /* md5 password or empty. */ $password = ''; - if (!empty ($key)) - $password = md5 ($key); + if (!empty($key)) { + $password = md5($key); + } /* create link file */ - $link_tmp_name = VAR_LINKS . $md5 . rand (0, 10000) . '.tmp'; - $handle = fopen ($link_tmp_name, 'w'); - fwrite ($handle, + $link_tmp_name = VAR_LINKS . $md5 . rand(0, 10000) . '.tmp'; + $handle = fopen($link_tmp_name, 'w'); + fwrite($handle, $name . NL. $mime_type . NL. $size . NL. $password . NL. $time . - NL . $md5. NL . ($one_time_download ? 'O' : 'R') . NL . date ('U') . + NL . $md5. NL . ($one_time_download ? 'O' : 'R') . NL . time() . NL . $ip . NL. $delete_link_code . NL . ($crypted ? 'C' : 'O')); - fclose ($handle); - $md5_link = substr(base_16_to_64 (md5_file ($link_tmp_name)), 0, $link_name_length); - $l = s2p ("$md5_link"); - if (!@mkdir (VAR_LINKS . $l, 0755, true) || - !rename ($link_tmp_name, VAR_LINKS . $l . $md5_link)) - { - if (file_exists ($link_tmp_name)) - unlink ($link_tmp_name); - - $counter--; - if ($counter >= 1) - { - $handle = fopen (VAR_FILES . $p . $md5. '_count', 'w'); - fwrite ($handle, $counter); - fclose ($handle); + fclose($handle); + $md5_link = substr(base_16_to_64(md5_file($link_tmp_name)), 0, $link_name_length); + $l = s2p("$md5_link"); + if (!@mkdir(VAR_LINKS . $l, 0755, true) || + !rename($link_tmp_name, VAR_LINKS . $l . $md5_link)) { + if (file_exists($link_tmp_name)) { + unlink($link_tmp_name); } - else - { - jirafeau_clean_rm_file ($md5_link); + + $counter--; + if ($counter >= 1) { + $handle = fopen(VAR_FILES . $p . $md5. '_count', 'w'); + fwrite($handle, $counter); + fclose($handle); + } else { + jirafeau_clean_rm_file($md5_link); } return array( 'error' => - array ('has_error' => true, + array('has_error' => true, 'why' => t('Internal error during file creation. ')), 'link' =>'', 'delete_link' => ''); } - return array ( 'error' => $noerr, + return array( 'error' => $noerr, 'link' => $md5_link, 'delete_link' => $delete_link_code, 'crypt_key' => $crypt_key); @@ -443,30 +434,27 @@ jirafeau_upload ($file, $one_time_download, $key, $time, $ip, $crypt, $link_name * @param $mime the mime type * @returns a boolean telling if a mime type is viewable */ -function -jirafeau_is_viewable ($mime) +function jirafeau_is_viewable($mime) { - if (!empty ($mime)) - { + if (!empty($mime)) { /* Actually, verify if mime-type is an image or a text. */ - $viewable = array ('image', 'text', 'video', 'audio'); - $decomposed = explode ('/', $mime); - return in_array ($decomposed[0], $viewable); + $viewable = array('image', 'text', 'video', 'audio'); + $decomposed = explode('/', $mime); + return in_array($decomposed[0], $viewable); } return false; } // Error handling functions. //! Global array that contains all registered errors. -$error_list = array (); +$error_list = array(); /** * Adds an error to the list of errors. * @param $title the error's title * @param $description is a human-friendly description of the problem. */ -function -add_error ($title, $description) +function add_error($title, $description) { global $error_list; $error_list[] = '
' . $title. '
' . $description. '