/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2006 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: view_photo.php 14766 2006-10-11 16:13:06Z jenst $
*/
?>
/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2006 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: init.php 14282 2006-08-12 00:46:01Z jenst $
*/
?>
/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2006 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: Version.php 14817 2006-10-13 02:22:15Z ckdake $
*/
?>
/*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2006 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: util.php 14543 2006-09-17 00:17:41Z jenst $
*/
/**
* @package Utils
*/
/**
* First include some necessary files
*/
require_once(dirname(__FILE__) . '/nls.php');
require_once(dirname(__FILE__) . '/lib/url.php');
require_once(dirname(__FILE__) . '/lib/popup.php');
require_once(dirname(__FILE__) . '/classes/Mail/htmlMimeMail.php');
require_once(dirname(__FILE__) . '/classes/HTML/table.php');
require_once(dirname(__FILE__) . '/lib/valchecks.php');
require_once(dirname(__FILE__) . '/lib/messages.php');
require_once(dirname(__FILE__) . '/lib/content.php');
function getRequestVar($str) {
if (!is_array($str)) {
if (!isset($_REQUEST[$str])) {
return null;
}
$ret = & $_REQUEST[$str];
if (get_magic_quotes_gpc()) {
$ret = stripslashes_deep($ret);
}
//echo "\n
- Checking:". htmlspecialchars($str);
$ret = sanitizeInput($ret);
}
else {
foreach ($str as $reqvar) {
$ret[] = getRequestVar($reqvar);
}
}
return $ret;
}
function getFilesVar($str) {
if (!is_array($str)) {
if (!isset($_FILES[$str])) {
return null;
}
$ret = &$_FILES[$str];
}
else {
foreach ($str as $reqvar) {
$ret[] = getFilesVar($reqvar);
}
}
return $ret;
}
function getEnvVar($str) {
if (!is_array($str)) {
if (!isset($_ENV[$str])) {
return null;
}
$ret = &$_ENV[$str];
}
else {
foreach ($str as $reqvar) {
$ret[] = getEnvVar($reqvar);
}
}
return $ret;
}
function stripslashes_deep($value) {
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
function getBlacklistFilename() {
global $gallery;
return sprintf("%s/blacklist.dat", $gallery->app->albumDir);
}
function loadBlacklist() {
static $blacklist;
if (!isset($blacklist)) {
$tmp = getFile(getBlacklistFilename());
$blacklist = unserialize($tmp);
if (empty($blacklist)) {
// Initialize the blacklist
$blacklist = array();
$blacklist['entries'] = array();
}
}
return $blacklist;
}
function isBlacklistedComment(&$comment, $existingComment = true) {
$blacklist = loadBlacklist();
if ($existingComment) {
foreach ($blacklist['entries'] as $key => $entry) {
if (ereg($entry, $comment->getCommentText()) ||
ereg($entry, $comment->getName())) {
return true;
}
}
} else {
foreach ($blacklist['entries'] as $entry) {
if (ereg($entry, $comment['commenter_name']) ||
ereg($entry, $comment['comment_text'])) {
return true;
}
}
}
return false;
}
function gallery_syslog($message) {
global $gallery;
if (isset($gallery->app->useSyslog) && $gallery->app->useSyslog == "yes") {
define_syslog_variables();
openlog("gallery", LOG_NDELAY | LOG_PID, LOG_USER);
syslog(LOG_NOTICE, "(" . $gallery->app->photoAlbumURL . " [" . $gallery->version . "]) " . $message);
closelog();
}
}
function exec_internal($cmd) {
global $gallery;
$debugfile = '';
$status = '';
$results = array();
if (isDebugging()) {
debugMessage(sprintf(gTranslate('core', "Executing: %s"), $cmd), __FILE__, __LINE__);
$debugfile = tempnam($gallery->app->tmpDir, "dbg");
}
fs_exec($cmd, $results, $status, $debugfile);
if (isDebugging()) {
print "\n
". gTranslate('core', "Results:") ."
";
if ($results) {
print join("\n", $results);
} else {
print "" .gTranslate('core', "none") ."";
}
print "";
if (file_exists($debugfile)) {
print "\n
". gTranslate('core', "Debug messages:") ." ";
if ($fd = fs_fopen($debugfile, "r")) {
while (!feof($fd)) {
$buf = fgets($fd, 4096);
print $buf;
}
fclose($fd);
}
unlink($debugfile);
print "";
}
print "\n
". sprintf(gTranslate('core', "Status: %s (expected %s)"),
$status, $gallery->app->expectedExecStatus);
}
return array($results, $status);
}
function exec_wrapper($cmd) {
global $gallery;
list($results, $status) = exec_internal($cmd);
if ($status == $gallery->app->expectedExecStatus) {
return true;
} else {
if ($results) {
echo '
'. gallery_error("") . join("
", $results) .'
';
}
return false;
}
}
function getDimensions($file) {
global $gallery;
debugMessage(sprintf(gTranslate('core', "Getting Dimension of file: %s"), $file), __FILE__, __LINE__, 2);
if (! fs_file_exists($file)) {
debugMessage(gTranslate('core', "The file does not exist ?!"), __FILE__, __LINE__);
return array(0, 0);
}
list($width, $height) = getimagesize($file);
if ($width > 1 && $height > 1) {
debugMessage(sprintf(gTranslate('core', "Dimensions: x: %d y: %d"), $width, $height), __FILE__, __LINE__, 3);
return array($width, $height);
}
debugMessage(sprintf(gTranslate('core', "PHP's %s function is unable to determine dimensions."), "getimagesize()"), __FILE__, __LINE__);
/* Just in case php can't determine dimensions. */
switch($gallery->app->graphics) {
case 'NetPBM':
list($lines, $status) = exec_internal(toPnmCmd($file) ." | ".
NetPBM('pnmfile', '--allimages'));
break;
case "ImageMagick":
/* This fails under windows, IM isn't returning parsable status output. */
list($lines, $status) = exec_internal(ImCmd('identify', '', fs_import_filename($file)));
break;
default:
echo debugMessage(gTranslate('core', "You have no graphics package configured for use!"));
return array(0, 0);
break;
}
if ($status == $gallery->app->expectedExecStatus) {
foreach ($lines as $line) {
switch($gallery->app->graphics) {
case 'NetPBM':
if (ereg("([0-9]+) by ([0-9]+)", $line, $regs)) {
return array($regs[1], $regs[2]);
}
break;
case 'ImageMagick':
if (ereg("([0-9]+)x([0-9]+)", $line, $regs)) {
return array($regs[1], $regs[2]);
}
break;
}
}
}
debugMessage(gTranslate('core', "Unable to determine image dimensions!"), __FILE__, __LINE__);
return array(0, 0);
}
function acceptableFormat($tag) {
return (isImage($tag) || isMovie($tag));
}
function acceptableFormatRegexp() {
return "(?:" . join("|", acceptableFormatList()) . ")";
}
function acceptableMovieList() {
return array('asx', 'asf', 'avi', 'mpg', 'mpeg', 'mp2', 'wmv', 'mov', 'qt', 'swf', 'mp4', 'rm', 'ram');
}
function acceptableImageList() {
return array('jpg', 'jpeg', 'gif', 'png');
}
function acceptableFormatList() {
return array_merge(acceptableImageList(), acceptableMovieList());
}
function isImage($tag) {
$tag = strtolower($tag);
return in_array($tag, acceptableImageList());
}
function isMovie($tag) {
$tag = strtolower($tag);
return in_array($tag, acceptableMovieList());
}
function getFile($fname, $legacy=false) {
$tmp = "";
if (!fs_file_exists($fname) || broken_link($fname)) {
return $tmp;
}
if (function_exists("file_get_contents")) {
return fs_file_get_contents($fname);
}
if ($legacy) {
$modes = "rt";
} else {
$modes = "rb";
}
if ($fd = fs_fopen($fname, $modes)) {
while (!feof($fd)) {
$tmp .= fread($fd, 65536);
}
fclose($fd);
}
return $tmp;
}
function my_flush() {
print str_repeat(" ", 4096); // force a flush
}
function correctPseudoUsers(&$array, $ownerUid) {
global $gallery;
/*
* If EVERYBODY is in the list, reduce it to just that entry.
*/
$everybody = $gallery->userDB->getEverybody();
if (!empty($array[$everybody->getUid()])) {
$array = array($everybody->getUid() => $everybody->getUsername());
return;
}
/*
* If LOGGEDIN is in the list, reduce it to just that entry.
*/
$loggedIn = $gallery->userDB->getLoggedIn();
if (!empty($array[$loggedIn->getUid()])) {
$array = array($loggedIn->getUid() => $loggedIn->getUsername());
return;
}
/*
* If the list has more than one entry, remove the NOBODY user.
*/
$nobody = $gallery->userDB->getNobody();
if (count($array) > 1) {
unset($array[$nobody->getUid()]);
}
/*
* If the list has no entries, insert the NOBODY user *unless* the
* owner is the EVERYBODY user, in which case specify EVERYBODY.
*/
if (count($array) == 0) {
if (!strcmp($ownerUid, $everybody->getUid())) {
$array = array($everybody->getUid() => $everybody->getUsername());
} else {
$array[$nobody->getUid()] = $nobody->getUsername();
}
}
}
/**
* Checks wether our Gallery configuration is configured
*
* @return mixed NULL, 'unconfigured', 'reconfigure'
*/
function gallerySanityCheck() {
global $gallery, $GALLERY_OK;
if (!empty($gallery->backup_mode)) {
return NULL;
}
setGalleryPaths();
if (!fs_file_exists(GALLERY_CONFDIR . "/config.php") ||
broken_link(GALLERY_CONFDIR . "config.php") ||
!$gallery->app) {
$GALLERY_OK = false;
return 'unconfigured';
}
if ($gallery->app->config_version != $gallery->config_version) {
$GALLERY_OK = false;
return 'reconfigure';
}
$GALLERY_OK = true;
return NULL;
}
function preprocessImage($dir, $file) {
if (!fs_file_exists("$dir/$file") || broken_link("$dir/$file")) {
return 0;
}
/*
* Check to see if it starts with a mime-type header, eg:
*
* Content-Type: image/pjpeg\n\n
*
* If so, remove everything up to and including the last
* newline
*/
if ($fd = fs_fopen("$dir/$file", "rb")) {
// Read the first line
$line = fgets($fd, 4096);
// Does it look like a content-type string?
if (strstr($line, "Content-Type:")) {
// Skip till we find a line by itself.
do {
$line = fgets($fd, 4096);
} while (!feof($fd) && ord($line) != 13 && ord($line) != 10);
// Dump the rest to a file
$tempfile = tempnam($dir, $file);
if ($newfd = fs_fopen($tempfile, "wb", 0755)) {
while (!feof($fd)) {
/*
* Copy the rest of the file. Specify a length
* to fwrite so that we ignore magic_quotes.
*/
fwrite($newfd, fread($fd, 64*1024), 64*1024+1);
}
fclose($newfd);
$success = fs_rename($tempfile, "$dir/$file");
if (!$success) {
echo gallery_error("Couldn't move $tempfile -> $dir/$file");
fs_unlink($tempfile);
}
} else {
echo gallery_error(sprintf(gTranslate('core', "Can't write to %s."),
$tempfile));
}
chmod("$dir/$file", 0644);
}
fclose($fd);
} else {
echo gallery_error(sprintf(gTranslate('core', "Can't read %s."), "$dir/$file"));
}
return 1;
}
/**
* This function checks wether we are debugging with a given level.
* If no level is given, it just returns wether we are debugging or not.
* Debug is indicated by a debuglevel greater then 0
* @param integer $level
* @return boolean
*/
function isDebugging($level = NULL) {
global $gallery;
if (isset($gallery->app->debuglevel)) {
if($gallery->app->debuglevel > 0) {
if(isset($level) && $gallery->app->debuglevel < $level) {
return false;
}
return true;
}
else {
return false;
}
}
else {
return false;
}
}
function getNextPhoto($idx, $album=NULL) {
global $gallery;
if (!$album) {
$album = $gallery->album;
}
$numPhotos = $album->numPhotos(1);
$idx++;
if ($idx > $numPhotos) {
return $idx;
}
// If it's not an album or hidden, or the user is an admin, show it to them.
if ((!$album->isAlbum($idx) && !$album->isHidden($idx)) || $gallery->user->isAdmin()) {
return $idx;
}
// Check rights to album
if ($album->isAlbum($idx)) {
$myAlbum =& $album->getNestedAlbum($idx, false);
// Owners can always see their own content
if ($gallery->user->isOwnerOfAlbum($myAlbum)) {
return $idx;
}
// No rights? getNextPhoto
if (!$gallery->user->canReadAlbum($myAlbum)) {
return getNextPhoto($idx, $album);
}
}
// Visible Album or Hidden Photo/Album
if (!$album->isHidden($idx)) {
// Visible album - allow all
return $idx;
} else {
if ($gallery->user->isOwnerOfAlbum($album)) {
// Does the user own the current album?
// Owners can always see at least the first level of sub-content
return $idx;
} elseif ($album->getItemOwnerModify() && $album->isItemOwner($gallery->user->getUid(), $idx)) {
// Hidden photo - allow the owner to see it (hidden sub-albums are covered
// in the album rights block by isOwnerOfAlbum)
return $idx;
} else {
// Hidden photo or album - disallow all others
return getNextPhoto($idx, $album);
}
}
}
/**
* This function checks which tool
* can we use for getting exif data from a photo.
* returns false when no way works.
* @return mixed
* @author Jens Tkotz app->exiftags)) {
return 'exiftags';
} elseif (isset($gallery->app->use_exif)) {
return 'jhead';
} else {
return false;
}
}
/**
* This function does not really looks if EXIF Data is there or not.
* It just looks at the extension.
* @package string $file
* @return boolean
* @author Jens Tkotz
*/
function hasExif($file) {
if(eregi('jpe?g$', $file)) {
return true;
} else {
return false;
}
}
/**
* If an exiftool is installed then gallery tries to pull out EXIF Data.
* Only fields with data are returned.
*/
function getExif($file) {
global $gallery;
$return = array();
$myExif = array();
$unwantedFields = array();
switch(getExifDisplayTool()) {
case 'exiftags':
if (empty($gallery->app->exiftags)) {
break;
}
$path = $gallery->app->exiftags;
list($return, $status) = @exec_internal(fs_import_filename($path, 1) .' -au '.
fs_import_filename($file, 1));
break;
case 'jhead':
if (empty($gallery->app->use_exif)) {
break;
}
$path = $gallery->app->use_exif;
list($return, $status) = @exec_internal(fs_import_filename($path, 1) .' -v ' .
fs_import_filename($file, 1));
$unwantedFields = array('File name');
break;
default:
return array(false,'');
break;
}
if ($status == 0) {
foreach ($return as $value) {
$value = trim($value);
if (!empty($value)) {
$explodeReturn = explode(':', $value, 2);
$exifDesc = trim(htmlentities($explodeReturn[0]));
$exifData = trim(htmlentities($explodeReturn[1]));
if(!empty($exifData) && !in_array($exifDesc, $unwantedFields)) {
if (isset($myExif[$exifDesc])) {
$myExif[$exifDesc] .= "
";
} else {
$myExif[$exifDesc] = '';
}
$myExif[$exifDesc] .= trim($exifData);
}
}
}
}
return array($status, $myExif);
}
/**
* This function tries to get the ItemCaptureDate from Exif Data.
* If exif is not supported, or no date was gotten, then the file creation date is returned.
* Note: i used switch/case because this is easier to extend later.
*/
function getItemCaptureDate($file) {
$success = false;
$exifSupported = getExifDisplayTool();
if ($exifSupported) {
$return = getExif($file);
$exifData = $return[1];
switch($exifSupported) {
case 'exiftags':
if (isset($exifData['Image Created'])) {
$tempDate = split(" ", $exifData['Image Created'], 2);
}
break;
case 'jhead':
if (isset($exifData['Date/Time'])) {
$tempDate = split(" ", $exifData['Date/Time'], 2);
}
break;
}
if (isset($tempDate)) {
$tempDay = strtr($tempDate[0], ':', '-');
$tempTime = $tempDate[1];
$itemCaptureTimeStamp = strtotime("$tempDay $tempTime");
if ($itemCaptureTimeStamp != 0) {
$success = true;
}
}
}
// we were not able to get the capture date from exif... use file creation time
if (!$success) {
$itemCaptureTimeStamp = filemtime($file);
}
if (!isDebugging()) {
sprintf (gTranslate('core', "Item Capture Date : %s"), strftime('%Y', $itemCaptureTimeStamp));
}
return $itemCaptureTimeStamp;
}
function doCommand($command, $args = array(), $returnTarget = '', $returnArgs = array()) {
if ($returnTarget) {
$args["return"] = urlencode(makeGalleryHeaderUrl($returnTarget, $returnArgs));
}
$args["cmd"] = $command;
return makeGalleryUrl('popups/do_command.php', $args);
}
function breakString($buf, $desired_len=40, $space_char=' ', $overflow=5) {
$result = '';
$col = 0;
for ($i = 0; $i < strlen($buf); $i++, $col++) {
$result .= $buf{$i};
if (($col > $desired_len && $buf{$i} == $space_char) ||
($col > $desired_len + $overflow)) {
$col = 0;
$result .= '
';
}
}
return $result;
}
function padded_range_array($start, $end) {
$arr = array();
for ($i = $start; $i <= $end; $i++) {
$val = sprintf("%02d", $i);
$arr[$val] = $i;
}
return $arr;
}
function safe_serialize($obj, $file) {
global $gallery;
if (!strcmp($gallery->app->use_flock, "yes")) {
/* Acquire an advisory lock */
$lockfd = fs_fopen("$file.lock", "a+");
if (!$lockfd) {
echo gallery_error(sprintf(gTranslate('core', "Could not open lock file (%s) for writing!"),
"$file.lock"));
return 0;
}
if (!flock($lockfd, LOCK_EX)) {
echo gallery_error(sprintf(gTranslate('core', "Could not acquire lock (%s)!"),
"$file.lock"));
return 0;
}
}
/*
* Don't use tempnam because it may create a file on a different
* partition which would cause rename() to fail. Instead, create our own
* temporary file.
*/
$i = 0;
do {
$tmpfile = "$file.$i";
$i++;
} while (fs_file_exists($tmpfile));
if ($fd = fs_fopen($tmpfile, "wb")) {
$buf = serialize($obj);
$bufsize = strlen($buf);
$count = fwrite($fd, $buf);
fclose($fd);
if ($count != $bufsize || fs_filesize($tmpfile) != $bufsize) {
/* Something went wrong! */
$success = 0;
} else {
/*
* Make the current copy the backup, and then
* write the new current copy. There's a
* potential race condition here if the
* advisory lock (above) fails; two processes
* may try to do the initial rename() at the
* same time. In that case the initial rename
* will fail, but we'll ignore that. The
* second rename() will always go through (and
* the second process's changes will probably
* overwrite the first process's changes).
*/
if (fs_file_exists($file)) {
fs_rename($file, "$file.bak");
}
fs_rename($tmpfile, $file);
$success = 1;
}
} else {
$success = 0;
}
if (!strcmp($gallery->app->use_flock, "yes")) {
flock($lockfd, LOCK_UN);
}
return $success;
}
/**
* This function left in place to support patches that use it, but please use
* lastCommentDate functions in classes Album and AlbumItem.
*/
function mostRecentComment($album, $i) {
$id = $album->getPhotoId($i);
$index = $album->getPhotoIndex($id);
$recentcomment = $album->getComment($index, $album->numComments($i));
return $recentcomment->getDatePosted();
}
function ordinal($num = 1) {
$ords = array("th","st","nd","rd");
$val = $num;
if ((($num%=100)>9 && $num<20) || ($num%=10)>3) $num=0;
return "$val" . $ords[$num];
}
/**
* Extracts the extension of a given filename and returns it in lower chars.
* @param string $filename
* @return string $ext
* @author Jens Tkotz
*/
function getExtension($filename) {
$ext = ereg_replace(".*\.([^\.]*)$", "\\1", $filename);
$ext = strtolower($ext);
echo debugMessage(sprintf(gTranslate('core', "extension of file %s is %s"), basename($filename), $ext), __FILE__, __LINE__, 3);
return $ext;
}
function acceptableArchiveList() {
return array('zip', 'rar');
}
function acceptableArchive($ext) {
if (in_array($ext, acceptableArchiveList())) {
return true;
} else {
return false;
}
}
/**
* This function checks wether an archive can be decompressed via Gallery
* It just uses the filename extension.
* If the extension is handable the de/compressing tool is returned
* @param string $ext
* @return mixed $tool String containting the tool that handles $ext, FALSE when unsupported.
* @author Jens Tkotz
*/
function canDecompressArchive($ext) {
global $gallery;
$tool = false;
$ext = strtolower($ext);
switch ($ext) {
case 'zip':
if ($gallery->app->feature["zip"] == 1) {
$tool = 'zip';
}
break;
case 'rar':
if (!empty($gallery->app->rar)) {
$tool = 'rar';
}
break;
default:
/* Extension not supported, $tool stays fals */
break;
}
return $tool;
}
/**
* This function checks wether an archive can be created via Gallery
* It just uses the filename extension.
* If the extension is handable the de/compressing tool is returned
* @param string $ext
* @return mixed The tool which can create an archive with type $ext, or false.
* @author Jens Tkotz
*/
function canCreateArchive($ext = 'zip') {
global $gallery;
$ext = strtolower($ext);
if ($ext == 'zip' && !empty($gallery->app->zip)) {
return 'zip';
}
elseif ($ext == 'rar' && !empty($gallery->app->rar)) {
return 'rar';
}
else {
/* No suitable tool found */
return false;
}
}
function getArchiveFileNames($archive, $ext) {
global $gallery;
$cmd = '';
$files = array();
if ($tool = canDecompressArchive($ext)) {
$filename = fs_import_filename($archive);
switch ($tool) {
case 'zip':
$cmd = fs_import_filename($gallery->app->zipinfo) ." -1 ". $filename;
break;
case 'rar':
$cmd = fs_import_filename($gallery->app->rar) ." vb ". $filename;
break;
}
list($files, $status) = exec_internal($cmd);
if (!empty($files)) {
sort($files);
}
}
return $files;
}
/* extract a file into Gallery temp dir */
function extractFileFromArchive($archive, $ext, $file) {
global $gallery;
$cmd_pic_path = str_replace("[", "\[", $file);
$cmd_pic_path = str_replace("]", "\]", $cmd_pic_path);
if($tool = canDecompressArchive($ext)) {
echo debugMessage(sprintf(gTranslate('core', "Extracting: %s with %s"), $archive, $tool),__FILE__, __LINE__,3);
switch($tool) {
case 'zip':
$cmd = fs_import_filename($gallery->app->unzip) . " -j -o " .
fs_import_filename($archive) . ' ' . fs_import_filename($cmd_pic_path) .
' -d ' . fs_import_filename($gallery->app->tmpDir);
break;
case 'rar':
$cmd = fs_import_filename($gallery->app->rar) ." e ".
fs_import_filename($archive) .' -x '. fs_import_filename($cmd_pic_path) .' '.
fs_import_filename($gallery->app->tmpDir);
break;
}
return exec_wrapper($cmd);
}
else {
echo debugMessage(sprintf(gTranslate('core', "%s with extension %s is not an supported archive.", $archive, $ext)),__FILE__, __LINE__);
return false;
}
}
function createZip($folderName = '', $zipName = '', $deleteSource = true) {
global $gallery;
if ($folderName == '') {
return false;
}
$tool = canCreateArchive('zip');
if (! $tool) {
debugMessage(gTranslate('core', "No Support for creating Zips"), __FILE__, __LINE__, 2);
return false;
} else {
debugMessage(sprintf(gTranslate('core', "Creating Zip file with %s"), $tool), __FILE__, __LINE__, 2);
}
$tmpDir = $gallery->app->tmpDir .'/'. uniqid(rand());
if ($zipName == '') {
$fullZipName = 'gallery_zip.zip';
}
else {
$fullZipName = "$tmpDir/$zipName.zip";
}
if(! fs_mkdir($tmpDir)) {
echo gallery_error(
sprintf(gTranslate('core', "Your temp folder is not writeable! Please check permissions of this dir: %s"),
$gallery->app->tmpDir));
return false;
}
/* Keep Current Dir in mind */
$currentDir = getcwd();
/* Switch to the folder that content is going to be zipped */
chdir($folderName);
$cmd = fs_import_filename($gallery->app->zip) ." -r $fullZipName *";
if (! exec_wrapper($cmd)) {
echo gallery_error("Zipping failed");
/* Go back */
chdir($currentDir);
return false;
}
else {
/* Go back */
chdir($currentDir);
if($deleteSource) {
rmdirRecursive($folderName);
}
return $fullZipName;
}
}
function processNewImage($file, $ext, $name, $caption, $setCaption = '', $extra_fields=array(), $wmName="", $wmAlign=0, $wmAlignX=0, $wmAlignY=0, $wmSelect=0) {
global $gallery;
global $temp_files;
echo debugMessage(sprintf(gTranslate('core', "Processing file: %s"), $file), __FILE__, __LINE__,3);
/* Begin of code for the case the uploaded file is an archive */
if (acceptableArchive($ext)) {
processingMsg(sprintf(gTranslate('core', "Processing file '%s' as archive"), $name));
$tool = canDecompressArchive($ext);
if (!$tool) {
processingMsg(sprintf(gTranslate('core', "Skipping %s (%s support not enabled)"), $name, $ext));
echo "
";
return;
}
/*
* Figure out what files inside the archive we can handle.
* Put all Filenames into $files.
*/
echo debugMessage(gTranslate('core', "Getting archive content Filenames"), __FILE__, __LINE__);
$files = getArchiveFileNames($file, $ext);
/* Get meta data */
$image_info = array();
foreach ($files as $pic_path) {
$pic = basename($pic_path);
$tag = getExtension($pic);
if ($tag == 'csv') {
extractFileFromArchive($file, $ext, $pic_path);
$image_info = array_merge($image_info, parse_csv($gallery->app->tmpDir . "/$pic",";"));
}
}
if(!empty($image_info)) {
debugMessage(printMetaData($image_info), __FILE__, __LINE__);
}
else {
echo debugMessage(gTranslate('core', "No Metadata"), __FILE__, __LINE__);
}
/* Now process all valid files we found */
echo debugMessage(gTranslate('core', "Processing files in archive"), __FILE__, __LINE__);
$loop = 0;
foreach ($files as $pic_path) {
$loop++;
$pic = basename($pic_path);
$tag = getExtension($pic);
echo debugMessage(sprintf(gTranslate('core', "%d. %s"), $loop, $pic_path), __FILE__, __LINE__);
if (acceptableFormat($tag) || acceptableArchive($tag)) {
if(!extractFileFromArchive($file, $ext, $pic_path)) {
echo '
'. gallery_error(sprintf(gTranslate('core', "Could not extract %s"), $pic_path));
continue;
}
/* Now process the metadates. */
$extra_fields = array();
/* Find in meta data array */
$firstRow = 1;
$fileNameKey = "File Name";
/* $captionMetaFields will store the names (in order of priority to set caption to) */
$captionMetaFields = array("Caption", "Title", "Description", "Persons");
foreach ( $image_info as $info ) {
if ($firstRow) {
/* Find the name of the file name field */
foreach (array_keys($info) as $currKey) {
if (eregi("^\"?file\ ?name\"?$", $currKey)) {
$fileNameKey = $currKey;
}
}
$firstRow = 0;
}
if ($info[$fileNameKey] == $pic) {
/* Loop through fields */
foreach ($captionMetaFields as $field) {
/* If caption isn't populated and current field is */
if (!strlen($caption) && strlen($info[$field])) {
$caption = $info[$field];
}
}
$extra_fields = $info;
}
}
/* Don't use the second argument for $cmd_pic_path, because it is already quoted. */
processNewImage($gallery->app->tmpDir . "/$pic", $tag, $pic, $caption, $setCaption, $extra_fields, $wmName, $wmAlign, $wmAlignX, $wmAlignY, $wmSelect);
fs_unlink($gallery->app->tmpDir . "/$pic");
}
}
} else {
/* Its a single file
* remove %20 and the like from name
*/
$name = urldecode($name);
/* parse out original filename without extension */
$originalFilename = eregi_replace(".$ext$", "", $name);
/* replace multiple non-word characters with a single "_" */
$mangledFilename = ereg_replace("[^[:alnum:]]", "_", $originalFilename);
/* Get rid of extra underscores */
$mangledFilename = ereg_replace("_+", "_", $mangledFilename);
$mangledFilename = ereg_replace("(^_|_$)", "", $mangledFilename);
if (empty($mangledFilename)) {
$mangledFilename = $gallery->album->newPhotoName();
}
/*
* need to prevent users from using original filenames that are purely numeric.
* Purely numeric filenames mess up the rewriterules that we use for mod_rewrite
* specifically:
* RewriteRule ^([^\.\?/]+)/([0-9]+)$ /~jpk/gallery/view_photo.php?set_albumName=$1&index=$2 [QSA]
*/
if (ereg("^([0-9]+)$", $mangledFilename)) {
$mangledFilename .= "_G";
}
set_time_limit($gallery->app->timeLimit);
if (acceptableFormat($ext)) {
/*
* Move the uploaded image to our temporary directory
* using move_uploaded_file so that we work around
* issues with the open_basedir restriction.
*/
if (function_exists('move_uploaded_file')) {
$newFile = tempnam($gallery->app->tmpDir, "gallery");
if (move_uploaded_file($file, $newFile)) {
$file = $newFile;
}
/* Make sure we remove this file when we're done */
$temp_files[$newFile] = 1;
}
/* What should the caption be, if no caption was given by user ?
* See captionOptions.inc.php for options
*/
if (isset($gallery->app->dateTimeString)) {
$dateTimeFormat = $gallery->app->dateTimeString;
} else {
$dateTimeFormat = "%D %T";
}
if (empty($caption)) {
switch ($setCaption) {
case 0:
$caption = '';
break;
case 1:
default:
/* Use filename */
$caption = strtr($originalFilename, '_', ' ');
break;
case 2:
/* Use file cration date */
$caption = strftime($dateTimeFormat, filectime($file));
break;
case 3:
/* Use capture date */
$caption = strftime($dateTimeFormat, getItemCaptureDate($file));
break;
}
}
echo "\n******". sprintf(gTranslate('core', "Adding %s"), $name) ."*****
";
/* After all the preprocessing, NOW ADD THE element
* function addPhoto($file, $tag, $originalFilename, $caption, $pathToThumb="", $extraFields=array(), $owner="", $votes=NULL,
* $wmName="", $wmAlign=0, $wmAlignX=0, $wmAlignY=0, $wmSelect=0)
*/
$err = $gallery->album->addPhoto(
$file,
$ext,
$mangledFilename,
$caption,
'',
$extra_fields,
$gallery->user->uid,
NULL,
$wmName, $wmAlign, $wmAlignX, $wmAlignY, $wmSelect
);
if ($err) {
processingMsg(gallery_error($err));
processingMsg("". sprintf(gTranslate('core', "Need help? Look in the %s%s FAQ%s"),
'', Gallery(), '') .
"");
}
} else {
processingMsg(sprintf(gTranslate('core', "Skipping %s (can't handle %s format)"), $name, $ext));
}
}
}
function escapeEregChars($string) {
return ereg_replace('(\.|\\\\|\+|\*|\?|\[|\]|\^|\$|\(|\)|\{|\}|\=|\!|<|>|\||\:)', '\\\\1', $string);
}
function findInPath($program) {
$path = explode(':', getenv('PATH'));
foreach ($path as $dir) {
if (fs_file_exists("$dir/$program")) {
return "$dir/$program";
}
}
return false;
}
/**
* Return the Version number of ImageMagick, identified by "convert -version"
* @return $version string Versionnumber as string
*/
function getImVersion() {
global $gallery;
$version = array();
exec($gallery->app->ImPath .'/convert -version', $results);
$pieces = explode(' ', $results[0]);
$version = $pieces[2];
return $version;
}
define("OS_WINDOWS", "win");
define("OS_LINUX", "linux");
define("OS_SUNOS", "SunOS");
define("OS_OTHER", "other");
function getOS () {
if (substr(PHP_OS, 0, 3) == 'WIN') {
return OS_WINDOWS;
} elseif ( stristr(PHP_OS, "linux")) {
return OS_LINUX;
} elseif ( stristr(PHP_OS, "SunOS")) {
return OS_SUNOS;
} else {
return OS_OTHER;
}
}
function generate_password($len = 10) {
$result = '';
$alpha = 'abcdefghijklmnopqrstuvwxyz' .
'0123456789' .
'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$size = strlen($alpha) - 1;
$used = array();
while ($len--) {
$random = mt_rand(0, $size);
$char = $alpha[$random];
// No duplicate characters.
if (in_array($char, $used, true)) {
$len++;
continue;
}
$used[] = $char;
$result .= $char;
}
return $result;
}
function pretty_password($pass, $print, $pre = ' ') {
$idx = -1;
$len = strlen($pass);
if ($print === true) {
$result = "Your password is: $pass\n\n";
} else {
$result = '';
}
while (++$idx < $len) {
if (ereg('[[:upper:]]', $pass[$idx])) {
$result .= $pre . $pass[$idx] .
' = Uppercase letter ' . $pass[$idx] . "\n";
} elseif (ereg('[[:lower:]]', $pass[$idx])) {
$result .= $pre . $pass[$idx] .
' = Lowercase letter ' . $pass[$idx] . "\n";
} elseif (ereg('[[:digit:]]', $pass[$idx])) {
$result .= $pre . $pass[$idx] .
' = Numerical number ' . $pass[$idx] . "\n";
} else {
$result .= $pre . $pass[$idx] .
' = ASCII Character ' . $pass[$idx] . "\n";
}
}
return "$result\n";
}
function logMessage ($msg, $logfile) {
if ($fd = fs_fopen($logfile, "a")) {
fwrite($fd, strftime("%Y/%m/%d %H:%M.%S: $msg\n"));
fclose($fd);
}
elseif (isDebugging()) {
print sprintf(gTranslate('core', "Cannot open logfile: %s"), $logfile);
}
}
/* simplify condition tests */
function testRequirement($test) {
global $gallery;
if(substr($test, 0,1 ) == "!") {
$test = substr($test, 1);
$negativeTest = true;
}
else {
$negativeTest = false;
}
switch ($test) {
case 'albumIsRoot':
$result = $gallery->album->isRoot();
break;
case 'isAdminOrAlbumOwner':
$result = $gallery->user->isAdmin() || $gallery->user->isOwnerOfAlbum($gallery->album);
break;
case 'comments_enabled':
$result = $gallery->app->comments_enabled == 'yes';
break;
case 'allowComments':
$result = $gallery->album->fields["perms"]['canAddComments'];
break;
case 'hasComments':
$result = ($gallery->album->lastCommentDate("no") != -1);
break;
case 'canAddToAlbum':
$result = $gallery->user->canAddToAlbum($gallery->album);
break;
case 'canDeleteAlbum':
$result = $gallery->user->canDeleteAlbum($gallery->album);
break;
case 'extraFieldsExist':
$extraFields = $gallery->album->getExtraFields();
$result = !empty($extraFields);
break;
case 'isAlbumOwner':
$result = $gallery->user->isOwnerOfAlbum($gallery->album);
break;
case 'canCreateSubAlbum':
$result = $gallery->user->canCreateSubAlbum($gallery->album);
break;
case 'notOffline':
$result = !$gallery->session->offline;
break;
case 'canChangeText':
$result = $gallery->user->canChangeTextOfAlbum($gallery->album);
break;
case 'canWriteToAlbum':
$result = $gallery->user->canWriteToAlbum($gallery->album);
break;
case 'photosExist':
$result = $gallery->album->numPhotos(true);
break;
case 'watermarkingEnabled':
$result = isset($gallery->app->watermarkDir);
break;
default:
$result = false;
break;
}
if ($negativeTest) {
$result = ! $result;
}
return $result;
}
/**
* @return string $location Location where Gallery assmes the user. Can be 'core' or 'config'
* @author Jens Tkotz
*/
function where_i_am() {
global $GALLERY_OK;
if (!stristr($_SERVER['REQUEST_URI'],'setup') || $GALLERY_OK) {
$location = 'core';
} else {
$location = 'config';
}
return $location;
}
// Returns the CVS version as a string, NULL if file can't be read, or ""
// if version can't be found.
function getCVSVersion($file) {
$path= dirname(__FILE__) . "/$file";
if (!fs_file_exists($path)) {
return NULL;
}
if (!fs_is_readable($path)) {
return NULL;
}
$contents=file($path);
foreach ($contents as $line) {
if (ereg("\\\x24\x49\x64: [A-Za-z_.0-9]*,v ([0-9.]*) .*\x24$", trim($line), $matches) ||
ereg("\\\x24\x49\x64: [A-Za-z_.0-9]*,v ([0-9.]*) .*\x24 ", trim($line), $matches)) {
if ($matches[1]) {
return $matches[1];
}
}
}
return '';
}
// Returns the SVN revision as a string, NULL if file can't be read, or ""
// if version can't be found.
function getSVNRevision($file) {
$path = dirname(__FILE__) . "/$file";
if (!fs_file_exists($path)) {
return NULL;
}
if (!fs_is_readable($path)) {
return NULL;
}
$contents = file($path);
foreach ($contents as $line) {
if (ereg("\\\x24\x49\x64: [A-Za-z_.0-9-]* ([0-9]*) .*\x24$", trim($line), $matches) ||
ereg("\\\x24\x49\x64: [A-Za-z_.0-9-]* ([0-9]*) .*\x24 ", trim($line), $matches)) {
if ($matches[1]) {
return $matches[1];
}
}
}
return '';
}
/* Return -1 if old version is greater than new version, 0 if they are the
same and 1 if new version is greater.
*/
function compareVersions($old_str, $new_str) {
if ($old_str === $new_str) {
return 0;
}
$old=explode('.', $old_str);
$new=explode('.', $new_str);
foreach ($old as $old_number) {
$old_number=0+$old_number;
$new_number=0+array_shift($new);
if ($new_number == null) {
return -1;
}
if ($old_number == $new_number) {
continue;
}
if ($old_number > $new_number) {
return -1;
}
// if ($old_number < $new_number)
return 1;
}
if (count($new) == 0) {
return 0;
}
return 1;
}
function contextHelp ($link) {
global $gallery;
if ($gallery->app->showContextHelp == 'yes') {
return popup_link ('?', 'docs/context-help/' . $link, false, true, 500, 500);
} else {
return null;
}
}
function parse_csv ($filename, $delimiter=";") {
echo debugMessage(sprintf(gTranslate('core', "Parsing for csv data in file: %s"), $filename), __FILE__, __LINE__);
$maxLength = 1024;
$return_array = array();
if ($fd = fs_fopen($filename, "rt")) {
$headers = fgetcsv($fd, $maxLength, $delimiter);
while ($columns = fgetcsv($fd, $maxLength, $delimiter)) {
$i = 0;
$current_image = array();
foreach ($columns as $column) {
$current_image[$headers[$i++]] = $column;
}
$return_array[] = $current_image;
}
fclose($fd);
}
if(isDebugging()){
echo gTranslate('core', "csv result:");
print_r($return_array);
}
return $return_array;
}
/**
* This function strips slashes from an array Key
* e.g. $foo[\'bar\'] will become $foo['bar']
*
* @param array $arr
* @author Andrew Lindeman, 02/2004
*/
function key_strip_slashes (&$arr) {
$keys = array_keys ($arr);
foreach ($keys as $val) {
$tmpVal = stripslashes ($val);
if ($tmpVal != $val) {
$arr[$tmpVal] = $arr[$val];
unset ($arr[$val]);
}
if (is_array ($arr[$tmpVal])) {
key_strip_slashes ($arr[$tmpVal]);
}
}
}
function getExtraFieldsValues($index, $extra_fields, $full) {
global $gallery;
$photo = $gallery->album->getPhoto($index);
$automaticFields = automaticFieldsList();
$table = array();
foreach ($extra_fields as $key) {
if (isset($automaticFields[$key]) && $key != 'EXIF') {
if ($key == 'Upload Date') {
$table[$automaticFields[$key]] = strftime($gallery->app->dateTimeString , $gallery->album->getUploadDate($index));
}
if ($key == 'Capture Date') {
$itemCaptureDate = $gallery->album->getItemCaptureDate($index);
$table[$automaticFields[$key]] = strftime($gallery->app->dateTimeString , $itemCaptureDate);
}
if ($key == 'Dimensions') {
$dimensions = $photo->getDimensions($full);
$table[$automaticFields[$key]] = $dimensions[0]." x ".$dimensions[1]." (". ((int) $photo->getFileSize($full) >> 10) ."k)";
}
}
else {
$value = $gallery->album->getExtraField($index, $key);
if (!empty($value)) {
/* Might be look strange, but $key could be in translateableFields() */
$table[gTranslate('core', $key)] = str_replace("\n", "
", $value);
}
}
}
return $table;
}
if (!function_exists('glob')) {
function glob($pattern) {
$path_parts = pathinfo($pattern);
$pattern = '^' . str_replace(array('*', '?'), array('(.+)', '(.)'), $path_parts['basename'] . '$');
$dir = fs_opendir($path_parts['dirname']);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..' && ereg($pattern, $file)) {
$result[] = "{$path_parts['dirname']}/$file";
}
}
closedir($dir);
// my changes here
if (isset($result)) {
return $result;
}
return array();
}
}
function genGUID() {
return md5(uniqid(mt_rand(), true));
}
function calcVAdivDimension($frame, $iHeight, $iWidth, $borderwidth) {
global $gallery;
$thumbsize = $gallery->album->fields["thumb_size"];
// If the user has set their Gallery to display larger images,
// accomodate for it.
if (!($iHeight < $thumbsize && $iWidth < $thumbsize)) {
$thumbsize = max($iHeight, $iWidth);
}
switch ($frame) {
// special cases
case "none":
$divCellWidth = $thumbsize + 3;
$divCellAdd = 3;
break;
case "dots":
$divCellWidth = $thumbsize + 7;
$divCellAdd = 7;
break;
case "solid":
$divCellWidth = $thumbsize + $borderwidth + 3;
$divCellAdd = $borderwidth + 3;
break;
case "siriux":
$divCellWidth = $thumbsize + 15;
$divCellAdd = 15;
break;
default: // use frames directory or fallback to none.
if(array_key_exists($frame, available_frames())) {
require(dirname(__FILE__) . "/layout/frames/$frame/frame.def");
$divCellWidth = $thumbsize + $widthTL + $widthTR;
$divCellAdd = $heightTT + $heightBB;
}
else {
$divCellWidth = $thumbsize + 3;
$divCellAdd = 3;
}
break;
} // end of switch
// This is needed to keep smaller images centered
$padding=round(($thumbsize-$iHeight)/2,0);
$divCellHeight=$thumbsize-$padding*2+$divCellAdd;
/* For Debugging */
// echo "$divCellWidth, $divCellHeight, $padding";
return array ($divCellWidth, $divCellHeight, $padding);
}
/*
** Counts all Elements of an Array, but not the array(s) itself
** Code by A. Lindeman
*/
function recursiveCount (&$arr) {
$count = 0;
foreach ($arr as $element) {
if (is_array ($element)) {
$count += recursiveCount ($element);
} else {
$count++;
}
}
return $count;
}
/**
* Loads an array on extensions mapping to the mimetype
* Returns the mimetype according to the extension of given filename
* @param string $filename
* @return string $mimetype
* @author Jens Tkotz album->getAbsolutePhotoPath($ecard['photoIndex'], false);
$photo = $gallery->album->getPhoto($ecard['photoIndex']);
if($preview) {
$imageName = $gallery->album->getPhotoPath($ecard['photoIndex'], false);
$stampName = getImagePath('ecard_images/'. $ecard['stamp'] .'.gif');
}
else {
$imageName = $photo->getImageName(false);
$stampName = $ecard['stamp'] .'.gif';
}
list ($width, $height) = getDimensions($imagePath);
$widthReplace = ($width < 200) ? 'width="500"' : '';
$ecard_data = preg_replace ("/<%ecard_sender_email%>/", $ecard["email_sender"], $ecard_data);
$ecard_data = preg_replace ("/<%ecard_sender_name%>/", $ecard["name_sender"], $ecard_data);
$ecard_data = preg_replace ("/<%ecard_image_name%>/", $imageName, $ecard_data);
$ecard_data = preg_replace ("/<%ecard_message%>/", preg_replace ("/\r?\n/", "
\n", htmlspecialchars($ecard["message"])), $ecard_data);
$ecard_data = preg_replace ("/<%ecard_reciepient_email%>/", $ecard["email_recepient"], $ecard_data);
$ecard_data = preg_replace ("/<%ecard_reciepient_name%>/", $ecard["name_recepient"], $ecard_data);
$ecard_data = preg_replace ("/<%ecard_stamp%>/", $stampName, $ecard_data);
$ecard_data = preg_replace ("/<%ecard_width%>/", $widthReplace, $ecard_data);
return $ecard_data;
}
function send_ecard($ecard,$ecard_HTML_data,$ecard_PLAIN_data) {
global $gallery;
$ecard_pictures = array();
$photo = $gallery->album->getPhoto($ecard['photoIndex']);
$ecard_mail = new htmlMimeMail();
$imagePath = $gallery->album->getAbsolutePhotoPath($ecard['photoIndex'], false);
$imageName = $photo->getImageName(false);
$stampName = $ecard['stamp'] .'.gif';
$stampPath = getAbsoluteImagePath("ecard_images/$stampName");
$ecard_pictures[$imageName] = $imagePath;
$ecard_pictures[$stampName] = $stampPath;
foreach ($ecard_pictures as $pictureName => $picturePath) {
$picture = $ecard_mail->getFile($picturePath);
$ecard_mail->addHtmlImage($picture, $pictureName, getMimeType($picturePath));
}
/*
* Currently all other images in the template are ignored.
if (preg_match_all("/()/Uim", $ecard_HTML_data, $matchArray)) {
for ($i = 0; $i < count($matchArray[0]); ++$i) {
$ecard_image = $ecard_mail->getFile($matchArray[2][$i]);
}
}
*/
$ecard_mail->setHtml($ecard_HTML_data, $ecard_PLAIN_data);
$ecard_mail->setFrom($ecard["name_sender"] .' <'. $ecard["email_sender"] .'>');
if (empty($ecard['subject'])) {
$ecard['subject'] = sprintf(gTranslate('core', "%s sent you an E-C@rd."), $ecard["name_sender"]);
}
$ecard_mail->setSubject($ecard['subject']);
$ecard_mail->setReturnPath($ecard["email_sender"]);
$result = $ecard_mail->send(array($ecard["name_recepient"] .' <'. $ecard["email_recepient"] .'>'));
return $result;
}
/**
* This function is taken from
* http://www.phpinsider.com/smarty-forum/viewtopic.php?t=1079
*
* @param array $data The array that is going to be sorted.
* @param string $sortby Field which the array is sorted by
* @param string $order Either 'asc' or 'desc'
* @param boolean $caseSensitive
* @param boolean $keepIndexes if set to true, then uasort instead of usort is used.
*/
function array_sort_by_fields(&$data, $sortby, $order = 'asc', $caseSensitive = true, $keepIndexes = false, $special = false) {
static $sort_funcs = array();
static $code;
$order = ($order == 'asc') ? 1 : -1;
if (empty($sort_funcs[$sortby])) {
if ($special) {
$a = "\$a->fields[\"$sortby\"]";
$b = "\$b->fields[\"$sortby\"]";
}
else {
$a = "\$a['$sortby']";
$b = "\$b['$sortby']";
}
if ($caseSensitive) {
$code = "
$a = removeAccessKey($a);
$b = removeAccessKey($b);
if( $a == $b ) {
return 0;
};
if ( $a > $b ) {
return $order;
} else {
return -1 * $order;
}";
}
else {
$code = "
$a = removeAccessKey($a);
$b = removeAccessKey($b);
if(strtoupper($a) == strtoupper($b)) {
return 0;
};
if (strtoupper($a) > strtoupper($b)) {
return $order;
} else {
return -1 * $order;
}";
}
$sort_func = $sort_funcs[$sortby] = create_function('$a, $b', $code);
} else {
$sort_func = $sort_funcs[$sortby];
}
debugMessage($code, __FILE__, __LINE__, 3);
if($keepIndexes) {
uasort($data, $sort_func);
} else {
usort($data, $sort_func);
}
}
/**
* creates a copy of a album structure
* @param array $albumItemNames Array containing an albumstructure with absolute filenames.
* @param string $dir Optional dir, which can be used for recursice purpose.
* @return string $mixed In success the dirname as string, where the files copied to. Otherwise false.
* @author Jens Tkotz
*/
function createTempAlbum($albumItemNames = array(), $dir = '') {
global $gallery;
if(empty($albumItemNames)) {
return false;
}
$prefix = 'gallery_download_';
if (empty($dir)) {
$token = uniqid(rand());
$dir = $gallery->app->tmpDir .'/'. $prefix . $token;
}
if(! fs_mkdir($dir)) {
echo gallery_error(
sprintf(gTranslate('core', "Gallery was unable to create a tempory subfolder in your temp folder. Please check permissions of this dir: %s"),
$gallery->app->tmpDir));
return false;
}
foreach($albumItemNames as $possibleAlbumName => $filename) {
if(is_array($filename)) {
createTempAlbum($filename, "$dir/$possibleAlbumName");
}
else {
$destination = $dir .'/'. basename ($filename);
if(! fs_copy($filename, $destination)) {
echo gallery_error("Copy Failed");
}
}
}
return $dir;
}
function rmdirRecursive($dir) {
if($objs = glob($dir."/*")){
foreach($objs as $obj) {
if(is_dir($obj)) {
rmdirRecursive($obj);
}
else {
unlink($obj);
}
}
}
rmdir($dir);
}
function downloadFile($filename) {
global $gallery;
/* Verify its really a file */
if(!fs_is_file($filename) || broken_link($filename)) {
echo gallery_error(sprintf(gTranslate('core', "'%s' seems not to be a valid file. Download aborted."),
$filename));
return false;
}
/* Verify $filename is inside the temp dir */
$validFileName = strncmp($filename, $gallery->app->tmpDir, strlen($filename));
if($validFileName < 0) {
echo gallery_error(sprintf(gTranslate('core', "The file '%s' seems not inside Gallery tempdir %s, download aborted."),
$filename, $gallery->app->tmpDir));
return false;
}
elseif ($validFileName == 0 || dirname($filename) == $gallery->app->tmpDir) {
echo gallery_error(gTranslate('core', "We are trying to download the tempdir itself ?! Download aborted."));
return false;
}
$contentType = getMimeType($filename);
$size = fs_filesize($filename);
$fp = fopen($filename, 'r');
$filedata = fread($fp, $size);
fclose($fp);
header('Pragma: private');
header('Cache-control: private, must-revalidate');
header("Content-type: $contentType");
if ($size > 0) {
header("Content-Length: $size");
}
header('Content-Disposition: attachment; filename="'. basename($filename) .'"');
echo $filedata;
/* As downloadable files are always created in a subfolder of the tempdir,
* we delete this folder and its content
*/
rmdirRecursive(dirname($filename));
return true;
}
/**
* flats a multidimensional array done to a one-dimension array.
* keys get lost.
* @param array $array
* @return array $flatArray
* @author Jens Tkotz
*/
function array_flaten($array) {
$flatArray = array();
foreach($array as $value) {
if(is_array($value)) {
$flatArray = array_merge($flatArray, array_flaten($value));
}
else {
$flatArray[] = $value;
}
}
return $flatArray;
}
/**
* This function returns the Gallery Title as a string thats save to show in ...
*
* @param string $topic optional
* @return string $ret
* @author Jens Tkotz
*/
function clearGalleryTitle($topic = '') {
global $gallery;
$ret = strip_tags($gallery->app->galleryTitle);
if($topic != '') {
$ret .= ' :: ' . $topic;
}
return $ret;
}
require_once(dirname(__FILE__) . '/lib/lang.php');
require_once(dirname(__FILE__) . '/lib/Form.php');
require_once(dirname(__FILE__) . '/lib/voting.php');
require_once(dirname(__FILE__) . '/lib/album.php');
require_once(dirname(__FILE__) . '/lib/albumItem.php');
require_once(dirname(__FILE__) . '/lib/imageManipulation.php');
require_once(dirname(__FILE__) . '/lib/mail.php');
?>
Fatal error: Call to undefined function getos() in /home/andretz/Sites/algorithm.com.au/gallery/init.php on line 51