2011-06-13 12:52:29 +02:00
< ? php
2017-11-30 02:28:30 +01:00
/**
2016-01-17 03:25:17 +01:00
* @ file mod / admin . php
2017-01-09 13:12:54 +01:00
*
2016-01-17 03:25:17 +01:00
* @ brief Friendica admin
*/
2018-01-15 00:59:08 +01:00
2017-04-30 06:07:00 +02:00
use Friendica\App ;
2018-10-17 21:30:41 +02:00
use Friendica\BaseModule ;
2017-12-04 15:04:36 +01:00
use Friendica\Content\Feature ;
2018-10-24 08:15:24 +02:00
use Friendica\Content\Pager ;
2018-01-15 00:59:08 +01:00
use Friendica\Content\Text\Markdown ;
2017-04-30 06:01:26 +02:00
use Friendica\Core\Config ;
2018-01-21 18:06:27 +01:00
use Friendica\Core\L10n ;
2018-10-29 22:20:46 +01:00
use Friendica\Core\Logger ;
2018-10-31 15:35:50 +01:00
use Friendica\Core\Renderer ;
2019-02-03 22:22:04 +01:00
use Friendica\Core\StorageManager ;
2018-01-15 00:59:08 +01:00
use Friendica\Core\System ;
2018-01-17 19:52:25 +01:00
use Friendica\Core\Theme ;
2018-10-14 13:19:37 +02:00
use Friendica\Core\Update ;
2017-11-05 13:15:53 +01:00
use Friendica\Core\Worker ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2017-12-14 22:13:02 +01:00
use Friendica\Database\DBStructure ;
2017-12-07 15:04:24 +01:00
use Friendica\Model\Contact ;
2018-01-18 00:22:01 +01:00
use Friendica\Model\Item ;
2018-10-14 17:57:28 +02:00
use Friendica\Model\Register ;
2018-01-25 03:08:45 +01:00
use Friendica\Model\User ;
2018-12-28 02:56:15 +01:00
use Friendica\Module ;
2017-12-17 17:40:59 +01:00
use Friendica\Module\Login ;
2018-05-19 18:52:23 +02:00
use Friendica\Module\Tos ;
2019-02-08 14:38:13 +01:00
use Friendica\Protocol\PortableContact ;
2018-07-31 03:24:26 +02:00
use Friendica\Util\Arrays ;
2019-02-03 22:22:04 +01:00
use Friendica\Util\BasePath ;
2019-04-08 21:12:10 +02:00
use Friendica\Util\BaseURL ;
2018-01-27 03:38:34 +01:00
use Friendica\Util\DateTimeFormat ;
2018-08-26 00:31:22 +02:00
use Friendica\Util\Network ;
2018-11-08 16:14:37 +01:00
use Friendica\Util\Strings ;
2018-10-14 17:57:28 +02:00
use Friendica\Util\Temporal ;
2019-01-22 07:30:52 +01:00
use Psr\Log\LogLevel ;
2016-01-17 03:25:17 +01:00
2012-04-18 09:24:47 +02:00
/**
2016-01-17 03:25:17 +01:00
* @ brief Process send data from the admin panels subpages
2015-12-26 08:49:38 +01:00
*
2018-10-14 17:32:54 +02:00
* This function acts as relay for processing the data send from the subpages
2015-12-26 08:49:38 +01:00
* of the admin panel . Depending on the 1 st parameter of the url ( argv [ 1 ])
* specialized functions are called to process the data from the subpages .
*
2018-10-14 17:32:54 +02:00
* The function itself does not return anything , but the subsequently function
2015-12-26 08:49:38 +01:00
* return the HTML for the pages of the admin panel .
*
2012-04-18 09:24:47 +02:00
* @ param App $a
2019-01-07 07:07:42 +01:00
* @ throws ImagickException
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2012-04-18 09:24:47 +02:00
*/
2017-11-30 02:28:30 +01:00
function admin_post ( App $a )
{
2017-03-13 18:23:02 +01:00
if ( ! is_site_admin ()) {
2011-10-18 09:18:21 +02:00
return ;
2011-06-13 18:03:06 +02:00
}
2012-02-17 08:50:57 +01:00
2012-02-24 05:29:09 +01:00
// do not allow a page manager to access the admin panel at all.
2012-02-17 08:50:57 +01:00
2018-11-30 15:06:22 +01:00
if ( ! empty ( $_SESSION [ 'submanage' ])) {
2012-02-17 08:50:57 +01:00
return ;
2016-12-20 10:35:28 +01:00
}
2012-02-24 05:29:09 +01:00
2018-01-05 01:42:48 +01:00
$return_path = 'admin' ;
2016-12-20 10:35:28 +01:00
if ( $a -> argc > 1 ) {
2017-03-13 18:23:02 +01:00
switch ( $a -> argv [ 1 ]) {
2017-07-07 10:38:07 +02:00
case 'deleteitem' :
admin_page_deleteitem_post ( $a );
break ;
2011-06-13 18:03:06 +02:00
}
}
2018-10-19 20:11:27 +02:00
$a -> internalRedirect ( $return_path );
2013-12-02 00:11:31 +01:00
return ; // NOTREACHED
2011-06-13 18:03:06 +02:00
}
2011-06-13 12:52:29 +02:00
2012-04-18 09:24:47 +02:00
/**
2016-01-17 03:25:17 +01:00
* @ brief Generates content of the admin panel pages
2016-01-16 14:12:55 +01:00
*
2016-01-19 09:15:32 +01:00
* This function generates the content for the admin panel . It consists of the
* aside menu ( same for the entire admin panel ) and the code for the soecified
* subpage of the panel .
*
* The structure of the adress is : / admin / subpage / details though " details " is
* only necessary for some subpages , like themes or addons where it is the name
* of one theme resp . addon from which the details should be shown . Content for
* the subpages is generated in separate functions for each of the subpages .
*
* The returned string hold the generated HTML code of the page .
2016-01-16 14:12:55 +01:00
*
2012-04-18 09:24:47 +02:00
* @ param App $a
* @ return string
2019-01-07 07:07:42 +01:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2012-04-18 09:24:47 +02:00
*/
2017-11-30 02:28:30 +01:00
function admin_content ( App $a )
{
2017-03-13 18:23:02 +01:00
if ( ! is_site_admin ()) {
2017-12-17 17:40:59 +01:00
return Login :: form ();
2011-06-13 12:52:29 +02:00
}
2018-11-30 15:06:22 +01:00
if ( ! empty ( $_SESSION [ 'submanage' ])) {
2012-04-18 09:24:47 +02:00
return " " ;
2016-12-20 10:35:28 +01:00
}
2012-02-17 08:50:57 +01:00
2014-05-03 12:02:25 +02:00
// APC deactivated, since there are problems with PHP 5.5
//if (function_exists("apc_delete")) {
2018-11-30 15:06:22 +01:00
// $toDelete = new APCIterator('user', APC_ITER_VALUE);
// apc_delete($toDelete);
2014-05-03 12:02:25 +02:00
//}
2016-01-17 03:25:17 +01:00
// Header stuff
2018-10-31 15:44:06 +01:00
$a -> page [ 'htmlhead' ] .= Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'admin/settings_head.tpl' ), []);
2016-01-17 03:25:17 +01:00
/*
2011-06-13 12:52:29 +02:00
* Side bar links
*/
2018-01-15 14:05:12 +01:00
$aside_tools = [];
2016-02-17 23:47:32 +01:00
// array(url, name, extra css classes)
2015-11-17 11:34:47 +01:00
// not part of $aside to make the template more adjustable
2018-01-15 14:05:12 +01:00
$aside_sub = [
2018-10-23 22:38:28 +02:00
'information' => [ L10n :: t ( 'Information' ), [
'overview' => [ 'admin/' , L10n :: t ( 'Overview' ), 'overview' ],
'federation' => [ 'admin/federation/' , L10n :: t ( 'Federation Statistics' ), 'federation' ]]],
'configuration' => [ L10n :: t ( 'Configuration' ), [
'site' => [ 'admin/site/' , L10n :: t ( 'Site' ) , 'site' ],
'users' => [ 'admin/users/' , L10n :: t ( 'Users' ) , 'users' ],
'addons' => [ 'admin/addons/' , L10n :: t ( 'Addons' ) , 'addons' ],
'themes' => [ 'admin/themes/' , L10n :: t ( 'Themes' ) , 'themes' ],
'features' => [ 'admin/features/' , L10n :: t ( 'Additional features' ) , 'features' ],
'tos' => [ 'admin/tos/' , L10n :: t ( 'Terms of Service' ) , 'tos' ]]],
'database' => [ L10n :: t ( 'Database' ), [
'dbsync' => [ 'admin/dbsync/' , L10n :: t ( 'DB updates' ) , 'dbsync' ],
'deferred' => [ 'admin/deferred/' , L10n :: t ( 'Inspect Deferred Workers' ), 'deferred' ],
'workerqueue' => [ 'admin/workerqueue/' , L10n :: t ( 'Inspect worker Queue' ) , 'workerqueue' ]]],
'tools' => [ L10n :: t ( 'Tools' ), [
'contactblock' => [ 'admin/contactblock/' , L10n :: t ( 'Contact Blocklist' ) , 'contactblock' ],
'blocklist' => [ 'admin/blocklist/' , L10n :: t ( 'Server Blocklist' ) , 'blocklist' ],
'deleteitem' => [ 'admin/deleteitem/' , L10n :: t ( 'Delete Item' ) , 'deleteitem' ],]],
'logs' => [ L10n :: t ( 'Logs' ), [
'logsconfig' => [ 'admin/logs/' , L10n :: t ( 'Logs' ), 'logs' ],
'logsview' => [ 'admin/viewlogs/' , L10n :: t ( 'View Logs' ), 'viewlogs' ]
2018-01-30 13:37:00 +01:00
]],
2018-10-23 22:38:28 +02:00
'diagnostics' => [ L10n :: t ( 'Diagnostics' ), [
'phpinfo' => [ 'phpinfo/' , L10n :: t ( 'PHP Info' ), 'phpinfo' ],
'probe' => [ 'probe/' , L10n :: t ( 'probe address' ), 'probe' ],
'webfinger' => [ 'webfinger/' , L10n :: t ( 'check webfinger' ), 'webfinger' ]
2018-01-30 13:37:00 +01:00
]]
2018-01-15 14:05:12 +01:00
];
2013-01-27 13:57:44 +01:00
2018-01-17 20:22:38 +01:00
$aside_tools [ 'addons_admin' ] = [];
2013-01-27 13:57:44 +01:00
2018-10-31 15:44:06 +01:00
$t = Renderer :: getMarkupTemplate ( 'admin/aside.tpl' );
2018-10-31 15:35:50 +01:00
$a -> page [ 'aside' ] .= Renderer :: replaceMacros ( $t , [
2016-01-17 03:25:17 +01:00
'$admin' => $aside_tools ,
'$subpages' => $aside_sub ,
2018-01-21 19:33:59 +01:00
'$admtxt' => L10n :: t ( 'Admin' ),
'$plugadmtxt' => L10n :: t ( 'Addon Features' ),
'$h_pending' => L10n :: t ( 'User registrations waiting for confirmation' ),
2017-11-30 02:28:30 +01:00
'$admurl' => " admin/ "
2018-01-15 14:05:12 +01:00
]);
2011-06-13 12:52:29 +02:00
2017-12-01 06:40:55 +01:00
// Page content
2011-06-13 12:52:29 +02:00
$o = '' ;
// urls
2017-03-13 18:23:02 +01:00
if ( $a -> argc > 1 ) {
switch ( $a -> argv [ 1 ]) {
2017-07-07 10:38:07 +02:00
case 'deleteitem' :
$o = admin_page_deleteitem ( $a );
break ;
2011-06-13 12:52:29 +02:00
default :
2018-01-21 19:33:59 +01:00
notice ( L10n :: t ( " Item not found. " ));
2011-06-13 12:52:29 +02:00
}
}
2013-01-27 13:57:44 +01:00
2018-10-13 18:57:31 +02:00
if ( $a -> isAjax ()) {
2014-07-09 21:36:20 +02:00
echo $o ;
2018-12-26 06:40:12 +01:00
exit ();
2012-04-13 11:20:05 +02:00
} else {
return $o ;
}
2014-07-09 21:36:20 +02:00
}
2011-06-13 12:52:29 +02:00
2017-07-07 10:38:07 +02:00
/**
2017-07-07 20:54:26 +02:00
* @ brief Subpage where the admin can delete an item from their node given the GUID
2017-07-07 10:38:07 +02:00
*
2017-07-07 20:54:26 +02:00
* This subpage of the admin panel offers the nodes admin to delete an item from
2017-07-07 10:38:07 +02:00
* the node , given the GUID or the display URL such as http :// example . com / display / 123456.
2017-07-07 20:54:26 +02:00
* The item will then be marked as deleted in the database and processed accordingly .
2017-10-08 10:22:29 +02:00
*
2017-07-07 10:38:07 +02:00
* @ param App $a
* @ return string
2019-01-07 07:07:42 +01:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2017-07-07 10:38:07 +02:00
*/
2017-11-30 02:28:30 +01:00
function admin_page_deleteitem ( App $a )
{
2018-10-31 15:44:06 +01:00
$t = Renderer :: getMarkupTemplate ( 'admin/deleteitem.tpl' );
2017-07-07 10:38:07 +02:00
2018-10-31 15:35:50 +01:00
return Renderer :: replaceMacros ( $t , [
2018-01-21 19:33:59 +01:00
'$title' => L10n :: t ( 'Administration' ),
'$page' => L10n :: t ( 'Delete Item' ),
'$submit' => L10n :: t ( 'Delete this Item' ),
'$intro1' => L10n :: t ( 'On this page you can delete an item from your node. If the item is a top level posting, the entire thread will be deleted.' ),
'$intro2' => L10n :: t ( 'You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.' ),
'$deleteitemguid' => [ 'deleteitemguid' , L10n :: t ( " GUID " ), '' , L10n :: t ( " The GUID of the item you want to delete. " ), 'required' , 'autofocus' ],
2017-08-26 09:32:10 +02:00
'$baseurl' => System :: baseUrl (),
2018-10-17 21:30:41 +02:00
'$form_security_token' => BaseModule :: getFormSecurityToken ( " admin_deleteitem " )
2018-01-15 14:05:12 +01:00
]);
2017-07-07 10:38:07 +02:00
}
2017-11-30 02:28:30 +01:00
2017-07-07 10:38:07 +02:00
/**
* @ brief Process send data from Admin Delete Item Page
*
* The GUID passed through the form should be only the GUID . But we also parse
* URLs like the full / display URL to make the process more easy for the admin .
*
* @ param App $a
2019-01-07 07:07:42 +01:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2017-07-07 10:38:07 +02:00
*/
2017-11-30 02:28:30 +01:00
function admin_page_deleteitem_post ( App $a )
{
2018-11-30 15:06:22 +01:00
if ( empty ( $_POST [ 'page_deleteitem_submit' ])) {
2017-07-07 10:38:07 +02:00
return ;
}
2018-10-17 21:30:41 +02:00
BaseModule :: checkFormSecurityTokenRedirectOnError ( '/admin/deleteitem/' , 'admin_deleteitem' );
2017-07-10 14:55:40 +02:00
2018-11-30 15:06:22 +01:00
if ( ! empty ( $_POST [ 'page_deleteitem_submit' ])) {
2018-11-09 19:29:42 +01:00
$guid = trim ( Strings :: escapeTags ( $_POST [ 'deleteitemguid' ]));
2017-07-07 10:38:07 +02:00
// The GUID should not include a "/", so if there is one, we got an URL
// and the last part of it is most likely the GUID.
if ( strpos ( $guid , '/' )) {
2017-11-30 02:28:30 +01:00
$guid = substr ( $guid , strrpos ( $guid , '/' ) + 1 );
2017-07-07 10:38:07 +02:00
}
2018-05-29 07:22:57 +02:00
// Now that we have the GUID, drop those items, which will also delete the
2017-07-10 14:55:40 +02:00
// associated threads.
2018-05-29 07:22:57 +02:00
Item :: delete ([ 'guid' => $guid ]);
2017-07-07 10:38:07 +02:00
}
2018-01-21 19:33:59 +01:00
info ( L10n :: t ( 'Item marked for deletion.' ) . EOL );
2018-10-19 20:11:27 +02:00
$a -> internalRedirect ( 'admin/deleteitem' );
2017-07-07 10:38:07 +02:00
return ; // NOTREACHED
}
2018-08-26 00:31:22 +02:00
function admin_page_server_vital ()
{
// Fetch the host-meta to check if this really is a vital server
2018-10-10 21:08:43 +02:00
return Network :: curl ( System :: baseUrl () . '/.well-known/host-meta' ) -> isSuccess ();
2018-08-26 00:31:22 +02:00
}