2013-02-26 01:09:40 +00:00
< ? php /** @file */
2013-01-26 02:13:15 +00:00
require_once ( 'include/permissions.php' );
2013-02-06 00:54:09 +00:00
require_once ( 'include/items.php' );
2013-04-26 03:01:24 +00:00
require_once ( 'include/photo/photo_driver.php' );
2013-01-26 02:13:15 +00:00
2014-08-13 01:08:31 +00:00
function photo_upload ( $channel , $observer , $args ) {
2013-01-26 02:13:15 +00:00
$ret = array ( 'success' => false );
$channel_id = $channel [ 'channel_id' ];
$account_id = $channel [ 'channel_account_id' ];
if ( ! perm_is_allowed ( $channel_id , $observer [ 'xchan_hash' ], 'post_photos' )) {
$ret [ 'message' ] = t ( 'Permission denied.' );
return $ret ;
}
call_hooks ( 'photo_upload_begin' , $args );
/**
* Determine the album to use
*/
$album = $args [ 'album' ];
$newalbum = $args [ 'newalbum' ];
logger ( 'photo_upload: album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG );
if ( ! $album ) {
if ( $newalbum )
$album = $newalbum ;
else
$album = datetime_convert ( 'UTC' , date_default_timezone_get (), 'now' , 'Y' );
}
/**
*
* We create a wall item for every photo , but we don ' t want to
* overwhelm the data stream with a hundred newly uploaded photos .
* So we will make the first photo uploaded to this album in the last several hours
* visible by default , the rest will become visible over time when and if
* they acquire comments , likes , dislikes , and / or tags
*
*/
$r = q ( " SELECT * FROM photo WHERE album = '%s' AND uid = %d AND created > UTC_TIMESTAMP() - INTERVAL 3 HOUR " ,
dbesc ( $album ),
intval ( $channel_id )
);
if (( ! $r ) || ( $album == t ( 'Profile Photos' )))
$visible = 1 ;
else
$visible = 0 ;
if ( intval ( $args [ 'not_visible' ]) || $args [ 'not_visible' ] === 'true' )
$visible = 0 ;
$str_group_allow = perms2str ((( is_array ( $args [ 'group_allow' ])) ? $args [ 'group_allow' ] : explode ( ',' , $args [ 'group_allow' ])));
$str_contact_allow = perms2str ((( is_array ( $args [ 'contact_allow' ])) ? $args [ 'contact_allow' ] : explode ( ',' , $args [ 'contact_allow' ])));
$str_group_deny = perms2str ((( is_array ( $args [ 'group_deny' ])) ? $args [ 'group_deny' ] : explode ( ',' , $args [ 'group_deny' ])));
$str_contact_deny = perms2str ((( is_array ( $args [ 'contact_deny' ])) ? $args [ 'contact_deny' ] : explode ( ',' , $args [ 'contact_deny' ])));
2014-08-13 01:08:31 +00:00
if ( $args [ 'data' ]) {
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
// allow an import from a binary string representing the image.
// This bypasses the upload step and max size limit checking
2014-08-13 01:08:31 +00:00
$imagedata = $args [ 'data' ];
2014-08-11 05:19:08 +00:00
$filename = $args [ 'filename' ];
$filesize = strlen ( $imagedata );
// this is going to be deleted if it exists
$src = '/tmp/deletemenow' ;
2014-08-13 01:08:31 +00:00
$type = $args [ 'type' ];
2013-01-26 02:13:15 +00:00
}
else {
2014-08-11 05:19:08 +00:00
$f = array ( 'src' => '' , 'filename' => '' , 'filesize' => 0 , 'type' => '' );
2014-01-23 07:54:14 +00:00
2014-08-11 05:19:08 +00:00
call_hooks ( 'photo_upload_file' , $f );
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
if ( x ( $f , 'src' ) && x ( $f , 'filesize' )) {
$src = $f [ 'src' ];
$filename = $f [ 'filename' ];
$filesize = $f [ 'filesize' ];
$type = $f [ 'type' ];
}
else {
$src = $_FILES [ 'userfile' ][ 'tmp_name' ];
$filename = basename ( $_FILES [ 'userfile' ][ 'name' ]);
$filesize = intval ( $_FILES [ 'userfile' ][ 'size' ]);
$type = $_FILES [ 'userfile' ][ 'type' ];
}
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
if ( ! $type )
$type = guess_image_type ( $filename );
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
logger ( 'photo_upload: received file: ' . $filename . ' as ' . $src . ' (' . $type . ') ' . $filesize . ' bytes' , LOGGER_DEBUG );
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
$maximagesize = get_config ( 'system' , 'maximagesize' );
if (( $maximagesize ) && ( $filesize > $maximagesize )) {
$ret [ 'message' ] = sprintf ( t ( 'Image exceeds website size limit of %lu bytes' ), $maximagesize );
@ unlink ( $src );
call_hooks ( 'photo_upload_end' , $ret );
return $ret ;
}
if ( ! $filesize ) {
$ret [ 'message' ] = t ( 'Image file is empty.' );
@ unlink ( $src );
call_hooks ( 'photo_post_end' , $ret );
return $ret ;
}
2013-01-26 02:13:15 +00:00
2014-08-11 05:19:08 +00:00
logger ( 'photo_upload: loading the contents of ' . $src , LOGGER_DEBUG );
$imagedata = @ file_get_contents ( $src );
}
2013-01-26 02:13:15 +00:00
2014-01-07 22:10:28 +00:00
$r = q ( " select sum(size) as total from photo where aid = %d and scale = 0 " ,
intval ( $account_id )
2013-01-26 02:13:15 +00:00
);
$limit = service_class_fetch ( $channel_id , 'photo_upload_limit' );
if (( $r ) && ( $limit !== false ) && (( $r [ 0 ][ 'total' ] + strlen ( $imagedata )) > $limit )) {
$ret [ 'message' ] = upgrade_message ();
@ unlink ( $src );
call_hooks ( 'photo_post_end' , $ret );
return $ret ;
}
2013-04-26 03:01:24 +00:00
$ph = photo_factory ( $imagedata , $type );
2013-01-26 02:13:15 +00:00
if ( ! $ph -> is_valid ()) {
$ret [ 'message' ] = t ( 'Unable to process image' );
logger ( 'photo_upload: unable to process image' );
@ unlink ( $src );
2013-03-21 22:30:51 +00:00
call_hooks ( 'photo_upload_end' , $ret );
2013-01-26 02:13:15 +00:00
return $ret ;
}
$ph -> orient ( $src );
@ unlink ( $src );
$max_length = get_config ( 'system' , 'max_image_length' );
if ( ! $max_length )
$max_length = MAX_IMAGE_LENGTH ;
if ( $max_length > 0 )
$ph -> scaleImage ( $max_length );
$width = $ph -> getWidth ();
$height = $ph -> getHeight ();
$smallest = 0 ;
2014-08-13 01:08:31 +00:00
$photo_hash = (( $args [ 'resource_id' ]) ? $args [ 'resource_id' ] : photo_new_resource ());
2013-01-26 02:13:15 +00:00
$visitor = '' ;
if ( $channel [ 'channel_hash' ] !== $observer [ 'xchan_hash' ])
$visitor = $observer [ 'xchan_hash' ];
$errors = false ;
2013-08-07 08:42:45 +00:00
$p = array ( 'aid' => $account_id , 'uid' => $channel_id , 'xchan' => $visitor , 'resource_id' => $photo_hash ,
'filename' => $filename , 'album' => $album , 'scale' => 0 , 'photo_flags' => PHOTO_NORMAL ,
'allow_cid' => $str_contact_allow , 'allow_gid' => $str_group_allow ,
'deny_cid' => $str_contact_deny , 'deny_gid' => $str_group_deny
);
2014-08-13 04:51:32 +00:00
if ( $args [ 'created' ])
$p [ 'created' ] = $args [ 'created' ];
if ( $args [ 'edited' ])
$p [ 'edited' ] = $args [ 'edited' ];
2014-08-13 23:34:36 +00:00
if ( $args [ 'title' ])
$p [ 'title' ] = $args [ 'title' ];
if ( $args [ 'description' ])
$p [ 'desciprion' ] = $args [ 'description' ];
2014-08-13 04:51:32 +00:00
2013-08-07 08:42:45 +00:00
$r1 = $ph -> save ( $p );
2013-01-26 02:13:15 +00:00
if ( ! $r1 )
$errors = true ;
if (( $width > 640 || $height > 640 ) && ( ! $errors )) {
$ph -> scaleImage ( 640 );
2013-08-07 08:42:45 +00:00
$p [ 'scale' ] = 1 ;
$r2 = $ph -> save ( $p );
2013-01-26 02:13:15 +00:00
$smallest = 1 ;
if ( ! $r2 )
$errors = true ;
}
if (( $width > 320 || $height > 320 ) && ( ! $errors )) {
$ph -> scaleImage ( 320 );
2013-08-07 08:42:45 +00:00
$p [ 'scale' ] = 2 ;
$r3 = $ph -> save ( $p );
2013-01-26 02:13:15 +00:00
$smallest = 2 ;
if ( ! $r3 )
$errors = true ;
}
2014-03-25 19:44:30 +00:00
2013-01-26 02:13:15 +00:00
if ( $errors ) {
q ( " delete from photo where resource_id = '%s' and uid = %d " ,
dbesc ( $photo_hash ),
intval ( $channel_id )
);
$ret [ 'message' ] = t ( 'Photo storage failed.' );
logger ( 'photo_upload: photo store failed.' );
2013-03-21 22:30:51 +00:00
call_hooks ( 'photo_upload_end' , $ret );
2013-01-26 02:13:15 +00:00
return $ret ;
}
2014-03-25 19:44:30 +00:00
// This will be the width and height of the smallest representation
$width_x_height = $ph -> getWidth () . 'x' . $ph -> getHeight ();
2013-01-26 02:13:15 +00:00
$basename = basename ( $filename );
2013-03-22 01:25:41 +00:00
$mid = item_message_id ();
2013-01-26 02:13:15 +00:00
// Create item container
$item_flags = ITEM_WALL | ITEM_ORIGIN | ITEM_THREAD_TOP ;
2013-02-06 00:54:09 +00:00
$item_restrict = (( $visible ) ? ITEM_VISIBLE : ITEM_HIDDEN );
2013-01-26 02:13:15 +00:00
$title = '' ;
2013-03-22 01:25:41 +00:00
$mid = item_message_id ();
2013-01-26 02:13:15 +00:00
$arr = array ();
$arr [ 'aid' ] = $account_id ;
$arr [ 'uid' ] = $channel_id ;
2013-03-22 01:25:41 +00:00
$arr [ 'mid' ] = $mid ;
$arr [ 'parent_mid' ] = $mid ;
2013-01-26 02:13:15 +00:00
$arr [ 'item_flags' ] = $item_flags ;
$arr [ 'item_restrict' ] = $item_restrict ;
$arr [ 'resource_type' ] = 'photo' ;
$arr [ 'resource_id' ] = $photo_hash ;
$arr [ 'owner_xchan' ] = $channel [ 'channel_hash' ];
$arr [ 'author_xchan' ] = $observer [ 'xchan_hash' ];
$arr [ 'title' ] = $title ;
$arr [ 'allow_cid' ] = $str_contact_allow ;
$arr [ 'allow_gid' ] = $str_group_allow ;
$arr [ 'deny_cid' ] = $str_contact_deny ;
$arr [ 'deny_gid' ] = $str_group_deny ;
2013-09-18 00:53:44 +00:00
$arr [ 'verb' ] = ACTIVITY_POST ;
2013-01-26 02:13:15 +00:00
2014-01-09 23:45:17 +00:00
$arr [ 'plink' ] = z_root () . '/channel/' . $channel [ 'channel_address' ] . '/?f=&mid=' . $arr [ 'mid' ];
2014-03-25 04:24:26 +00:00
if ( $width_x_height )
$tag = '[zmg=' . $width_x_height . ']' ;
else
$tag = '[zmg]' ;
2014-01-09 23:45:17 +00:00
2013-04-15 10:00:08 +00:00
$arr [ 'body' ] = '[zrl=' . z_root () . '/photos/' . $channel [ 'channel_address' ] . '/image/' . $photo_hash . ']'
2014-03-25 04:24:26 +00:00
. $tag . z_root () . " /photo/ { $photo_hash } - { $smallest } . " . $ph -> getExt () . '[/zmg]'
2013-04-15 10:00:08 +00:00
. '[/zrl]' ;
2013-01-26 02:13:15 +00:00
2013-09-11 02:06:06 +00:00
$result = item_store ( $arr );
$item_id = $result [ 'item_id' ];
2013-01-26 02:13:15 +00:00
if ( $visible )
proc_run ( 'php' , " include/notifier.php " , 'wall-new' , $item_id );
$ret [ 'success' ] = true ;
2014-09-17 02:07:19 +00:00
$ret [ 'item' ] = $arr ;
2013-02-06 00:54:09 +00:00
$ret [ 'body' ] = $arr [ 'body' ];
2013-02-06 04:14:19 +00:00
$ret [ 'resource_id' ] = $photo_hash ;
2013-01-26 02:13:15 +00:00
$ret [ 'photoitem_id' ] = $item_id ;
2013-03-21 22:30:51 +00:00
call_hooks ( 'photo_upload_end' , $ret );
2013-01-26 02:13:15 +00:00
return $ret ;
2013-01-26 07:32:44 +00:00
}
function photos_albums_list ( $channel , $observer ) {
2013-01-26 10:24:07 +00:00
$channel_id = $channel [ 'channel_id' ];
2013-01-26 07:32:44 +00:00
$observer_xchan = (( $observer ) ? $observer [ 'xchan_hash' ] : '' );
if ( ! perm_is_allowed ( $channel_id , $observer_xchan , 'view_photos' ))
return false ;
// FIXME - create a permissions SQL which works on arbitrary observers and channels, regardless of login or web status
$sql_extra = permissions_sql ( $channel_id );
2014-06-18 03:45:53 +00:00
$albums = q ( " SELECT count( distinct resource_id ) as total, album from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra group by album order by created desc " ,
2013-07-19 03:55:25 +00:00
intval ( $channel_id ),
intval ( PHOTO_NORMAL ),
intval ( PHOTO_PROFILE )
2013-01-26 07:32:44 +00:00
);
2013-01-26 10:24:07 +00:00
// add various encodings to the array so we can just loop through and pick them out in a template
2013-05-30 02:47:01 +00:00
$ret = array ( 'success' => false );
2013-01-26 10:24:07 +00:00
if ( $albums ) {
2013-05-30 02:47:01 +00:00
$ret [ 'success' ] = true ;
2014-06-18 23:26:27 +00:00
$ret [ 'albums' ] = array ();
2013-01-26 10:24:07 +00:00
foreach ( $albums as $k => $album ) {
2014-01-23 06:56:16 +00:00
$entry = array (
2014-06-18 03:45:53 +00:00
'text' => $album [ 'album' ],
'total' => $album [ 'total' ],
2014-01-23 06:56:16 +00:00
'url' => z_root () . '/photos/' . $channel [ 'channel_address' ] . '/album/' . bin2hex ( $album [ 'album' ]),
'urlencode' => urlencode ( $album [ 'album' ]),
'bin2hex' => bin2hex ( $album [ 'album' ]));
2014-06-18 23:26:27 +00:00
$ret [ 'albums' ][] = $entry ;
2013-01-26 10:24:07 +00:00
}
}
2013-05-30 02:47:01 +00:00
return $ret ;
2013-01-26 07:32:44 +00:00
}
2013-01-26 10:24:07 +00:00
function photos_album_widget ( $channelx , $observer , $albums = null ) {
$o = '' ;
2013-12-13 21:30:33 +00:00
// If we weren't passed an album list, see if the photos module
// dropped one for us to find in $a->data['albums'].
// If all else fails, load it.
if ( ! $albums ) {
if ( array_key_exists ( 'albums' , get_app () -> data ))
$albums = get_app () -> data [ 'albums' ];
else
$albums = photos_albums_list ( $channelx , $observer );
}
2013-01-26 10:24:07 +00:00
2014-06-18 23:26:27 +00:00
if ( $albums [ 'success' ]) {
2013-01-26 10:24:07 +00:00
$o = replace_macros ( get_markup_template ( 'photo_albums.tpl' ), array (
'$nick' => $channelx [ 'channel_address' ],
'$title' => t ( 'Photo Albums' ),
2014-06-18 23:26:27 +00:00
'$albums' => $albums [ 'albums' ],
2013-01-26 10:24:07 +00:00
'$baseurl' => z_root (),
'$upload' => (( perm_is_allowed ( $channelx [ 'channel_id' ],(( $observer ) ? $observer [ 'xchan_hash' ] : '' ), 'post_photos' ))
? t ( 'Upload New Photos' ) : '' )
));
}
return $o ;
2013-01-26 11:42:05 +00:00
}
2013-05-30 02:47:01 +00:00
function photos_list_photos ( $channel , $observer , $album = '' ) {
$channel_id = $channel [ 'channel_id' ];
$observer_xchan = (( $observer ) ? $observer [ 'xchan_hash' ] : '' );
if ( ! perm_is_allowed ( $channel_id , $observer_xchan , 'view_photos' ))
return false ;
$sql_extra = permissions_sql ( $channel_id );
if ( $album )
$sql_extra .= " and album = ' " . protect_sprintf ( dbesc ( $album )) . " ' " ;
$ret = array ( 'success' => false );
2013-12-23 02:37:39 +00:00
$r = q ( " select resource_id, created, edited, title, description, album, filename, type, height, width, size, scale, profile, photo_flags, allow_cid, allow_gid, deny_cid, deny_gid from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra " ,
2013-07-19 03:55:25 +00:00
intval ( $channel_id ),
intval ( PHOTO_NORMAL ),
intval ( PHOTO_PROFILE )
2013-05-30 02:47:01 +00:00
);
2013-12-19 23:23:36 +00:00
2013-05-30 02:47:01 +00:00
if ( $r ) {
2013-12-19 23:23:36 +00:00
for ( $x = 0 ; $x < count ( $r ); $x ++ ) {
$r [ $x ][ 'src' ] = z_root () . '/photo/' . $r [ $x ][ 'resource_id' ] . '-' . $r [ $x ][ 'scale' ];
}
2013-05-30 02:47:01 +00:00
$ret [ 'success' ] = true ;
$ret [ 'photos' ] = $r ;
}
return $ret ;
}
2013-01-26 11:42:05 +00:00
function photos_album_exists ( $channel_id , $album ) {
$r = q ( " SELECT id from photo where album = '%s' and uid = %d limit 1 " ,
dbesc ( $album ),
intval ( $channel_id )
);
return (( $r ) ? true : false );
}
function photos_album_rename ( $channel_id , $oldname , $newname ) {
return q ( " UPDATE photo SET album = '%s' WHERE album = '%s' AND uid = %d " ,
dbesc ( $newname ),
dbesc ( $oldname ),
intval ( $channel_id )
);
}
function photos_album_get_db_idstr ( $channel_id , $album , $remote_xchan = '' ) {
if ( $remote_xchan ) {
$r = q ( " SELECT distinct resource_id as from photo where xchan = '%s' and uid = %d and album = '%s' " ,
dbesc ( $remote_xchan ),
intval ( $channel_id ),
dbesc ( $album )
);
}
else {
$r = q ( " SELECT distinct resource_id from photo where uid = %d and album = '%s' " ,
intval ( $channel_id ),
dbesc ( $album )
);
}
if ( $r ) {
$arr = array ();
foreach ( $r as $rr ) {
$arr [] = " ' " . dbesc ( $rr [ 'resource_id' ]) . " ' " ;
}
$str = implode ( ',' , $arr );
return $str ;
}
return false ;
}
2013-02-02 09:58:11 +00:00
function photos_create_item ( $channel , $creator_hash , $photo , $visible = false ) {
// Create item container
$item_flags = ITEM_WALL | ITEM_ORIGIN | ITEM_THREAD_TOP ;
$item_restrict = (( $visible ) ? ITEM_HIDDEN : ITEM_VISIBLE );
$title = '' ;
2013-03-22 01:25:41 +00:00
$mid = item_message_id ();
2013-02-02 09:58:11 +00:00
$arr = array ();
$arr [ 'aid' ] = $channel [ 'channel_account_id' ];
$arr [ 'uid' ] = $channel [ 'channel_id' ];
2013-03-22 01:25:41 +00:00
$arr [ 'mid' ] = $mid ;
$arr [ 'parent_mid' ] = $mid ;
2013-02-02 09:58:11 +00:00
$arr [ 'item_flags' ] = $item_flags ;
$arr [ 'item_restrict' ] = $item_restrict ;
$arr [ 'resource_type' ] = 'photo' ;
$arr [ 'resource_id' ] = $photo [ 'resource_id' ];
$arr [ 'owner_xchan' ] = $channel [ 'channel_hash' ];
$arr [ 'author_xchan' ] = $creator_hash ;
$arr [ 'allow_cid' ] = $photo [ 'allow_cid' ];
$arr [ 'allow_gid' ] = $photo [ 'allow_gid' ];
$arr [ 'deny_cid' ] = $photo [ 'deny_cid' ];
$arr [ 'deny_gid' ] = $photo [ 'deny_gid' ];
2014-01-09 23:45:17 +00:00
$arr [ 'plink' ] = z_root () . '/channel/' . $channel [ 'channel_address' ] . '/?f=&mid=' . $arr [ 'mid' ];
2013-02-02 09:58:11 +00:00
2013-04-15 10:00:08 +00:00
$arr [ 'body' ] = '[zrl=' . z_root () . '/photos/' . $channel [ 'channel_address' ] . '/image/' . $photo [ 'resource_id' ] . ']'
2013-05-28 11:50:16 +00:00
. '[zmg]' . z_root () . '/photo/' . $photo [ 'resource_id' ] . '-' . $photo [ 'scale' ] . '[/zmg]'
2013-04-15 10:00:08 +00:00
. '[/zrl]' ;
2013-02-02 09:58:11 +00:00
2013-09-11 02:06:06 +00:00
$result = item_store ( $arr );
$item_id = $result [ 'item_id' ];
2013-02-02 09:58:11 +00:00
return $item_id ;
2014-03-22 20:10:26 +00:00
}