2010-07-01 23:48:07 +00:00
< ? php
2018-02-04 23:44:42 +00:00
/**
2018-02-05 19:09:03 +00:00
* @ file_tag_unsave_file boot . php
2015-12-24 00:31:17 +00:00
* This file defines some global constants and includes the central App class .
*/
/**
* Friendica
2016-04-03 11:48:31 +00:00
*
2015-12-24 00:31:17 +00:00
* Friendica is a communications platform for integrated social communications
* utilising decentralised communications and linkage to several indie social
* projects - as well as popular mainstream providers .
2016-04-03 11:48:31 +00:00
*
2015-12-24 00:31:17 +00:00
* Our mission is to free our friends and families from the clutches of
* data - harvesting corporations , and pave the way to a future where social
* communications are free and open and flow between alternate providers as
* easily as email does today .
*/
2010-07-01 23:48:07 +00:00
2017-11-09 16:05:18 +00:00
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php' ;
2016-04-03 11:48:31 +00:00
2017-04-30 04:07:00 +00:00
use Friendica\App ;
2018-01-17 18:42:40 +00:00
use Friendica\Core\Addon ;
2017-04-30 04:01:26 +00:00
use Friendica\Core\Config ;
2018-01-27 02:43:43 +00:00
use Friendica\Core\L10n ;
2017-11-07 02:22:52 +00:00
use Friendica\Core\PConfig ;
2018-02-05 19:09:03 +00:00
use Friendica\Core\Protocol ;
2018-01-25 02:08:45 +00:00
use Friendica\Core\System ;
2017-11-08 13:03:41 +00:00
use Friendica\Core\Worker ;
2017-11-08 03:57:46 +00:00
use Friendica\Database\DBM ;
2017-12-14 21:13:02 +00:00
use Friendica\Database\DBStructure ;
2018-01-25 02:08:45 +00:00
use Friendica\Model\Contact ;
2018-02-05 19:09:03 +00:00
use Friendica\Model\Conversation ;
2018-01-27 02:38:34 +00:00
use Friendica\Util\DateTimeFormat ;
2017-01-17 19:21:46 +00:00
2017-05-03 02:42:29 +00:00
require_once 'include/text.php' ;
2014-09-07 15:28:38 +00:00
2017-11-09 16:05:18 +00:00
define ( 'FRIENDICA_PLATFORM' , 'Friendica' );
define ( 'FRIENDICA_CODENAME' , 'Asparagus' );
define ( 'FRIENDICA_VERSION' , '3.6-dev' );
define ( 'DFRN_PROTOCOL_VERSION' , '2.23' );
2018-02-08 11:26:24 +00:00
define ( 'DB_UPDATE_VERSION' , 1250 );
2017-12-14 21:13:02 +00:00
define ( 'NEW_UPDATE_ROUTINE_VERSION' , 1170 );
/**
* @ brief Constants for the database update check
*/
const DB_UPDATE_NOT_CHECKED = 0 ; // Database check wasn't executed before
const DB_UPDATE_SUCCESSFUL = 1 ; // Database check was successful
const DB_UPDATE_FAILED = 2 ; // Database check failed
2015-12-25 17:36:13 +00:00
/**
* @ brief Constant with a HTML line break .
*
* Contains a HTML line break ( br ) element and a real carriage return with line
* feed for the source .
* This can be used in HTML and JavaScript where needed a line break .
*/
2017-11-09 16:05:18 +00:00
define ( 'EOL' , " <br /> \r \n " );
2011-08-17 03:05:02 +00:00
2011-05-04 09:20:44 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ brief Image storage quality .
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Lower numbers save space at cost of image detail .
2012-04-09 12:04:49 +00:00
* For ease of upgrade , please do not change here . Change jpeg quality with
* $a -> config [ 'system' ][ 'jpeg_quality' ] = n ;
* in . htconfig . php , where n is netween 1 and 100 , and with very poor results
* below about 50
2011-05-04 09:20:44 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'JPEG_QUALITY' , 100 );
2017-05-03 02:42:29 +00:00
2012-06-07 15:42:13 +00:00
/**
* $a -> config [ 'system' ][ 'png_quality' ] from 0 ( uncompressed ) to 9
*/
2017-11-09 16:05:18 +00:00
define ( 'PNG_QUALITY' , 8 );
2012-06-07 15:42:13 +00:00
2012-06-28 16:33:21 +00:00
/**
* An alternate way of limiting picture upload sizes . Specify the maximum pixel
* length that pictures are allowed to be ( for non - square pictures , it will apply
* to the longest side ) . Pictures longer than this length will be resized to be
* this length ( on the longest side , the other side will be scaled appropriately ) .
* Modify this value using
*
* $a -> config [ 'system' ][ 'max_image_length' ] = n ;
*
* in . htconfig . php
*
* If you don ' t want to set a maximum length , set to - 1. The default value is
* defined by 'MAX_IMAGE_LENGTH' below .
*/
2017-11-09 16:05:18 +00:00
define ( 'MAX_IMAGE_LENGTH' , - 1 );
2012-06-28 16:33:21 +00:00
2012-05-09 05:46:40 +00:00
/**
* Not yet used
*/
2017-11-09 16:05:18 +00:00
define ( 'DEFAULT_DB_ENGINE' , 'InnoDB' );
2012-05-09 05:46:40 +00:00
2011-01-30 06:35:11 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name SSL Policy
2016-10-02 03:29:30 +00:00
*
2011-01-30 06:35:11 +00:00
* SSL redirection policies
2015-12-25 19:58:26 +00:00
* @ {
2011-01-30 06:35:11 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'SSL_POLICY_NONE' , 0 );
define ( 'SSL_POLICY_FULL' , 1 );
define ( 'SSL_POLICY_SELFSIGN' , 2 );
2015-12-25 19:58:26 +00:00
/* @}*/
2011-01-30 06:35:11 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Logger
2016-10-02 03:29:30 +00:00
*
2010-12-10 12:04:35 +00:00
* log levels
2015-12-25 19:58:26 +00:00
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'LOGGER_NORMAL' , 0 );
define ( 'LOGGER_TRACE' , 1 );
define ( 'LOGGER_DEBUG' , 2 );
define ( 'LOGGER_DATA' , 3 );
define ( 'LOGGER_ALL' , 4 );
2015-12-25 19:58:26 +00:00
/* @}*/
2010-11-02 00:56:36 +00:00
2015-08-24 15:24:14 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Cache
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Cache levels
* @ {
2015-08-24 15:24:14 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'CACHE_MONTH' , 0 );
define ( 'CACHE_WEEK' , 1 );
define ( 'CACHE_DAY' , 2 );
define ( 'CACHE_HOUR' , 3 );
define ( 'CACHE_HALF_HOUR' , 4 );
define ( 'CACHE_QUARTER_HOUR' , 5 );
define ( 'CACHE_FIVE_MINUTES' , 6 );
define ( 'CACHE_MINUTE' , 7 );
2015-12-25 19:58:26 +00:00
/* @}*/
2015-08-24 15:24:14 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Register
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Registration policies
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'REGISTER_CLOSED' , 0 );
define ( 'REGISTER_APPROVE' , 1 );
define ( 'REGISTER_OPEN' , 2 );
/**
* @ }
*/
2010-07-01 23:48:07 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Contact_is
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Relationship types
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'CONTACT_IS_FOLLOWER' , 1 );
define ( 'CONTACT_IS_SHARING' , 2 );
define ( 'CONTACT_IS_FRIEND' , 3 );
/**
* @ }
*/
2010-09-09 23:48:33 +00:00
2012-04-29 00:53:19 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Update
2016-10-02 03:29:30 +00:00
*
2012-04-29 00:53:19 +00:00
* DB update return values
2015-12-25 19:58:26 +00:00
* @ {
2012-04-29 00:53:19 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'UPDATE_SUCCESS' , 0 );
define ( 'UPDATE_FAILED' , 1 );
/**
* @ }
*/
2012-04-29 00:53:19 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name page / profile types
2010-12-10 12:04:35 +00:00
*
* PAGE_NORMAL is a typical personal profile account
2011-08-07 23:15:54 +00:00
* PAGE_SOAPBOX automatically approves all friend requests as CONTACT_IS_SHARING , ( readonly )
2012-04-09 12:04:49 +00:00
* PAGE_COMMUNITY automatically approves all friend requests as CONTACT_IS_SHARING , but with
2010-12-10 12:04:35 +00:00
* write access to wall and comments ( no email and not included in page owner ' s ACL lists )
2012-04-09 12:04:49 +00:00
* PAGE_FREELOVE automatically approves all friend requests as full friends ( CONTACT_IS_FRIEND ) .
2010-12-10 12:04:35 +00:00
*
2015-12-25 19:58:26 +00:00
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'PAGE_NORMAL' , 0 );
define ( 'PAGE_SOAPBOX' , 1 );
define ( 'PAGE_COMMUNITY' , 2 );
define ( 'PAGE_FREELOVE' , 3 );
define ( 'PAGE_BLOG' , 4 );
define ( 'PAGE_PRVGROUP' , 5 );
/**
* @ }
*/
2010-10-17 05:11:21 +00:00
2016-09-25 15:28:00 +00:00
/**
2016-09-25 20:37:27 +00:00
* @ name account types
2016-09-25 15:28:00 +00:00
*
2016-09-27 18:29:50 +00:00
* ACCOUNT_TYPE_PERSON - the account belongs to a person
* Associated page types : PAGE_NORMAL , PAGE_SOAPBOX , PAGE_FREELOVE
*
* ACCOUNT_TYPE_ORGANISATION - the account belongs to an organisation
* Associated page type : PAGE_SOAPBOX
*
* ACCOUNT_TYPE_NEWS - the account is a news reflector
* Associated page type : PAGE_SOAPBOX
*
* ACCOUNT_TYPE_COMMUNITY - the account is community forum
* Associated page types : PAGE_COMMUNITY , PAGE_PRVGROUP
2016-09-25 15:28:00 +00:00
* @ {
*/
2017-11-09 16:05:18 +00:00
define ( 'ACCOUNT_TYPE_PERSON' , 0 );
define ( 'ACCOUNT_TYPE_ORGANISATION' , 1 );
define ( 'ACCOUNT_TYPE_NEWS' , 2 );
define ( 'ACCOUNT_TYPE_COMMUNITY' , 3 );
/**
* @ }
*/
2016-09-25 15:28:00 +00:00
2015-12-25 17:36:13 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name CP
2016-10-02 03:29:30 +00:00
*
2015-12-25 17:36:13 +00:00
* Type of the community page
2015-12-25 19:58:26 +00:00
* @ {
2015-12-25 17:36:13 +00:00
*/
2018-01-03 13:27:43 +00:00
define ( 'CP_NO_COMMUNITY_PAGE' , - 1 );
2017-11-09 16:05:18 +00:00
define ( 'CP_USERS_ON_SERVER' , 0 );
define ( 'CP_GLOBAL_COMMUNITY' , 1 );
2018-01-03 13:27:43 +00:00
define ( 'CP_USERS_AND_GLOBAL' , 2 );
2017-11-09 16:05:18 +00:00
/**
* @ }
*/
2015-02-08 19:35:40 +00:00
2017-04-22 20:46:40 +00:00
/**
* @ name Protocols
2018-02-05 19:09:03 +00:00
* @ deprecated since version 3.6
* @ see Conversation
2017-04-22 20:46:40 +00:00
*
* Different protocols that we are storing
* @ {
*/
2018-02-05 19:09:03 +00:00
define ( 'PROTOCOL_UNKNOWN' , Conversation :: PROTOCOL_UNKNOWN );
define ( 'PROTOCOL_DFRN' , Conversation :: PROTOCOL_DFRN );
define ( 'PROTOCOL_DIASPORA' , Conversation :: PROTOCOL_DIASPORA );
define ( 'PROTOCOL_OSTATUS_SALMON' , Conversation :: PROTOCOL_OSTATUS_SALMON );
define ( 'PROTOCOL_OSTATUS_FEED' , Conversation :: PROTOCOL_OSTATUS_FEED ); // Deprecated
define ( 'PROTOCOL_GS_CONVERSATION' , Conversation :: PROTOCOL_GS_CONVERSATION ); // Deprecated
define ( 'PROTOCOL_SPLITTED_CONV' , Conversation :: PROTOCOL_SPLITTED_CONV );
2017-11-09 16:05:18 +00:00
/**
* @ }
*/
2017-04-22 20:46:40 +00:00
2011-04-11 10:22:09 +00:00
/**
2018-02-05 17:57:41 +00:00
* @ name Network constants
2018-02-05 00:40:06 +00:00
* @ deprecated since version 3.6
2018-02-05 19:09:03 +00:00
* @ see Protocol
2016-10-02 03:29:30 +00:00
*
2012-04-09 12:04:49 +00:00
* Network and protocol family types
2015-12-25 19:58:26 +00:00
* @ {
2011-04-11 10:22:09 +00:00
*/
2018-02-05 17:57:41 +00:00
define ( 'NETWORK_DFRN' , Protocol :: DFRN ); // Friendica, Mistpark, other DFRN implementations
define ( 'NETWORK_ZOT' , Protocol :: ZOT ); // Zot! - Currently unsupported
define ( 'NETWORK_OSTATUS' , Protocol :: OSTATUS ); // GNU-social, Pleroma, Mastodon, other OStatus implementations
define ( 'NETWORK_FEED' , Protocol :: FEED ); // RSS/Atom feeds with no known "post/notify" protocol
define ( 'NETWORK_DIASPORA' , Protocol :: DIASPORA ); // Diaspora
define ( 'NETWORK_MAIL' , Protocol :: MAIL ); // IMAP/POP
define ( 'NETWORK_FACEBOOK' , Protocol :: FACEBOOK ); // Facebook API
define ( 'NETWORK_LINKEDIN' , Protocol :: LINKEDIN ); // LinkedIn
define ( 'NETWORK_XMPP' , Protocol :: XMPP ); // XMPP - Currently unsupported
define ( 'NETWORK_MYSPACE' , Protocol :: MYSPACE ); // MySpace - Currently unsupported
define ( 'NETWORK_GPLUS' , Protocol :: GPLUS ); // Google+
define ( 'NETWORK_PUMPIO' , Protocol :: PUMPIO ); // pump.io
define ( 'NETWORK_TWITTER' , Protocol :: TWITTER ); // Twitter
define ( 'NETWORK_DIASPORA2' , Protocol :: DIASPORA2 ); // Diaspora connector
define ( 'NETWORK_STATUSNET' , Protocol :: STATUSNET ); // Statusnet connector
define ( 'NETWORK_APPNET' , Protocol :: APPNET ); // app.net - Dead protocol
define ( 'NETWORK_NEWS' , Protocol :: NEWS ); // Network News Transfer Protocol - Currently unsupported
define ( 'NETWORK_ICALENDAR' , Protocol :: ICALENDAR ); // iCalendar - Currently unsupported
define ( 'NETWORK_PNUT' , Protocol :: PNUT ); // pnut.io - Currently unsupported
define ( 'NETWORK_PHANTOM' , Protocol :: PHANTOM ); // Place holder
2017-11-09 16:05:18 +00:00
/**
* @ }
*/
2012-05-11 10:41:29 +00:00
2012-04-09 14:56:01 +00:00
/**
2012-03-29 02:56:14 +00:00
* These numbers are used in stored permissions
* and existing allocations MUST NEVER BE CHANGED
* OR RE - ASSIGNED ! You may only add to them .
*/
2018-01-15 13:05:12 +00:00
$netgroup_ids = [
2012-03-29 02:56:14 +00:00
NETWORK_DFRN => ( - 1 ),
NETWORK_ZOT => ( - 2 ),
NETWORK_OSTATUS => ( - 3 ),
NETWORK_FEED => ( - 4 ),
NETWORK_DIASPORA => ( - 5 ),
NETWORK_MAIL => ( - 6 ),
NETWORK_FACEBOOK => ( - 8 ),
NETWORK_LINKEDIN => ( - 9 ),
NETWORK_XMPP => ( - 10 ),
NETWORK_MYSPACE => ( - 11 ),
NETWORK_GPLUS => ( - 12 ),
2013-08-28 06:56:48 +00:00
NETWORK_PUMPIO => ( - 13 ),
2013-09-05 06:34:54 +00:00
NETWORK_TWITTER => ( - 14 ),
2014-01-13 18:57:15 +00:00
NETWORK_DIASPORA2 => ( - 15 ),
2014-04-04 08:40:46 +00:00
NETWORK_STATUSNET => ( - 16 ),
2015-10-27 06:49:02 +00:00
NETWORK_APPNET => ( - 17 ),
NETWORK_NEWS => ( - 18 ),
NETWORK_ICALENDAR => ( - 19 ),
2017-02-02 06:06:23 +00:00
NETWORK_PNUT => ( - 20 ),
2012-05-11 10:41:29 +00:00
NETWORK_PHANTOM => ( - 127 ),
2018-01-15 13:05:12 +00:00
];
2012-03-29 02:56:14 +00:00
2010-12-10 12:04:35 +00:00
/**
* Maximum number of " people who like (or don't like) this " that we will list by name
*/
2017-11-09 16:05:18 +00:00
define ( 'MAX_LIKERS' , 75 );
2010-10-13 00:11:06 +00:00
2011-07-15 10:08:43 +00:00
/**
* Communication timeout
*/
2017-11-09 16:05:18 +00:00
define ( 'ZCURL_TIMEOUT' , ( - 1 ));
2011-07-15 10:08:43 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Notify
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Email notification options
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'NOTIFY_INTRO' , 0x0001 );
define ( 'NOTIFY_CONFIRM' , 0x0002 );
define ( 'NOTIFY_WALL' , 0x0004 );
define ( 'NOTIFY_COMMENT' , 0x0008 );
define ( 'NOTIFY_MAIL' , 0x0010 );
define ( 'NOTIFY_SUGGEST' , 0x0020 );
define ( 'NOTIFY_PROFILE' , 0x0040 );
define ( 'NOTIFY_TAGSELF' , 0x0080 );
define ( 'NOTIFY_TAGSHARE' , 0x0100 );
define ( 'NOTIFY_POKE' , 0x0200 );
define ( 'NOTIFY_SHARE' , 0x0400 );
define ( 'SYSTEM_EMAIL' , 0x4000 );
define ( 'NOTIFY_SYSTEM' , 0x8000 );
2015-12-25 19:58:26 +00:00
/* @}*/
2012-03-25 11:37:09 +00:00
2012-07-06 00:59:56 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Term
2016-10-02 03:29:30 +00:00
*
2012-07-06 00:59:56 +00:00
* Tag / term types
2015-12-25 19:58:26 +00:00
* @ {
2012-07-06 00:59:56 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'TERM_UNKNOWN' , 0 );
define ( 'TERM_HASHTAG' , 1 );
define ( 'TERM_MENTION' , 2 );
define ( 'TERM_CATEGORY' , 3 );
define ( 'TERM_PCATEGORY' , 4 );
define ( 'TERM_FILE' , 5 );
define ( 'TERM_SAVEDSEARCH' , 6 );
define ( 'TERM_CONVERSATION' , 7 );
define ( 'TERM_OBJ_POST' , 1 );
define ( 'TERM_OBJ_PHOTO' , 2 );
2012-07-06 00:59:56 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Namespaces
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Various namespaces we may need to parse
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'NAMESPACE_ZOT' , 'http://purl.org/zot' );
define ( 'NAMESPACE_DFRN' , 'http://purl.org/macgirvin/dfrn/1.0' );
define ( 'NAMESPACE_THREAD' , 'http://purl.org/syndication/thread/1.0' );
define ( 'NAMESPACE_TOMB' , 'http://purl.org/atompub/tombstones/1.0' );
define ( 'NAMESPACE_ACTIVITY' , 'http://activitystrea.ms/spec/1.0/' );
define ( 'NAMESPACE_ACTIVITY_SCHEMA' , 'http://activitystrea.ms/schema/1.0/' );
define ( 'NAMESPACE_MEDIA' , 'http://purl.org/syndication/atommedia' );
define ( 'NAMESPACE_SALMON_ME' , 'http://salmon-protocol.org/ns/magic-env' );
define ( 'NAMESPACE_OSTATUSSUB' , 'http://ostatus.org/schema/1.0/subscribe' );
define ( 'NAMESPACE_GEORSS' , 'http://www.georss.org/georss' );
define ( 'NAMESPACE_POCO' , 'http://portablecontacts.net/spec/1.0' );
define ( 'NAMESPACE_FEED' , 'http://schemas.google.com/g/2010#updates-from' );
define ( 'NAMESPACE_OSTATUS' , 'http://ostatus.org/schema/1.0' );
define ( 'NAMESPACE_STATUSNET' , 'http://status.net/schema/api/1/' );
define ( 'NAMESPACE_ATOM1' , 'http://www.w3.org/2005/Atom' );
define ( 'NAMESPACE_MASTODON' , 'http://mastodon.social/schema/1.0' );
2015-12-25 19:58:26 +00:00
/* @}*/
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Activity
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Activity stream defines
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'ACTIVITY_LIKE' , NAMESPACE_ACTIVITY_SCHEMA . 'like' );
define ( 'ACTIVITY_DISLIKE' , NAMESPACE_DFRN . '/dislike' );
define ( 'ACTIVITY_ATTEND' , NAMESPACE_ZOT . '/activity/attendyes' );
define ( 'ACTIVITY_ATTENDNO' , NAMESPACE_ZOT . '/activity/attendno' );
define ( 'ACTIVITY_ATTENDMAYBE' , NAMESPACE_ZOT . '/activity/attendmaybe' );
define ( 'ACTIVITY_OBJ_HEART' , NAMESPACE_DFRN . '/heart' );
define ( 'ACTIVITY_FRIEND' , NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
define ( 'ACTIVITY_REQ_FRIEND' , NAMESPACE_ACTIVITY_SCHEMA . 'request-friend' );
define ( 'ACTIVITY_UNFRIEND' , NAMESPACE_ACTIVITY_SCHEMA . 'remove-friend' );
define ( 'ACTIVITY_FOLLOW' , NAMESPACE_ACTIVITY_SCHEMA . 'follow' );
define ( 'ACTIVITY_UNFOLLOW' , NAMESPACE_ACTIVITY_SCHEMA . 'stop-following' );
define ( 'ACTIVITY_JOIN' , NAMESPACE_ACTIVITY_SCHEMA . 'join' );
define ( 'ACTIVITY_POST' , NAMESPACE_ACTIVITY_SCHEMA . 'post' );
define ( 'ACTIVITY_UPDATE' , NAMESPACE_ACTIVITY_SCHEMA . 'update' );
define ( 'ACTIVITY_TAG' , NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
define ( 'ACTIVITY_FAVORITE' , NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
define ( 'ACTIVITY_UNFAVORITE' , NAMESPACE_ACTIVITY_SCHEMA . 'unfavorite' );
define ( 'ACTIVITY_SHARE' , NAMESPACE_ACTIVITY_SCHEMA . 'share' );
define ( 'ACTIVITY_DELETE' , NAMESPACE_ACTIVITY_SCHEMA . 'delete' );
define ( 'ACTIVITY_POKE' , NAMESPACE_ZOT . '/activity/poke' );
define ( 'ACTIVITY_OBJ_BOOKMARK' , NAMESPACE_ACTIVITY_SCHEMA . 'bookmark' );
define ( 'ACTIVITY_OBJ_COMMENT' , NAMESPACE_ACTIVITY_SCHEMA . 'comment' );
define ( 'ACTIVITY_OBJ_NOTE' , NAMESPACE_ACTIVITY_SCHEMA . 'note' );
define ( 'ACTIVITY_OBJ_PERSON' , NAMESPACE_ACTIVITY_SCHEMA . 'person' );
define ( 'ACTIVITY_OBJ_IMAGE' , NAMESPACE_ACTIVITY_SCHEMA . 'image' );
define ( 'ACTIVITY_OBJ_PHOTO' , NAMESPACE_ACTIVITY_SCHEMA . 'photo' );
define ( 'ACTIVITY_OBJ_VIDEO' , NAMESPACE_ACTIVITY_SCHEMA . 'video' );
define ( 'ACTIVITY_OBJ_P_PHOTO' , NAMESPACE_ACTIVITY_SCHEMA . 'profile-photo' );
define ( 'ACTIVITY_OBJ_ALBUM' , NAMESPACE_ACTIVITY_SCHEMA . 'photo-album' );
define ( 'ACTIVITY_OBJ_EVENT' , NAMESPACE_ACTIVITY_SCHEMA . 'event' );
define ( 'ACTIVITY_OBJ_GROUP' , NAMESPACE_ACTIVITY_SCHEMA . 'group' );
define ( 'ACTIVITY_OBJ_TAGTERM' , NAMESPACE_DFRN . '/tagterm' );
define ( 'ACTIVITY_OBJ_PROFILE' , NAMESPACE_DFRN . '/profile' );
define ( 'ACTIVITY_OBJ_QUESTION' , 'http://activityschema.org/object/question' );
2015-12-25 19:58:26 +00:00
/* @}*/
2010-09-09 03:14:17 +00:00
2010-12-10 12:04:35 +00:00
/**
2015-12-25 19:58:26 +00:00
* @ name Gravity
2016-10-02 03:29:30 +00:00
*
2015-12-25 19:58:26 +00:00
* Item weight for query ordering
* @ {
2010-12-10 12:04:35 +00:00
*/
2017-11-09 16:05:18 +00:00
define ( 'GRAVITY_PARENT' , 0 );
define ( 'GRAVITY_LIKE' , 3 );
define ( 'GRAVITY_COMMENT' , 6 );
2015-12-25 19:58:26 +00:00
/* @}*/
2016-08-01 05:48:43 +00:00
/**
* @ name Priority
*
* Process priority for the worker
* @ {
*/
2017-11-09 16:05:18 +00:00
define ( 'PRIORITY_UNDEFINED' , 0 );
define ( 'PRIORITY_CRITICAL' , 10 );
define ( 'PRIORITY_HIGH' , 20 );
define ( 'PRIORITY_MEDIUM' , 30 );
define ( 'PRIORITY_LOW' , 40 );
define ( 'PRIORITY_NEGLIGIBLE' , 50 );
2016-08-01 05:48:43 +00:00
/* @}*/
2017-02-10 20:45:22 +00:00
/**
* @ name Social Relay settings
*
* See here : https :// github . com / jaywink / social - relay
* and here : https :// wiki . diasporafoundation . org / Relay_servers_for_public_posts
* @ {
*/
define ( 'SR_SCOPE_NONE' , '' );
define ( 'SR_SCOPE_ALL' , 'all' );
define ( 'SR_SCOPE_TAGS' , 'tags' );
/* @}*/
2010-09-09 03:14:17 +00:00
2017-02-27 23:37:15 +00:00
/**
* Lowest possible date time value
*/
2017-11-09 16:05:18 +00:00
define ( 'NULL_DATE' , '0001-01-01 00:00:00' );
2017-02-27 23:37:15 +00:00
2016-05-22 10:31:32 +00:00
// Normally this constant is defined - but not if "pcntl" isn't installed
2017-03-19 08:04:04 +00:00
if ( ! defined ( " SIGTERM " )) {
2016-05-22 10:31:32 +00:00
define ( " SIGTERM " , 15 );
2017-03-19 08:04:04 +00:00
}
2017-05-03 02:42:29 +00:00
2017-06-03 19:46:19 +00:00
/**
* Depending on the PHP version this constant does exist - or not .
* See here : http :// php . net / manual / en / curl . constants . php #117928
*/
if ( ! defined ( 'CURLE_OPERATION_TIMEDOUT' )) {
2017-11-09 16:05:18 +00:00
define ( 'CURLE_OPERATION_TIMEDOUT' , CURLE_OPERATION_TIMEOUTED );
2017-06-03 19:46:19 +00:00
}
2010-12-10 12:04:35 +00:00
/**
* Reverse the effect of magic_quotes_gpc if it is enabled .
* Please disable magic_quotes_gpc so we don ' t have to do this .
* See http :// php . net / manual / en / security . magicquotes . disabling . php
*/
2017-11-09 16:05:18 +00:00
function startup ()
{
2011-07-18 04:34:02 +00:00
error_reporting ( E_ERROR | E_WARNING | E_PARSE );
2012-10-15 23:28:43 +00:00
2011-07-18 04:34:02 +00:00
set_time_limit ( 0 );
2011-09-23 00:35:49 +00:00
// This has to be quite large to deal with embedded private photos
2011-11-02 08:50:15 +00:00
ini_set ( 'pcre.backtrack_limit' , 500000 );
2011-07-18 04:34:02 +00:00
if ( get_magic_quotes_gpc ()) {
2018-01-15 13:05:12 +00:00
$process = [ & $_GET , & $_POST , & $_COOKIE , & $_REQUEST ];
2012-04-09 12:04:49 +00:00
while ( list ( $key , $val ) = each ( $process )) {
foreach ( $val as $k => $v ) {
unset ( $process [ $key ][ $k ]);
if ( is_array ( $v )) {
$process [ $key ][ stripslashes ( $k )] = $v ;
$process [] = & $process [ $key ][ stripslashes ( $k )];
} else {
$process [ $key ][ stripslashes ( $k )] = stripslashes ( $v );
}
}
}
unset ( $process );
2011-07-18 04:34:02 +00:00
}
2010-11-24 07:42:45 +00:00
}
2015-12-24 00:31:17 +00:00
/**
* @ brief Retrieve the App structure
2016-10-02 03:29:30 +00:00
*
2015-12-24 00:31:17 +00:00
* Useful in functions which require it but don ' t get it passed to them
2017-12-17 20:27:50 +00:00
*
* @ return App
2015-12-24 00:31:17 +00:00
*/
2017-11-09 16:05:18 +00:00
function get_app ()
{
2015-12-24 00:31:17 +00:00
global $a ;
2017-10-11 14:52:08 +00:00
if ( empty ( $a )) {
$a = new App ( dirname ( __DIR__ ));
}
2015-12-24 00:31:17 +00:00
return $a ;
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Multi - purpose function to check variable state .
*
* Usage : x ( $var ) or $x ( $array , 'key' )
*
* returns false if variable / key is not set
* if variable is set , returns 1 if has 'non-zero' value , otherwise returns 0.
* e . g . x ( '' ) or x ( 0 ) returns 0 ;
*
* @ param string | array $s variable to check
2017-11-09 16:05:18 +00:00
* @ param string $k key inside the array to check
2015-12-24 00:31:17 +00:00
*
* @ return bool | int
*/
2017-11-09 16:05:18 +00:00
function x ( $s , $k = null )
{
if ( $k != null ) {
2017-04-01 19:46:57 +00:00
if (( is_array ( $s )) && ( array_key_exists ( $k , $s ))) {
2017-01-26 13:28:43 +00:00
if ( $s [ $k ]) {
2015-12-24 00:31:17 +00:00
return ( int ) 1 ;
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
return ( int ) 0 ;
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
return false ;
2017-01-26 13:28:43 +00:00
} else {
if ( isset ( $s )) {
if ( $s ) {
2015-12-24 00:31:17 +00:00
return ( int ) 1 ;
2010-07-01 23:48:07 +00:00
}
2015-12-24 00:31:17 +00:00
return ( int ) 0 ;
2010-07-01 23:48:07 +00:00
}
2015-12-24 00:31:17 +00:00
return false ;
2010-07-01 23:48:07 +00:00
}
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2018-01-01 19:50:47 +00:00
/**
* Return the provided variable value if it exists and is truthy or the provided
* default value instead .
*
* Works with initialized variables and potentially uninitialized array keys
*
* Usages :
* - defaults ( $var , $default )
* - defaults ( $array , 'key' , $default )
*
* @ brief Returns a defaut value if the provided variable or array key is falsy
* @ see x ()
* @ return mixed
*/
function defaults () {
$args = func_get_args ();
if ( count ( $args ) < 2 ) {
throw new BadFunctionCallException ( 'defaults() requires at least 2 parameters' );
}
if ( count ( $args ) > 3 ) {
throw new BadFunctionCallException ( 'defaults() cannot use more than 3 parameters' );
}
if ( count ( $args ) === 3 && is_null ( $args [ 1 ])) {
throw new BadFunctionCallException ( 'defaults($arr, $key, $def) $key is null' );
}
$default = array_pop ( $args );
if ( call_user_func_array ( 'x' , $args )) {
if ( count ( $args ) === 1 ) {
$return = $args [ 0 ];
} else {
$return = $args [ 0 ][ $args [ 1 ]];
}
} else {
$return = $default ;
}
return $return ;
}
2015-12-24 00:31:17 +00:00
/**
* @ brief Returns the baseurl .
*
2017-08-26 07:32:10 +00:00
* @ see System :: baseUrl ()
2015-12-24 00:31:17 +00:00
*
* @ return string
2017-08-26 07:32:10 +00:00
* @ TODO Function is deprecated and only used in some addons
2015-12-24 00:31:17 +00:00
*/
2017-11-09 16:05:18 +00:00
function z_root ()
{
2017-08-26 07:32:10 +00:00
return System :: baseUrl ();
2011-08-02 04:02:25 +00:00
}
2015-12-24 00:31:17 +00:00
/**
* @ brief Return absolut URL for given $path .
*
2017-11-09 16:05:18 +00:00
* @ param string $path given path
2015-12-24 00:31:17 +00:00
*
* @ return string
*/
2017-11-09 16:05:18 +00:00
function absurl ( $path )
{
2017-05-03 02:42:29 +00:00
if ( strpos ( $path , '/' ) === 0 ) {
2011-08-02 04:02:25 +00:00
return z_path () . $path ;
2017-01-26 13:28:43 +00:00
}
2011-08-02 04:02:25 +00:00
return $path ;
}
2015-12-24 00:31:17 +00:00
/**
* @ brief Function to check if request was an AJAX ( xmlhttprequest ) request .
*
* @ return boolean
*/
2017-11-09 16:05:18 +00:00
function is_ajax ()
{
2012-03-28 09:42:04 +00:00
return ( ! empty ( $_SERVER [ 'HTTP_X_REQUESTED_WITH' ]) && strtolower ( $_SERVER [ 'HTTP_X_REQUESTED_WITH' ]) == 'xmlhttprequest' );
}
2017-09-30 17:42:03 +00:00
/**
* @ brief Function to check if request was an AJAX ( xmlhttprequest ) request .
*
2017-11-19 21:47:21 +00:00
* @ param boolean $via_worker boolean Is the check run via the worker ?
2017-09-30 17:42:03 +00:00
*/
2017-11-09 16:05:18 +00:00
function check_db ( $via_worker )
{
2017-11-07 02:22:52 +00:00
$build = Config :: get ( 'system' , 'build' );
2017-12-22 14:48:29 +00:00
if ( empty ( $build )) {
2018-01-10 22:44:38 +00:00
Config :: set ( 'system' , 'build' , DB_UPDATE_VERSION - 1 );
2013-01-19 06:38:49 +00:00
$build = DB_UPDATE_VERSION ;
2013-01-19 01:37:45 +00:00
}
2017-12-22 14:48:29 +00:00
// We don't support upgrading from very old versions anymore
if ( $build < NEW_UPDATE_ROUTINE_VERSION ) {
die ( 'You try to update from a version prior to database version 1170. The direct upgrade path is not supported. Please update to version 3.5.4 before updating to this version.' );
}
2017-01-26 13:28:43 +00:00
if ( $build != DB_UPDATE_VERSION ) {
2017-09-30 16:45:35 +00:00
// When we cannot execute the database update via the worker, we will do it directly
2017-11-18 07:31:33 +00:00
if ( ! Worker :: add ( PRIORITY_CRITICAL , 'DBUpdate' ) && $via_worker ) {
2018-01-04 14:51:05 +00:00
update_db ();
2017-09-30 16:45:35 +00:00
}
2017-01-26 13:28:43 +00:00
}
2013-01-19 01:37:45 +00:00
}
2015-12-24 00:31:17 +00:00
/**
* Sets the base url for use in cmdline programs which don ' t have
* $_SERVER variables
2017-11-09 16:05:18 +00:00
*
* @ param object $a App
2015-12-24 00:31:17 +00:00
*/
2017-11-09 16:05:18 +00:00
function check_url ( App $a )
{
2017-11-07 02:22:52 +00:00
$url = Config :: get ( 'system' , 'url' );
2011-08-02 04:02:25 +00:00
2015-12-24 00:31:17 +00:00
// if the url isn't set or the stored url is radically different
// than the currently visited url, store the current value accordingly.
// "Radically different" ignores common variations such as http vs https
// and www.example.com vs example.com.
// We will only change the url to an ip address if there is no existing setting
2010-12-22 22:16:22 +00:00
2018-01-04 02:12:19 +00:00
if ( empty ( $url ) || ( ! link_compare ( $url , System :: baseUrl ())) && ( ! preg_match ( " /^( \ d { 1,3}) \ .( \ d { 1,3}) \ .( \ d { 1,3}) \ .( \ d { 1,3}) $ / " , $a -> get_hostname ))) {
Config :: set ( 'system' , 'url' , System :: baseUrl ());
2017-01-26 13:28:43 +00:00
}
2012-04-09 12:04:49 +00:00
2015-12-24 00:31:17 +00:00
return ;
}
2012-04-09 12:04:49 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Automatic database updates
2017-11-09 16:05:18 +00:00
* @ param object $a App
2015-12-24 00:31:17 +00:00
*/
2018-01-04 02:12:19 +00:00
function update_db ()
2017-11-09 16:05:18 +00:00
{
2017-11-07 02:22:52 +00:00
$build = Config :: get ( 'system' , 'build' );
2017-12-22 14:48:29 +00:00
2018-01-10 22:44:38 +00:00
if ( empty ( $build ) || ( $build > DB_UPDATE_VERSION )) {
$build = DB_UPDATE_VERSION - 1 ;
Config :: set ( 'system' , 'build' , $build );
2017-01-26 13:28:43 +00:00
}
2012-08-13 23:46:24 +00:00
2017-01-26 13:28:43 +00:00
if ( $build != DB_UPDATE_VERSION ) {
2017-12-22 14:56:40 +00:00
require_once 'update.php' ;
2015-12-24 00:31:17 +00:00
$stored = intval ( $build );
$current = intval ( DB_UPDATE_VERSION );
2017-01-26 13:28:43 +00:00
if ( $stored < $current ) {
2017-01-18 21:45:32 +00:00
Config :: load ( 'database' );
2015-12-24 00:31:17 +00:00
2017-12-22 14:48:29 +00:00
// Compare the current structure with the defined structure
$t = Config :: get ( 'database' , 'dbupdate_' . DB_UPDATE_VERSION );
if ( ! is_null ( $t )) {
return ;
}
2013-01-19 06:38:49 +00:00
2017-12-22 14:48:29 +00:00
Config :: set ( 'database' , 'dbupdate_' . DB_UPDATE_VERSION , time ());
// run update routine
// it update the structure in one call
$retval = DBStructure :: update ( false , true );
if ( $retval ) {
DBStructure :: updateFail (
DB_UPDATE_VERSION ,
$retval
);
return ;
} else {
Config :: set ( 'database' , 'dbupdate_' . DB_UPDATE_VERSION , 'success' );
}
2015-12-24 00:31:17 +00:00
2017-12-22 14:48:29 +00:00
// run any left update_nnnn functions in update.php
2017-12-22 21:31:32 +00:00
for ( $x = $stored + 1 ; $x <= $current ; $x ++ ) {
2017-12-22 14:48:29 +00:00
$r = run_update_function ( $x );
if ( ! $r ) {
break ;
2010-08-15 02:31:10 +00:00
}
}
}
2013-01-15 03:31:32 +00:00
}
2015-12-24 00:31:17 +00:00
return ;
2013-01-15 03:31:32 +00:00
}
2015-12-24 00:31:17 +00:00
2017-11-09 16:05:18 +00:00
function run_update_function ( $x )
{
2017-01-26 13:28:43 +00:00
if ( function_exists ( 'update_' . $x )) {
2015-12-24 00:31:17 +00:00
// There could be a lot of processes running or about to run.
// We want exactly one process to run the update command.
// So store the fact that we're taking responsibility
// after first checking to see if somebody else already has.
// If the update fails or times-out completely you may need to
// delete the config entry to try again.
2017-11-07 02:22:52 +00:00
$t = Config :: get ( 'database' , 'update_' . $x );
2017-12-06 19:57:06 +00:00
if ( ! is_null ( $t )) {
2015-12-24 00:31:17 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2017-11-07 02:22:52 +00:00
Config :: set ( 'database' , 'update_' . $x , time ());
2015-12-24 00:31:17 +00:00
// call the specific update
$func = 'update_' . $x ;
$retval = $func ();
2017-01-26 13:28:43 +00:00
if ( $retval ) {
2015-12-24 00:31:17 +00:00
//send the administrator an e-mail
2017-12-14 21:13:02 +00:00
DBStructure :: updateFail (
2015-12-24 00:31:17 +00:00
$x ,
2018-01-23 17:47:30 +00:00
L10n :: t ( 'Update %s failed. See error logs.' , $x )
2015-12-24 00:31:17 +00:00
);
return false ;
2014-09-07 15:28:38 +00:00
} else {
2017-11-07 02:22:52 +00:00
Config :: set ( 'database' , 'update_' . $x , 'success' );
2018-01-10 22:44:38 +00:00
Config :: set ( 'system' , 'build' , $x );
2014-09-07 15:28:38 +00:00
return true ;
}
2015-12-24 00:31:17 +00:00
} else {
2017-11-07 02:22:52 +00:00
Config :: set ( 'database' , 'update_' . $x , 'success' );
2018-01-10 22:44:38 +00:00
Config :: set ( 'system' , 'build' , $x );
2014-09-07 15:28:38 +00:00
return true ;
}
}
2013-01-15 03:31:32 +00:00
2015-12-25 19:58:26 +00:00
/**
2018-01-17 19:22:38 +00:00
* @ brief Synchronise addons :
2015-12-25 19:58:26 +00:00
*
* $a -> config [ 'system' ][ 'addon' ] contains a comma - separated list of names
2018-01-17 19:22:38 +00:00
* of addons which are used on this system .
2015-12-25 19:58:26 +00:00
* Go through the database list of already installed addons , and if we have
* an entry , but it isn ' t in the config list , call the uninstall procedure
* and mark it uninstalled in the database ( for now we ' ll remove it ) .
2018-01-17 19:22:38 +00:00
* Then go through the config list and if we have a addon that isn ' t installed ,
2015-12-25 19:58:26 +00:00
* call the install procedure and add it to the database .
2016-10-02 03:29:30 +00:00
*
2017-11-09 16:05:18 +00:00
* @ param object $a App
2017-01-26 13:28:43 +00:00
*/
2018-01-17 19:22:38 +00:00
function check_addons ( App $a )
2017-11-09 16:05:18 +00:00
{
2015-12-24 00:31:17 +00:00
$r = q ( " SELECT * FROM `addon` WHERE `installed` = 1 " );
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2015-12-24 00:31:17 +00:00
$installed = $r ;
2017-01-26 13:28:43 +00:00
} else {
2018-01-15 13:05:12 +00:00
$installed = [];
2017-01-26 13:28:43 +00:00
}
2011-10-18 07:18:21 +00:00
2018-01-17 19:22:38 +00:00
$addons = Config :: get ( 'system' , 'addon' );
$addons_arr = [];
2011-10-18 07:18:21 +00:00
2018-01-17 19:22:38 +00:00
if ( $addons ) {
$addons_arr = explode ( ',' , str_replace ( ' ' , '' , $addons ));
2017-01-26 13:28:43 +00:00
}
2011-10-18 07:18:21 +00:00
2018-01-17 19:22:38 +00:00
$a -> addons = $addons_arr ;
2011-10-18 07:18:21 +00:00
2018-01-15 13:05:12 +00:00
$installed_arr = [];
2011-10-18 07:18:21 +00:00
2017-01-26 13:28:43 +00:00
if ( count ( $installed )) {
foreach ( $installed as $i ) {
2018-01-17 19:22:38 +00:00
if ( ! in_array ( $i [ 'name' ], $addons_arr )) {
2018-01-17 18:42:40 +00:00
Addon :: uninstall ( $i [ 'name' ]);
2017-01-26 13:28:43 +00:00
} else {
2015-12-24 00:31:17 +00:00
$installed_arr [] = $i [ 'name' ];
2010-12-22 22:16:22 +00:00
}
}
2015-12-24 00:31:17 +00:00
}
2010-12-22 22:16:22 +00:00
2018-01-17 19:22:38 +00:00
if ( count ( $addons_arr )) {
foreach ( $addons_arr as $p ) {
2017-05-03 02:42:29 +00:00
if ( ! in_array ( $p , $installed_arr )) {
2018-01-17 18:42:40 +00:00
Addon :: install ( $p );
2010-12-22 22:16:22 +00:00
}
}
2015-12-24 00:31:17 +00:00
}
2011-03-09 10:12:32 +00:00
2018-01-17 18:42:40 +00:00
Addon :: loadHooks ();
2010-12-22 22:16:22 +00:00
2015-12-24 00:31:17 +00:00
return ;
2012-04-09 12:04:49 +00:00
}
2010-08-15 01:11:36 +00:00
2017-11-09 16:05:18 +00:00
function get_guid ( $size = 16 , $prefix = " " )
{
2015-03-09 19:59:57 +00:00
if ( $prefix == " " ) {
$a = get_app ();
$prefix = hash ( " crc32 " , $a -> get_hostname ());
}
2014-07-21 22:36:20 +00:00
2017-03-23 19:48:48 +00:00
while ( strlen ( $prefix ) < ( $size - 13 )) {
2015-03-09 19:59:57 +00:00
$prefix .= mt_rand ();
2017-03-23 19:48:48 +00:00
}
2011-08-05 02:19:51 +00:00
2015-03-09 19:59:57 +00:00
if ( $size >= 24 ) {
$prefix = substr ( $prefix , 0 , $size - 22 );
return ( str_replace ( " . " , " " , uniqid ( $prefix , true )));
} else {
2015-12-16 09:47:26 +00:00
$prefix = substr ( $prefix , 0 , max ( $size - 13 , 0 ));
2015-03-09 19:59:57 +00:00
return ( uniqid ( $prefix ));
}
}
2010-07-01 23:48:07 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Used to end the current process , after saving session state .
2018-02-03 05:46:05 +00:00
* @ deprecated
2015-12-24 00:31:17 +00:00
*/
2017-11-09 16:05:18 +00:00
function killme ()
{
2017-03-24 20:17:00 +00:00
exit ();
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Redirect to another URL and terminate this process .
*/
2017-12-17 16:43:30 +00:00
function goaway ( $path )
2017-11-09 16:05:18 +00:00
{
2017-12-17 16:43:30 +00:00
if ( strstr ( normalise_link ( $path ), 'http://' )) {
$url = $path ;
} else {
$url = System :: baseUrl () . '/' . ltrim ( $path , '/' );
2017-01-26 13:28:43 +00:00
}
2016-03-06 13:53:30 +00:00
2017-12-17 16:43:30 +00:00
header ( " Location: $url " );
2015-12-24 00:31:17 +00:00
killme ();
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Returns the user id of locally logged in user or false .
2016-10-02 03:29:30 +00:00
*
2015-12-24 00:31:17 +00:00
* @ return int | bool user id or false
*/
2017-11-09 16:05:18 +00:00
function local_user ()
{
2017-03-06 10:06:05 +00:00
if ( x ( $_SESSION , 'authenticated' ) && x ( $_SESSION , 'uid' )) {
2015-12-24 00:31:17 +00:00
return intval ( $_SESSION [ 'uid' ]);
2017-03-06 10:06:05 +00:00
}
2015-12-24 00:31:17 +00:00
return false ;
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2017-03-06 10:06:05 +00:00
/**
* @ brief Returns the public contact id of logged in user or false .
*
* @ return int | bool public contact id or false
*/
2017-11-09 16:05:18 +00:00
function public_contact ()
{
2017-03-06 10:06:05 +00:00
static $public_contact_id = false ;
if ( ! $public_contact_id && x ( $_SESSION , 'authenticated' )) {
if ( x ( $_SESSION , 'my_address' )) {
// Local user
2017-11-19 22:03:39 +00:00
$public_contact_id = intval ( Contact :: getIdForURL ( $_SESSION [ 'my_address' ], 0 ));
2017-03-23 19:48:48 +00:00
} elseif ( x ( $_SESSION , 'visitor_home' )) {
2017-03-06 10:06:05 +00:00
// Remote user
2017-11-19 22:03:39 +00:00
$public_contact_id = intval ( Contact :: getIdForURL ( $_SESSION [ 'visitor_home' ], 0 ));
2017-03-06 10:06:05 +00:00
}
2017-03-23 19:48:48 +00:00
} elseif ( ! x ( $_SESSION , 'authenticated' )) {
2017-03-06 10:06:05 +00:00
$public_contact_id = false ;
}
return $public_contact_id ;
}
2015-12-24 00:31:17 +00:00
/**
2015-12-24 10:58:42 +00:00
* @ brief Returns contact id of authenticated site visitor or false
2016-10-02 03:29:30 +00:00
*
2015-12-24 00:31:17 +00:00
* @ return int | bool visitor_id or false
*/
2017-11-09 16:05:18 +00:00
function remote_user ()
{
2017-08-28 04:46:04 +00:00
// You cannot be both local and remote
if ( local_user ()) {
return false ;
}
2017-12-22 14:48:29 +00:00
if ( x ( $_SESSION , 'authenticated' ) && x ( $_SESSION , 'visitor_id' )) {
2015-12-24 00:31:17 +00:00
return intval ( $_SESSION [ 'visitor_id' ]);
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
return false ;
2012-04-09 12:04:49 +00:00
}
2010-07-01 23:48:07 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Show an error message to user .
*
* This function save text in session , to be shown to the user at next page load
*
* @ param string $s - Text of notice
*/
2017-11-09 16:05:18 +00:00
function notice ( $s )
{
2015-12-24 00:31:17 +00:00
$a = get_app ();
2017-05-03 02:42:29 +00:00
if ( ! x ( $_SESSION , 'sysmsg' )) {
2018-01-15 13:05:12 +00:00
$_SESSION [ 'sysmsg' ] = [];
2017-01-26 13:28:43 +00:00
}
if ( $a -> interactive ) {
2015-12-24 00:31:17 +00:00
$_SESSION [ 'sysmsg' ][] = $s ;
2017-01-26 13:28:43 +00:00
}
2012-04-09 12:04:49 +00:00
}
2014-04-26 00:22:30 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Show an info message to user .
*
* This function save text in session , to be shown to the user at next page load
*
* @ param string $s - Text of notice
*/
2017-11-09 16:05:18 +00:00
function info ( $s )
{
2015-12-24 00:31:17 +00:00
$a = get_app ();
2014-04-26 00:22:30 +00:00
2017-11-07 02:22:52 +00:00
if ( local_user () && PConfig :: get ( local_user (), 'system' , 'ignore_info' )) {
2015-12-24 00:31:17 +00:00
return ;
2017-01-26 13:28:43 +00:00
}
2011-05-23 09:39:57 +00:00
2017-05-03 02:42:29 +00:00
if ( ! x ( $_SESSION , 'sysmsg_info' )) {
2018-01-15 13:05:12 +00:00
$_SESSION [ 'sysmsg_info' ] = [];
2017-01-26 13:28:43 +00:00
}
if ( $a -> interactive ) {
2015-12-24 00:31:17 +00:00
$_SESSION [ 'sysmsg_info' ][] = $s ;
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
}
2010-07-08 14:03:25 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Wrapper around config to limit the text length of an incoming message
*
* @ return int
*/
2017-11-09 16:05:18 +00:00
function get_max_import_size ()
{
2016-12-13 09:16:36 +00:00
$a = get_app ();
2017-12-22 14:48:29 +00:00
return ( x ( $a -> config , 'max_import_size' ) ? $a -> config [ 'max_import_size' ] : 0 );
2012-04-09 12:04:49 +00:00
}
2010-07-08 14:03:25 +00:00
2017-11-05 15:28:55 +00:00
2017-11-09 16:05:18 +00:00
function current_theme ()
{
2018-01-15 13:05:12 +00:00
$app_base_themes = [ 'duepuntozero' , 'dispy' , 'quattro' ];
2014-09-07 12:23:03 +00:00
2015-12-24 00:31:17 +00:00
$a = get_app ();
2014-09-07 12:23:03 +00:00
2015-12-24 00:31:17 +00:00
$page_theme = null ;
2015-08-11 21:26:00 +00:00
2015-12-24 00:31:17 +00:00
// Find the theme that belongs to the user whose stuff we are looking at
2015-06-27 12:10:43 +00:00
2017-01-26 13:28:43 +00:00
if ( $a -> profile_uid && ( $a -> profile_uid != local_user ())) {
2017-11-09 16:05:18 +00:00
$r = q (
" select theme from user where uid = %d limit 1 " ,
2015-12-24 00:31:17 +00:00
intval ( $a -> profile_uid )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2015-12-24 00:31:17 +00:00
$page_theme = $r [ 0 ][ 'theme' ];
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
}
2015-06-27 12:10:43 +00:00
2015-12-24 00:31:17 +00:00
// Allow folks to over-rule user themes and always use their own on their own site.
// This works only if the user is on the same server
2015-06-27 12:10:43 +00:00
2017-01-26 13:28:43 +00:00
if ( $page_theme && local_user () && ( local_user () != $a -> profile_uid )) {
2017-11-07 02:22:52 +00:00
if ( PConfig :: get ( local_user (), 'system' , 'always_my_theme' )) {
2015-12-24 00:31:17 +00:00
$page_theme = null ;
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
}
2015-06-27 12:10:43 +00:00
2012-09-29 23:47:47 +00:00
// $mobile_detect = new Mobile_Detect();
// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
2015-12-24 00:31:17 +00:00
$is_mobile = $a -> is_mobile || $a -> is_tablet ;
2013-01-03 17:53:11 +00:00
2017-01-17 19:21:46 +00:00
$standard_system_theme = Config :: get ( 'system' , 'theme' , '' );
2017-05-03 02:42:29 +00:00
$standard_theme_name = (( isset ( $_SESSION ) && x ( $_SESSION , 'theme' )) ? $_SESSION [ 'theme' ] : $standard_system_theme );
2015-06-27 12:10:43 +00:00
2017-01-17 19:21:46 +00:00
if ( $is_mobile ) {
if ( isset ( $_SESSION [ 'show-mobile' ]) && ! $_SESSION [ 'show-mobile' ]) {
2015-12-24 00:31:17 +00:00
$theme_name = $standard_theme_name ;
2017-01-17 19:21:46 +00:00
} else {
$system_theme = Config :: get ( 'system' , 'mobile-theme' , '' );
if ( $system_theme == '' ) {
$system_theme = $standard_system_theme ;
}
2017-05-03 02:42:29 +00:00
$theme_name = (( isset ( $_SESSION ) && x ( $_SESSION , 'mobile-theme' )) ? $_SESSION [ 'mobile-theme' ] : $system_theme );
2015-12-24 00:31:17 +00:00
2017-01-26 13:28:43 +00:00
if ( $theme_name === '---' ) {
2015-12-24 00:31:17 +00:00
// user has selected to have the mobile theme be the same as the normal one
2015-07-02 00:55:03 +00:00
$theme_name = $standard_theme_name ;
2015-08-11 21:26:00 +00:00
2017-01-26 13:28:43 +00:00
if ( $page_theme ) {
2015-12-24 00:31:17 +00:00
$theme_name = $page_theme ;
2017-01-26 13:28:43 +00:00
}
2012-09-13 03:35:51 +00:00
}
2012-07-24 02:37:00 +00:00
}
2017-01-26 13:28:43 +00:00
} else {
2015-12-24 00:31:17 +00:00
$theme_name = $standard_theme_name ;
2015-06-27 12:10:43 +00:00
2017-01-26 13:28:43 +00:00
if ( $page_theme ) {
2015-12-24 00:31:17 +00:00
$theme_name = $page_theme ;
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
}
2012-07-25 00:13:19 +00:00
2017-11-09 16:05:18 +00:00
if ( $theme_name
&& ( file_exists ( 'view/theme/' . $theme_name . '/style.css' )
|| file_exists ( 'view/theme/' . $theme_name . '/style.php' ))
) {
2015-12-24 00:31:17 +00:00
return ( $theme_name );
2017-01-26 13:28:43 +00:00
}
2014-09-07 12:23:03 +00:00
2017-01-26 13:28:43 +00:00
foreach ( $app_base_themes as $t ) {
2017-11-09 16:05:18 +00:00
if ( file_exists ( 'view/theme/' . $t . '/style.css' )
|| file_exists ( 'view/theme/' . $t . '/style.php' )
) {
2015-12-24 00:31:17 +00:00
return ( $t );
2017-01-26 13:28:43 +00:00
}
2015-12-24 00:31:17 +00:00
}
2014-09-07 12:23:03 +00:00
2017-05-03 02:42:29 +00:00
$fallback = array_merge ( glob ( 'view/theme/*/style.css' ), glob ( 'view/theme/*/style.php' ));
2017-01-26 13:28:43 +00:00
if ( count ( $fallback )) {
2017-05-03 02:42:29 +00:00
return ( str_replace ( 'view/theme/' , '' , substr ( $fallback [ 0 ], 0 , - 10 )));
2017-01-26 13:28:43 +00:00
}
/// @TODO No final return statement?
2012-04-09 12:04:49 +00:00
}
2011-04-14 07:22:38 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Return full URL to theme which is currently in effect .
2016-10-02 03:29:30 +00:00
*
2015-12-24 00:31:17 +00:00
* Provide a sane default if nothing is chosen or the specified theme does not exist .
2016-10-02 03:29:30 +00:00
*
2015-12-24 00:31:17 +00:00
* @ return string
*/
2017-11-09 16:05:18 +00:00
function current_theme_url ()
{
2016-12-13 09:16:36 +00:00
$a = get_app ();
2015-06-27 12:10:43 +00:00
2015-12-24 00:31:17 +00:00
$t = current_theme ();
2015-06-27 12:10:43 +00:00
2015-12-24 00:31:17 +00:00
$opts = (( $a -> profile_uid ) ? '?f=&puid=' . $a -> profile_uid : '' );
2017-01-26 13:28:43 +00:00
if ( file_exists ( 'view/theme/' . $t . '/style.php' )) {
2017-05-03 02:42:29 +00:00
return ( 'view/theme/' . $t . '/style.pcss' . $opts );
2017-01-26 13:28:43 +00:00
}
2015-08-11 21:26:00 +00:00
2017-05-03 02:42:29 +00:00
return ( 'view/theme/' . $t . '/style.css' );
2012-04-09 12:04:49 +00:00
}
2011-02-06 23:50:50 +00:00
2017-11-09 16:05:18 +00:00
function feed_birthday ( $uid , $tz )
{
2015-12-24 00:31:17 +00:00
/**
* Determine the next birthday , but only if the birthday is published
* in the default profile . We _could_ also look for a private profile that the
* recipient can see , but somebody could get mad at us if they start getting
* public birthday greetings when they haven ' t made this info public .
*
* Assuming we are able to publish this info , we are then going to convert
* the start time from the owner ' s timezone to UTC .
*
* This will potentially solve the problem found with some social networks
* where birthdays are converted to the viewer ' s timezone and salutations from
* elsewhere in the world show up on the wrong day . We will convert it to the
* viewer ' s timezone also , but first we are going to convert it from the birthday
* person ' s timezone to GMT - so the viewer may find the birthday starting at
* 6 : 00 PM the day before , but that will correspond to midnight to the birthday person .
*/
$birthday = '' ;
2012-04-09 12:04:49 +00:00
2017-05-03 02:42:29 +00:00
if ( ! strlen ( $tz )) {
2015-12-24 00:31:17 +00:00
$tz = 'UTC' ;
2017-01-26 13:28:43 +00:00
}
2012-04-09 12:04:49 +00:00
2017-11-09 16:05:18 +00:00
$p = q (
" SELECT `dob` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $uid )
2015-12-24 00:31:17 +00:00
);
2012-04-09 12:04:49 +00:00
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $p )) {
2017-05-03 02:42:29 +00:00
$tmp_dob = substr ( $p [ 0 ][ 'dob' ], 5 );
2017-01-26 13:28:43 +00:00
if ( intval ( $tmp_dob )) {
2018-01-27 02:38:34 +00:00
$y = DateTimeFormat :: timezoneNow ( $tz , 'Y' );
2015-12-24 00:31:17 +00:00
$bd = $y . '-' . $tmp_dob . ' 00:00' ;
$t_dob = strtotime ( $bd );
2018-01-27 02:38:34 +00:00
$now = strtotime ( DateTimeFormat :: timezoneNow ( $tz ));
2017-01-26 13:28:43 +00:00
if ( $t_dob < $now ) {
2015-12-24 00:31:17 +00:00
$bd = $y + 1 . '-' . $tmp_dob . ' 00:00' ;
2017-01-26 13:28:43 +00:00
}
2018-01-27 02:38:34 +00:00
$birthday = DateTimeFormat :: convert ( $bd , 'UTC' , $tz , DateTimeFormat :: ATOM );
2011-02-07 06:41:07 +00:00
}
2012-04-09 12:04:49 +00:00
}
2015-12-24 00:31:17 +00:00
return $birthday ;
2012-04-09 12:04:49 +00:00
}
2011-02-08 01:06:04 +00:00
2015-12-24 00:31:17 +00:00
/**
* @ brief Check if current user has admin role .
*
* @ return bool true if user is an admin
*/
2017-11-09 16:05:18 +00:00
function is_site_admin ()
{
2015-12-24 00:31:17 +00:00
$a = get_app ();
2013-12-01 23:11:31 +00:00
2015-12-24 00:31:17 +00:00
$adminlist = explode ( " , " , str_replace ( " " , " " , $a -> config [ 'admin_email' ]));
2013-12-01 23:11:31 +00:00
2017-03-23 19:48:48 +00:00
//if(local_user() && x($a->user,'email') && x($a->config,'admin_email') && ($a->user['email'] === $a->config['admin_email']))
2017-05-03 02:42:29 +00:00
if ( local_user () && x ( $a -> user , 'email' ) && x ( $a -> config , 'admin_email' ) && in_array ( $a -> user [ 'email' ], $adminlist )) {
2015-12-24 00:31:17 +00:00
return true ;
2017-03-23 19:48:48 +00:00
}
2015-12-24 00:31:17 +00:00
return false ;
2012-04-09 12:04:49 +00:00
}
2011-05-24 00:18:36 +00:00
2012-06-14 14:04:13 +00:00
/**
2015-12-24 00:31:17 +00:00
* @ brief Returns querystring as string from a mapped array .
*
2017-11-09 16:05:18 +00:00
* @ param array $params mapped array with query parameters
* @ param string $name of parameter , default null
2015-12-24 00:31:17 +00:00
*
* @ return string
*/
2017-11-09 16:05:18 +00:00
function build_querystring ( $params , $name = null )
{
2015-08-11 21:26:00 +00:00
$ret = " " ;
2017-03-23 19:48:48 +00:00
foreach ( $params as $key => $val ) {
2017-01-26 13:28:43 +00:00
if ( is_array ( $val )) {
2017-03-23 19:48:48 +00:00
/// @TODO maybe not compare against null, use is_null()
if ( $name == null ) {
2015-08-11 21:26:00 +00:00
$ret .= build_querystring ( $val , $key );
} else {
2017-05-03 02:42:29 +00:00
$ret .= build_querystring ( $val , $name . " [ $key ] " );
2015-08-11 21:26:00 +00:00
}
} else {
$val = urlencode ( $val );
2017-03-23 19:48:48 +00:00
/// @TODO maybe not compare against null, use is_null()
if ( $name != null ) {
/// @TODO two string concated, can be merged to one
$ret .= $name . " [ $key ] " . " = $val & " ;
2015-08-11 21:26:00 +00:00
} else {
2017-03-23 19:48:48 +00:00
$ret .= " $key = $val & " ;
2015-08-11 21:26:00 +00:00
}
}
}
return $ret ;
2012-06-14 14:04:13 +00:00
}
2012-09-13 03:35:51 +00:00
2017-11-09 16:05:18 +00:00
function explode_querystring ( $query )
{
2013-01-26 19:52:21 +00:00
$arg_st = strpos ( $query , '?' );
2017-01-26 13:28:43 +00:00
if ( $arg_st !== false ) {
2013-01-26 19:52:21 +00:00
$base = substr ( $query , 0 , $arg_st );
$arg_st += 1 ;
2015-08-11 21:26:00 +00:00
} else {
2013-01-26 19:52:21 +00:00
$base = '' ;
$arg_st = 0 ;
}
$args = explode ( '&' , substr ( $query , $arg_st ));
2017-03-23 19:48:48 +00:00
foreach ( $args as $k => $arg ) {
/// @TODO really compare type-safe here?
2017-01-26 13:28:43 +00:00
if ( $arg === '' ) {
2013-01-26 19:52:21 +00:00
unset ( $args [ $k ]);
2017-01-26 13:28:43 +00:00
}
2013-01-26 19:52:21 +00:00
}
$args = array_values ( $args );
2017-01-26 13:28:43 +00:00
if ( ! $base ) {
2013-01-26 19:52:21 +00:00
$base = $args [ 0 ];
unset ( $args [ 0 ]);
$args = array_values ( $args );
}
2018-01-15 13:05:12 +00:00
return [
2013-01-26 19:52:21 +00:00
'base' => $base ,
'args' => $args ,
2018-01-15 13:05:12 +00:00
];
2013-01-26 19:52:21 +00:00
}
2012-09-13 03:35:51 +00:00
/**
2017-05-03 02:42:29 +00:00
* Returns the complete URL of the current page , e . g .: http ( s ) :// something . com / network
*
* Taken from http :// webcheatsheet . com / php / get_current_page_url . php
*/
2017-11-09 16:05:18 +00:00
function curPageURL ()
{
2012-09-13 03:35:51 +00:00
$pageURL = 'http' ;
2017-01-26 13:28:43 +00:00
if ( $_SERVER [ " HTTPS " ] == " on " ) {
$pageURL .= " s " ;
}
2017-03-23 19:48:48 +00:00
2012-09-13 03:35:51 +00:00
$pageURL .= " :// " ;
2017-03-23 19:48:48 +00:00
2012-09-13 03:35:51 +00:00
if ( $_SERVER [ " SERVER_PORT " ] != " 80 " && $_SERVER [ " SERVER_PORT " ] != " 443 " ) {
2017-05-03 02:42:29 +00:00
$pageURL .= $_SERVER [ " SERVER_NAME " ] . " : " . $_SERVER [ " SERVER_PORT " ] . $_SERVER [ " REQUEST_URI " ];
2012-09-13 03:35:51 +00:00
} else {
2017-05-03 02:42:29 +00:00
$pageURL .= $_SERVER [ " SERVER_NAME " ] . $_SERVER [ " REQUEST_URI " ];
2012-09-13 03:35:51 +00:00
}
return $pageURL ;
}
2012-10-15 23:28:43 +00:00
2017-11-09 16:05:18 +00:00
function random_digits ( $digits )
{
2012-11-01 23:14:42 +00:00
$rn = '' ;
2017-01-26 13:28:43 +00:00
for ( $i = 0 ; $i < $digits ; $i ++ ) {
2017-03-23 19:48:48 +00:00
/// @TODO rand() is different to mt_rand() and maybe lesser "random"
2017-05-03 02:42:29 +00:00
$rn .= rand ( 0 , 9 );
2012-11-01 23:14:42 +00:00
}
return $rn ;
}
2012-11-16 23:50:39 +00:00
2017-11-09 16:05:18 +00:00
function get_server ()
{
2017-11-07 02:22:52 +00:00
$server = Config :: get ( " system " , " directory " );
2015-08-23 09:05:10 +00:00
2017-01-26 13:28:43 +00:00
if ( $server == " " ) {
2017-06-03 02:15:43 +00:00
$server = " http://dir.friendica.social " ;
2017-01-26 13:28:43 +00:00
}
2015-08-23 09:05:10 +00:00
return ( $server );
}
2017-11-09 16:05:18 +00:00
function get_temppath ()
{
2017-07-08 15:25:13 +00:00
$a = get_app ();
2017-11-07 02:22:52 +00:00
$temppath = Config :: get ( " system " , " temppath " );
2017-07-08 15:25:13 +00:00
if (( $temppath != " " ) && App :: directory_usable ( $temppath )) {
// We have a temp path and it is usable
2017-07-22 06:43:04 +00:00
return App :: realpath ( $temppath );
2017-07-08 15:25:13 +00:00
}
// We don't have a working preconfigured temp path, so we take the system path.
$temppath = sys_get_temp_dir ();
// Check if it is usable
if (( $temppath != " " ) && App :: directory_usable ( $temppath )) {
2017-07-22 05:50:25 +00:00
// Always store the real path, not the path through symlinks
2017-07-22 06:43:04 +00:00
$temppath = App :: realpath ( $temppath );
2017-07-22 05:50:25 +00:00
2017-07-08 15:25:13 +00:00
// To avoid any interferences with other systems we create our own directory
$new_temppath = $temppath . " / " . $a -> get_hostname ();
if ( ! is_dir ( $new_temppath )) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir ( $new_temppath );
}
if ( App :: directory_usable ( $new_temppath )) {
// The new path is usable, we are happy
2017-11-07 02:22:52 +00:00
Config :: set ( " system " , " temppath " , $new_temppath );
2017-07-08 15:25:13 +00:00
return $new_temppath ;
} else {
// We can't create a subdirectory, strange.
// But the directory seems to work, so we use it but don't store it.
return $temppath ;
}
}
// Reaching this point means that the operating system is configured badly.
return '' ;
}
2017-11-09 16:05:18 +00:00
function get_cachefile ( $file , $writemode = true )
{
2014-06-22 23:24:39 +00:00
$cache = get_itemcachepath ();
2012-11-16 23:50:39 +00:00
2017-05-03 02:42:29 +00:00
if (( ! $cache ) || ( ! is_dir ( $cache ))) {
2012-11-16 23:50:39 +00:00
return ( " " );
2017-01-26 13:28:43 +00:00
}
2012-11-16 23:50:39 +00:00
2017-03-23 19:48:48 +00:00
$subfolder = $cache . " / " . substr ( $file , 0 , 2 );
2012-11-16 23:50:39 +00:00
2017-03-23 19:48:48 +00:00
$cachepath = $subfolder . " / " . $file ;
2012-11-16 23:50:39 +00:00
if ( $writemode ) {
if ( ! is_dir ( $subfolder )) {
mkdir ( $subfolder );
chmod ( $subfolder , 0777 );
}
}
2017-03-23 19:48:48 +00:00
/// @TODO no need to put braces here
2017-03-24 20:05:08 +00:00
return $cachepath ;
2012-11-16 23:50:39 +00:00
}
2017-11-09 16:05:18 +00:00
function clear_cache ( $basepath = " " , $path = " " )
{
2012-11-16 23:50:39 +00:00
if ( $path == " " ) {
2014-06-22 23:24:39 +00:00
$basepath = get_itemcachepath ();
2012-11-16 23:50:39 +00:00
$path = $basepath ;
}
2017-06-08 02:00:59 +00:00
if (( $path == " " ) || ( ! is_dir ( $path ))) {
2012-11-16 23:50:39 +00:00
return ;
2017-01-26 13:28:43 +00:00
}
2012-11-16 23:50:39 +00:00
2017-01-26 13:28:43 +00:00
if ( substr ( realpath ( $path ), 0 , strlen ( $basepath )) != $basepath ) {
2012-11-16 23:50:39 +00:00
return ;
2017-01-26 13:28:43 +00:00
}
2012-11-16 23:50:39 +00:00
2017-11-07 02:22:52 +00:00
$cachetime = ( int ) Config :: get ( 'system' , 'itemcache_duration' );
2017-01-26 13:28:43 +00:00
if ( $cachetime == 0 ) {
2012-11-16 23:50:39 +00:00
$cachetime = 86400 ;
2017-01-26 13:28:43 +00:00
}
2012-11-16 23:50:39 +00:00
2017-05-03 02:42:29 +00:00
if ( is_writable ( $path )) {
2015-08-11 21:26:00 +00:00
if ( $dh = opendir ( $path )) {
while (( $file = readdir ( $dh )) !== false ) {
2017-05-03 02:42:29 +00:00
$fullpath = $path . " / " . $file ;
2017-06-09 01:03:44 +00:00
if (( filetype ( $fullpath ) == " dir " ) && ( $file != " . " ) && ( $file != " .. " )) {
2015-08-11 21:26:00 +00:00
clear_cache ( $basepath , $fullpath );
2017-01-26 13:28:43 +00:00
}
2017-06-09 01:03:44 +00:00
if (( filetype ( $fullpath ) == " file " ) && ( filectime ( $fullpath ) < ( time () - $cachetime ))) {
2015-08-11 21:26:00 +00:00
unlink ( $fullpath );
2017-01-26 13:28:43 +00:00
}
2015-08-11 21:26:00 +00:00
}
closedir ( $dh );
2012-11-16 23:50:39 +00:00
}
2013-10-21 18:03:01 +00:00
}
2012-11-16 23:50:39 +00:00
}
2012-12-23 13:16:35 +00:00
2017-11-09 16:05:18 +00:00
function get_itemcachepath ()
{
2014-06-22 23:24:39 +00:00
// Checking, if the cache is deactivated
2017-11-07 02:22:52 +00:00
$cachetime = ( int ) Config :: get ( 'system' , 'itemcache_duration' );
2017-01-26 13:28:43 +00:00
if ( $cachetime < 0 ) {
2014-06-22 23:24:39 +00:00
return " " ;
2017-01-26 13:28:43 +00:00
}
2014-06-22 23:24:39 +00:00
2017-11-07 02:22:52 +00:00
$itemcache = Config :: get ( 'system' , 'itemcache' );
2017-06-08 02:00:59 +00:00
if (( $itemcache != " " ) && App :: directory_usable ( $itemcache )) {
2017-07-22 06:43:04 +00:00
return App :: realpath ( $itemcache );
2017-02-15 21:46:29 +00:00
}
2014-06-22 23:24:39 +00:00
$temppath = get_temppath ();
if ( $temppath != " " ) {
2017-05-03 02:42:29 +00:00
$itemcache = $temppath . " /itemcache " ;
2017-01-26 13:28:43 +00:00
if ( ! file_exists ( $itemcache ) && ! is_dir ( $itemcache )) {
2015-03-29 11:56:26 +00:00
mkdir ( $itemcache );
}
2014-06-22 23:24:39 +00:00
2017-02-15 21:46:29 +00:00
if ( App :: directory_usable ( $itemcache )) {
2017-11-07 02:22:52 +00:00
Config :: set ( " system " , " itemcache " , $itemcache );
2017-02-19 08:23:21 +00:00
return $itemcache ;
2014-06-22 23:24:39 +00:00
}
}
return " " ;
}
2016-12-01 22:50:07 +00:00
/**
* @ brief Returns the path where spool files are stored
*
* @ return string Spool path
*/
2017-11-09 16:05:18 +00:00
function get_spoolpath ()
{
2017-11-07 02:22:52 +00:00
$spoolpath = Config :: get ( 'system' , 'spoolpath' );
2017-06-08 02:00:59 +00:00
if (( $spoolpath != " " ) && App :: directory_usable ( $spoolpath )) {
2017-02-19 08:23:21 +00:00
// We have a spool path and it is usable
return $spoolpath ;
2016-12-01 22:50:07 +00:00
}
2016-12-01 13:50:26 +00:00
2017-02-19 08:23:21 +00:00
// We don't have a working preconfigured spool path, so we take the temp path.
2016-12-01 13:50:26 +00:00
$temppath = get_temppath ();
if ( $temppath != " " ) {
2017-02-19 08:23:21 +00:00
// To avoid any interferences with other systems we create our own directory
2017-05-03 02:42:29 +00:00
$spoolpath = $temppath . " /spool " ;
2016-12-01 22:50:07 +00:00
if ( ! is_dir ( $spoolpath )) {
2016-12-01 13:50:26 +00:00
mkdir ( $spoolpath );
2016-12-01 22:50:07 +00:00
}
2016-12-01 13:50:26 +00:00
2017-02-15 21:46:29 +00:00
if ( App :: directory_usable ( $spoolpath )) {
2017-02-19 08:23:21 +00:00
// The new path is usable, we are happy
2017-11-07 02:22:52 +00:00
Config :: set ( " system " , " spoolpath " , $spoolpath );
2017-02-19 08:23:21 +00:00
return $spoolpath ;
} else {
// We can't create a subdirectory, strange.
// But the directory seems to work, so we use it but don't store it.
return $temppath ;
2016-12-01 13:50:26 +00:00
}
}
2017-02-19 08:23:21 +00:00
// Reaching this point means that the operating system is configured badly.
2016-12-01 13:50:26 +00:00
return " " ;
}
2013-01-08 20:24:13 +00:00
2017-01-26 13:28:43 +00:00
if ( ! function_exists ( 'exif_imagetype' )) {
2017-11-09 16:05:18 +00:00
function exif_imagetype ( $file )
{
2015-06-26 16:57:20 +00:00
$size = getimagesize ( $file );
2017-03-24 20:05:08 +00:00
return $size [ 2 ];
2015-06-26 16:57:20 +00:00
}
2013-10-22 14:08:29 +00:00
}
2015-09-13 16:47:10 +00:00
2017-11-09 16:05:18 +00:00
function validate_include ( & $file )
{
2015-09-13 16:47:10 +00:00
$orig_file = $file ;
$file = realpath ( $file );
2017-01-26 13:28:43 +00:00
if ( strpos ( $file , getcwd ()) !== 0 ) {
2015-09-13 16:47:10 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2015-09-13 16:47:10 +00:00
2017-05-03 02:42:29 +00:00
$file = str_replace ( getcwd () . " / " , " " , $file , $count );
2017-01-26 13:28:43 +00:00
if ( $count != 1 ) {
2015-09-13 16:47:10 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2015-09-13 16:47:10 +00:00
2017-01-26 13:28:43 +00:00
if ( $orig_file !== $file ) {
2015-09-13 16:47:10 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2015-09-13 16:47:10 +00:00
$valid = false ;
2017-01-26 13:28:43 +00:00
if ( strpos ( $file , " include/ " ) === 0 ) {
2015-09-13 16:47:10 +00:00
$valid = true ;
2017-01-26 13:28:43 +00:00
}
2015-09-13 16:47:10 +00:00
2017-01-26 13:28:43 +00:00
if ( strpos ( $file , " addon/ " ) === 0 ) {
2015-09-13 16:47:10 +00:00
$valid = true ;
2017-01-26 13:28:43 +00:00
}
2015-09-13 16:47:10 +00:00
2017-01-26 13:28:43 +00:00
// Simply return flag
return ( $valid );
2015-09-13 16:47:10 +00:00
}
2015-12-15 22:26:58 +00:00
2017-11-09 16:05:18 +00:00
function current_load ()
{
2017-01-26 13:28:43 +00:00
if ( ! function_exists ( 'sys_getloadavg' )) {
2015-12-15 22:26:58 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2015-12-15 22:26:58 +00:00
$load_arr = sys_getloadavg ();
2017-01-26 13:28:43 +00:00
if ( ! is_array ( $load_arr )) {
2015-12-15 22:26:58 +00:00
return false ;
2017-01-26 13:28:43 +00:00
}
2015-12-15 22:26:58 +00:00
2016-08-03 13:59:25 +00:00
return max ( $load_arr [ 0 ], $load_arr [ 1 ]);
2015-12-15 22:26:58 +00:00
}
2015-12-26 15:06:38 +00:00
2015-12-28 02:17:55 +00:00
/**
* @ brief get c - style args
2016-10-02 03:29:30 +00:00
*
2015-12-28 02:17:55 +00:00
* @ return int
*/
2017-11-09 16:05:18 +00:00
function argc ()
{
2015-12-26 15:06:38 +00:00
return get_app () -> argc ;
}
2015-12-28 02:17:55 +00:00
/**
* @ brief Returns the value of a argv key
2016-10-02 03:29:30 +00:00
*
2015-12-28 02:17:55 +00:00
* @ param int $x argv key
* @ return string Value of the argv key
*/
2017-11-09 16:05:18 +00:00
function argv ( $x )
{
2017-05-03 02:42:29 +00:00
if ( array_key_exists ( $x , get_app () -> argv )) {
2015-12-26 15:06:38 +00:00
return get_app () -> argv [ $x ];
2017-01-26 13:28:43 +00:00
}
2015-12-26 15:06:38 +00:00
return '' ;
}
2016-05-10 23:52:05 +00:00
/**
* @ brief Get the data which is needed for infinite scroll
2016-10-02 03:29:30 +00:00
*
2016-05-10 23:52:05 +00:00
* For invinite scroll we need the page number of the actual page
* and the the URI where the content of the next page comes from .
* This data is needed for the js part in main . js .
* Note : infinite scroll does only work for the network page ( module )
2016-10-02 03:29:30 +00:00
*
2016-05-10 23:52:05 +00:00
* @ param string $module The name of the module ( e . g . " network " )
* @ return array Of infinite scroll data
2017-05-03 02:42:29 +00:00
* 'pageno' => $pageno The number of the actual page
* 'reload_uri' => $reload_uri The URI of the content we have to load
2016-05-10 23:52:05 +00:00
*/
2017-11-09 16:05:18 +00:00
function infinite_scroll_data ( $module )
{
2017-11-07 02:22:52 +00:00
if ( PConfig :: get ( local_user (), 'system' , 'infinite_scroll' )
2018-01-01 20:08:00 +00:00
&& $module == 'network'
&& defaults ( $_GET , 'mode' , '' ) != 'minimal'
2017-11-09 16:05:18 +00:00
) {
2016-05-10 23:52:05 +00:00
// get the page number
2018-01-01 20:08:00 +00:00
$pageno = defaults ( $_GET , 'page' , 1 );
2016-05-10 23:52:05 +00:00
$reload_uri = " " ;
// try to get the uri from which we load the content
2017-11-09 16:05:18 +00:00
foreach ( $_GET as $param => $value ) {
2017-06-08 02:00:59 +00:00
if (( $param != " page " ) && ( $param != " q " )) {
2017-03-23 19:48:48 +00:00
$reload_uri .= " & " . $param . " = " . urlencode ( $value );
}
}
2016-05-10 23:52:05 +00:00
2018-01-01 20:08:00 +00:00
$a = get_app ();
if ( $a -> page_offset != " " && ! strstr ( $reload_uri , " &offset= " )) {
2017-03-23 19:48:48 +00:00
$reload_uri .= " &offset= " . urlencode ( $a -> page_offset );
}
2016-05-10 23:52:05 +00:00
2018-01-15 13:05:12 +00:00
$arr = [ " pageno " => $pageno , " reload_uri " => $reload_uri ];
2016-05-10 23:52:05 +00:00
return $arr ;
}
}