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