2010-07-01 19:48:07 -04:00
< ? php
2017-11-29 07:52:27 -05:00
/**
* @ file mod / profile_photo . php
*/
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2017-11-06 21:22:52 -05:00
use Friendica\Core\Config ;
2018-01-21 13:33:59 -05:00
use Friendica\Core\L10n ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2017-11-05 07:15:53 -05:00
use Friendica\Core\Worker ;
2017-11-07 22:57:46 -05:00
use Friendica\Database\DBM ;
2017-12-07 08:56:11 -05:00
use Friendica\Model\Photo ;
2018-01-14 21:22:39 -05:00
use Friendica\Model\Profile ;
2017-12-07 08:56:11 -05:00
use Friendica\Object\Image ;
2010-07-01 19:48:07 -04:00
2018-01-14 21:22:39 -05:00
function profile_photo_init ( App $a )
{
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2010-07-01 19:48:07 -04:00
return ;
}
2010-08-02 23:21:21 -04:00
2018-01-14 21:22:39 -05:00
Profile :: load ( $a , $a -> user [ 'nickname' ]);
2016-02-05 15:52:39 -05:00
}
2010-07-01 19:48:07 -04:00
2017-01-09 07:14:25 -05:00
function profile_photo_post ( App $a ) {
2010-07-01 19:48:07 -04:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2018-01-22 09:16:25 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2012-03-12 16:17:37 -04:00
return ;
}
2014-03-11 18:52:32 -04:00
2012-03-12 16:17:37 -04:00
check_form_security_token_redirectOnErr ( '/profile_photo' , 'profile_photo' );
2014-03-11 18:52:32 -04:00
2017-03-21 12:02:59 -04:00
if (( x ( $_POST , 'cropfinal' )) && ( $_POST [ 'cropfinal' ] == 1 )) {
2010-07-01 19:48:07 -04:00
2012-09-11 21:51:17 -04:00
// unless proven otherwise
$is_default_profile = 1 ;
2017-03-21 12:02:59 -04:00
if ( $_REQUEST [ 'profile' ]) {
2012-09-11 21:51:17 -04:00
$r = q ( " select id, `is-default` from profile where id = %d and uid = %d limit 1 " ,
intval ( $_REQUEST [ 'profile' ]),
intval ( local_user ())
);
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $r ) && ( ! intval ( $r [ 0 ][ 'is-default' ])))
2012-09-11 21:51:17 -04:00
$is_default_profile = 0 ;
2014-03-11 18:52:32 -04:00
}
2012-09-11 21:51:17 -04:00
2010-07-01 19:48:07 -04:00
// phase 2 - we have finished cropping
2010-07-19 22:09:58 -04:00
2017-03-21 12:02:59 -04:00
if ( $a -> argc != 2 ) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Image uploaded but image cropping failed.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2010-07-19 22:09:58 -04:00
$image_id = $a -> argv [ 1 ];
2017-03-21 12:02:59 -04:00
if ( substr ( $image_id , - 2 , 1 ) == '-' ) {
2010-07-01 19:48:07 -04:00
$scale = substr ( $image_id , - 1 , 1 );
$image_id = substr ( $image_id , 0 , - 2 );
}
2014-03-11 18:52:32 -04:00
2010-07-01 19:48:07 -04:00
$srcX = $_POST [ 'xstart' ];
$srcY = $_POST [ 'ystart' ];
$srcW = $_POST [ 'xfinal' ] - $srcX ;
$srcH = $_POST [ 'yfinal' ] - $srcY ;
2010-11-09 21:24:35 -05:00
2010-07-19 22:09:58 -04:00
$r = q ( " SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d AND `scale` = %d LIMIT 1 " ,
2010-07-01 19:48:07 -04:00
dbesc ( $image_id ),
2010-10-18 17:34:59 -04:00
dbesc ( local_user ()),
2010-07-01 19:48:07 -04:00
intval ( $scale ));
2010-07-19 22:09:58 -04:00
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $r )) {
2010-07-19 22:09:58 -04:00
$base_image = $r [ 0 ];
2017-12-07 08:56:11 -05:00
$Image = new Image ( $base_image [ 'data' ], $base_image [ 'type' ]);
if ( $Image -> isValid ()) {
$Image -> crop ( 175 , $srcX , $srcY , $srcW , $srcH );
2010-07-01 19:48:07 -04:00
2018-01-22 09:16:25 -05:00
$r = Photo :: store ( $Image , local_user (), 0 , $base_image [ 'resource-id' ], $base_image [ 'filename' ], L10n :: t ( 'Profile Photos' ), 4 , $is_default_profile );
2010-07-19 22:09:58 -04:00
2016-12-20 09:37:27 -05:00
if ( $r === false ) {
2018-01-22 09:16:25 -05:00
notice ( sprintf ( L10n :: t ( 'Image size reduction [%s] failed.' ), " 175 " ) . EOL );
2016-12-20 09:37:27 -05:00
}
2010-07-01 19:48:07 -04:00
2017-12-07 08:56:11 -05:00
$Image -> scaleDown ( 80 );
2010-07-19 22:09:58 -04:00
2018-01-22 09:16:25 -05:00
$r = Photo :: store ( $Image , local_user (), 0 , $base_image [ 'resource-id' ], $base_image [ 'filename' ], L10n :: t ( 'Profile Photos' ), 5 , $is_default_profile );
2015-11-13 02:45:14 -05:00
2016-12-20 09:37:27 -05:00
if ( $r === false ) {
2018-01-22 09:16:25 -05:00
notice ( sprintf ( L10n :: t ( 'Image size reduction [%s] failed.' ), " 80 " ) . EOL );
2016-12-20 09:37:27 -05:00
}
2010-10-04 19:04:52 -04:00
2017-12-07 08:56:11 -05:00
$Image -> scaleDown ( 48 );
2010-11-05 02:50:32 -04:00
2018-01-22 09:16:25 -05:00
$r = Photo :: store ( $Image , local_user (), 0 , $base_image [ 'resource-id' ], $base_image [ 'filename' ], L10n :: t ( 'Profile Photos' ), 6 , $is_default_profile );
2014-03-11 18:52:32 -04:00
2016-12-20 09:37:27 -05:00
if ( $r === false ) {
2018-01-22 09:16:25 -05:00
notice ( sprintf ( L10n :: t ( 'Image size reduction [%s] failed.' ), " 48 " ) . EOL );
2016-12-20 09:37:27 -05:00
}
2010-11-05 02:50:32 -04:00
2012-09-11 21:51:17 -04:00
// If setting for the default profile, unset the profile photo flag from any other photos I own
2017-03-21 12:02:59 -04:00
if ( $is_default_profile ) {
2012-09-11 21:51:17 -04:00
$r = q ( " UPDATE `photo` SET `profile` = 0 WHERE `profile` = 1 AND `resource-id` != '%s' AND `uid` = %d " ,
dbesc ( $base_image [ 'resource-id' ]),
intval ( local_user ())
);
2015-11-13 02:45:14 -05:00
$r = q ( " UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s' WHERE `self` AND `uid` = %d " ,
2017-12-07 08:56:11 -05:00
dbesc ( System :: baseUrl () . '/photo/' . $base_image [ 'resource-id' ] . '-4.' . $Image -> getExt ()),
dbesc ( System :: baseUrl () . '/photo/' . $base_image [ 'resource-id' ] . '-5.' . $Image -> getExt ()),
dbesc ( System :: baseUrl () . '/photo/' . $base_image [ 'resource-id' ] . '-6.' . $Image -> getExt ()),
2015-11-13 02:45:14 -05:00
intval ( local_user ())
);
} else {
2014-03-11 18:52:32 -04:00
$r = q ( " update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d " ,
2017-12-07 08:56:11 -05:00
dbesc ( System :: baseUrl () . '/photo/' . $base_image [ 'resource-id' ] . '-4.' . $Image -> getExt ()),
dbesc ( System :: baseUrl () . '/photo/' . $base_image [ 'resource-id' ] . '-5.' . $Image -> getExt ()),
2012-09-11 21:51:17 -04:00
intval ( $_REQUEST [ 'profile' ]),
intval ( local_user ())
);
}
// we'll set the updated profile-photo timestamp even if it isn't the default profile,
// so that browsers will do a cache update unconditionally
2010-10-04 19:04:52 -04:00
2014-03-11 18:52:32 -04:00
$r = q ( " UPDATE `contact` SET `avatar-date` = '%s' WHERE `self` = 1 AND `uid` = %d " ,
2010-10-04 19:04:52 -04:00
dbesc ( datetime_convert ()),
2010-10-18 17:34:59 -04:00
intval ( local_user ())
2010-10-04 19:04:52 -04:00
);
2018-01-21 13:33:59 -05:00
info ( L10n :: t ( 'Shift-reload the page or clear browser cache if the new photo does not display immediately.' ) . EOL );
2010-10-04 19:04:52 -04:00
// Update global directory in background
2017-08-26 03:32:10 -04:00
$url = System :: baseUrl () . '/profile/' . $a -> user [ 'nickname' ];
2017-11-06 21:22:52 -05:00
if ( $url && strlen ( Config :: get ( 'system' , 'directory' ))) {
2017-11-18 02:59:30 -05:00
Worker :: add ( PRIORITY_LOW , " Directory " , $url );
2016-12-20 05:36:03 -05:00
}
2011-10-20 08:43:33 -04:00
2017-11-19 11:59:37 -05:00
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' , local_user ());
2016-12-19 08:26:13 -05:00
} else {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Unable to process image' ) . EOL );
2016-12-19 08:26:13 -05:00
}
2010-07-01 19:48:07 -04:00
}
2010-11-09 21:24:35 -05:00
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/profiles' );
2010-07-19 22:09:58 -04:00
return ; // NOTREACHED
2010-07-01 19:48:07 -04:00
}
$src = $_FILES [ 'userfile' ][ 'tmp_name' ];
$filename = basename ( $_FILES [ 'userfile' ][ 'name' ]);
$filesize = intval ( $_FILES [ 'userfile' ][ 'size' ]);
2012-06-07 11:42:13 -04:00
$filetype = $_FILES [ 'userfile' ][ 'type' ];
2016-12-19 08:26:13 -05:00
if ( $filetype == " " ) {
2017-12-07 08:56:11 -05:00
$filetype = Image :: guessType ( $filename );
2016-12-19 08:26:13 -05:00
}
2017-11-29 12:17:12 -05:00
$maximagesize = Config :: get ( 'system' , 'maximagesize' );
2010-11-09 21:24:35 -05:00
2016-12-19 08:26:13 -05:00
if (( $maximagesize ) && ( $filesize > $maximagesize )) {
2018-01-22 09:16:25 -05:00
notice ( sprintf ( L10n :: t ( 'Image exceeds size limit of %s' ), formatBytes ( $maximagesize )) . EOL );
2010-11-09 21:24:35 -05:00
@ unlink ( $src );
return ;
}
2010-07-01 19:48:07 -04:00
$imagedata = @ file_get_contents ( $src );
2017-12-07 08:56:11 -05:00
$ph = new Image ( $imagedata , $filetype );
2010-07-01 19:48:07 -04:00
2017-11-29 12:17:12 -05:00
if ( ! $ph -> isValid ()) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Unable to process image.' ) . EOL );
2010-07-01 19:48:07 -04:00
@ unlink ( $src );
return ;
}
2012-07-08 11:18:05 -04:00
$ph -> orient ( $src );
2010-07-01 19:48:07 -04:00
@ unlink ( $src );
2011-02-04 04:18:28 -05:00
return profile_photo_crop_ui_head ( $a , $ph );
2010-07-01 19:48:07 -04:00
}
2017-01-09 07:14:25 -05:00
function profile_photo_content ( App $a ) {
2010-07-01 19:48:07 -04:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2010-07-19 22:09:58 -04:00
return ;
}
2017-01-09 07:14:25 -05:00
2011-04-23 20:31:23 -04:00
$newuser = false ;
2017-03-21 12:02:59 -04:00
if ( $a -> argc == 2 && $a -> argv [ 1 ] === 'new' )
2011-04-23 20:31:23 -04:00
$newuser = true ;
2017-03-21 12:02:59 -04:00
if ( $a -> argv [ 1 ] == 'use' ){
2011-02-04 04:18:28 -05:00
if ( $a -> argc < 3 ){
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2011-02-04 04:18:28 -05:00
return ;
};
2017-01-09 07:14:25 -05:00
2012-03-27 07:51:20 -04:00
// check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
2017-01-09 07:14:25 -05:00
2011-02-04 04:18:28 -05:00
$resource_id = $a -> argv [ 2 ];
//die(":".local_user());
$r = q ( " SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' ORDER BY `scale` ASC " ,
intval ( local_user ()),
dbesc ( $resource_id )
);
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )){
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2011-02-04 04:18:28 -05:00
return ;
}
2011-09-15 06:06:43 -04:00
$havescale = false ;
2016-12-20 15:15:53 -05:00
foreach ( $r as $rr ) {
2017-03-21 12:02:59 -04:00
if ( $rr [ 'scale' ] == 5 )
2011-09-15 06:06:43 -04:00
$havescale = true ;
}
2011-02-04 04:18:28 -05:00
// set an already uloaded photo as profile photo
// if photo is in 'Profile Photos', change it in db
2018-01-22 09:16:25 -05:00
if (( $r [ 0 ][ 'album' ] == L10n :: t ( 'Profile Photos' )) && ( $havescale )){
2011-02-04 04:18:28 -05:00
$r = q ( " UPDATE `photo` SET `profile`=0 WHERE `profile`=1 AND `uid`=%d " ,
intval ( local_user ()));
2014-03-11 18:52:32 -04:00
2011-02-04 04:18:28 -05:00
$r = q ( " UPDATE `photo` SET `profile`=1 WHERE `uid` = %d AND `resource-id` = '%s' " ,
intval ( local_user ()),
dbesc ( $resource_id )
);
2014-03-11 18:52:32 -04:00
$r = q ( " UPDATE `contact` SET `avatar-date` = '%s' WHERE `self` = 1 AND `uid` = %d " ,
2011-02-04 04:18:28 -05:00
dbesc ( datetime_convert ()),
intval ( local_user ())
);
2014-03-11 18:52:32 -04:00
2011-02-04 04:18:28 -05:00
// Update global directory in background
$url = $_SESSION [ 'my_url' ];
2017-11-06 21:22:52 -05:00
if ( $url && strlen ( Config :: get ( 'system' , 'directory' ))) {
2017-11-18 02:59:30 -05:00
Worker :: add ( PRIORITY_LOW , " Directory " , $url );
2016-12-20 05:36:03 -05:00
}
2014-03-11 18:52:32 -04:00
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/profiles' );
2011-02-04 04:18:28 -05:00
return ; // NOTREACHED
}
2017-12-07 08:56:11 -05:00
$ph = new Image ( $r [ 0 ][ 'data' ], $r [ 0 ][ 'type' ]);
2011-02-04 04:18:28 -05:00
profile_photo_crop_ui_head ( $a , $ph );
// go ahead as we have jus uploaded a new photo to crop
}
2010-07-01 19:48:07 -04:00
2012-09-11 21:51:17 -04:00
$profiles = q ( " select `id`,`profile-name` as `name`,`is-default` as `default` from profile where uid = %d " ,
intval ( local_user ())
);
2017-03-21 12:02:59 -04:00
if ( ! x ( $a -> config , 'imagecrop' )) {
2017-01-09 07:14:25 -05:00
2011-05-11 07:37:13 -04:00
$tpl = get_markup_template ( 'profile_photo.tpl' );
2010-07-01 19:48:07 -04:00
2018-01-15 08:05:12 -05:00
$o .= replace_macros ( $tpl ,[
2011-04-08 02:10:43 -04:00
'$user' => $a -> user [ 'nickname' ],
2018-01-22 09:16:25 -05:00
'$lbl_upfile' => L10n :: t ( 'Upload File:' ),
'$lbl_profiles' => L10n :: t ( 'Select a profile:' ),
'$title' => L10n :: t ( 'Upload Profile Photo' ),
'$submit' => L10n :: t ( 'Upload' ),
2012-09-11 21:51:17 -04:00
'$profiles' => $profiles ,
2012-03-12 16:17:37 -04:00
'$form_security_token' => get_form_security_token ( " profile_photo " ),
2018-01-22 09:16:25 -05:00
'$select' => sprintf ( '%s %s' , L10n :: t ( 'or' ), ( $newuser ) ? '<a href="' . System :: baseUrl () . '">' . L10n :: t ( 'skip this step' ) . '</a>' : '<a href="' . System :: baseUrl () . '/photos/' . $a -> user [ 'nickname' ] . '">' . L10n :: t ( 'select a photo from your photo albums' ) . '</a>' )
2018-01-15 08:05:12 -05:00
]);
2010-07-01 19:48:07 -04:00
return $o ;
}
else {
2012-06-07 11:42:13 -04:00
$filename = $a -> config [ 'imagecrop' ] . '-' . $a -> config [ 'imagecrop_resolution' ] . '.' . $a -> config [ 'imagecrop_ext' ];
2010-07-01 19:48:07 -04:00
$resolution = $a -> config [ 'imagecrop_resolution' ];
2011-05-11 07:37:13 -04:00
$tpl = get_markup_template ( " cropbody.tpl " );
2018-01-15 08:05:12 -05:00
$o .= replace_macros ( $tpl ,[
2010-07-01 19:48:07 -04:00
'$filename' => $filename ,
2012-09-11 21:51:17 -04:00
'$profile' => intval ( $_REQUEST [ 'profile' ]),
2010-07-01 19:48:07 -04:00
'$resource' => $a -> config [ 'imagecrop' ] . '-' . $a -> config [ 'imagecrop_resolution' ],
2017-08-26 03:32:10 -04:00
'$image_url' => System :: baseUrl () . '/photo/' . $filename ,
2018-01-22 09:16:25 -05:00
'$title' => L10n :: t ( 'Crop Image' ),
'$desc' => L10n :: t ( 'Please adjust the image cropping for optimum viewing.' ),
2012-03-12 16:17:37 -04:00
'$form_security_token' => get_form_security_token ( " profile_photo " ),
2018-01-22 09:16:25 -05:00
'$done' => L10n :: t ( 'Done Editing' )
2018-01-15 08:05:12 -05:00
]);
2010-07-01 19:48:07 -04:00
return $o ;
}
2010-07-19 22:09:58 -04:00
return ; // NOTREACHED
2017-12-11 23:52:33 -05:00
}
2011-02-04 04:18:28 -05:00
2017-12-07 08:56:11 -05:00
function profile_photo_crop_ui_head ( App $a , Image $Image ) {
2017-11-06 21:22:52 -05:00
$max_length = Config :: get ( 'system' , 'max_image_length' );
2016-12-20 09:37:27 -05:00
if ( ! $max_length ) {
2012-07-08 11:18:05 -04:00
$max_length = MAX_IMAGE_LENGTH ;
2016-12-20 09:37:27 -05:00
}
if ( $max_length > 0 ) {
2017-12-07 08:56:11 -05:00
$Image -> scaleDown ( $max_length );
2016-12-20 09:37:27 -05:00
}
2012-07-08 11:18:05 -04:00
2017-12-07 08:56:11 -05:00
$width = $Image -> getWidth ();
$height = $Image -> getHeight ();
2011-02-04 04:18:28 -05:00
2016-12-20 09:37:27 -05:00
if ( $width < 175 || $height < 175 ) {
2017-12-07 08:56:11 -05:00
$Image -> scaleUp ( 200 );
$width = $Image -> getWidth ();
$height = $Image -> getHeight ();
2011-02-04 04:18:28 -05:00
}
$hash = photo_new_resource ();
2017-01-09 07:14:25 -05:00
2011-02-04 04:18:28 -05:00
$smallest = 0 ;
2018-01-22 09:16:25 -05:00
$r = Photo :: store ( $Image , local_user (), 0 , $hash , $filename , L10n :: t ( 'Profile Photos' ), 0 );
2011-02-04 04:18:28 -05:00
2016-12-20 09:37:27 -05:00
if ( $r ) {
2018-01-22 09:16:25 -05:00
info ( L10n :: t ( 'Image uploaded successfully.' ) . EOL );
2016-12-20 09:37:27 -05:00
} else {
2018-01-22 09:16:25 -05:00
notice ( L10n :: t ( 'Image upload failed.' ) . EOL );
2016-12-20 09:37:27 -05:00
}
2011-02-04 04:18:28 -05:00
2016-12-20 09:37:27 -05:00
if ( $width > 640 || $height > 640 ) {
2017-12-07 08:56:11 -05:00
$Image -> scaleDown ( 640 );
2018-01-22 09:16:25 -05:00
$r = Photo :: store ( $Image , local_user (), 0 , $hash , $filename , L10n :: t ( 'Profile Photos' ), 1 );
2016-12-20 09:37:27 -05:00
if ( $r === false ) {
2018-01-22 09:16:25 -05:00
notice ( sprintf ( L10n :: t ( 'Image size reduction [%s] failed.' ), " 640 " ) . EOL );
2016-12-20 09:37:27 -05:00
} else {
2011-02-04 04:18:28 -05:00
$smallest = 1 ;
2016-12-20 09:37:27 -05:00
}
2011-02-04 04:18:28 -05:00
}
$a -> config [ 'imagecrop' ] = $hash ;
$a -> config [ 'imagecrop_resolution' ] = $smallest ;
2017-12-07 08:56:11 -05:00
$a -> config [ 'imagecrop_ext' ] = $Image -> getExt ();
2018-01-15 08:05:12 -05:00
$a -> page [ 'htmlhead' ] .= replace_macros ( get_markup_template ( " crophead.tpl " ), []);
$a -> page [ 'end' ] .= replace_macros ( get_markup_template ( " cropend.tpl " ), []);
2011-02-04 04:18:28 -05:00
return ;
2017-12-11 23:52:33 -05:00
}