2010-07-01 19:48:07 -04:00
< ? php
2017-11-29 07:52:27 -05:00
/**
* @ file mod / profile_photo . php
*/
2018-01-24 21:08:45 -05:00
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2018-10-17 15:30:41 -04:00
use Friendica\BaseModule ;
2017-11-06 21:22:52 -05:00
use Friendica\Core\Config ;
2018-01-21 13:33:59 -05:00
use Friendica\Core\L10n ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2017-11-05 07:15:53 -05:00
use Friendica\Core\Worker ;
2018-07-21 08:40:21 -04:00
use Friendica\Database\DBA ;
2018-03-24 02:15:18 -04:00
use Friendica\Model\Contact ;
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 ;
2018-10-17 08:19:58 -04:00
use Friendica\Util\Security ;
2010-07-01 19:48:07 -04:00
2018-01-14 21:22:39 -05:00
function profile_photo_init ( App $a )
{
2018-07-07 17:46:30 -04: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
2018-07-07 17:46:30 -04:00
function profile_photo_post ( App $a )
{
if ( ! local_user ()) {
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2012-03-12 16:17:37 -04:00
return ;
}
2014-03-11 18:52:32 -04:00
2018-10-17 15:30:41 -04:00
BaseModule :: checkFormSecurityTokenRedirectOnError ( '/profile_photo' , 'profile_photo' );
2014-03-11 18:52:32 -04:00
2018-07-22 16:01:14 -04:00
if ( ! empty ( $_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 ;
2018-07-07 17:46:30 -04: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-11 21:51:17 -04:00
intval ( local_user ())
);
2018-07-22 16:01:14 -04:00
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r ) && ( ! intval ( $r [ 0 ][ 'is-default' ]))) {
2018-07-22 16:01:14 -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
2018-07-07 17:46:30 -04:00
if ( $a -> argc != 2 ) {
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 ];
2018-07-07 17:46:30 -04:00
if ( substr ( $image_id , - 2 , 1 ) == '-' ) {
$scale = substr ( $image_id , - 1 , 1 );
$image_id = substr ( $image_id , 0 , - 2 );
2010-07-01 19:48:07 -04:00
}
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
2018-07-21 09:10:13 -04: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-19 22:09:58 -04:00
2018-10-19 18:01:48 -04:00
$path = 'profile/' . $a -> user [ 'nickname' ];
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $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 ()) {
2018-10-23 08:30:21 -04:00
$Image -> crop ( 300 , $srcX , $srcY , $srcW , $srcH );
2010-07-01 19:48:07 -04:00
2018-07-07 17:46:30 -04: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-10-23 08:30:21 -04:00
notice ( L10n :: t ( 'Image size reduction [%s] failed.' , " 300 " ) . 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-07-07 17:46:30 -04: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-23 21:59:16 -05:00
notice ( 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-07-07 17:46:30 -04: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-23 21:59:16 -05:00
notice ( 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
2018-03-24 02:15:18 -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 " ,
2018-07-21 09:10:13 -04:00
DBA :: escape ( $base_image [ 'resource-id' ]), intval ( local_user ())
2012-09-11 21:51:17 -04:00
);
2015-11-13 02:45:14 -05:00
} else {
2014-03-11 18:52:32 -04:00
$r = q ( " update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d " ,
2018-07-21 09:10:13 -04: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 17:46:30 -04:00
intval ( $_REQUEST [ 'profile' ]), intval ( local_user ())
2012-09-11 21:51:17 -04:00
);
}
2018-03-24 02:15:18 -04:00
Contact :: updateSelfFromUserID ( local_user (), true );
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
2018-10-19 18:01:48 -04:00
if ( $path && strlen ( Config :: get ( 'system' , 'directory' ))) {
2018-10-19 19:00:01 -04:00
Worker :: add ( PRIORITY_LOW , " Directory " , $a -> getBaseURL () . '/' . $path );
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
2018-10-19 18:01:48 -04:00
$a -> internalRedirect ( $path );
2010-07-19 22:09:58 -04:00
return ; // NOTREACHED
2010-07-01 19:48:07 -04:00
}
2018-07-07 17:46:30 -04:00
$src = $_FILES [ 'userfile' ][ 'tmp_name' ];
2010-07-01 19:48:07 -04:00
$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-23 21:59:16 -05:00
notice ( 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
2018-07-07 17:46:30 -04: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 );
2018-07-19 17:59:18 -04:00
$imagecrop = profile_photo_crop_ui_head ( $a , $ph );
2018-10-19 14:11:27 -04:00
$a -> internalRedirect ( 'profile_photo/use/' . $imagecrop [ 'hash' ]);
2010-07-01 19:48:07 -04:00
}
2018-07-07 17:46:30 -04:00
function profile_photo_content ( App $a )
{
2010-07-01 19:48:07 -04:00
2018-07-07 17:46:30 -04:00
if ( ! local_user ()) {
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 ;
2018-07-07 17:46:30 -04:00
if ( $a -> argc == 2 && $a -> argv [ 1 ] === 'new' ) {
2011-04-23 20:31:23 -04:00
$newuser = true ;
2018-07-07 17:46:30 -04:00
}
2011-04-23 20:31:23 -04:00
2018-07-07 17:46:30 -04:00
$imagecrop = [];
2018-07-22 16:01:14 -04:00
if ( isset ( $a -> argv [ 1 ]) && $a -> argv [ 1 ] == 'use' && $a -> argc >= 3 ) {
2018-10-19 04:03:52 -04:00
// BaseModule::checkFormSecurityTokenRedirectOnError('/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());
2018-07-07 17:46:30 -04:00
$r = q ( " SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' ORDER BY `scale` ASC " , intval ( local_user ()),
2018-07-21 09:10:13 -04:00
DBA :: escape ( $resource_id )
2018-07-07 17:46:30 -04:00
);
2018-07-22 16:01:14 -04:00
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $r )) {
2018-07-07 17:46:30 -04:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2011-02-04 04:18:28 -05:00
return ;
}
2018-07-22 16:01:14 -04:00
2011-09-15 06:06:43 -04:00
$havescale = false ;
2016-12-20 15:15:53 -05:00
foreach ( $r as $rr ) {
2018-07-22 16:01:14 -04:00
if ( $rr [ 'scale' ] == 5 ) {
$havescale = true ;
}
2011-09-15 06:06:43 -04:00
}
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-07-07 17:46:30 -04: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 18:52:32 -04:00
2018-07-07 17:46:30 -04:00
$r = q ( " UPDATE `photo` SET `profile`=1 WHERE `uid` = %d AND `resource-id` = '%s' " , intval ( local_user ()),
2018-07-21 09:10:13 -04:00
DBA :: escape ( $resource_id )
2018-07-07 17:46:30 -04:00
);
2014-03-11 18:52:32 -04:00
2018-03-24 02:15:18 -04:00
Contact :: updateSelfFromUserID ( local_user (), true );
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' ];
2018-07-07 17:46:30 -04: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
2018-10-19 14:11:27 -04:00
$a -> internalRedirect ( 'profile/' . $a -> user [ 'nickname' ]);
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' ]);
2018-07-07 17:46:30 -04:00
$imagecrop = profile_photo_crop_ui_head ( $a , $ph );
2011-02-04 04:18:28 -05:00
// 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 ())
);
2018-07-19 17:59:18 -04:00
if ( empty ( $imagecrop )) {
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'profile_photo.tpl' );
2010-07-01 19:48:07 -04:00
2018-10-31 10:35:50 -04:00
$o = Renderer :: replaceMacros ( $tpl ,
2018-07-07 17:46:30 -04:00
[
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 ,
2018-10-17 15:30:41 -04:00
'$form_security_token' => BaseModule :: getFormSecurityToken ( " profile_photo " ),
2018-07-07 17:46:30 -04: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 ;
2018-07-07 17:46:30 -04:00
} else {
$filename = $imagecrop [ 'hash' ] . '-' . $imagecrop [ 'resolution' ] . '.' . $imagecrop [ 'ext' ];
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( " cropbody.tpl " );
2018-10-31 10:35:50 -04:00
$o = Renderer :: replaceMacros ( $tpl ,
2018-07-07 17:46:30 -04:00
[
'$filename' => $filename ,
2018-07-22 16:01:14 -04:00
'$profile' => ( isset ( $_REQUEST [ 'profile' ]) ? intval ( $_REQUEST [ 'profile' ]) : 0 ),
2018-07-07 17:46:30 -04:00
'$resource' => $imagecrop [ 'hash' ] . '-' . $imagecrop [ 'resolution' ],
2017-08-26 03:32:10 -04:00
'$image_url' => System :: baseUrl () . '/photo/' . $filename ,
2018-07-07 17:46:30 -04:00
'$title' => L10n :: t ( 'Crop Image' ),
'$desc' => L10n :: t ( 'Please adjust the image cropping for optimum viewing.' ),
2018-10-17 15:30:41 -04:00
'$form_security_token' => BaseModule :: getFormSecurityToken ( " profile_photo " ),
2018-07-07 17:46:30 -04: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
2018-07-22 16:01:14 -04:00
function profile_photo_crop_ui_head ( App $a , Image $image )
2018-07-07 17:46:30 -04:00
{
$max_length = Config :: get ( 'system' , 'max_image_length' );
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 ) {
2018-07-22 16:01:14 -04:00
$image -> scaleDown ( $max_length );
2016-12-20 09:37:27 -05:00
}
2012-07-08 11:18:05 -04:00
2018-07-22 16:01:14 -04: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 ) {
2018-10-23 10:36:57 -04:00
$image -> scaleUp ( 300 );
2018-07-22 16:01:14 -04:00
$width = $image -> getWidth ();
$height = $image -> getHeight ();
2011-02-04 04:18:28 -05:00
}
2018-02-20 05:02:07 -05:00
$hash = Photo :: newResource ();
2017-01-09 07:14:25 -05:00
2011-02-04 04:18:28 -05:00
$smallest = 0 ;
2018-02-11 21:25:09 -05:00
$filename = '' ;
2011-02-04 04:18:28 -05:00
2018-07-22 16:01:14 -04: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 ) {
2018-07-22 16:01:14 -04:00
$image -> scaleDown ( 640 );
$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-23 21:59:16 -05:00
notice ( 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
}
2018-10-31 10:44:06 -04:00
$a -> page [ 'htmlhead' ] .= Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( " crophead.tpl " ), []);
2018-07-07 17:46:30 -04:00
$imagecrop = [
'hash' => $hash ,
'resolution' => $smallest ,
2018-07-22 16:01:14 -04:00
'ext' => $image -> getExt (),
2018-07-07 17:46:30 -04:00
];
return $imagecrop ;
2017-12-11 23:52:33 -05:00
}