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