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 ;
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 ;
2017-11-08 03:57:46 +00:00
use Friendica\Database\DBM ;
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-01-27 02:38:34 +00:00
use Friendica\Util\DateTimeFormat ;
2010-07-01 23:48:07 +00:00
2018-01-15 02:22:39 +00:00
function profile_photo_init ( App $a )
{
2016-12-20 10:56:34 +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
2017-01-09 12:14:25 +00:00
function profile_photo_post ( App $a ) {
2010-07-01 23:48:07 +00:00
2016-12-20 10:56:34 +00:00
if ( ! local_user ()) {
2018-01-22 14:16:25 +00:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2012-03-12 20:17:37 +00:00
return ;
}
2014-03-11 22:52:32 +00:00
2012-03-12 20:17:37 +00:00
check_form_security_token_redirectOnErr ( '/profile_photo' , 'profile_photo' );
2014-03-11 22:52:32 +00:00
2017-03-21 16:02:59 +00:00
if (( x ( $_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 ;
2017-03-21 16:02:59 +00:00
if ( $ _REQUEST [ 'profile' ]) {
2012-09-12 01:51:17 +00: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-08 03:57:46 +00:00
if ( DBM :: is_result ( $r ) && ( ! intval ( $r [ 0 ][ 'is-default' ])))
2012-09-12 01:51:17 +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
2017-03-21 16:02:59 +00:00
if ( $a -> argc != 2 ) {
2018-01-21 18:33:59 +00:00
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 ];
2017-03-21 16:02:59 +00:00
if ( substr ( $image_id , - 2 , 1 ) == '-' ) {
2010-07-01 23:48:07 +00:00
$scale = substr ( $image_id , - 1 , 1 );
$image_id = substr ( $image_id , 0 , - 2 );
}
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
2010-07-20 02:09:58 +00:00
$r = q ( " SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d AND `scale` = %d LIMIT 1 " ,
2010-07-01 23:48:07 +00:00
dbesc ( $image_id ),
2010-10-18 21:34:59 +00:00
dbesc ( local_user ()),
2010-07-01 23:48:07 +00:00
intval ( $scale ));
2010-07-20 02:09:58 +00:00
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $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 ()) {
$Image -> crop ( 175 , $srcX , $srcY , $srcW , $srcH );
2010-07-01 23:48:07 +00:00
2018-01-22 14:16:25 +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-01-22 14:16:25 +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-01-22 14:16:25 +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 " ,
dbesc ( $base_image [ 'resource-id' ]),
intval ( local_user ())
);
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 " ,
2017-12-07 13:56:11 +00: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-12 01:51:17 +00:00
intval ( $_REQUEST [ 'profile' ]),
intval ( local_user ())
);
}
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
2017-08-26 07:32:10 +00:00
$url = System :: baseUrl () . '/profile/' . $a -> user [ 'nickname' ];
2017-11-07 02:22:52 +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
}
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
2017-08-26 07:32:10 +00:00
goaway ( System :: baseUrl () . '/profiles' );
2010-07-20 02:09:58 +00:00
return ; // NOTREACHED
2010-07-01 23:48:07 +00:00
}
$src = $_FILES [ 'userfile' ][ 'tmp_name' ];
$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
2017-11-29 17:17:12 +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 );
2011-02-04 09:18:28 +00:00
return profile_photo_crop_ui_head ( $a , $ph );
2010-07-01 23:48:07 +00:00
}
2017-01-09 12:14:25 +00:00
function profile_photo_content ( App $a ) {
2010-07-01 23:48:07 +00:00
2016-12-20 10:56:34 +00:00
if ( ! local_user ()) {
2018-01-21 18:33:59 +00:00
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 ;
2017-03-21 16:02:59 +00:00
if ( $a -> argc == 2 && $a -> argv [ 1 ] === 'new' )
2011-04-24 00:31:23 +00:00
$newuser = true ;
2017-03-21 16:02:59 +00:00
if ( $a -> argv [ 1 ] == 'use' ){
2011-02-04 09:18:28 +00:00
if ( $a -> argc < 3 ){
2018-01-21 18:33:59 +00:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2011-02-04 09:18:28 +00:00
return ;
};
2017-01-09 12:14:25 +00:00
2012-03-27 11:51:20 +00:00
// check_form_security_token_redirectOnErr('/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());
$r = q ( " SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' ORDER BY `scale` ASC " ,
intval ( local_user ()),
dbesc ( $resource_id )
);
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )){
2018-01-21 18:33:59 +00:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2011-02-04 09:18:28 +00:00
return ;
}
2011-09-15 10:06:43 +00:00
$havescale = false ;
2016-12-20 20:15:53 +00:00
foreach ( $r as $rr ) {
2017-03-21 16:02:59 +00:00
if ( $rr [ 'scale' ] == 5 )
2011-09-15 10:06:43 +00:00
$havescale = true ;
}
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-01-22 14:16:25 +00:00
if (( $r [ 0 ][ 'album' ] == L10n :: t ( 'Profile Photos' )) && ( $havescale )){
2011-02-04 09:18:28 +00:00
$r = q ( " UPDATE `photo` SET `profile`=0 WHERE `profile`=1 AND `uid`=%d " ,
intval ( local_user ()));
2014-03-11 22:52:32 +00:00
2011-02-04 09:18:28 +00:00
$r = q ( " UPDATE `photo` SET `profile`=1 WHERE `uid` = %d AND `resource-id` = '%s' " ,
intval ( local_user ()),
dbesc ( $resource_id )
);
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' ];
2017-11-07 02:22:52 +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
2017-08-26 07:32:10 +00:00
goaway ( System :: baseUrl () . '/profiles' );
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' ]);
2011-02-04 09:18:28 +00:00
profile_photo_crop_ui_head ( $a , $ph );
// 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 ())
);
2017-03-21 16:02:59 +00:00
if ( ! x ( $a -> config , 'imagecrop' )) {
2017-01-09 12:14:25 +00:00
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( 'profile_photo.tpl' );
2010-07-01 23:48:07 +00:00
2018-02-12 02:25:09 +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 ,
2012-03-12 20:17:37 +00:00
'$form_security_token' => get_form_security_token ( " profile_photo " ),
2018-01-22 14:16:25 +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 ;
}
else {
2012-06-07 15:42:13 +00:00
$filename = $a -> config [ 'imagecrop' ] . '-' . $a -> config [ 'imagecrop_resolution' ] . '.' . $a -> config [ 'imagecrop_ext' ];
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( " cropbody.tpl " );
2018-02-12 02:25:09 +00:00
$o = replace_macros ( $tpl ,[
2010-07-01 23:48:07 +00:00
'$filename' => $filename ,
2012-09-12 01:51:17 +00:00
'$profile' => intval ( $_REQUEST [ 'profile' ]),
2010-07-01 23:48:07 +00:00
'$resource' => $a -> config [ 'imagecrop' ] . '-' . $a -> config [ 'imagecrop_resolution' ],
2017-08-26 07:32:10 +00:00
'$image_url' => System :: baseUrl () . '/photo/' . $filename ,
2018-01-22 14:16:25 +00:00
'$title' => L10n :: t ( 'Crop Image' ),
'$desc' => L10n :: t ( 'Please adjust the image cropping for optimum viewing.' ),
2012-03-12 20:17:37 +00:00
'$form_security_token' => get_form_security_token ( " profile_photo " ),
2018-01-22 14:16:25 +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
2017-12-07 13:56:11 +00:00
function profile_photo_crop_ui_head ( App $a , Image $Image ) {
2017-11-07 02:22:52 +00:00
$max_length = Config :: get ( 'system' , 'max_image_length' );
2016-12-20 14:37:27 +00:00
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 ) {
2017-12-07 13:56:11 +00:00
$Image -> scaleDown ( $max_length );
2016-12-20 14:37:27 +00:00
}
2012-07-08 15:18:05 +00:00
2017-12-07 13:56:11 +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 ) {
2017-12-07 13:56:11 +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-01-22 14:16:25 +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 ) {
2017-12-07 13:56:11 +00:00
$Image -> scaleDown ( 640 );
2018-01-22 14:16:25 +00:00
$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
}
$a -> config [ 'imagecrop' ] = $hash ;
$a -> config [ 'imagecrop_resolution' ] = $smallest ;
2017-12-07 13:56:11 +00:00
$a -> config [ 'imagecrop_ext' ] = $Image -> getExt ();
2018-01-15 13:05:12 +00:00
$a -> page [ 'htmlhead' ] .= replace_macros ( get_markup_template ( " crophead.tpl " ), []);
$a -> page [ 'end' ] .= replace_macros ( get_markup_template ( " cropend.tpl " ), []);
2011-02-04 09:18:28 +00:00
return ;
2017-12-12 04:52:33 +00:00
}