2010-08-06 04:15:24 +00:00
< ? php
2017-11-29 12:52:27 +00:00
/**
2024-01-02 20:57:26 +00:00
* @ copyright Copyright ( C ) 2010 - 2024 , the Friendica project
2020-02-09 15:18:46 +00:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2017-11-29 12:52:27 +00:00
*/
2018-01-25 02:08:45 +00:00
2018-01-15 19:51:56 +00:00
use Friendica\Content\Nav ;
2018-10-24 06:15:24 +00:00
use Friendica\Content\Pager ;
2018-02-15 02:33:55 +00:00
use Friendica\Content\Text\BBCode ;
2018-03-02 23:41:24 +00:00
use Friendica\Core\ACL ;
2020-09-09 20:49:03 +00:00
use Friendica\Core\Addon ;
2018-12-26 06:06:24 +00:00
use Friendica\Core\Hook ;
2018-10-29 21:20:46 +00:00
use Friendica\Core\Logger ;
2018-10-31 14:35:50 +00:00
use Friendica\Core\Renderer ;
2019-10-23 19:38:51 +00:00
use Friendica\Core\System ;
2018-07-20 12:19:26 +00:00
use Friendica\Database\DBA ;
2023-01-01 21:34:01 +00:00
use Friendica\Database\DBStructure ;
2023-03-16 11:03:49 +00:00
use Friendica\DI ;
2017-12-07 14:04:24 +00:00
use Friendica\Model\Contact ;
2018-01-28 11:18:08 +00:00
use Friendica\Model\Item ;
2017-12-07 13:56:11 +00:00
use Friendica\Model\Photo ;
2021-01-16 04:11:28 +00:00
use Friendica\Model\Post ;
2021-08-08 10:14:56 +00:00
use Friendica\Model\Profile ;
2020-04-18 20:46:41 +00:00
use Friendica\Model\Tag ;
2018-06-18 20:36:34 +00:00
use Friendica\Model\User ;
2020-01-26 14:49:11 +00:00
use Friendica\Module\BaseProfile ;
2022-11-23 19:08:58 +00:00
use Friendica\Network\HTTPException ;
2017-05-07 18:44:30 +00:00
use Friendica\Network\Probe ;
2019-10-23 22:25:43 +00:00
use Friendica\Protocol\Activity ;
2022-11-23 19:08:58 +00:00
use Friendica\Security\Security ;
2018-11-05 08:37:03 +00:00
use Friendica\Util\Crypto ;
2018-01-27 02:38:34 +00:00
use Friendica\Util\DateTimeFormat ;
2019-10-18 01:26:15 +00:00
use Friendica\Util\Images ;
2018-01-25 02:08:45 +00:00
use Friendica\Util\Map ;
2018-11-08 15:14:37 +00:00
use Friendica\Util\Strings ;
2019-05-26 13:00:19 +00:00
use Friendica\Util\Temporal ;
2018-11-05 12:40:18 +00:00
use Friendica\Util\XML ;
2017-04-30 04:01:26 +00:00
2024-05-13 16:19:19 +00:00
function photos_init ()
2022-09-12 21:12:11 +00:00
{
2022-10-20 19:02:49 +00:00
if ( DI :: config () -> get ( 'system' , 'block_public' ) && ! DI :: userSession () -> isAuthenticated ()) {
2011-04-22 00:29:47 +00:00
return ;
}
2012-10-09 15:50:24 +00:00
2018-01-15 19:51:56 +00:00
Nav :: setSelected ( 'home' );
2015-09-30 16:50:44 +00:00
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 1 ) {
2023-01-11 01:40:35 +00:00
$owner = Profile :: load ( DI :: app (), DI :: args () -> getArgv ()[ 1 ], false );
2022-07-19 16:06:36 +00:00
if ( ! isset ( $owner [ 'account_removed' ]) || $owner [ 'account_removed' ]) {
2021-08-17 13:06:28 +00:00
throw new HTTPException\NotFoundException ( DI :: l10n () -> t ( 'User not found.' ));
}
2010-08-06 04:15:24 +00:00
2021-07-24 10:09:39 +00:00
$albums = Photo :: getAlbums ( $owner [ 'uid' ]);
2012-11-02 11:20:12 +00:00
2022-10-20 19:02:49 +00:00
$albums_visible = (( intval ( $owner [ 'hidewall' ]) && ! DI :: userSession () -> isAuthenticated ()) ? false : true );
2015-06-27 12:10:43 +00:00
// add various encodings to the array so we can just loop through and pick them out in a template
2018-01-15 13:05:12 +00:00
$ret = [ 'success' => false ];
2015-06-27 12:10:43 +00:00
2016-10-22 10:14:41 +00:00
if ( $albums ) {
2017-03-25 13:56:23 +00:00
if ( $albums_visible ) {
2015-06-27 12:10:43 +00:00
$ret [ 'success' ] = true ;
2017-03-25 13:56:23 +00:00
}
2015-06-27 12:10:43 +00:00
2018-01-15 13:05:12 +00:00
$ret [ 'albums' ] = [];
2016-10-22 10:14:41 +00:00
foreach ( $albums as $k => $album ) {
2018-01-15 13:05:12 +00:00
$entry = [
2015-06-27 12:10:43 +00:00
'text' => $album [ 'album' ],
'total' => $album [ 'total' ],
2021-07-24 10:09:39 +00:00
'url' => 'photos/' . $owner [ 'nickname' ] . '/album/' . bin2hex ( $album [ 'album' ]),
2015-06-27 12:10:43 +00:00
'urlencode' => urlencode ( $album [ 'album' ]),
'bin2hex' => bin2hex ( $album [ 'album' ])
2018-01-15 13:05:12 +00:00
];
2015-06-27 12:10:43 +00:00
$ret [ 'albums' ][] = $entry ;
}
}
2022-10-20 19:02:49 +00:00
if ( DI :: userSession () -> getLocalUserId () && $owner [ 'uid' ] == DI :: userSession () -> getLocalUserId ()) {
2015-06-27 12:10:43 +00:00
$can_post = true ;
2018-07-10 12:27:56 +00:00
} else {
$can_post = false ;
2017-03-25 13:56:23 +00:00
}
2015-06-27 12:10:43 +00:00
2018-01-01 21:47:00 +00:00
if ( $ret [ 'success' ]) {
2018-10-31 14:44:06 +00:00
$photo_albums_widget = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'photo_albums.tpl' ), [
2021-07-24 10:09:39 +00:00
'$nick' => $owner [ 'nickname' ],
2020-01-18 19:52:34 +00:00
'$title' => DI :: l10n () -> t ( 'Photo Albums' ),
'$recent' => DI :: l10n () -> t ( 'Recent Photos' ),
2018-01-01 21:47:00 +00:00
'$albums' => $ret [ 'albums' ],
2021-07-24 10:09:39 +00:00
'$upload' => [ DI :: l10n () -> t ( 'Upload New Photos' ), 'photos/' . $owner [ 'nickname' ] . '/upload' ],
2015-06-27 12:10:43 +00:00
'$can_post' => $can_post
2018-01-15 13:05:12 +00:00
]);
2015-06-27 12:10:43 +00:00
}
2010-08-06 04:15:24 +00:00
2018-07-30 04:41:20 +00:00
if ( ! empty ( $photo_albums_widget )) {
2019-12-30 19:02:09 +00:00
DI :: page ()[ 'aside' ] .= $photo_albums_widget ;
2018-07-30 04:41:20 +00:00
}
2011-06-02 05:06:53 +00:00
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( " photos_head.tpl " );
2018-07-23 01:19:28 +00:00
2023-06-18 16:49:38 +00:00
DI :: page ()[ 'htmlhead' ] .= Renderer :: replaceMacros ( $tpl , [
2020-01-18 19:52:34 +00:00
'$ispublic' => DI :: l10n () -> t ( 'everybody' )
2018-01-15 13:05:12 +00:00
]);
2010-08-06 04:15:24 +00:00
}
2010-12-06 02:08:36 +00:00
2010-09-09 03:14:17 +00:00
return ;
2010-08-06 04:15:24 +00:00
}
2024-05-13 16:19:19 +00:00
function photos_post ()
2018-01-01 21:47:00 +00:00
{
2021-07-25 13:08:22 +00:00
$user = User :: getByNickname ( DI :: args () -> getArgv ()[ 1 ]);
2021-07-24 10:09:39 +00:00
if ( ! DBA :: isResult ( $user )) {
throw new HTTPException\NotFoundException ( DI :: l10n () -> t ( 'User not found.' ));
}
2010-12-06 02:08:36 +00:00
$can_post = false ;
$visitor = 0 ;
2021-07-24 10:09:39 +00:00
$page_owner_uid = intval ( $user [ 'uid' ]);
2024-04-07 16:32:50 +00:00
$community_page = in_array ( $user [ 'page-flags' ], [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_COMM_MAN ]);
2010-12-06 02:08:36 +00:00
2022-10-20 19:02:49 +00:00
if ( DI :: userSession () -> getLocalUserId () && ( DI :: userSession () -> getLocalUserId () == $page_owner_uid )) {
2010-12-06 02:08:36 +00:00
$can_post = true ;
2022-10-20 19:02:49 +00:00
} elseif ( $community_page && ! empty ( DI :: userSession () -> getRemoteContactID ( $page_owner_uid ))) {
$contact_id = DI :: userSession () -> getRemoteContactID ( $page_owner_uid );
2019-09-28 05:37:24 +00:00
$can_post = true ;
$visitor = $contact_id ;
2010-12-06 02:08:36 +00:00
}
2010-08-06 04:15:24 +00:00
2017-12-28 20:37:23 +00:00
if ( ! $can_post ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Permission denied.' ));
2022-05-18 02:13:54 +00:00
System :: exit ();
2010-10-14 05:01:23 +00:00
}
2010-08-09 00:08:39 +00:00
2018-06-18 20:36:34 +00:00
$owner_record = User :: getOwnerDataById ( $page_owner_uid );
2010-08-09 00:08:39 +00:00
2018-06-18 20:36:34 +00:00
if ( ! $owner_record ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Contact information unavailable' ));
2020-12-21 05:27:16 +00:00
DI :: logger () -> info ( 'photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid );
2022-05-18 02:13:54 +00:00
System :: exit ();
2010-11-02 23:24:23 +00:00
}
2020-12-22 03:23:13 +00:00
$aclFormatter = DI :: aclFormatter ();
$str_contact_allow = isset ( $_REQUEST [ 'contact_allow' ]) ? $aclFormatter -> toString ( $_REQUEST [ 'contact_allow' ]) : $owner_record [ 'allow_cid' ] ? ? '' ;
2023-05-13 23:54:35 +00:00
$str_circle_allow = isset ( $_REQUEST [ 'circle_allow' ]) ? $aclFormatter -> toString ( $_REQUEST [ 'circle_allow' ]) : $owner_record [ 'allow_gid' ] ? ? '' ;
2020-12-22 03:23:13 +00:00
$str_contact_deny = isset ( $_REQUEST [ 'contact_deny' ]) ? $aclFormatter -> toString ( $_REQUEST [ 'contact_deny' ]) : $owner_record [ 'deny_cid' ] ? ? '' ;
2023-05-13 23:54:35 +00:00
$str_circle_deny = isset ( $_REQUEST [ 'circle_deny' ]) ? $aclFormatter -> toString ( $_REQUEST [ 'circle_deny' ]) : $owner_record [ 'deny_gid' ] ? ? '' ;
2020-12-22 03:23:13 +00:00
$visibility = $_REQUEST [ 'visibility' ] ? ? '' ;
if ( $visibility === 'public' ) {
// The ACL selector introduced in version 2019.12 sends ACL input data even when the Public visibility is selected
2023-05-13 23:54:35 +00:00
$str_contact_allow = $str_circle_allow = $str_contact_deny = $str_circle_deny = '' ;
2020-12-22 03:23:13 +00:00
} else if ( $visibility === 'custom' ) {
// Since we know from the visibility parameter the item should be private, we have to prevent the empty ACL
// case that would make it public. So we always append the author's contact id to the allowed contacts.
2020-12-21 05:27:16 +00:00
// See https://github.com/friendica/friendica/issues/9672
2020-12-22 03:23:13 +00:00
$str_contact_allow .= $aclFormatter -> toString ( Contact :: getPublicIdByUserId ( $page_owner_uid ));
2020-12-21 05:27:16 +00:00
}
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 3 && DI :: args () -> getArgv ()[ 2 ] === 'album' ) {
2022-06-20 06:25:17 +00:00
if ( ! Strings :: isHex ( DI :: args () -> getArgv ()[ 3 ] ? ? '' )) {
2021-07-24 10:09:39 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . $user [ 'nickname' ] . '/album' );
2019-05-30 08:30:15 +00:00
}
2021-07-25 13:08:22 +00:00
$album = hex2bin ( DI :: args () -> getArgv ()[ 3 ]);
2010-08-09 00:08:39 +00:00
2021-10-19 19:15:28 +00:00
if ( ! DBA :: exists ( 'photo' , [ 'album' => $album , 'uid' => $page_owner_uid , 'photo-type' => Photo :: DEFAULT ])) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Album not found.' ));
2021-07-24 10:09:39 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . $user [ 'nickname' ] . '/album' );
2010-08-09 00:08:39 +00:00
return ; // NOTREACHED
}
2013-01-26 19:52:21 +00:00
// Check if the user has responded to a delete confirmation query
2018-09-11 04:10:11 +00:00
if ( ! empty ( $_REQUEST [ 'canceled' ])) {
2021-07-25 13:08:22 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . $user [ 'nickname' ] . '/album/' . DI :: args () -> getArgv ()[ 3 ]);
2013-01-26 19:52:21 +00:00
}
2018-01-01 21:47:00 +00:00
// RENAME photo album
2021-11-07 12:57:24 +00:00
$newalbum = trim ( $_POST [ 'albumname' ] ? ? '' );
2016-10-22 10:14:41 +00:00
if ( $newalbum != $album ) {
2021-10-03 15:02:20 +00:00
Photo :: update ([ 'album' => $newalbum ], [ 'album' => $album , 'uid' => $page_owner_uid ]);
2016-12-25 15:58:38 +00:00
// Update the photo albums cache
2018-01-04 03:36:15 +00:00
Photo :: clearAlbumCache ( $page_owner_uid );
2016-12-25 15:58:38 +00:00
2024-05-13 16:19:19 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . DI :: userSession () -> getLocalUserNickname () . '/album/' . bin2hex ( $newalbum ));
2010-08-09 00:08:39 +00:00
return ; // NOTREACHED
}
2015-09-29 22:19:54 +00:00
/*
2019-05-01 23:36:14 +00:00
* DELETE all photos filed in a given album
2015-09-29 22:19:54 +00:00
*/
2019-05-01 23:36:14 +00:00
if ( ! empty ( $_POST [ 'dropalbum' ])) {
2018-01-15 13:05:12 +00:00
$res = [];
2010-12-06 02:08:36 +00:00
// get the list of photos we are about to delete
2016-10-22 10:14:41 +00:00
if ( $visitor ) {
2023-06-18 16:49:38 +00:00
$r = DBA :: toArray ( DBA :: p (
2024-01-15 16:45:24 +00:00
" SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `contact-id` = ? AND `uid` = ? AND `album` = ? " ,
2021-10-08 04:10:45 +00:00
$visitor ,
$page_owner_uid ,
$album
));
2016-10-22 10:14:41 +00:00
} else {
2023-06-18 16:49:38 +00:00
$r = DBA :: toArray ( DBA :: p (
2024-01-15 16:45:24 +00:00
" SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `uid` = ? AND `album` = ? " ,
2022-10-20 19:02:49 +00:00
DI :: userSession () -> getLocalUserId (),
2021-10-08 04:10:45 +00:00
$album
));
2010-12-06 02:08:36 +00:00
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $r )) {
2016-12-20 20:15:53 +00:00
foreach ( $r as $rr ) {
2018-11-21 15:28:09 +00:00
$res [] = $rr [ 'rid' ];
2010-08-09 00:08:39 +00:00
}
2010-12-06 02:08:36 +00:00
2019-05-01 23:36:14 +00:00
// remove the associated photos
Photo :: delete ([ 'resource-id' => $res , 'uid' => $page_owner_uid ]);
2010-12-06 02:08:36 +00:00
2019-05-01 23:36:14 +00:00
// find and delete the corresponding item with all the comments and likes/dislikes
Item :: deleteForUser ([ 'resource-id' => $res , 'uid' => $page_owner_uid ], $page_owner_uid );
2016-12-25 15:58:38 +00:00
2019-05-01 23:36:14 +00:00
// Update the photo albums cache
Photo :: clearAlbumCache ( $page_owner_uid );
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Album successfully deleted' ));
2019-05-01 23:36:14 +00:00
} else {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Album was empty.' ));
2019-05-01 23:36:14 +00:00
}
2010-08-09 00:08:39 +00:00
}
2016-12-25 15:58:38 +00:00
2021-07-24 10:09:39 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . $user [ 'nickname' ] . '/album' );
2013-01-26 19:52:21 +00:00
}
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 3 && DI :: args () -> getArgv ()[ 2 ] === 'image' ) {
2019-05-01 23:36:14 +00:00
// Check if the user has responded to a delete confirmation query for a single photo
if ( ! empty ( $_POST [ 'canceled' ])) {
2021-07-25 13:08:22 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . DI :: args () -> getArgv ()[ 1 ] . '/image/' . DI :: args () -> getArgv ()[ 3 ]);
2013-01-26 19:52:21 +00:00
}
2019-05-01 23:36:14 +00:00
if ( ! empty ( $_POST [ 'delete' ])) {
// same as above but remove single photo
if ( $visitor ) {
2021-07-25 13:08:22 +00:00
$condition = [ 'contact-id' => $visitor , 'uid' => $page_owner_uid , 'resource-id' => DI :: args () -> getArgv ()[ 3 ]];
2019-05-01 23:36:14 +00:00
} else {
2022-10-20 19:02:49 +00:00
$condition = [ 'uid' => DI :: userSession () -> getLocalUserId (), 'resource-id' => DI :: args () -> getArgv ()[ 3 ]];
2019-05-01 23:36:14 +00:00
}
2018-07-23 01:19:28 +00:00
2019-05-02 13:49:20 +00:00
$photo = DBA :: selectFirst ( 'photo' , [ 'resource-id' ], $condition );
if ( DBA :: isResult ( $photo )) {
Photo :: delete ([ 'uid' => $page_owner_uid , 'resource-id' => $photo [ 'resource-id' ]]);
2010-08-09 00:08:39 +00:00
2019-05-02 13:49:20 +00:00
Item :: deleteForUser ([ 'resource-id' => $photo [ 'resource-id' ], 'uid' => $page_owner_uid ], $page_owner_uid );
2018-05-29 05:22:57 +00:00
2019-05-01 23:36:14 +00:00
// Update the photo albums cache
Photo :: clearAlbumCache ( $page_owner_uid );
} else {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Failed to delete the photo.' ));
2021-07-25 13:08:22 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . DI :: args () -> getArgv ()[ 1 ] . '/image/' . DI :: args () -> getArgv ()[ 3 ]);
2019-05-01 23:36:14 +00:00
}
2010-08-09 00:08:39 +00:00
2022-11-20 22:15:07 +00:00
DI :: baseUrl () -> redirect ( 'profile/' . DI :: args () -> getArgv ()[ 1 ] . '/photos' );
2019-05-01 23:36:14 +00:00
}
2010-08-09 00:08:39 +00:00
}
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 2 && ( ! empty ( $_POST [ 'desc' ]) || ! empty ( $_POST [ 'newtag' ]) || isset ( $_POST [ 'albname' ]))) {
2021-11-06 20:25:21 +00:00
$desc = ! empty ( $_POST [ 'desc' ]) ? trim ( $_POST [ 'desc' ]) : '' ;
$rawtags = ! empty ( $_POST [ 'newtag' ]) ? trim ( $_POST [ 'newtag' ]) : '' ;
$item_id = ! empty ( $_POST [ 'item_id' ]) ? intval ( $_POST [ 'item_id' ]) : 0 ;
$albname = ! empty ( $_POST [ 'albname' ]) ? trim ( $_POST [ 'albname' ]) : '' ;
$origaname = ! empty ( $_POST [ 'origaname' ]) ? trim ( $_POST [ 'origaname' ]) : '' ;
2018-07-22 23:49:16 +00:00
2021-07-25 13:08:22 +00:00
$resource_id = DI :: args () -> getArgv ()[ 3 ];
2010-08-08 08:58:26 +00:00
2017-12-28 20:37:23 +00:00
if ( ! strlen ( $albname )) {
2018-01-27 02:38:34 +00:00
$albname = DateTimeFormat :: localNow ( 'Y' );
2017-03-25 13:56:23 +00:00
}
2012-05-23 08:01:04 +00:00
2018-07-23 01:19:28 +00:00
if ( ! empty ( $_POST [ 'rotate' ]) && ( intval ( $_POST [ 'rotate' ]) == 1 || intval ( $_POST [ 'rotate' ]) == 2 )) {
2022-08-30 19:45:30 +00:00
Logger :: debug ( 'rotate' );
2012-05-23 08:01:04 +00:00
2018-11-21 16:55:16 +00:00
$photo = Photo :: getPhotoForUser ( $page_owner_uid , $resource_id );
2018-07-23 01:19:28 +00:00
2018-11-21 16:55:16 +00:00
if ( DBA :: isResult ( $photo )) {
$image = Photo :: getImageForPhoto ( $photo );
2018-07-23 01:19:28 +00:00
if ( $image -> isValid ()) {
2018-06-19 19:06:17 +00:00
$rotate_deg = (( intval ( $_POST [ 'rotate' ]) == 1 ) ? 270 : 90 );
2018-07-23 01:19:28 +00:00
$image -> rotate ( $rotate_deg );
2012-05-23 08:01:04 +00:00
2018-07-23 01:19:28 +00:00
$width = $image -> getWidth ();
$height = $image -> getHeight ();
2012-05-23 08:01:04 +00:00
2018-11-21 16:55:16 +00:00
Photo :: update ([ 'height' => $height , 'width' => $width ], [ 'resource-id' => $resource_id , 'uid' => $page_owner_uid , 'scale' => 0 ], $image );
2012-05-23 08:01:04 +00:00
2023-10-14 19:29:03 +00:00
if ( $width > \Friendica\Util\Proxy :: PIXEL_MEDIUM || $height > \Friendica\Util\Proxy :: PIXEL_MEDIUM ) {
$image -> scaleDown ( \Friendica\Util\Proxy :: PIXEL_MEDIUM );
2018-07-23 01:19:28 +00:00
$width = $image -> getWidth ();
$height = $image -> getHeight ();
2013-01-13 14:11:06 +00:00
2018-11-21 16:55:16 +00:00
Photo :: update ([ 'height' => $height , 'width' => $width ], [ 'resource-id' => $resource_id , 'uid' => $page_owner_uid , 'scale' => 1 ], $image );
2012-05-23 08:01:04 +00:00
}
2023-10-14 19:29:03 +00:00
if ( $width > \Friendica\Util\Proxy :: PIXEL_SMALL || $height > \Friendica\Util\Proxy :: PIXEL_SMALL ) {
$image -> scaleDown ( \Friendica\Util\Proxy :: PIXEL_SMALL );
2018-07-23 01:19:28 +00:00
$width = $image -> getWidth ();
$height = $image -> getHeight ();
2012-05-23 08:01:04 +00:00
2018-11-21 16:55:16 +00:00
Photo :: update ([ 'height' => $height , 'width' => $width ], [ 'resource-id' => $resource_id , 'uid' => $page_owner_uid , 'scale' => 2 ], $image );
2013-01-13 14:11:06 +00:00
}
2012-05-23 08:01:04 +00:00
}
}
}
2011-02-03 23:13:38 +00:00
2019-01-07 18:23:14 +00:00
$photos_stmt = DBA :: select ( 'photo' , [], [ 'resource-id' => $resource_id , 'uid' => $page_owner_uid ], [ 'order' => [ 'scale' => true ]]);
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2019-01-07 18:23:14 +00:00
$photos = DBA :: toArray ( $photos_stmt );
if ( DBA :: isResult ( $photos )) {
$photo = $photos [ 0 ];
2024-02-17 06:45:41 +00:00
$ext = Images :: getExtensionByMimeType ( $photo [ 'type' ]);
2018-11-21 16:55:16 +00:00
Photo :: update (
2023-05-13 23:54:35 +00:00
[ 'desc' => $desc , 'album' => $albname , 'allow_cid' => $str_contact_allow , 'allow_gid' => $str_circle_allow , 'deny_cid' => $str_contact_deny , 'deny_gid' => $str_circle_deny ],
2018-11-21 16:55:16 +00:00
[ 'resource-id' => $resource_id , 'uid' => $page_owner_uid ]
2010-08-09 00:08:39 +00:00
);
2017-03-25 13:56:23 +00:00
2016-12-26 01:41:00 +00:00
// Update the photo albums cache if album name was changed
if ( $albname !== $origaname ) {
2018-01-04 03:36:15 +00:00
Photo :: clearAlbumCache ( $page_owner_uid );
2016-12-26 01:41:00 +00:00
}
2017-03-25 13:56:23 +00:00
}
2014-07-21 22:36:20 +00:00
2019-01-07 18:23:14 +00:00
if ( DBA :: isResult ( $photos ) && ! $item_id ) {
2010-11-02 06:42:26 +00:00
// Create item container
2010-08-09 00:08:39 +00:00
$title = '' ;
2022-07-09 11:32:32 +00:00
$uri = Item :: newURI ();
2014-07-21 22:36:20 +00:00
2018-01-15 13:05:12 +00:00
$arr = [];
2018-09-27 11:52:15 +00:00
$arr [ 'guid' ] = System :: createUUID ();
2010-12-06 02:08:36 +00:00
$arr [ 'uid' ] = $page_owner_uid ;
2010-11-04 02:47:07 +00:00
$arr [ 'uri' ] = $uri ;
2018-07-19 13:52:05 +00:00
$arr [ 'post-type' ] = Item :: PT_IMAGE ;
2010-11-04 02:47:07 +00:00
$arr [ 'wall' ] = 1 ;
2018-11-21 16:55:16 +00:00
$arr [ 'resource-id' ] = $photo [ 'resource-id' ];
2010-12-06 02:08:36 +00:00
$arr [ 'contact-id' ] = $owner_record [ 'id' ];
$arr [ 'owner-name' ] = $owner_record [ 'name' ];
$arr [ 'owner-link' ] = $owner_record [ 'url' ];
$arr [ 'owner-avatar' ] = $owner_record [ 'thumb' ];
$arr [ 'author-name' ] = $owner_record [ 'name' ];
$arr [ 'author-link' ] = $owner_record [ 'url' ];
$arr [ 'author-avatar' ] = $owner_record [ 'thumb' ];
2010-11-04 02:47:07 +00:00
$arr [ 'title' ] = $title ;
2018-11-21 16:55:16 +00:00
$arr [ 'allow_cid' ] = $photo [ 'allow_cid' ];
$arr [ 'allow_gid' ] = $photo [ 'allow_gid' ];
$arr [ 'deny_cid' ] = $photo [ 'deny_cid' ];
$arr [ 'deny_gid' ] = $photo [ 'deny_gid' ];
2022-06-04 12:02:59 +00:00
$arr [ 'visible' ] = 0 ;
2011-10-17 21:52:03 +00:00
$arr [ 'origin' ] = 1 ;
2014-02-22 14:46:19 +00:00
2023-05-10 07:54:15 +00:00
$arr [ 'body' ] = Images :: getBBCodeByResource ( $photo [ 'resource-id' ], $user [ 'nickname' ], $photo [ 'scale' ], $ext );
2014-02-22 14:46:19 +00:00
2018-01-28 11:18:08 +00:00
$item_id = Item :: insert ( $arr );
2010-08-09 00:08:39 +00:00
}
2016-10-22 10:14:41 +00:00
if ( $item_id ) {
2021-07-30 06:22:52 +00:00
$item = Post :: selectFirst ([ 'inform' , 'uri-id' ], [ 'id' => $item_id , 'uid' => $page_owner_uid ]);
2019-05-26 13:00:19 +00:00
if ( DBA :: isResult ( $item )) {
$old_inform = $item [ 'inform' ];
}
2010-11-02 06:42:26 +00:00
}
2010-08-08 08:58:26 +00:00
2016-10-22 10:14:41 +00:00
if ( strlen ( $rawtags )) {
2010-11-02 06:42:26 +00:00
$inform = '' ;
// if the new tag doesn't have a namespace specifier (@foo or #foo) give it a hashtag
2018-01-01 21:47:00 +00:00
$x = substr ( $rawtags , 0 , 1 );
2017-03-25 13:56:23 +00:00
if ( $x !== '@' && $x !== '#' ) {
2010-11-02 06:42:26 +00:00
$rawtags = '#' . $rawtags ;
2017-03-25 13:56:23 +00:00
}
2010-11-02 06:42:26 +00:00
2018-01-15 13:05:12 +00:00
$taginfo = [];
2018-11-09 18:24:19 +00:00
$tags = BBCode :: getTags ( $rawtags );
2010-11-02 06:42:26 +00:00
2016-10-22 10:14:41 +00:00
if ( count ( $tags )) {
foreach ( $tags as $tag ) {
2017-03-30 18:33:38 +00:00
if ( strpos ( $tag , '@' ) === 0 ) {
2018-01-01 21:47:00 +00:00
$profile = '' ;
2019-05-02 13:49:20 +00:00
$contact = null ;
2023-06-18 16:49:38 +00:00
$name = substr ( $tag , 1 );
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2017-03-30 18:33:38 +00:00
if (( strpos ( $name , '@' )) || ( strpos ( $name , 'http://' ))) {
2010-11-02 06:42:26 +00:00
$newname = $name ;
2016-07-09 18:09:09 +00:00
$links = @ Probe :: lrdd ( $name );
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2016-10-22 10:14:41 +00:00
if ( count ( $links )) {
foreach ( $links as $link ) {
2017-03-25 13:56:23 +00:00
if ( $link [ '@attributes' ][ 'rel' ] === 'http://webfinger.net/rel/profile-page' ) {
2015-09-29 22:19:54 +00:00
$profile = $link [ '@attributes' ][ 'href' ];
2017-03-25 13:56:23 +00:00
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2016-10-22 10:14:41 +00:00
if ( $link [ '@attributes' ][ 'rel' ] === 'salmon' ) {
2017-03-30 18:33:38 +00:00
$salmon = '$url:' . str_replace ( ',' , '%sc' , $link [ '@attributes' ][ 'href' ]);
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2017-03-25 13:56:23 +00:00
if ( strlen ( $inform )) {
2010-11-02 06:42:26 +00:00
$inform .= ',' ;
2017-03-25 13:56:23 +00:00
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2017-03-25 13:56:23 +00:00
$inform .= $salmon ;
2010-11-02 06:42:26 +00:00
}
}
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2018-01-15 13:05:12 +00:00
$taginfo [] = [ $newname , $profile , $salmon ];
2016-10-22 10:14:41 +00:00
} else {
2010-11-02 06:42:26 +00:00
$newname = $name ;
2011-10-28 02:12:30 +00:00
$tagcid = 0 ;
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2017-03-30 18:33:38 +00:00
if ( strrpos ( $newname , '+' )) {
$tagcid = intval ( substr ( $newname , strrpos ( $newname , '+' ) + 1 ));
2017-03-25 13:56:23 +00:00
}
2011-10-28 02:12:30 +00:00
2016-10-22 10:14:41 +00:00
if ( $tagcid ) {
2019-05-02 13:49:20 +00:00
$contact = DBA :: selectFirst ( 'contact' , [], [ 'id' => $tagcid , 'uid' => $page_owner_uid ]);
2016-10-22 10:14:41 +00:00
} else {
2023-06-18 16:49:38 +00:00
$newname = str_replace ( '_' , ' ' , $name );
2012-09-29 23:55:40 +00:00
//select someone from this user's contacts by name
2019-05-02 13:49:20 +00:00
$contact = DBA :: selectFirst ( 'contact' , [], [ 'name' => $newname , 'uid' => $page_owner_uid ]);
if ( ! DBA :: isResult ( $contact )) {
2012-09-29 23:55:40 +00:00
//select someone by attag or nick and the name passed in
2023-06-18 16:49:38 +00:00
$contact = DBA :: selectFirst (
'contact' ,
[],
2019-05-02 13:49:20 +00:00
[ '(`attag` = ? OR `nick` = ?) AND `uid` = ?' , $name , $name , $page_owner_uid ],
[ 'order' => [ 'attag' => true ]]
2012-09-29 23:55:40 +00:00
);
}
}
2017-03-30 19:38:22 +00:00
2019-05-02 13:49:20 +00:00
if ( DBA :: isResult ( $contact )) {
$newname = $contact [ 'name' ];
$profile = $contact [ 'url' ];
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2019-05-02 13:49:20 +00:00
$notify = 'cid:' . $contact [ 'id' ];
2017-03-25 13:56:23 +00:00
if ( strlen ( $inform )) {
2010-11-02 06:42:26 +00:00
$inform .= ',' ;
2017-03-25 13:56:23 +00:00
}
2010-11-03 23:48:21 +00:00
$inform .= $notify ;
2010-11-02 06:42:26 +00:00
}
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2016-10-22 10:14:41 +00:00
if ( $profile ) {
2019-05-02 13:49:20 +00:00
if ( ! empty ( $contact )) {
2020-05-14 02:35:13 +00:00
$taginfo [] = [ $newname , $profile , $notify , $contact ];
2017-03-25 13:56:23 +00:00
} else {
2020-05-14 02:35:13 +00:00
$taginfo [] = [ $newname , $profile , $notify , null ];
2017-03-25 13:56:23 +00:00
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2017-03-25 13:56:23 +00:00
$profile = str_replace ( ',' , '%2c' , $profile );
2020-04-18 20:46:41 +00:00
if ( ! empty ( $item [ 'uri-id' ])) {
Tag :: store ( $item [ 'uri-id' ], Tag :: MENTION , $newname , $profile );
2021-07-24 10:09:39 +00:00
}
2010-11-02 06:42:26 +00:00
}
2017-03-30 18:33:38 +00:00
} elseif ( strpos ( $tag , '#' ) === 0 ) {
2014-07-21 22:36:20 +00:00
$tagname = substr ( $tag , 1 );
2020-04-18 20:46:41 +00:00
if ( ! empty ( $item [ 'uri-id' ])) {
Tag :: store ( $item [ 'uri-id' ], Tag :: HASHTAG , $tagname );
}
2010-11-02 06:42:26 +00:00
}
}
}
2019-05-26 13:00:19 +00:00
$newinform = $old_inform ? ? '' ;
2017-03-25 13:56:23 +00:00
if ( strlen ( $newinform ) && strlen ( $inform )) {
2010-11-02 06:42:26 +00:00
$newinform .= ',' ;
2017-03-25 13:56:23 +00:00
}
2010-11-02 06:42:26 +00:00
$newinform .= $inform ;
2020-05-05 05:11:59 +00:00
$fields = [ 'inform' => $newinform , 'edited' => DateTimeFormat :: utcNow (), 'changed' => DateTimeFormat :: utcNow ()];
2018-02-06 12:40:22 +00:00
$condition = [ 'id' => $item_id ];
Item :: update ( $fields , $condition );
2010-11-03 23:48:21 +00:00
2010-11-05 03:47:44 +00:00
$best = 0 ;
2019-01-07 18:23:14 +00:00
foreach ( $photos as $scales ) {
2016-10-22 10:14:41 +00:00
if ( intval ( $scales [ 'scale' ]) == 2 ) {
2010-11-05 03:47:44 +00:00
$best = 2 ;
break ;
}
Cleanups: isResult() more used, readability improved (#5608)
* [diaspora]: Maybe SimpleXMLElement is the right type-hint?
* Changes proposed + pre-renaming:
- pre-renamed $db -> $connection
- added TODOs for not allowing bad method invocations (there is a
BadMethodCallException in SPL)
* If no record is found, below $r[0] will fail with a E_NOTICE and the code
doesn't behave as expected.
* Ops, one more left ...
* Continued:
- added documentation for Contact::updateSslPolicy() method
- added type-hint for $contact of same method
- empty lines added + TODO where the bug origins that $item has no element 'body'
* Added empty lines for better readability
* Cleaned up:
- no more x() (deprecated) usage but empty() instead
- fixed mixing of space/tab indending
- merged else/if block goether in elseif() (lesser nested code blocks)
* Re-fixed DBM -> DBA switch
* Fixes/rewrites:
- use empty()/isset() instead of deprecated x()
- merged 2 nested if() blocks into one
- avoided nested if() block inside else block by rewriting it to elseif()
- $contact_id is an integer, let's test on > 0 here
- added a lot spaces and some empty lines for better readability
* Rewrite:
- moved all CONTACT_* constants from boot.php to Contact class
* CR request:
- renamed Contact::CONTACT_IS_* -> Contact::* ;-)
* Rewrites:
- moved PAGE_* to Friendica\Model\Profile class
- fixed mixure with "Contact::* rewrite"
* Ops, one still there (return is no function)
* Rewrite to Proxy class:
- introduced new Friendica\Network\Proxy class for in exchange of proxy_*()
functions
- moved also all PROXY_* constants there as Proxy::*
- removed now no longer needed mod/proxy.php loading as composer's auto-load
will do this for us
- renamed those proxy_*() functions to better names:
+ proxy_init() -> Proxy::init() (public)
+ proxy_url() -> Proxy::proxifyUrl() (public)
+ proxy_parse_html() -> Proxy::proxifyHtml() (public)
+ proxy_is_local_image() -> Proxy::isLocalImage() (private)
+ proxy_parse_query() -> Proxy::parseQuery() (private)
+ proxy_img_cb() -> Proxy::replaceUrl() (private)
* CR request:
- moved all PAGE_* constants to Friendica\Model\Contact class
- fixed all references of both classes
* Ops, need to set $a here ...
* CR request:
- moved Proxy class to Friendica\Module
- extended BaseModule
* Ops, no need for own instance of $a when self::getApp() is around.
* Proxy-rewrite:
- proxy_url() and proxy_parse_html() are both non-module functions (now
methods)
- so they must be splitted into a seperate class
- also the SIZE_* and DEFAULT_TIME constants are both not relevant to module
* No instances from utility classes
* Fixed error:
- proxify*() is now located in `Friendica\Util\ProxyUtils`
* Moved back to original place, ops? How did they move here? Well, it was not
intended by me.
* Removed duplicate (left-over from split) constants and static array. Thank to
MrPetovan finding it.
* Renamed ProxyUtils -> Proxy and aliased it back to ProxyUtils.
* Rewrite:
- stopped using deprecated NETWORK_* constants, now Protocol::* should be used
- still left them intact for slow/lazy developers ...
* Ops, was added accidentally ...
* Ops, why these wrong moves?
* Ops, one to much (thanks to MrPetovan)
* Ops, wrong moving ...
* moved back to original place ...
* spaces added
* empty lines add for better readability.
* convertered spaces -> tab for code indenting.
* CR request: Add space between if and brace.
* CR requests fixed + move reverted
- ops, src/Module/*.php has been moved to src/Network/ accidentally
- reverted some parts in src/Database/DBA.php as pointed out by Annando
- removed internal TODO items
- added some spaces for better readability
2018-08-24 05:05:49 +00:00
2016-10-22 10:14:41 +00:00
if ( intval ( $scales [ 'scale' ]) == 4 ) {
2010-11-05 03:47:44 +00:00
$best = 4 ;
break ;
2010-11-03 23:48:21 +00:00
}
}
2016-10-22 10:14:41 +00:00
if ( count ( $taginfo )) {
foreach ( $taginfo as $tagged ) {
2022-07-09 11:32:32 +00:00
$uri = Item :: newURI ();
2010-11-05 03:47:44 +00:00
2022-09-12 21:12:11 +00:00
$arr = [
'guid' => System :: createUUID (),
'uid' => $page_owner_uid ,
'uri' => $uri ,
'wall' => 1 ,
'contact-id' => $owner_record [ 'id' ],
'owner-name' => $owner_record [ 'name' ],
'owner-link' => $owner_record [ 'url' ],
'owner-avatar' => $owner_record [ 'thumb' ],
'author-name' => $owner_record [ 'name' ],
'author-link' => $owner_record [ 'url' ],
'author-avatar' => $owner_record [ 'thumb' ],
'title' => '' ,
'allow_cid' => $photo [ 'allow_cid' ],
'allow_gid' => $photo [ 'allow_gid' ],
'deny_cid' => $photo [ 'deny_cid' ],
'deny_gid' => $photo [ 'deny_gid' ],
'visible' => 0 ,
'verb' => Activity :: TAG ,
'gravity' => Item :: GRAVITY_PARENT ,
'object-type' => Activity\ObjectType :: PERSON ,
'target-type' => Activity\ObjectType :: IMAGE ,
'inform' => $tagged [ 2 ],
'origin' => 1 ,
'body' => DI :: l10n () -> t ( '%1$s was tagged in %2$s by %3$s' , '[url=' . $tagged [ 1 ] . ']' . $tagged [ 0 ] . '[/url]' , '[url=' . DI :: baseUrl () . '/photos/' . $owner_record [ 'nickname' ] . '/image/' . $photo [ 'resource-id' ] . ']' . DI :: l10n () -> t ( 'a photo' ) . '[/url]' , '[url=' . $owner_record [ 'url' ] . ']' . $owner_record [ 'name' ] . '[/url]' ) . " \n \n " . '[url=' . DI :: baseUrl () . '/photos/' . $owner_record [ 'nickname' ] . '/image/' . $photo [ 'resource-id' ] . ']' . '[img]' . DI :: baseUrl () . '/photo/' . $photo [ 'resource-id' ] . '-' . $best . '.' . $ext . '[/img][/url]' . " \n " ,
'object' => '<object><type>' . Activity\ObjectType :: PERSON . '</type><title>' . $tagged [ 0 ] . '</title><id>' . $tagged [ 1 ] . '/' . $tagged [ 0 ] . '</id><link>' . XML :: escape ( '<link rel="alternate" type="text/html" href="' . $tagged [ 1 ] . '" />' . " \n " ),
'target' => '<target><type>' . Activity\ObjectType :: IMAGE . '</type><title>' . $photo [ 'desc' ] . '</title><id>' . DI :: baseUrl () . '/photos/' . $owner_record [ 'nickname' ] . '/image/' . $photo [ 'resource-id' ] . '</id><link>' . XML :: escape ( '<link rel="alternate" type="text/html" href="' . DI :: baseUrl () . '/photos/' . $owner_record [ 'nickname' ] . '/image/' . $photo [ 'resource-id' ] . '" />' . " \n " . '<link rel="preview" type="' . $photo [ 'type' ] . '" href="' . DI :: baseUrl () . '/photo/' . $photo [ 'resource-id' ] . '-' . $best . '.' . $ext . '" />' ) . '</link></target>' ,
];
2017-03-25 13:56:23 +00:00
if ( $tagged [ 3 ]) {
2019-01-07 18:23:14 +00:00
$arr [ 'object' ] .= XML :: escape ( '<link rel="photo" type="' . $photo [ 'type' ] . '" href="' . $tagged [ 3 ][ 'photo' ] . '" />' . " \n " );
2017-03-25 13:56:23 +00:00
}
2010-11-05 03:47:44 +00:00
$arr [ 'object' ] .= '</link></object>' . " \n " ;
2019-01-07 06:23:49 +00:00
Item :: insert ( $arr );
2010-11-05 03:47:44 +00:00
}
}
2010-11-02 06:42:26 +00:00
}
2019-12-15 23:28:31 +00:00
DI :: baseUrl () -> redirect ( $_SESSION [ 'photo_return' ]);
2010-08-08 08:58:26 +00:00
return ; // NOTREACHED
}
2010-08-06 04:15:24 +00:00
}
2024-05-13 16:19:19 +00:00
function photos_content ()
2018-01-01 21:47:00 +00:00
{
2010-08-06 04:15:24 +00:00
// URLs:
// photos/name/upload
2012-01-16 01:48:42 +00:00
// photos/name/upload/xxxxx (xxxxx is album name)
2010-08-06 04:15:24 +00:00
// photos/name/album/xxxxx
// photos/name/album/xxxxx/edit
2019-05-01 23:36:14 +00:00
// photos/name/album/xxxxx/drop
2010-08-06 04:15:24 +00:00
// photos/name/image/xxxxx
// photos/name/image/xxxxx/edit
2019-05-01 23:36:14 +00:00
// photos/name/image/xxxxx/drop
2010-08-09 00:08:39 +00:00
2022-11-15 14:04:12 +00:00
$user = User :: getByNickname ( DI :: args () -> getArgv ()[ 1 ] ? ? '' );
2021-07-24 10:09:39 +00:00
if ( ! DBA :: isResult ( $user )) {
throw new HTTPException\NotFoundException ( DI :: l10n () -> t ( 'User not found.' ));
}
2022-10-20 19:02:49 +00:00
if ( DI :: config () -> get ( 'system' , 'block_public' ) && ! DI :: userSession () -> isAuthenticated ()) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Public access denied.' ));
2011-04-22 00:29:47 +00:00
return ;
}
2014-02-22 14:46:19 +00:00
2021-07-24 10:09:39 +00:00
if ( empty ( $user )) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'No photos selected' ));
2010-08-06 04:15:24 +00:00
return ;
}
2021-08-08 10:14:56 +00:00
$profile = Profile :: getByUID ( $user [ 'uid' ]);
2019-12-16 00:33:13 +00:00
$_SESSION [ 'photo_return' ] = DI :: args () -> getCommand ();
2010-08-06 04:15:24 +00:00
2015-06-22 18:07:19 +00:00
// Parse arguments
2018-01-01 21:47:00 +00:00
$datum = null ;
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 3 ) {
$datatype = DI :: args () -> getArgv ()[ 2 ];
$datum = DI :: args () -> getArgv ()[ 3 ];
} elseif (( DI :: args () -> getArgc () > 2 ) && ( DI :: args () -> getArgv ()[ 2 ] === 'upload' )) {
2010-08-06 04:15:24 +00:00
$datatype = 'upload' ;
2017-03-25 13:56:23 +00:00
} else {
2010-08-06 04:15:24 +00:00
$datatype = 'summary' ;
2017-03-25 13:56:23 +00:00
}
2010-08-06 04:15:24 +00:00
2021-07-25 13:08:22 +00:00
if ( DI :: args () -> getArgc () > 4 ) {
$cmd = DI :: args () -> getArgv ()[ 4 ];
2017-03-25 13:56:23 +00:00
} else {
2010-08-06 04:15:24 +00:00
$cmd = 'view' ;
2017-03-25 13:56:23 +00:00
}
2010-08-06 04:15:24 +00:00
// Setup permissions structures
2016-01-04 10:46:19 +00:00
$can_post = false ;
$visitor = 0 ;
$contact = null ;
$remote_contact = false ;
$contact_id = 0 ;
2019-05-01 23:36:14 +00:00
$edit = '' ;
$drop = '' ;
2010-08-06 04:15:24 +00:00
2021-07-24 10:09:39 +00:00
$owner_uid = $user [ 'uid' ];
2010-09-28 02:48:45 +00:00
2024-04-07 16:32:50 +00:00
$community_page = in_array ( $user [ 'page-flags' ], [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_COMM_MAN ]);
2010-12-08 01:16:05 +00:00
2022-10-20 19:02:49 +00:00
if ( DI :: userSession () -> getLocalUserId () && ( DI :: userSession () -> getLocalUserId () == $owner_uid )) {
2016-01-04 10:46:19 +00:00
$can_post = true ;
2022-10-20 19:02:49 +00:00
} elseif ( $community_page && ! empty ( DI :: userSession () -> getRemoteContactID ( $owner_uid ))) {
$contact_id = DI :: userSession () -> getRemoteContactID ( $owner_uid );
2019-09-25 22:24:17 +00:00
$contact = DBA :: selectFirst ( 'contact' , [], [ 'id' => $contact_id , 'uid' => $owner_uid , 'blocked' => false , 'pending' => false ]);
2019-05-02 13:49:20 +00:00
2019-09-25 22:24:17 +00:00
if ( DBA :: isResult ( $contact )) {
$can_post = true ;
$remote_contact = true ;
$visitor = $contact_id ;
2016-01-04 10:46:19 +00:00
}
}
2018-01-01 21:47:00 +00:00
// perhaps they're visiting - but not a community page, so they wouldn't have write access
2022-10-20 19:02:49 +00:00
if ( ! empty ( DI :: userSession () -> getRemoteContactID ( $owner_uid )) && ! $visitor ) {
$contact_id = DI :: userSession () -> getRemoteContactID ( $owner_uid );
2019-05-02 13:49:20 +00:00
2019-09-25 22:24:17 +00:00
$contact = DBA :: selectFirst ( 'contact' , [], [ 'id' => $contact_id , 'uid' => $owner_uid , 'blocked' => false , 'pending' => false ]);
2019-05-02 13:49:20 +00:00
2019-09-25 22:24:17 +00:00
$remote_contact = DBA :: isResult ( $contact );
2016-01-04 10:46:19 +00:00
}
2022-10-20 19:02:49 +00:00
if ( ! $remote_contact && DI :: userSession () -> getLocalUserId ()) {
2018-01-01 21:47:00 +00:00
$contact_id = $_SESSION [ 'cid' ];
2021-07-24 11:49:11 +00:00
$contact = DBA :: selectFirst ( 'contact' , [], [ 'id' => $contact_id , 'uid' => $owner_uid , 'blocked' => false , 'pending' => false ]);
2016-01-04 10:46:19 +00:00
}
2010-08-06 04:15:24 +00:00
2022-11-30 18:50:52 +00:00
if ( $user [ 'hidewall' ] && ! DI :: userSession () -> isAuthenticated ()) {
DI :: baseUrl () -> redirect ( 'profile/' . $user [ 'nickname' ] . '/restricted' );
2011-05-28 07:42:01 +00:00
}
2019-09-28 09:36:41 +00:00
$sql_extra = Security :: getPermissionsSQLByUserId ( $owner_uid );
2010-08-06 04:15:24 +00:00
2011-06-23 09:30:17 +00:00
$o = " " ;
// tabs
2022-10-20 19:02:49 +00:00
$is_owner = ( DI :: userSession () -> getLocalUserId () && ( DI :: userSession () -> getLocalUserId () == $owner_uid ));
2022-11-30 19:38:23 +00:00
$o .= BaseProfile :: getTabsHTML ( 'photos' , $is_owner , $user [ 'nickname' ], $profile [ 'hide-friends' ]);
2011-06-23 09:30:17 +00:00
2018-01-01 21:47:00 +00:00
// Display upload form
2016-10-22 10:14:41 +00:00
if ( $datatype === 'upload' ) {
2017-12-28 20:37:23 +00:00
if ( ! $can_post ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Permission denied.' ));
2010-08-06 04:15:24 +00:00
return ;
}
2012-01-16 01:48:42 +00:00
2022-11-23 19:08:58 +00:00
// This prevents the photo upload form to return to itself without a hint the picture has been correctly uploaded.
DI :: session () -> remove ( 'photo_return' );
2022-06-20 06:25:17 +00:00
$selname = ( ! is_null ( $datum ) && Strings :: isHex ( $datum )) ? hex2bin ( $datum ) : '' ;
2012-01-16 01:48:42 +00:00
2024-05-10 00:57:35 +00:00
$albumselect = [ '' => '<current year>' ];
foreach ( Photo :: getAlbums ( $owner_uid ) as $album ) {
if ( $album [ 'album' ] === '' ) {
continue ;
2010-08-06 04:15:24 +00:00
}
2024-05-10 00:57:35 +00:00
$albumselect [ $album [ 'album' ]] = $album [ 'album' ];
2010-08-06 04:15:24 +00:00
}
2010-10-18 07:43:49 +00:00
2011-01-28 02:45:19 +00:00
$uploader = '' ;
2023-06-18 16:49:38 +00:00
$ret = [
'post_url' => 'profile/' . $user [ 'nickname' ] . '/photos' ,
'addon_text' => $uploader ,
'default_upload' => true
];
2011-01-28 02:45:19 +00:00
2023-06-18 16:49:38 +00:00
Hook :: callAll ( 'photo_upload_form' , $ret );
2011-01-28 02:45:19 +00:00
2018-10-31 14:44:06 +00:00
$default_upload_box = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'photos_default_uploader_box.tpl' ), []);
$default_upload_submit = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'photos_default_uploader_submit.tpl' ), [
2020-01-18 19:52:34 +00:00
'$submit' => DI :: l10n () -> t ( 'Submit' ),
2018-01-15 13:05:12 +00:00
]);
2011-01-28 02:45:19 +00:00
2022-11-26 20:47:55 +00:00
// Get the relevant size limits for uploads. Abbreviated var names: MaxImageSize -> mis; upload_max_filesize -> umf
2022-11-30 00:05:32 +00:00
$mis_bytes = Strings :: getBytesFromShorthand ( DI :: config () -> get ( 'system' , 'maximagesize' ));
2022-11-26 22:25:11 +00:00
$umf_bytes = Strings :: getBytesFromShorthand ( ini_get ( 'upload_max_filesize' ));
2022-11-30 01:44:48 +00:00
// Per Friendica definition a value of '0' means unlimited:
2023-06-18 16:49:38 +00:00
if ( $mis_bytes == 0 ) {
2022-11-30 01:16:04 +00:00
$mis_bytes = INF ;
}
2022-11-30 01:44:48 +00:00
2022-11-26 22:25:11 +00:00
// When PHP is configured with upload_max_filesize less than maximagesize provide this lower limit.
2022-11-30 03:34:40 +00:00
$maximagesize_bytes = ( is_numeric ( $mis_bytes ) && ( $mis_bytes < $umf_bytes ) ? $mis_bytes : $umf_bytes );
2022-11-26 20:53:12 +00:00
2023-03-22 03:17:33 +00:00
// @todo We may be want to use appropriate binary prefixed dynamically
2022-11-30 03:34:40 +00:00
$usage_message = DI :: l10n () -> t ( 'The maximum accepted image size is %s' , Strings :: formatBytes ( $maximagesize_bytes ));
2011-01-28 02:45:19 +00:00
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'photos_upload.tpl' );
2012-12-22 19:57:29 +00:00
2024-05-13 16:19:19 +00:00
$aclselect_e = ( $visitor ? '' : ACL :: getFullSelectorHTML ( DI :: page (), DI :: userSession () -> getLocalUserId ()));
2012-12-22 19:57:29 +00:00
2023-06-18 16:49:38 +00:00
$o .= Renderer :: replaceMacros ( $tpl , [
2020-01-18 19:52:34 +00:00
'$pagename' => DI :: l10n () -> t ( 'Upload Photos' ),
2010-08-06 04:15:24 +00:00
'$sessid' => session_id (),
2012-06-25 08:37:44 +00:00
'$usage' => $usage_message ,
2021-07-24 10:09:39 +00:00
'$nickname' => $user [ 'nickname' ],
2020-01-18 19:52:34 +00:00
'$newalbum' => DI :: l10n () -> t ( 'New album name: ' ),
'$existalbumtext' => DI :: l10n () -> t ( 'or select existing album:' ),
'$nosharetext' => DI :: l10n () -> t ( 'Do not show a status post for this upload' ),
2018-01-01 21:47:00 +00:00
'$albumselect' => $albumselect ,
2024-05-10 00:57:35 +00:00
'$selname' => $selname ,
2020-01-18 19:52:34 +00:00
'$permissions' => DI :: l10n () -> t ( 'Permissions' ),
2012-12-22 19:57:29 +00:00
'$aclselect' => $aclselect_e ,
2024-05-13 16:19:19 +00:00
'$lockstate' => ACL :: getLockstateForUserId ( DI :: userSession () -> getLocalUserId ()) ? 'lock' : 'unlock' ,
2013-01-26 19:52:21 +00:00
'$alt_uploader' => $ret [ 'addon_text' ],
2017-12-28 20:37:23 +00:00
'$default_upload_box' => ( $ret [ 'default_upload' ] ? $default_upload_box : '' ),
'$default_upload_submit' => ( $ret [ 'default_upload' ] ? $default_upload_submit : '' ),
2013-01-26 19:52:21 +00:00
'$uploadurl' => $ret [ 'post_url' ],
// ACL permissions box
2019-12-16 00:30:34 +00:00
'$return_path' => DI :: args () -> getQueryString (),
2018-01-15 13:05:12 +00:00
]);
2010-08-06 04:15:24 +00:00
2015-06-22 18:07:19 +00:00
return $o ;
2010-08-06 04:15:24 +00:00
}
2018-01-01 21:47:00 +00:00
// Display a single photo album
2016-10-22 10:14:41 +00:00
if ( $datatype === 'album' ) {
2019-05-29 18:28:25 +00:00
// if $datum is not a valid hex, redirect to the default page
2022-06-20 06:25:17 +00:00
if ( is_null ( $datum ) || ! Strings :: isHex ( $datum )) {
2023-06-18 16:49:38 +00:00
DI :: baseUrl () -> redirect ( 'photos/' . $user [ 'nickname' ] . '/album' );
2019-05-29 18:28:25 +00:00
}
2010-08-06 04:15:24 +00:00
$album = hex2bin ( $datum );
2021-10-19 19:15:28 +00:00
if ( $can_post && ! Photo :: exists ([ 'uid' => $owner_uid , 'album' => $album , 'photo-type' => Photo :: DEFAULT ])) {
$can_post = false ;
}
2018-10-24 06:15:24 +00:00
$total = 0 ;
2023-06-18 16:49:38 +00:00
$r = DBA :: toArray ( DBA :: p (
2024-01-15 16:45:24 +00:00
" SELECT `resource-id`, MAX(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ?
2011-07-28 23:49:43 +00:00
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` " ,
2021-10-08 04:10:45 +00:00
$owner_uid ,
$album
));
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $r )) {
2018-10-24 06:15:24 +00:00
$total = count ( $r );
2011-01-04 08:06:36 +00:00
}
2010-08-06 04:15:24 +00:00
2020-02-16 16:53:52 +00:00
$pager = new Pager ( DI :: l10n (), DI :: args () -> getQueryString (), 20 );
2018-10-24 06:15:24 +00:00
2017-03-25 13:56:23 +00:00
/// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it?
2019-10-15 13:01:17 +00:00
$order_field = $_GET [ 'order' ] ? ? '' ;
2022-06-25 10:17:56 +00:00
if ( $order_field === 'created' ) {
2012-09-09 01:33:28 +00:00
$order = 'ASC' ;
2017-03-25 13:56:23 +00:00
} else {
2012-09-09 01:33:28 +00:00
$order = 'DESC' ;
2017-03-25 13:56:23 +00:00
}
2012-09-09 01:33:28 +00:00
2023-06-18 16:49:38 +00:00
$r = DBA :: toArray ( DBA :: p (
2024-01-15 16:45:24 +00:00
" SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`,
MIN ( `type` ) AS `type` , MAX ( `scale` ) AS `scale` , MIN ( `desc` ) AS `desc` ,
MIN ( `created` ) AS `created`
2021-10-08 04:10:45 +00:00
FROM `photo` WHERE `uid` = ? AND `album` = ?
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT ? , ? " ,
2010-12-06 02:08:36 +00:00
intval ( $owner_uid ),
2018-07-21 13:10:13 +00:00
DBA :: escape ( $album ),
2018-10-24 06:15:24 +00:00
$pager -> getStart (),
$pager -> getItemsPerPage ()
2021-10-08 04:10:45 +00:00
));
2010-08-06 04:15:24 +00:00
2019-05-01 23:36:14 +00:00
if ( $cmd === 'drop' ) {
2019-12-16 00:30:34 +00:00
$drop_url = DI :: args () -> getQueryString ();
2019-05-01 23:36:14 +00:00
return Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'confirm.tpl' ), [
2021-10-02 15:26:14 +00:00
'$l10n' => [
'message' => DI :: l10n () -> t ( 'Do you really want to delete this photo album and all its photos?' ),
'confirm' => DI :: l10n () -> t ( 'Delete Album' ),
'cancel' => DI :: l10n () -> t ( 'Cancel' ),
],
'$method' => 'post' ,
'$confirm_url' => $drop_url ,
'$confirm_name' => 'dropalbum' ,
2021-09-18 07:28:29 +00:00
'$confirm_value' => 'dropalbum' ,
2019-05-01 23:36:14 +00:00
]);
}
2017-03-25 13:56:23 +00:00
// edit album name
2016-10-22 10:14:41 +00:00
if ( $cmd === 'edit' ) {
2021-10-19 19:15:28 +00:00
if ( $can_post ) {
$edit_tpl = Renderer :: getMarkupTemplate ( 'album_edit.tpl' );
$album_e = $album ;
2023-06-18 16:49:38 +00:00
$o .= Renderer :: replaceMacros ( $edit_tpl , [
2021-10-19 19:15:28 +00:00
'$nametext' => DI :: l10n () -> t ( 'New album name: ' ),
'$nickname' => $user [ 'nickname' ],
'$album' => $album_e ,
'$hexalbum' => bin2hex ( $album ),
'$submit' => DI :: l10n () -> t ( 'Submit' ),
'$dropsubmit' => DI :: l10n () -> t ( 'Delete Album' )
]);
2010-08-09 00:08:39 +00:00
}
2021-10-19 19:15:28 +00:00
} elseif ( $can_post ) {
$edit = [ DI :: l10n () -> t ( 'Edit Album' ), 'photos/' . $user [ 'nickname' ] . '/album/' . bin2hex ( $album ) . '/edit' ];
$drop = [ DI :: l10n () -> t ( 'Drop Album' ), 'photos/' . $user [ 'nickname' ] . '/album/' . bin2hex ( $album ) . '/drop' ];
2010-08-09 00:08:39 +00:00
}
2012-01-16 01:48:42 +00:00
2022-06-25 10:17:56 +00:00
if ( $order_field === 'created' ) {
2021-07-24 10:09:39 +00:00
$order = [ DI :: l10n () -> t ( 'Show Newest First' ), 'photos/' . $user [ 'nickname' ] . '/album/' . bin2hex ( $album ), 'oldest' ];
2017-03-25 13:56:23 +00:00
} else {
2022-06-25 10:17:56 +00:00
$order = [ DI :: l10n () -> t ( 'Show Oldest First' ), 'photos/' . $user [ 'nickname' ] . '/album/' . bin2hex ( $album ) . '?order=created' , 'newest' ];
2017-03-25 13:56:23 +00:00
}
2012-09-09 01:33:28 +00:00
2018-01-15 13:05:12 +00:00
$photos = [];
2012-09-09 01:33:28 +00:00
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $r )) {
2017-12-29 12:47:56 +00:00
// "Twist" is only used for the duepunto theme with style "slackr"
2017-12-28 20:37:23 +00:00
$twist = false ;
2016-10-22 10:14:41 +00:00
foreach ( $r as $rr ) {
2017-12-28 20:37:23 +00:00
$twist = ! $twist ;
2014-02-22 14:46:19 +00:00
2024-02-17 06:45:41 +00:00
$ext = Images :: getExtensionByMimeType ( $rr [ 'type' ]);
2012-05-21 23:40:11 +00:00
2017-11-27 06:44:49 +00:00
$imgalt_e = $rr [ 'filename' ];
$desc_e = $rr [ 'desc' ];
2015-06-22 18:07:19 +00:00
2018-01-15 13:05:12 +00:00
$photos [] = [
2023-06-18 16:49:38 +00:00
'id' => $rr [ 'id' ],
'twist' => ' ' . ( $twist ? 'rotleft' : 'rotright' ) . rand ( 2 , 4 ),
'link' => 'photos/' . $user [ 'nickname' ] . '/image/' . $rr [ 'resource-id' ]
2022-06-25 10:17:56 +00:00
. ( $order_field === 'created' ? '?order=created' : '' ),
2020-01-18 19:52:34 +00:00
'title' => DI :: l10n () -> t ( 'View Photo' ),
2024-02-17 06:45:41 +00:00
'src' => 'photo/' . $rr [ 'resource-id' ] . '-' . $rr [ 'scale' ] . $ext ,
2023-06-18 16:49:38 +00:00
'alt' => $imgalt_e ,
'desc' => $desc_e ,
'ext' => $ext ,
'hash' => $rr [ 'resource-id' ],
2018-01-15 13:05:12 +00:00
];
2018-01-01 21:47:00 +00:00
}
2010-08-06 04:15:24 +00:00
}
2014-12-25 15:20:55 +00:00
2018-10-31 14:44:06 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'photo_album.tpl' );
2018-10-31 14:35:50 +00:00
$o .= Renderer :: replaceMacros ( $tpl , [
2018-10-24 15:42:59 +00:00
'$photos' => $photos ,
'$album' => $album ,
'$can_post' => $can_post ,
2021-07-24 10:09:39 +00:00
'$upload' => [ DI :: l10n () -> t ( 'Upload New Photos' ), 'photos/' . $user [ 'nickname' ] . '/upload/' . bin2hex ( $album )],
2018-10-24 15:42:59 +00:00
'$order' => $order ,
'$edit' => $edit ,
2019-05-01 23:36:14 +00:00
'$drop' => $drop ,
2018-10-24 15:42:59 +00:00
'$paginate' => $pager -> renderFull ( $total ),
]);
2014-12-25 15:20:55 +00:00
2010-08-06 04:15:24 +00:00
return $o ;
2014-02-22 14:46:19 +00:00
}
2010-08-06 04:15:24 +00:00
2018-01-01 21:47:00 +00:00
// Display one photo
2016-10-22 10:14:41 +00:00
if ( $datatype === 'image' ) {
2010-08-07 13:20:27 +00:00
// fetch image, item containing image, then comments
2022-05-31 04:52:50 +00:00
$ph = Photo :: selectToArray ([], [ " `uid` = ? AND `resource-id` = ? " . $sql_extra , $owner_uid , $datum ], [ 'order' => [ 'scale' ]]);
2010-08-06 04:15:24 +00:00
2018-07-21 12:46:04 +00:00
if ( ! DBA :: isResult ( $ph )) {
2019-05-02 13:49:20 +00:00
if ( DBA :: exists ( 'photo' , [ 'resource-id' => $datum , 'uid' => $owner_uid ])) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Permission denied. Access to this item may be restricted.' ));
2017-03-25 13:32:49 +00:00
} else {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Photo not available' ));
2017-03-25 13:32:49 +00:00
}
2010-08-06 04:15:24 +00:00
return ;
}
2019-05-01 23:36:14 +00:00
if ( $cmd === 'drop' ) {
2019-12-16 00:30:34 +00:00
$drop_url = DI :: args () -> getQueryString ();
2019-05-01 23:36:14 +00:00
return Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'confirm.tpl' ), [
2021-10-02 15:26:14 +00:00
'$l10n' => [
'message' => DI :: l10n () -> t ( 'Do you really want to delete this photo?' ),
'confirm' => DI :: l10n () -> t ( 'Delete Photo' ),
'cancel' => DI :: l10n () -> t ( 'Cancel' ),
],
'$method' => 'post' ,
'$confirm_url' => $drop_url ,
'$confirm_name' => 'delete' ,
2021-09-18 07:28:29 +00:00
'$confirm_value' => 'delete' ,
2019-05-01 23:36:14 +00:00
]);
}
2011-03-12 04:06:13 +00:00
$prevlink = '' ;
$nextlink = '' ;
2017-03-25 14:06:54 +00:00
/*
* @ todo This query is totally bad , the whole functionality has to be changed
* The query leads to a really intense used index .
* By now we hide it if someone wants to .
*/
2020-01-19 20:21:13 +00:00
if ( $cmd === 'view' && ! DI :: config () -> get ( 'system' , 'no_count' , false )) {
2019-10-15 13:01:17 +00:00
$order_field = $_GET [ 'order' ] ? ? '' ;
2018-06-20 20:12:59 +00:00
2022-06-25 10:17:56 +00:00
if ( $order_field === 'created' ) {
2022-05-31 04:52:50 +00:00
$params = [ 'order' => [ $order_field ]];
2023-01-01 21:34:01 +00:00
} elseif ( ! empty ( $order_field ) && DBStructure :: existsColumn ( 'photo' , [ $order_field ])) {
2022-05-31 04:52:50 +00:00
$params = [ 'order' => [ $order_field => true ]];
2017-12-28 20:37:23 +00:00
} else {
2022-05-31 04:52:50 +00:00
$params = [];
2017-12-28 20:37:23 +00:00
}
2012-09-09 01:33:28 +00:00
2022-05-31 04:52:50 +00:00
$prvnxt = Photo :: selectToArray ([ 'resource-id' ], [ " `album` = ? AND `uid` = ? AND `scale` = ? " . $sql_extra , $ph [ 0 ][ 'album' ], $owner_uid , 0 ], $params );
2011-03-12 04:06:13 +00:00
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $prvnxt )) {
2018-08-05 13:55:57 +00:00
$prv = null ;
$nxt = null ;
2017-03-25 13:32:49 +00:00
foreach ( $prvnxt as $z => $entry ) {
if ( $entry [ 'resource-id' ] == $ph [ 0 ][ 'resource-id' ]) {
2023-01-04 15:58:45 +00:00
$prv = $order_field === 'created' ? $z - 1 : $z + 1 ;
$nxt = $order_field === 'created' ? $z + 1 : $z - 1 ;
2017-03-25 13:32:49 +00:00
if ( $prv < 0 ) {
2017-01-15 14:50:26 +00:00
$prv = count ( $prvnxt ) - 1 ;
2017-03-25 13:32:49 +00:00
}
2023-01-04 13:25:33 +00:00
if ( $nxt < 0 ) {
$nxt = count ( $prvnxt ) - 1 ;
}
if ( $prv >= count ( $prvnxt )) {
$prv = 0 ;
}
2017-03-25 13:32:49 +00:00
if ( $nxt >= count ( $prvnxt )) {
2017-01-15 14:50:26 +00:00
$nxt = 0 ;
2017-03-25 13:32:49 +00:00
}
2017-01-15 14:50:26 +00:00
break ;
}
2011-03-12 04:06:13 +00:00
}
2019-05-01 23:36:14 +00:00
2018-08-05 13:55:57 +00:00
if ( ! is_null ( $prv )) {
2022-06-25 10:17:56 +00:00
$prevlink = 'photos/' . $user [ 'nickname' ] . '/image/' . $prvnxt [ $prv ][ 'resource-id' ] . ( $order_field === 'created' ? '?order=created' : '' );
2018-08-05 13:55:57 +00:00
}
if ( ! is_null ( $nxt )) {
2022-06-25 10:17:56 +00:00
$nextlink = 'photos/' . $user [ 'nickname' ] . '/image/' . $prvnxt [ $nxt ][ 'resource-id' ] . ( $order_field === 'created' ? '?order=created' : '' );
2019-05-01 23:36:14 +00:00
}
$tpl = Renderer :: getMarkupTemplate ( 'photo_edit_head.tpl' );
2023-06-18 16:49:38 +00:00
DI :: page ()[ 'htmlhead' ] .= Renderer :: replaceMacros ( $tpl , [
2019-05-01 23:36:14 +00:00
'$prevlink' => $prevlink ,
'$nextlink' => $nextlink
]);
if ( $prevlink ) {
$prevlink = [ $prevlink , '<div class="icon prev"></div>' ];
}
if ( $nextlink ) {
$nextlink = [ $nextlink , '<div class="icon next"></div>' ];
2018-08-05 13:55:57 +00:00
}
2023-06-18 16:49:38 +00:00
}
2017-01-15 14:50:26 +00:00
}
2011-03-12 04:06:13 +00:00
2017-01-26 14:23:30 +00:00
if ( count ( $ph ) == 1 ) {
2010-08-06 13:30:25 +00:00
$hires = $lores = $ph [ 0 ];
2017-01-26 14:23:30 +00:00
}
2018-05-14 20:34:11 +00:00
2016-10-22 10:14:41 +00:00
if ( count ( $ph ) > 1 ) {
if ( $ph [ 1 ][ 'scale' ] == 2 ) {
2010-08-07 00:16:52 +00:00
// original is 640 or less, we can display it directly
$hires = $lores = $ph [ 0 ];
2016-10-22 10:14:41 +00:00
} else {
$hires = $ph [ 0 ];
$lores = $ph [ 1 ];
2010-08-07 00:16:52 +00:00
}
2010-08-06 04:15:24 +00:00
}
2021-07-24 10:09:39 +00:00
$album_link = 'photos/' . $user [ 'nickname' ] . '/album/' . bin2hex ( $ph [ 0 ][ 'album' ]);
2017-03-25 13:32:49 +00:00
2017-03-25 13:57:40 +00:00
$tools = null ;
2014-02-22 14:46:19 +00:00
2016-10-22 10:14:41 +00:00
if ( $can_post && ( $ph [ 0 ][ 'uid' ] == $owner_uid )) {
2019-05-01 23:36:14 +00:00
$tools = [];
if ( $cmd === 'edit' ) {
2021-07-24 10:09:39 +00:00
$tools [ 'view' ] = [ 'photos/' . $user [ 'nickname' ] . '/image/' . $datum , DI :: l10n () -> t ( 'View photo' )];
2019-05-01 23:36:14 +00:00
} else {
2021-07-24 10:09:39 +00:00
$tools [ 'edit' ] = [ 'photos/' . $user [ 'nickname' ] . '/image/' . $datum . '/edit' , DI :: l10n () -> t ( 'Edit photo' )];
$tools [ 'delete' ] = [ 'photos/' . $user [ 'nickname' ] . '/image/' . $datum . '/drop' , DI :: l10n () -> t ( 'Delete photo' )];
2019-10-27 13:56:27 +00:00
$tools [ 'profile' ] = [ 'settings/profile/photo/crop/' . $ph [ 0 ][ 'resource-id' ], DI :: l10n () -> t ( 'Use as profile photo' )];
2019-05-01 23:36:14 +00:00
}
2012-03-19 08:20:53 +00:00
2019-05-01 23:36:14 +00:00
if (
2022-10-20 19:02:49 +00:00
$ph [ 0 ][ 'uid' ] == DI :: userSession () -> getLocalUserId ()
2019-05-01 23:36:14 +00:00
&& ( strlen ( $ph [ 0 ][ 'allow_cid' ]) || strlen ( $ph [ 0 ][ 'allow_gid' ]) || strlen ( $ph [ 0 ][ 'deny_cid' ]) || strlen ( $ph [ 0 ][ 'deny_gid' ]))
) {
2020-01-18 19:52:34 +00:00
$tools [ 'lock' ] = DI :: l10n () -> t ( 'Private Photo' );
2019-05-01 23:36:14 +00:00
}
2017-01-26 14:23:30 +00:00
}
2010-08-08 08:58:26 +00:00
2018-01-15 13:05:12 +00:00
$photo = [
2024-02-17 06:45:41 +00:00
'href' => 'photo/' . $hires [ 'resource-id' ] . '-' . $hires [ 'scale' ] . Images :: getExtensionByMimeType ( $hires [ 'type' ]),
2023-06-18 16:49:38 +00:00
'title' => DI :: l10n () -> t ( 'View Full Size' ),
2024-02-17 06:45:41 +00:00
'src' => 'photo/' . $lores [ 'resource-id' ] . '-' . $lores [ 'scale' ] . Images :: getExtensionByMimeType ( $lores [ 'type' ]) . '?_u=' . DateTimeFormat :: utcNow ( 'ymdhis' ),
2023-06-18 16:49:38 +00:00
'height' => $hires [ 'height' ],
'width' => $hires [ 'width' ],
'album' => $hires [ 'album' ],
2014-02-22 14:46:19 +00:00
'filename' => $hires [ 'filename' ],
2018-01-15 13:05:12 +00:00
];
2011-03-12 04:06:13 +00:00
2019-07-08 03:51:23 +00:00
$map = null ;
$link_item = [];
$total = 0 ;
2010-08-06 13:30:25 +00:00
// Do we have an item for this photo?
2014-02-22 14:46:19 +00:00
// FIXME! - replace following code to display the conversation with our normal
2012-09-29 13:04:01 +00:00
// conversation functions so that it works correctly and tracks changes
// in the evolving conversation code.
// The difference is that we won't be displaying the conversation head item
// as a "post" but displaying instead the photo it is linked to
2021-10-08 10:28:28 +00:00
$link_item = Post :: selectFirst ([], [ " `resource-id` = ? " . $sql_extra , $datum ]);
2010-08-06 13:30:25 +00:00
2019-07-08 03:51:23 +00:00
if ( ! empty ( $link_item [ 'parent' ]) && ! empty ( $link_item [ 'uid' ])) {
2022-09-12 21:12:11 +00:00
$condition = [ " `parent` = ? AND `gravity` = ? " , $link_item [ 'parent' ], Item :: GRAVITY_COMMENT ];
2021-01-16 22:37:27 +00:00
$total = Post :: count ( $condition );
2018-10-24 15:42:59 +00:00
2020-02-16 16:53:52 +00:00
$pager = new Pager ( DI :: l10n (), DI :: args () -> getQueryString ());
2010-08-06 13:30:25 +00:00
2018-10-24 06:15:24 +00:00
$params = [ 'order' => [ 'id' ], 'limit' => [ $pager -> getStart (), $pager -> getItemsPerPage ()]];
2024-03-06 17:07:43 +00:00
$items = Post :: toArray ( Post :: selectForUser ( $link_item [ 'uid' ], array_merge ( Item :: ITEM_FIELDLIST , [ 'author-alias' ]), $condition , $params ));
2013-01-13 14:11:06 +00:00
2022-10-20 19:02:49 +00:00
if ( DI :: userSession () -> getLocalUserId () == $link_item [ 'uid' ]) {
2018-02-06 12:40:22 +00:00
Item :: update ([ 'unseen' => false ], [ 'parent' => $link_item [ 'parent' ]]);
2010-11-04 07:19:10 +00:00
}
2019-07-08 03:51:23 +00:00
}
2015-09-29 22:19:54 +00:00
2019-07-08 03:51:23 +00:00
if ( ! empty ( $link_item [ 'coord' ])) {
$map = Map :: byCoordinates ( $link_item [ 'coord' ]);
2010-08-09 00:08:39 +00:00
}
2010-08-06 04:15:24 +00:00
2017-03-25 13:32:49 +00:00
$tags = null ;
2011-07-04 02:57:20 +00:00
2020-05-06 04:58:25 +00:00
if ( ! empty ( $link_item [ 'id' ])) {
2011-05-05 08:53:03 +00:00
// parse tags and add links
2018-10-23 09:40:20 +00:00
$tag_arr = [];
2022-11-02 03:42:20 +00:00
foreach ( explode ( ',' , Tag :: getCSVByURIId ( $link_item [ 'uri-id' ])) as $tag_name ) {
if ( $tag_name ) {
$tag_arr [] = [
'name' => BBCode :: toPlaintext ( $tag_name ),
'removeurl' => 'post/' . $link_item [ 'id' ] . '/tag/remove/' . bin2hex ( $tag_name ) . '?return=' . urlencode ( DI :: args () -> getCommand ()),
];
}
2014-02-22 14:46:19 +00:00
}
2020-01-18 19:52:34 +00:00
$tags = [ 'title' => DI :: l10n () -> t ( 'Tags: ' ), 'tags' => $tag_arr ];
2016-10-22 10:14:41 +00:00
if ( $cmd === 'edit' ) {
2022-11-02 03:42:20 +00:00
$tags [ 'removeanyurl' ] = 'post/' . $link_item [ 'id' ] . '/tag/remove?return=' . urlencode ( DI :: args () -> getCommand ());
2020-01-18 19:52:34 +00:00
$tags [ 'removetitle' ] = DI :: l10n () -> t ( '[Select tags to remove]' );
2011-06-09 04:43:32 +00:00
}
2010-08-09 00:08:39 +00:00
}
2010-08-08 08:58:26 +00:00
2010-11-05 03:47:44 +00:00
2011-05-05 08:53:03 +00:00
$edit = Null ;
2018-01-01 21:47:00 +00:00
if ( $cmd === 'edit' && $can_post ) {
2018-10-31 14:44:06 +00:00
$edit_tpl = Renderer :: getMarkupTemplate ( 'photo_edit.tpl' );
2012-12-22 19:57:29 +00:00
2017-11-27 06:44:49 +00:00
$album_e = $ph [ 0 ][ 'album' ];
$caption_e = $ph [ 0 ][ 'desc' ];
2024-05-13 16:19:19 +00:00
$aclselect_e = ACL :: getFullSelectorHTML ( DI :: page (), DI :: userSession () -> getLocalUserId (), false , ACL :: getDefaultUserPermissions ( $ph [ 0 ]));
2012-12-22 19:57:29 +00:00
2018-10-31 14:35:50 +00:00
$edit = Renderer :: replaceMacros ( $edit_tpl , [
2010-08-09 00:08:39 +00:00
'$id' => $ph [ 0 ][ 'id' ],
2023-06-18 16:49:38 +00:00
'$album' => [ 'albname' , DI :: l10n () -> t ( 'New album name' ), $album_e , '' ],
2020-01-18 19:52:34 +00:00
'$caption' => [ 'desc' , DI :: l10n () -> t ( 'Caption' ), $caption_e , '' ],
'$tags' => [ 'newtag' , DI :: l10n () -> t ( 'Add a Tag' ), " " , DI :: l10n () -> t ( 'Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping' )],
2023-06-18 16:49:38 +00:00
'$rotate_none' => [ 'rotate' , DI :: l10n () -> t ( 'Do not rotate' ), 0 , '' , true ],
'$rotate_cw' => [ 'rotate' , DI :: l10n () -> t ( " Rotate CW \x28 right \x29 " ), 1 , '' ],
'$rotate_ccw' => [ 'rotate' , DI :: l10n () -> t ( " Rotate CCW \x28 left \x29 " ), 2 , '' ],
2015-06-22 18:07:19 +00:00
2021-07-24 10:09:39 +00:00
'$nickname' => $user [ 'nickname' ],
2010-08-09 00:08:39 +00:00
'$resource_id' => $ph [ 0 ][ 'resource-id' ],
2020-01-18 19:52:34 +00:00
'$permissions' => DI :: l10n () -> t ( 'Permissions' ),
2012-12-22 19:57:29 +00:00
'$aclselect' => $aclselect_e ,
2015-06-22 18:07:19 +00:00
2019-07-08 03:51:23 +00:00
'$item_id' => $link_item [ 'id' ] ? ? 0 ,
2020-01-18 19:52:34 +00:00
'$submit' => DI :: l10n () -> t ( 'Submit' ),
'$delete' => DI :: l10n () -> t ( 'Delete Photo' ),
2013-01-26 19:52:21 +00:00
// ACL permissions box
2019-12-16 00:30:34 +00:00
'$return_path' => DI :: args () -> getQueryString (),
2018-01-15 13:05:12 +00:00
]);
2010-08-09 00:08:39 +00:00
}
2010-08-07 13:20:27 +00:00
2018-01-01 21:47:00 +00:00
$like = '' ;
$dislike = '' ;
$likebuttons = '' ;
$comments = '' ;
$paginate = '' ;
2010-08-06 13:30:25 +00:00
2019-07-08 03:51:23 +00:00
if ( ! empty ( $link_item [ 'id' ]) && ! empty ( $link_item [ 'uri' ])) {
2018-10-31 14:44:06 +00:00
$cmnt_tpl = Renderer :: getMarkupTemplate ( 'comment_item.tpl' );
$tpl = Renderer :: getMarkupTemplate ( 'photo_item.tpl' );
2019-12-16 00:33:13 +00:00
$return_path = DI :: args () -> getCommand ();
2010-08-06 13:30:25 +00:00
2018-07-21 12:46:04 +00:00
if ( ! DBA :: isResult ( $items )) {
2018-10-17 19:30:41 +00:00
if (( $can_post || Security :: canWriteToUserWall ( $owner_uid ))) {
2020-09-09 20:49:03 +00:00
/*
* Hmmm , code depending on the presence of a particular addon ?
* This should be better if done by a hook
*/
$qcomment = null ;
if ( Addon :: isEnabled ( 'qcomment' )) {
2022-10-20 19:02:49 +00:00
$words = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'qcomment' , 'words' );
2020-09-09 20:49:03 +00:00
$qcomment = $words ? explode ( " \n " , $words ) : [];
}
2018-10-31 14:35:50 +00:00
$comments .= Renderer :: replaceMacros ( $cmnt_tpl , [
2017-03-30 19:48:46 +00:00
'$return_path' => '' ,
2018-10-19 21:55:11 +00:00
'$jsreload' => $return_path ,
2017-03-30 19:48:46 +00:00
'$id' => $link_item [ 'id' ],
'$parent' => $link_item [ 'id' ],
'$profile_uid' => $owner_uid ,
'$mylink' => $contact [ 'url' ],
2020-01-18 19:52:34 +00:00
'$mytitle' => DI :: l10n () -> t ( 'This is you' ),
2017-03-30 19:48:46 +00:00
'$myphoto' => $contact [ 'thumb' ],
2020-01-18 19:52:34 +00:00
'$comment' => DI :: l10n () -> t ( 'Comment' ),
'$submit' => DI :: l10n () -> t ( 'Submit' ),
'$preview' => DI :: l10n () -> t ( 'Preview' ),
2020-02-12 04:45:47 +00:00
'$loading' => DI :: l10n () -> t ( 'Loading...' ),
2020-09-09 20:49:03 +00:00
'$qcomment' => $qcomment ,
2023-03-13 12:47:09 +00:00
'$rand_num' => Crypto :: randomDigits ( 12 ),
2018-01-15 13:05:12 +00:00
]);
2010-08-06 13:30:25 +00:00
}
}
2018-01-15 13:05:12 +00:00
$conv_responses = [
2020-02-23 01:41:12 +00:00
'like' => [],
'dislike' => [],
'attendyes' => [],
'attendno' => [],
'attendmaybe' => []
2018-01-15 13:05:12 +00:00
];
2015-06-04 02:19:06 +00:00
2022-10-20 19:02:49 +00:00
if ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'hide_dislike' )) {
2020-02-20 03:20:26 +00:00
unset ( $conv_responses [ 'dislike' ]);
}
2010-08-06 13:30:25 +00:00
// display comments
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $items )) {
2018-06-23 10:32:53 +00:00
foreach ( $items as $item ) {
2021-09-23 21:18:36 +00:00
DI :: conversation () -> builtinActivityPuller ( $item , $conv_responses );
2010-11-02 23:24:23 +00:00
}
2018-07-23 01:19:28 +00:00
if ( ! empty ( $conv_responses [ 'like' ][ $link_item [ 'uri' ]])) {
2024-01-15 16:45:24 +00:00
$like = DI :: conversation () -> formatActivity ( $conv_responses [ 'like' ][ $link_item [ 'uri' ]][ 'links' ], 'like' , $link_item [ 'id' ], '' , []);
2018-01-01 21:47:00 +00:00
}
2018-07-23 01:19:28 +00:00
if ( ! empty ( $conv_responses [ 'dislike' ][ $link_item [ 'uri' ]])) {
2024-01-15 16:45:24 +00:00
$dislike = DI :: conversation () -> formatActivity ( $conv_responses [ 'dislike' ][ $link_item [ 'uri' ]][ 'links' ], 'dislike' , $link_item [ 'id' ], '' , []);
2018-01-01 21:47:00 +00:00
}
2010-11-02 23:24:23 +00:00
2018-10-17 19:30:41 +00:00
if (( $can_post || Security :: canWriteToUserWall ( $owner_uid ))) {
2020-09-09 20:49:03 +00:00
/*
* Hmmm , code depending on the presence of a particular addon ?
* This should be better if done by a hook
*/
$qcomment = null ;
if ( Addon :: isEnabled ( 'qcomment' )) {
2022-10-20 19:02:49 +00:00
$words = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'qcomment' , 'words' );
2020-09-09 20:49:03 +00:00
$qcomment = $words ? explode ( " \n " , $words ) : [];
}
2023-06-18 16:49:38 +00:00
$comments .= Renderer :: replaceMacros ( $cmnt_tpl , [
2017-03-30 19:48:46 +00:00
'$return_path' => '' ,
2018-10-19 21:55:11 +00:00
'$jsreload' => $return_path ,
2017-03-30 19:48:46 +00:00
'$id' => $link_item [ 'id' ],
'$parent' => $link_item [ 'id' ],
'$profile_uid' => $owner_uid ,
'$mylink' => $contact [ 'url' ],
2020-01-18 19:52:34 +00:00
'$mytitle' => DI :: l10n () -> t ( 'This is you' ),
2017-03-30 19:48:46 +00:00
'$myphoto' => $contact [ 'thumb' ],
2020-01-18 19:52:34 +00:00
'$comment' => DI :: l10n () -> t ( 'Comment' ),
'$submit' => DI :: l10n () -> t ( 'Submit' ),
'$preview' => DI :: l10n () -> t ( 'Preview' ),
2020-09-09 20:49:03 +00:00
'$qcomment' => $qcomment ,
2023-03-13 12:47:09 +00:00
'$rand_num' => Crypto :: randomDigits ( 12 ),
2018-01-15 13:05:12 +00:00
]);
2010-11-04 07:19:10 +00:00
}
2018-06-23 10:32:53 +00:00
foreach ( $items as $item ) {
2010-08-06 13:30:25 +00:00
$comment = '' ;
$template = $tpl ;
2010-11-02 23:24:23 +00:00
2019-12-15 22:28:01 +00:00
$activity = DI :: activity ();
2019-10-23 00:05:11 +00:00
2019-10-23 22:25:43 +00:00
if (( $activity -> match ( $item [ 'verb' ], Activity :: LIKE ) ||
2023-06-18 16:49:38 +00:00
$activity -> match ( $item [ 'verb' ], Activity :: DISLIKE )) &&
( $item [ 'gravity' ] != Item :: GRAVITY_PARENT )
) {
2010-11-02 23:24:23 +00:00
continue ;
2018-01-01 21:47:00 +00:00
}
2010-11-02 23:24:23 +00:00
2023-06-18 16:49:38 +00:00
$author = [
'uid' => 0 ,
'id' => $item [ 'author-id' ],
'network' => $item [ 'author-network' ],
'url' => $item [ 'author-link' ],
'alias' => $item [ 'author-alias' ]
];
2021-02-17 18:59:19 +00:00
$profile_url = Contact :: magicLinkByContact ( $author );
2022-11-09 00:33:08 +00:00
if ( strpos ( $profile_url , 'contact/redir/' ) === 0 ) {
2010-09-28 02:48:45 +00:00
$sparkle = ' sparkle' ;
2016-10-22 10:14:41 +00:00
} else {
2010-09-28 02:48:45 +00:00
$sparkle = '' ;
}
2014-02-22 14:46:19 +00:00
2022-10-20 19:02:49 +00:00
$dropping = (( $item [ 'contact-id' ] == $contact_id ) || ( $item [ 'uid' ] == DI :: userSession () -> getLocalUserId ()));
2018-01-15 13:05:12 +00:00
$drop = [
2014-04-28 13:29:48 +00:00
'dropping' => $dropping ,
'pagedrop' => false ,
2022-09-12 21:12:11 +00:00
'select' => DI :: l10n () -> t ( 'Select' ),
'delete' => DI :: l10n () -> t ( 'Delete' ),
2018-01-15 13:05:12 +00:00
];
2010-08-06 13:30:25 +00:00
2017-11-27 06:44:49 +00:00
$title_e = $item [ 'title' ];
2021-11-25 11:16:47 +00:00
$body_e = BBCode :: convertForUriId ( $item [ 'uri-id' ], $item [ 'body' ]);
2012-12-22 19:57:29 +00:00
2023-06-18 16:49:38 +00:00
$comments .= Renderer :: replaceMacros ( $template , [
2022-09-12 21:12:11 +00:00
'$id' => $item [ 'id' ],
2018-06-23 10:32:53 +00:00
'$profile_url' => $profile_url ,
2022-09-12 21:12:11 +00:00
'$name' => $item [ 'author-name' ],
'$thumb' => $item [ 'author-avatar' ],
'$sparkle' => $sparkle ,
'$title' => $title_e ,
'$body' => $body_e ,
'$ago' => Temporal :: getRelativeDate ( $item [ 'created' ]),
'$indent' => (( $item [ 'parent' ] != $item [ 'id' ]) ? ' comment' : '' ),
'$drop' => $drop ,
'$comment' => $comment
2018-01-15 13:05:12 +00:00
]);
2012-10-14 18:30:10 +00:00
2018-10-17 19:30:41 +00:00
if (( $can_post || Security :: canWriteToUserWall ( $owner_uid ))) {
2020-09-09 20:49:03 +00:00
/*
* Hmmm , code depending on the presence of a particular addon ?
* This should be better if done by a hook
*/
$qcomment = null ;
if ( Addon :: isEnabled ( 'qcomment' )) {
2022-10-20 19:02:49 +00:00
$words = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'qcomment' , 'words' );
2020-09-09 20:49:03 +00:00
$qcomment = $words ? explode ( " \n " , $words ) : [];
}
2018-10-31 14:35:50 +00:00
$comments .= Renderer :: replaceMacros ( $cmnt_tpl , [
2017-03-30 19:48:46 +00:00
'$return_path' => '' ,
2018-10-19 21:55:11 +00:00
'$jsreload' => $return_path ,
2019-05-29 19:40:21 +00:00
'$id' => $item [ 'id' ],
2017-03-30 19:48:46 +00:00
'$parent' => $item [ 'parent' ],
'$profile_uid' => $owner_uid ,
'$mylink' => $contact [ 'url' ],
2020-01-18 19:52:34 +00:00
'$mytitle' => DI :: l10n () -> t ( 'This is you' ),
2017-03-30 19:48:46 +00:00
'$myphoto' => $contact [ 'thumb' ],
2020-01-18 19:52:34 +00:00
'$comment' => DI :: l10n () -> t ( 'Comment' ),
'$submit' => DI :: l10n () -> t ( 'Submit' ),
'$preview' => DI :: l10n () -> t ( 'Preview' ),
2020-09-09 20:49:03 +00:00
'$qcomment' => $qcomment ,
2023-03-13 12:47:09 +00:00
'$rand_num' => Crypto :: randomDigits ( 12 ),
2018-01-15 13:05:12 +00:00
]);
2012-10-14 18:30:10 +00:00
}
2010-08-06 13:30:25 +00:00
}
}
2020-02-20 03:20:26 +00:00
2020-11-21 16:10:04 +00:00
$responses = [];
foreach ( $conv_responses as $verb => $activity ) {
if ( isset ( $activity [ $link_item [ 'uri' ]])) {
$responses [ $verb ] = $activity [ $link_item [ 'uri' ]];
}
}
if ( $cmd === 'view' && ( $can_post || Security :: canWriteToUserWall ( $owner_uid ))) {
$like_tpl = Renderer :: getMarkupTemplate ( 'like_noshare.tpl' );
$likebuttons = Renderer :: replaceMacros ( $like_tpl , [
'$id' => $link_item [ 'id' ],
'$like' => DI :: l10n () -> t ( 'Like' ),
'$like_title' => DI :: l10n () -> t ( 'I like this (toggle)' ),
'$dislike' => DI :: l10n () -> t ( 'Dislike' ),
'$wait' => DI :: l10n () -> t ( 'Please wait' ),
'$dislike_title' => DI :: l10n () -> t ( 'I don\'t like this (toggle)' ),
2022-10-20 19:02:49 +00:00
'$hide_dislike' => DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'hide_dislike' ),
2020-11-21 16:10:04 +00:00
'$responses' => $responses ,
'$return_path' => DI :: args () -> getQueryString (),
]);
}
2018-10-24 15:42:59 +00:00
$paginate = $pager -> renderFull ( $total );
2010-08-06 13:30:25 +00:00
}
2014-02-22 14:46:19 +00:00
2018-10-31 14:44:06 +00:00
$photo_tpl = Renderer :: getMarkupTemplate ( 'photo_view.tpl' );
2018-10-31 14:35:50 +00:00
$o .= Renderer :: replaceMacros ( $photo_tpl , [
2011-05-05 08:53:03 +00:00
'$id' => $ph [ 0 ][ 'id' ],
2018-01-01 21:47:00 +00:00
'$album' => [ $album_link , $ph [ 0 ][ 'album' ]],
2011-05-05 08:53:03 +00:00
'$tools' => $tools ,
'$photo' => $photo ,
'$prevlink' => $prevlink ,
'$nextlink' => $nextlink ,
'$desc' => $ph [ 0 ][ 'desc' ],
2018-01-01 21:47:00 +00:00
'$tags' => $tags ,
2014-02-22 14:46:19 +00:00
'$edit' => $edit ,
2015-09-29 22:19:54 +00:00
'$map' => $map ,
2020-01-18 19:52:34 +00:00
'$map_text' => DI :: l10n () -> t ( 'Map' ),
2011-05-05 08:53:03 +00:00
'$likebuttons' => $likebuttons ,
2018-01-01 21:47:00 +00:00
'$like' => $like ,
'$dislike' => $dislike ,
2011-05-05 08:53:03 +00:00
'$comments' => $comments ,
'$paginate' => $paginate ,
2018-01-15 13:05:12 +00:00
]);
2014-02-22 14:46:19 +00:00
2019-12-30 19:02:09 +00:00
DI :: page ()[ 'htmlhead' ] .= " \n " . '<meta name="twitter:card" content="summary_large_image" />' . " \n " ;
DI :: page ()[ 'htmlhead' ] .= '<meta name="twitter:title" content="' . $photo [ " album " ] . '" />' . " \n " ;
2019-12-30 22:00:08 +00:00
DI :: page ()[ 'htmlhead' ] .= '<meta name="twitter:image" content="' . DI :: baseUrl () . " / " . $photo [ " href " ] . '" />' . " \n " ;
2019-12-30 19:02:09 +00:00
DI :: page ()[ 'htmlhead' ] .= '<meta name="twitter:image:width" content="' . $photo [ " width " ] . '" />' . " \n " ;
DI :: page ()[ 'htmlhead' ] .= '<meta name="twitter:image:height" content="' . $photo [ " height " ] . '" />' . " \n " ;
2014-02-22 14:46:19 +00:00
2010-08-06 04:15:24 +00:00
return $o ;
}
}