boot.php 73.6 KB
Newer Older
Zot's avatar
Zot committed
1
<?php
2 3
/**
 * @file boot.php
4
 *
5
 * @brief This file defines some global constants and includes the central App class.
6
 */
7

friendica's avatar
friendica committed
8
/**
friendica's avatar
friendica committed
9
 *
Zot's avatar
Zot committed
10
 * This is an open source decentralised communications
friendica's avatar
friendica committed
11
 * platform combined with a decentralised identity/authentication framework
friendica's avatar
friendica committed
12
 * wrapped in an extensible content management system, providing website designers
friendica's avatar
friendica committed
13 14
 * the ability to embed fully decentralised communications and social tools
 * into many traditional website designs (blogs, forums, small business
Zot's avatar
Zot committed
15
 * websites, charitable organisations, etc.). Also provided is DNS mobility
friendica's avatar
friendica committed
16
 * and internet scale privacy/access control.
friendica's avatar
friendica committed
17
 *
friendica's avatar
friendica committed
18
 * This allows any individual website to participate in a matrix of linked
friendica's avatar
friendica committed
19
 * sites and people and media sharing which is far greater than the reach
friendica's avatar
friendica committed
20
 * of an individual site.
friendica's avatar
friendica committed
21 22 23
 *
 * If you are reading the source code and come across a function
 * or code block which is not documented, but you have a good idea what it
friendica's avatar
friendica committed
24 25
 * does, please add some descriptive comments and push it to the main project.
 * Even if your description isn't perfect, it gives us a base which we
friendica's avatar
friendica committed
26
 * can build on and correct - so that eventually everything is fully
friendica's avatar
friendica committed
27 28 29
 * documented.
 */

30 31 32
// composer autoloader for all namespaced Classes
require_once('vendor/autoload.php');

33 34 35 36
require_once('include/config.php');
require_once('include/network.php');
require_once('include/plugin.php');
require_once('include/text.php');
37
require_once('include/datetime.php');
38
require_once('include/language.php');
39
require_once('include/nav.php');
40
require_once('include/permissions.php');
41
require_once('include/features.php');
42
require_once('include/taxonomy.php');
43 44
require_once('include/channel.php');
require_once('include/connections.php');
45
require_once('include/account.php');
46
require_once('include/zid.php');
47
require_once('include/xchan.php');
Zot's avatar
Zot committed
48
require_once('include/hubloc.php');
49
require_once('include/attach.php');
50
require_once('include/bbcode.php');
51

52
define ( 'PLATFORM_NAME',           'hubzilla' );
Mario's avatar
Mario committed
53
define ( 'STD_VERSION',             '4.0' );
54
define ( 'ZOT_REVISION',            '6.0a' );
friendica's avatar
friendica committed
55

56
define ( 'DB_UPDATE_VERSION',       1230 );
Zot's avatar
Zot committed
57

Hubzilla's avatar
Hubzilla committed
58
define ( 'PROJECT_BASE',   __DIR__ );
Zot's avatar
Zot committed
59

60
/**
61
 * @brief Constant with a HTML line break.
62 63 64 65 66
 *
 * 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.
 */
67
define ( 'EOL',                    '<br>' . "\r\n"        );
68
define ( 'EMPTY_STR',              ''                     );
69
define ( 'ATOM_TIME',              'Y-m-d\\TH:i:s\\Z'     ); // aka ISO 8601 "Zulu"
70
define ( 'TEMPLATE_BUILD_PATH',    'store/[data]/smarty3' );
71

72 73 74 75
define ( 'DIRECTORY_MODE_NORMAL',      0x0000); // A directory client
define ( 'DIRECTORY_MODE_PRIMARY',     0x0001); // There can only be *one* primary directory server in a directory_realm.
define ( 'DIRECTORY_MODE_SECONDARY',   0x0002); // All other mirror directory servers
define ( 'DIRECTORY_MODE_STANDALONE',  0x0100); // A detached (off the grid) hub with itself as directory server.
76 77 78 79 80 81 82

// We will look for upstream directories whenever me make contact
// with other sites, but if this is a new installation and isn't
// a standalone hub, we need to seed the service with a starting
// point to go out and find the rest of the world.

define ( 'DIRECTORY_REALM',            'RED_GLOBAL');
83
define ( 'DIRECTORY_FALLBACK_MASTER',  'https://zotadel.net');
84

85
$DIRECTORY_FALLBACK_SERVERS = array(
86 87
	'https://zotadel.net',
	'https://zotsite.net'
88 89
);

90

91 92 93
/**
 *
 * Image storage quality. Lower numbers save space at cost of image detail.
94
 * For ease of upgrade, please do not change here. Change jpeg quality with
redmatrix's avatar
redmatrix committed
95
 * App::$config['system']['jpeg_quality'] = n;
96 97
 * in .htconfig.php, where n is netween 1 and 100, and with very poor results
 * below about 50
98
 */
99
define ( 'JPEG_QUALITY',            100  );
100

101
/**
redmatrix's avatar
redmatrix committed
102
 * App::$config['system']['png_quality'] from 0 (uncompressed) to 9
103 104 105
 */
define ( 'PNG_QUALITY',             8  );

106 107 108 109 110 111 112
/**
 * Language detection parameters
 */
define ( 'LANGUAGE_DETECT_MIN_LENGTH',     128 );
define ( 'LANGUAGE_DETECT_MIN_CONFIDENCE', 0.01 );


113 114 115 116 117 118 119 120 121 122 123
/**
 * Default permissions for file-based storage (webDAV, etc.)
 * These files will be owned by the webserver who will need write
 * access to the "storage" folder.
 * Ideally you should make this 700, however some hosted platforms
 * may not let you change ownership of this directory so we're
 * defaulting to both owner-write and group-write privilege.
 * This should work for most cases without modification.
 * Over-ride this in your .htconfig.php if you need something
 * either more or less restrictive.
 */
friendica's avatar
friendica committed
124

Zot's avatar
Zot committed
125 126 127
if(! defined('STORAGE_DEFAULT_PERMISSIONS')) {
	define ( 'STORAGE_DEFAULT_PERMISSIONS',   0770 );
}
128 129


130 131 132 133 134 135 136 137
/**
 *
 * 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
 *
redmatrix's avatar
redmatrix committed
138
 *    App::$config['system']['max_image_length'] = n;
139 140 141 142 143 144 145 146 147
 *
 * 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.
 *
 */
define ( 'MAX_IMAGE_LENGTH',        -1  );

148

Friendika's avatar
Friendika committed
149 150 151
/**
 * log levels
 */
152 153 154 155 156 157 158

define ( 'LOGGER_NORMAL',          0 );
define ( 'LOGGER_TRACE',           1 );
define ( 'LOGGER_DEBUG',           2 );
define ( 'LOGGER_DATA',            3 );
define ( 'LOGGER_ALL',             4 );

159

Friendika's avatar
Friendika committed
160 161 162
/**
 * registration policies
 */
Zot's avatar
Zot committed
163 164 165 166

define ( 'REGISTER_CLOSED',        0 );
define ( 'REGISTER_APPROVE',       1 );
define ( 'REGISTER_OPEN',          2 );
Zot's avatar
Zot committed
167

168 169 170 171 172 173 174 175

/**
 * site access policy
 */

define ( 'ACCESS_PRIVATE',         0 );
define ( 'ACCESS_PAID',            1 );
define ( 'ACCESS_FREE',            2 );
176
define ( 'ACCESS_TIERED',          3 );
177

178 179 180 181 182 183 184 185
/**
 * DB update return values
 */

define ( 'UPDATE_SUCCESS', 0);
define ( 'UPDATE_FAILED',  1);


186 187 188 189 190
define ( 'CLIENT_MODE_NORMAL', 0x0000);
define ( 'CLIENT_MODE_LOAD',   0x0001);
define ( 'CLIENT_MODE_UPDATE', 0x0002);


Friendika's avatar
Friendika committed
191 192
/**
 *
friendica's avatar
friendica committed
193
 * Channel pageflags
Friendika's avatar
Friendika committed
194 195
 *
 */
196

197 198 199
define ( 'PAGE_NORMAL',            0x0000 );
define ( 'PAGE_HIDDEN',            0x0001 );
define ( 'PAGE_AUTOCONNECT',       0x0002 );
200
define ( 'PAGE_APPLICATION',       0x0004 );
201
define ( 'PAGE_ALLOWCODE',         0x0008 );
202
define ( 'PAGE_PREMIUM',           0x0010 );
friendica's avatar
friendica committed
203
define ( 'PAGE_ADULT',             0x0020 );
friendica's avatar
friendica committed
204
define ( 'PAGE_CENSORED',          0x0040 ); // Site admin has blocked this channel from appearing in casual search results and site feeds
205
define ( 'PAGE_SYSTEM',            0x1000 );
206
define ( 'PAGE_HUBADMIN',          0x2000 ); // set this to indicate a preferred admin channel rather than the
207
											 // default channel of any accounts with the admin role.
208 209
define ( 'PAGE_REMOVED',           0x8000 );

210 211

/**
212
 * Photo usage types
213 214 215 216 217 218
 */

define ( 'PHOTO_NORMAL',           0x0000 );
define ( 'PHOTO_PROFILE',          0x0001 );
define ( 'PHOTO_XCHAN',            0x0002 );
define ( 'PHOTO_THING',            0x0004 );
219
define ( 'PHOTO_COVER',            0x0010 );
220
define ( 'PHOTO_CACHE',            0x0020 );
221

222
define ( 'PHOTO_ADULT',            0x0008 );
223 224
define ( 'PHOTO_FLAG_OS',          0x4000 );

redmatrix's avatar
redmatrix committed
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

define ( 'PHOTO_RES_ORIG',              0 );
define ( 'PHOTO_RES_1024',              1 );  // rectangular 1024 max width or height, floating height if not (4:3)
define ( 'PHOTO_RES_640',               2 );  // to accomodate SMBC vertical comic strips without scrunching the width
define ( 'PHOTO_RES_320',               3 );  // accordingly

define ( 'PHOTO_RES_PROFILE_300',       4 );  // square 300 px
define ( 'PHOTO_RES_PROFILE_80',        5 );  // square 80 px
define ( 'PHOTO_RES_PROFILE_48',        6 );  // square 48 px

define ( 'PHOTO_RES_COVER_1200',        7 );  // 1200w x 435h (2.75:1)
define ( 'PHOTO_RES_COVER_850',         8 );  // 850w x 310h
define ( 'PHOTO_RES_COVER_425',        	9 );  // 425w x 160h


240 241
/**
 * Menu types
friendica's avatar
friendica committed
242
 */
243 244 245

define ( 'MENU_SYSTEM',          0x0001 );
define ( 'MENU_BOOKMARK',        0x0002 );
246

247
/**
248
 * Network and protocol family types
249 250
 */

251 252
define ( 'NETWORK_FRND',             'friendica-over-diaspora');    // Friendica, Mistpark, other DFRN implementations
define ( 'NETWORK_DFRN',             'dfrn');    // Friendica, Mistpark, other DFRN implementations
253
define ( 'NETWORK_ZOT',              'zot');     // Zot!
254
define ( 'NETWORK_OSTATUS',          'stat');    // status.net, identi.ca, GNU-social, other OStatus implementations
255
define ( 'NETWORK_GNUSOCIAL',        'gnusoc');    // status.net, identi.ca, GNU-social, other OStatus implementations
256 257
define ( 'NETWORK_FEED',             'rss');    // RSS/Atom feeds with no known "post/notify" protocol
define ( 'NETWORK_DIASPORA',         'diaspora');    // Diaspora
258
define ( 'NETWORK_ACTIVITYPUB',      'activitypub');
259
define ( 'NETWORK_MAIL',             'mail');    // IMAP/POP
260
define ( 'NETWORK_MAIL2',            'mai2');    // extended IMAP/POP
261
define ( 'NETWORK_FACEBOOK',         'face');    // Facebook API
262
define ( 'NETWORK_LINKEDIN',         'lnkd');    // LinkedIn
263
define ( 'NETWORK_XMPP',             'xmpp');    // XMPP
264
define ( 'NETWORK_MYSPACE',          'mysp');    // MySpace
265
define ( 'NETWORK_GPLUS',            'goog');    // Google+
friendica's avatar
friendica committed
266 267
define ( 'NETWORK_PHANTOM',          'unkn');    // Place holder

268

269
/**
friendica's avatar
friendica committed
270
 * Permissions
friendica's avatar
friendica committed
271 272
 */

friendica's avatar
friendica committed
273
define ( 'PERMS_R_STREAM',         0x00001);
274
define ( 'PERMS_R_PROFILE',        0x00002);
friendica's avatar
friendica committed
275 276
define ( 'PERMS_R_PHOTOS',         0x00004);
define ( 'PERMS_R_ABOOK',          0x00008);
friendica's avatar
friendica committed
277

friendica's avatar
friendica committed
278
define ( 'PERMS_W_STREAM',         0x00010);
279
define ( 'PERMS_W_WALL',           0x00020);
friendica's avatar
friendica committed
280 281 282
define ( 'PERMS_W_TAGWALL',        0x00040);
define ( 'PERMS_W_COMMENT',        0x00080);
define ( 'PERMS_W_MAIL',           0x00100);
283
define ( 'PERMS_W_PHOTOS',         0x00200);
friendica's avatar
friendica committed
284
define ( 'PERMS_W_CHAT',           0x00400);
285
define ( 'PERMS_A_DELEGATE',       0x00800);
286

287 288 289 290 291
define ( 'PERMS_R_STORAGE',        0x01000);
define ( 'PERMS_W_STORAGE',        0x02000);
define ( 'PERMS_R_PAGES',          0x04000);
define ( 'PERMS_W_PAGES',          0x08000);
define ( 'PERMS_A_REPUBLISH',      0x10000);
292
define ( 'PERMS_W_LIKE',           0x20000);
friendica's avatar
friendica committed
293

294
// General channel permissions
295 296 297 298 299 300 301 302
                                        // 0 = Only you
define ( 'PERMS_PUBLIC'     , 0x0001 ); // anybody
define ( 'PERMS_NETWORK'    , 0x0002 ); // anybody in this network
define ( 'PERMS_SITE'       , 0x0004 ); // anybody on this site
define ( 'PERMS_CONTACTS'   , 0x0008 ); // any of my connections
define ( 'PERMS_SPECIFIC'   , 0x0080 ); // only specific connections
define ( 'PERMS_AUTHED'     , 0x0100 ); // anybody authenticated (could include visitors from other networks)
define ( 'PERMS_PENDING'    , 0x0200 ); // any connections including those who haven't yet been approved
303

304 305 306 307 308
// Address book flags

define ( 'ABOOK_FLAG_BLOCKED'    , 0x0001);
define ( 'ABOOK_FLAG_IGNORED'    , 0x0002);
define ( 'ABOOK_FLAG_HIDDEN'     , 0x0004);
309
define ( 'ABOOK_FLAG_ARCHIVED'   , 0x0008);
310
define ( 'ABOOK_FLAG_PENDING'    , 0x0010);
311
define ( 'ABOOK_FLAG_UNCONNECTED', 0x0020);
friendica's avatar
friendica committed
312
define ( 'ABOOK_FLAG_SELF'       , 0x0080);
friendica's avatar
friendica committed
313
define ( 'ABOOK_FLAG_FEED'       , 0x0100);
314

315 316 317 318 319

define ( 'MAIL_DELETED',       0x0001);
define ( 'MAIL_REPLIED',       0x0002);
define ( 'MAIL_ISREPLY',       0x0004);
define ( 'MAIL_SEEN',          0x0008);
320
define ( 'MAIL_RECALLED',      0x0010);
321
define ( 'MAIL_OBSCURED',      0x0020);
322 323


324 325 326 327
define ( 'ATTACH_FLAG_DIR',    0x0001);
define ( 'ATTACH_FLAG_OS',     0x0002);


328 329 330
define ( 'MENU_ITEM_ZID',       0x0001);
define ( 'MENU_ITEM_NEWWIN',    0x0002);
define ( 'MENU_ITEM_CHATROOM',  0x0004);
331

332 333 334 335 336 337


define ( 'SITE_TYPE_ZOT',           0);
define ( 'SITE_TYPE_NOTZOT',        1);
define ( 'SITE_TYPE_UNKNOWN',       2);

338 339 340 341
/**
 * Poll/Survey types
 */

342 343 344
define ( 'POLL_SIMPLE_RATING',   0x0001);  // 1-5
define ( 'POLL_TENSCALE',        0x0002);  // 1-10
define ( 'POLL_MULTIPLE_CHOICE', 0x0004);
friendica's avatar
friendica committed
345
define ( 'POLL_OVERWRITE',       0x8000);  // If you vote twice remove the prior entry
346 347


348
define ( 'UPDATE_FLAGS_UPDATED',  0x0001);
friendica's avatar
friendica committed
349
define ( 'UPDATE_FLAGS_FORCED',   0x0002);
350 351 352
define ( 'UPDATE_FLAGS_DELETED',  0x1000);


353 354 355 356 357
define ( 'DROPITEM_NORMAL',      0);
define ( 'DROPITEM_PHASE1',      1);
define ( 'DROPITEM_PHASE2',      2);


Friendika's avatar
Friendika committed
358 359 360
/**
 * Maximum number of "people who like (or don't like) this"  that we will list by name
 */
Zot's avatar
Zot committed
361

362
define ( 'MAX_LIKERS',    10);
Zot's avatar
Zot committed
363

Friendika's avatar
Friendika committed
364 365 366 367 368 369 370
/**
 * Communication timeout
 */

define ( 'ZCURL_TIMEOUT' , (-1));


Friendika's avatar
Friendika committed
371 372 373
/**
 * email notification options
 */
Zot's avatar
Zot committed
374

375 376 377 378 379 380 381 382 383
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 );
friendica's avatar
friendica committed
384
define ( 'NOTIFY_POKE',     0x0200 );
385
define ( 'NOTIFY_LIKE',     0x0400 );
386

friendica's avatar
friendica committed
387 388
define ( 'NOTIFY_SYSTEM',   0x8000 );

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
/**
 * visual notification options
 */

define ( 'VNOTIFY_NETWORK',    0x0001 );
define ( 'VNOTIFY_CHANNEL',    0x0002 );
define ( 'VNOTIFY_MAIL',       0x0004 );
define ( 'VNOTIFY_EVENT',      0x0008 );
define ( 'VNOTIFY_EVENTTODAY', 0x0010 );
define ( 'VNOTIFY_BIRTHDAY',   0x0020 );
define ( 'VNOTIFY_SYSTEM',     0x0040 );
define ( 'VNOTIFY_INFO',       0x0080 );
define ( 'VNOTIFY_ALERT',      0x0100 );
define ( 'VNOTIFY_INTRO',      0x0200 );
define ( 'VNOTIFY_REGISTER',   0x0400 );
404 405
define ( 'VNOTIFY_FILES',      0x0800 );
define ( 'VNOTIFY_PUBS',       0x1000 );
406
define ( 'VNOTIFY_LIKE',       0x2000 );
407
define ( 'VNOTIFY_FORUMS',     0x4000 );
408

friendica's avatar
friendica committed
409

410

411 412 413 414
/**
 * Tag/term types
 */

415 416
define ( 'TERM_UNKNOWN',      0 );
define ( 'TERM_HASHTAG',      1 );
friendica's avatar
friendica committed
417
define ( 'TERM_MENTION',      2 );
418 419 420 421
define ( 'TERM_CATEGORY',     3 );
define ( 'TERM_PCATEGORY',    4 );
define ( 'TERM_FILE',         5 );
define ( 'TERM_SAVEDSEARCH',  6 );
422
define ( 'TERM_THING',        7 );
423
define ( 'TERM_BOOKMARK',     8 );
redmatrix's avatar
redmatrix committed
424
define ( 'TERM_HIERARCHY',    9 );
425
define ( 'TERM_COMMUNITYTAG', 10 );
426
define ( 'TERM_FORUM',        11 );
Zot's avatar
Zot committed
427
define ( 'TERM_EMOJI',        12 );
428

429 430 431 432 433 434
define ( 'TERM_OBJ_POST',    1 );
define ( 'TERM_OBJ_PHOTO',   2 );
define ( 'TERM_OBJ_PROFILE', 3 );
define ( 'TERM_OBJ_CHANNEL', 4 );
define ( 'TERM_OBJ_OBJECT',  5 );
define ( 'TERM_OBJ_THING',   6 );
friendica's avatar
friendica committed
435
define ( 'TERM_OBJ_APP',     7 );
436

redmatrix's avatar
redmatrix committed
437

Friendika's avatar
Friendika committed
438 439 440
/**
 * various namespaces we may need to parse
 */
redmatrix's avatar
redmatrix committed
441
define ( 'PROTOCOL_ZOT',              'http://purl.org/zot/protocol' );
Zot's avatar
Zot committed
442
define ( 'PROTOCOL_ZOT6',             'http://purl.org/zot/protocol/6.0' );
friendica's avatar
friendica committed
443
define ( 'NAMESPACE_ZOT',             'http://purl.org/zot' );
444
define ( 'NAMESPACE_DFRN' ,           'http://purl.org/macgirvin/dfrn/1.0' );
Zot's avatar
Zot committed
445 446 447
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/' );
448
define ( 'NAMESPACE_ACTIVITY_SCHEMA', 'http://activitystrea.ms/schema/1.0/' );
449
define ( 'NAMESPACE_MEDIA',           'http://purl.org/syndication/atommedia' );
450 451 452 453 454
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' );
Friendika's avatar
Friendika committed
455 456
define ( 'NAMESPACE_OSTATUS',         'http://ostatus.org/schema/1.0' );
define ( 'NAMESPACE_STATUSNET',       'http://status.net/schema/api/1/' );
Friendika's avatar
Friendika committed
457
define ( 'NAMESPACE_ATOM1',           'http://www.w3.org/2005/Atom' );
458 459
define ( 'NAMESPACE_YMEDIA',          'http://search.yahoo.com/mrss/' );

460 461
// We should be using versioned jsonld contexts so that signatures will be slightly more reliable.
// Why signatures are unreliable by design is a problem nobody seems to care about
462 463 464 465 466 467 468 469
// "because it's a proposed W3C standard". .

// Anyway, if you use versioned contexts, communication with Mastodon fails. Have not yet investigated
// the reason for the dependency but for the current time, use the standard non-versioned context.
//define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams-history/v1.8.jsonld' );

define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams' );

470
define ( 'ZOT_APSCHEMA_REV', '/apschema/v1.3' );
Friendika's avatar
Friendika committed
471 472 473
/**
 * activity stream defines
 */
Zot's avatar
Zot committed
474

Zot's avatar
Zot committed
475 476
define ( 'ACTIVITY_PUBLIC_INBOX', 'https://www.w3.org/ns/activitystreams#Public' );

477
define ( 'ACTIVITY_REACT',       NAMESPACE_ZOT   . '/activity/react' );
Zot's avatar
Zot committed
478
define ( 'ACTIVITY_LIKE',        NAMESPACE_ACTIVITY_SCHEMA . 'like' );
479
define ( 'ACTIVITY_DISLIKE',     NAMESPACE_ZOT   . '/activity/dislike' );
480 481 482
define ( 'ACTIVITY_AGREE',       NAMESPACE_ZOT   . '/activity/agree' );
define ( 'ACTIVITY_DISAGREE',    NAMESPACE_ZOT   . '/activity/disagree' );
define ( 'ACTIVITY_ABSTAIN',     NAMESPACE_ZOT   . '/activity/abstain' );
483 484 485
define ( 'ACTIVITY_ATTEND',      NAMESPACE_ZOT   . '/activity/attendyes' );
define ( 'ACTIVITY_ATTENDNO',    NAMESPACE_ZOT   . '/activity/attendno' );
define ( 'ACTIVITY_ATTENDMAYBE', NAMESPACE_ZOT   . '/activity/attendmaybe' );
486
define ( 'ACTIVITY_POLLRESPONSE', NAMESPACE_ZOT  . '/activity/pollresponse' );
487

488
define ( 'ACTIVITY_OBJ_HEART',   NAMESPACE_ZOT   . '/activity/heart' );
Zot's avatar
Zot committed
489

Zot's avatar
Zot committed
490
define ( 'ACTIVITY_FRIEND',      NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
491 492
define ( 'ACTIVITY_REQ_FRIEND',  NAMESPACE_ACTIVITY_SCHEMA . 'request-friend' );
define ( 'ACTIVITY_UNFRIEND',    NAMESPACE_ACTIVITY_SCHEMA . 'remove-friend' );
493
define ( 'ACTIVITY_FOLLOW',      NAMESPACE_ACTIVITY_SCHEMA . 'follow' );
494
define ( 'ACTIVITY_UNFOLLOW',    NAMESPACE_ACTIVITY_SCHEMA . 'stop-following' );
495 496
define ( 'ACTIVITY_JOIN',        NAMESPACE_ACTIVITY_SCHEMA . 'join' );

Zot's avatar
Zot committed
497 498
define ( 'ACTIVITY_POST',        NAMESPACE_ACTIVITY_SCHEMA . 'post' );
define ( 'ACTIVITY_UPDATE',      NAMESPACE_ACTIVITY_SCHEMA . 'update' );
499
define ( 'ACTIVITY_TAG',         NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
500
define ( 'ACTIVITY_SHARE',       NAMESPACE_ACTIVITY_SCHEMA . 'share' );
friendica's avatar
friendica committed
501
define ( 'ACTIVITY_FAVORITE',    NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
502
define ( 'ACTIVITY_CREATE',      NAMESPACE_ACTIVITY_SCHEMA . 'create' );
503
define ( 'ACTIVITY_DELETE',      NAMESPACE_ACTIVITY_SCHEMA . 'delete' );
504 505 506 507
define ( 'ACTIVITY_WIN',         NAMESPACE_ACTIVITY_SCHEMA . 'win' );
define ( 'ACTIVITY_LOSE',        NAMESPACE_ACTIVITY_SCHEMA . 'lose' );
define ( 'ACTIVITY_TIE',         NAMESPACE_ACTIVITY_SCHEMA . 'tie' );
define ( 'ACTIVITY_COMPLETE',    NAMESPACE_ACTIVITY_SCHEMA . 'complete' );
Zot's avatar
Zot committed
508

friendica's avatar
friendica committed
509
define ( 'ACTIVITY_POKE',        NAMESPACE_ZOT . '/activity/poke' );
510
define ( 'ACTIVITY_MOOD',        NAMESPACE_ZOT . '/activity/mood' );
friendica's avatar
friendica committed
511

Zot's avatar
Zot committed
512
define ( 'ACTIVITY_OBJ_COMMENT', NAMESPACE_ACTIVITY_SCHEMA . 'comment' );
Zot's avatar
Zot committed
513
define ( 'ACTIVITY_OBJ_ACTIVITY',NAMESPACE_ACTIVITY_SCHEMA . 'activity' );
Zot's avatar
Zot committed
514
define ( 'ACTIVITY_OBJ_NOTE',    NAMESPACE_ACTIVITY_SCHEMA . 'note' );
Mario's avatar
Mario committed
515
define ( 'ACTIVITY_OBJ_ARTICLE', NAMESPACE_ACTIVITY_SCHEMA . 'article' );
Zot's avatar
Zot committed
516 517 518 519
define ( 'ACTIVITY_OBJ_PERSON',  NAMESPACE_ACTIVITY_SCHEMA . 'person' );
define ( 'ACTIVITY_OBJ_PHOTO',   NAMESPACE_ACTIVITY_SCHEMA . 'photo' );
define ( 'ACTIVITY_OBJ_P_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'profile-photo' );
define ( 'ACTIVITY_OBJ_ALBUM',   NAMESPACE_ACTIVITY_SCHEMA . 'photo-album' );
Friendika's avatar
Friendika committed
520
define ( 'ACTIVITY_OBJ_EVENT',   NAMESPACE_ACTIVITY_SCHEMA . 'event' );
521
define ( 'ACTIVITY_OBJ_GROUP',   NAMESPACE_ACTIVITY_SCHEMA . 'group' );
522
define ( 'ACTIVITY_OBJ_GAME',    NAMESPACE_ACTIVITY_SCHEMA . 'game' );
523
define ( 'ACTIVITY_OBJ_WIKI',    NAMESPACE_ACTIVITY_SCHEMA . 'wiki' );
524 525
define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_ZOT  . '/activity/tagterm' );
define ( 'ACTIVITY_OBJ_PROFILE', NAMESPACE_ZOT  . '/activity/profile' );
526
define ( 'ACTIVITY_OBJ_THING',   NAMESPACE_ZOT  . '/activity/thing' );
527
define ( 'ACTIVITY_OBJ_LOCATION',NAMESPACE_ZOT  . '/activity/location' );
528
define ( 'ACTIVITY_OBJ_FILE',    NAMESPACE_ZOT  . '/activity/file' );
529
define ( 'ACTIVITY_OBJ_CARD',    NAMESPACE_ZOT  . '/activity/card' );
Zot's avatar
Zot committed
530

friendica's avatar
friendica committed
531 532 533 534 535 536 537 538 539
/**
 * Account Flags
 */

define ( 'ACCOUNT_OK',           0x0000 );
define ( 'ACCOUNT_UNVERIFIED',   0x0001 );
define ( 'ACCOUNT_BLOCKED',      0x0002 );
define ( 'ACCOUNT_EXPIRED',      0x0004 );
define ( 'ACCOUNT_REMOVED',      0x0008 );
540
define ( 'ACCOUNT_PENDING',      0x0010 );
friendica's avatar
friendica committed
541 542 543 544 545

/**
 * Account roles
 */

546
define ( 'ACCOUNT_ROLE_SYSTEM',    0x0002 );
547
define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
548
define ( 'ACCOUNT_ROLE_ADMIN',     0x1000 );
friendica's avatar
friendica committed
549

friendica's avatar
friendica committed
550 551 552 553 554
/**
 * Item visibility
 */

define ( 'ITEM_VISIBLE',         0x0000);
Zot's avatar
Zot committed
555
define ( 'ITEM_HIDDEN',          0x0001);
friendica's avatar
friendica committed
556 557 558
define ( 'ITEM_BLOCKED',         0x0002);
define ( 'ITEM_MODERATED',       0x0004);
define ( 'ITEM_SPAM',            0x0008);
Zot's avatar
Zot committed
559
define ( 'ITEM_DELETED',         0x0010);
560
define ( 'ITEM_UNPUBLISHED',     0x0020);
Zot's avatar
Zot committed
561
define ( 'ITEM_WEBPAGE',         0x0040);	// is a static web page, not a conversational item
friendica's avatar
friendica committed
562
define ( 'ITEM_DELAYED_PUBLISH', 0x0080);
Thomas Willingham's avatar
Thomas Willingham committed
563
define ( 'ITEM_BUILDBLOCK',      0x0100);	// Named thusly to make sure nobody confuses this with ITEM_BLOCKED
Zot's avatar
Zot committed
564
define ( 'ITEM_PDL',			 0x0200);	// Page Description Language - e.g. Comanche
Thomas Willingham's avatar
Thomas Willingham committed
565
define ( 'ITEM_BUG',			 0x0400);	// Is a bug, can be used by the internal bug tracker
566
define ( 'ITEM_PENDING_REMOVE',  0x0800);   // deleted, notification period has lapsed
567
define ( 'ITEM_DOC',             0x1000);   // hubzilla only, define here so that item import does the right thing
Zot's avatar
Zot committed
568
define ( 'ITEM_CARD',            0x2000);
Zot's avatar
Zot committed
569
define ( 'ITEM_ARTICLE',         0x4000);
Zot's avatar
Zot committed
570

571

572 573 574 575
define ( 'ITEM_TYPE_POST',       0 );
define ( 'ITEM_TYPE_BLOCK',      1 );
define ( 'ITEM_TYPE_PDL',        2 );
define ( 'ITEM_TYPE_WEBPAGE',    3 );
576
define ( 'ITEM_TYPE_BUG',        4 );
redmatrix's avatar
redmatrix committed
577
define ( 'ITEM_TYPE_DOC',        5 );
578
define ( 'ITEM_TYPE_CARD',       6 );
Zot's avatar
Zot committed
579
define ( 'ITEM_TYPE_ARTICLE',    7 );
580 581
//OSADA ITEM_TYPE_MAIL = 8
define ( 'ITEM_TYPE_CUSTOM',	 9 );
582

583 584 585
define ( 'ITEM_IS_STICKY',       1000 );


586
define ( 'DBTYPE_MYSQL',    0 );
587
define ( 'DBTYPE_POSTGRES', 1 );
588

589 590 591 592 593

function sys_boot() {

	// our central App object

594
	App::init();
595 596 597 598 599 600 601 602 603

	/*
	 * Load the configuration file which contains our DB credentials.
	 * Ignore errors. If the file doesn't exist or is empty, we are running in
	 * installation mode.
	 */

	// miniApp is a conversion object from old style .htconfig.php files

604
	$a = new miniApp;
605 606


607
	App::$install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false : true);
608 609 610

	@include('.htconfig.php');

611 612 613 614 615 616
	// allow somebody to set some initial settings just in case they can't
	// install without special fiddling

	if(App::$install && file_exists('.htpreconfig.php'))
		@include('.htpreconfig.php');

redmatrix's avatar
redmatrix committed
617 618 619 620 621 622
	if(array_key_exists('default_timezone',get_defined_vars())) {
		App::$config['system']['timezone'] = $default_timezone;
	}

	$a->convert();

Zot's avatar
Zot committed
623
	App::$config['system']['server_role'] = 'pro';
624

625 626
	App::$timezone = ((App::$config['system']['timezone']) ? App::$config['system']['timezone'] : 'UTC');
	date_default_timezone_set(App::$timezone);
627 628


629
	if(! defined('DEFAULT_PLATFORM_ICON')) {
Mario's avatar
Mario committed
630
		define( 'DEFAULT_PLATFORM_ICON', '/images/hz-32.png' );
631 632 633
	}

	if(! defined('DEFAULT_NOTIFY_ICON')) {
Mario's avatar
Mario committed
634
		define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-64.png' );
635 636
	}

637 638
	App::head_set_icon(DEFAULT_PLATFORM_ICON);

639 640 641 642 643 644
	/*
	 * Try to open the database;
	 */

	require_once('include/dba/dba_driver.php');

645 646 647
	if(! App::$install) {
		DBA::dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data, $db_type, App::$install);
		if(! DBA::$dba->connected) {
648 649 650 651 652
			system_unavailable();
		}

		unset($db_host, $db_port, $db_user, $db_pass, $db_data, $db_type);

653
		/*
654 655 656 657 658 659
		 * Load configs from db. Overwrite configs from .htconfig.php
		 */

		load_config('system');
		load_config('feature');

660 661
		App::$session = new Zotlabs\Web\Session();
		App::$session->init();
662
		load_hooks();
663 664 665
		/**
		 * @hooks init_1
		 */
666 667 668 669 670
		call_hooks('init_1');
	}
}


Friendika's avatar
Friendika committed
671 672
function startup() {
	error_reporting(E_ERROR | E_WARNING | E_PARSE);
673

674
	// Some hosting providers block/disable this
675
	@set_time_limit(0);
676

677 678 679 680 681 682 683 684 685 686
	if(function_exists ('ini_set')) {
		// This has to be quite large to deal with embedded private photos
		@ini_set('pcre.backtrack_limit', 500000);

		// Use cookies to store the session ID on the client side
		@ini_set('session.use_only_cookies', 1);

		// Disable transparent Session ID support
		@ini_set('session.use_trans_sid',    0);
	}
687 688
}

689

690 691 692 693 694
/**
 * class miniApp
 *
 * this is a transient structure which is needed to convert the $a->config settings
 * from older (existing) htconfig files which used a global App ($a) into the updated App structure
695 696
 * which is now static (although currently constructed at startup). We are only converting
 * 'system' config settings.
697 698 699 700 701 702
 */
class miniApp {
	public $config = array('system' => array());

	public function convert() {
		if($this->config['system']) {
703 704
			foreach($this->config['system'] as $k => $v)
				App::$config['system'][$k] = $v;
705 706 707 708 709
		}
	}
}


Friendika's avatar
Friendika committed
710 711 712
/**
 * class: App
 *
713 714
 * @brief Our main application structure for the life of this page.
 *
Friendika's avatar
Friendika committed
715
 * Primarily deals with the URL that got us here
716
 * and tries to make some sense of it, and
Friendika's avatar
Friendika committed
717
 * stores our page contents and config storage
718 719
 * and anything else that might need to be passed around
 * before we spit the page out.
Friendika's avatar
Friendika committed
720 721
 *
 */
friendica's avatar
friendica committed
722
class App {
723

724 725 726 727 728 729 730 731 732 733 734
	public  static $install    = false;           // true if we are installing the software
	public  static $account    = null;            // account record of the logged-in account
	public  static $channel    = null;            // channel record of the current channel of the logged-in account
	public  static $observer   = null;            // xchan record of the page observer
	public  static $profile_uid = 0;              // If applicable, the channel_id of the "page owner"
	public  static $poi        = null;            // "person of interest", generally a referenced connection
	private static $oauth_key  = null;            // consumer_id of oauth request, if used
	public  static $layout     = array();         // Comanche parsed template
	public  static $pdl        = null;            // Comanche page description
	private static $perms      = null;            // observer permissions
	private static $widgets    = array();         // widgets for this page
735
	public  static $config     = array();         // config cache
736 737 738 739 740
	public  static $override_intltext_templates = array();
	public  static $override_markup_templates = array();
	public  static $override_templateroot = null;
	public  static $override_helproot = null;
	public  static $override_helpfiles = array();
741

742
	public static  $session    = null;
743 744
	public static  $groups;
	public static  $language;
redmatrix's avatar
redmatrix committed
745
	public static  $langsave;
746
	public static  $rtl = false;
redmatrix's avatar
redmatrix committed
747
	public static  $plugins_admin;
748 749 750 751 752 753 754 755 756 757 758
	public static  $module_loaded = false;
	public static  $query_string;
	public static  $page;
	public static  $profile;
	public static  $user;
	public static  $cid;
	public static  $contact;
	public static  $contacts;
	public static  $content;
	public static  $data = array();
	public static  $error = false;
759
	public static  $emojitab = false;
760 761 762 763 764 765
	public static  $cmd;
	public static  $argv;
	public static  $argc;
	public static  $module;
	public static  $pager;
	public static  $strings;
766
	public static  $stringsave;   // used in push_lang() and pop_lang()
767 768 769 770 771 772 773 774
	public static  $hooks;
	public static  $timezone;
	public static  $interactive = true;
	public static  $plugins;
	private static $apps = array();
	public static  $identities;
	public static  $css_sources = array();
	public static  $js_sources = array();
Zot's avatar
Zot committed
775
	public static  $linkrel = array();
776 777 778
	public static  $theme_info = array();
	public static  $is_sys = false;
	public static  $nav_sel;
779
	public static  $comanche;
780

781 782 783 784

	public static $channel_links;


785
	public static  $category;
friendica's avatar
friendica committed
786 787 788 789

	// Allow themes to control internal parameters
	// by changing App values in theme.php

790 791 792 793 794
	public static  $sourcename = '';
	public static  $videowidth = 425;
	public static  $videoheight = 350;
	public static  $force_max_items = 0;
	public static  $theme_thread_allow = true;
friendica's avatar
friendica committed
795

796 797 798 799 800 801
	/**
	 * @brief An array for all theme-controllable parameters
	 *
	 * Mostly unimplemented yet. Only options 'template_engine' and
	 * beyond are used.
	 */
802
	private static $theme = array(
friendica's avatar
friendica committed
803 804 805 806 807 808
		'sourcename' => '',
		'videowidth' => 425,
		'videoheight' => 350,
		'force_max_items' => 0,
		'thread_allow' => true,
		'stylesheet' => '',
809
		'template_engine' => 'smarty3',
friendica's avatar
friendica committed
810
	);
Zach Prezkuta's avatar
Zach Prezkuta committed
811

812
	/**
813
	 * @brief An array of registered template engines ('name'=>'class name')
814
	 */
815
	public static $template_engines = array();
816
	/**
817
	 * @brief An array of instanced template engines ('name'=>'instance')
818
	 */
819
	public static $template_engine_instance = array();
friendica's avatar
friendica committed
820

821
	private static $ldelim = array(
friendica's avatar
friendica committed
822 823 824
		'internal' => '',
		'smarty3' => '{{'
	);
825
	private static $rdelim = array(
friendica's avatar
friendica committed
826 827 828
		'internal' => '',
		'smarty3' => '}}'
	);
829

830 831
	// These represent the URL which was used to access the page

832 833 834
	private static $scheme;
	private static $hostname;
	private static $path;
835

836 837 838
	// This is our standardised URL - regardless of what was used
	// to access the page

839
	private static $baseurl;
840

841
	private static $meta;
842

843 844 845
	/**
	 * App constructor.
	 */
redmatrix's avatar
redmatrix committed
846
	public static function init() {
847 848
		// we'll reset this after we read our config file
		date_default_timezone_set('UTC');
849

850 851 852
		self::$config = array('system'=>array());
		self::$page = array();
		self::$pager= array();
853

854
		self::$query_string = '';
Zot's avatar
Zot committed
855

856

friendica's avatar
friendica committed
857
		startup();
858

859 860 861 862 863 864
		set_include_path(
			'include' . PATH_SEPARATOR
			. 'library' . PATH_SEPARATOR
			. 'library/langdet' . PATH_SEPARATOR
			. '.' );

865
		self::$scheme = 'http';
friendica's avatar
friendica committed
866
		if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
867
			self::$scheme = 'https';
friendica's avatar
friendica committed
868
		elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
869
			self::$scheme = 'https';
870

friendica's avatar
friendica committed
871
		if(x($_SERVER,'SERVER_NAME')) {
872
			self::$hostname = punify($_SERVER['SERVER_NAME']);
Zot's avatar
Zot committed
873

friendica's avatar
friendica committed
874
			if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
875
				self::$hostname .= ':' . $_SERVER['SERVER_PORT'];
876 877

			/*
friendica's avatar
friendica committed
878 879 880 881
			 * Figure out if we are running at the top of a domain
			 * or in a sub-directory and adjust accordingly
			 */
			$path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
882 883
			if(isset($path) && strlen($path) && ($path != self::$path))
				self::$path = $path;
friendica's avatar
friendica committed
884
		}
Friendika's avatar
Friendika committed
885

886
		if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 2) === "q=") {
Zot's avatar
Zot committed
887
			self::$query_string = str_replace(['<','>'],['&lt;','&gt;'],substr($_SERVER['QUERY_STRING'], 2));
friendica's avatar
friendica committed
888
			// removing trailing / - maybe a nginx problem
889 890
			if (substr(self::$query_string, 0, 1) == "/")
				self::$query_string = substr(self::$query_string, 1);
891
			// change the first & to ?
892
			self::$query_string = preg_replace('/&/','?',self::$query_string,1);
friendica's avatar
friendica committed
893
		}
Zot's avatar
Zot committed
894

friendica's avatar
friendica committed
895
		if(x($_GET,'q'))
Mario's avatar
Mario committed
896
			self::$cmd = escape_tags(trim($_GET['q'],'/\\'));
897

friendica's avatar
friendica committed
898
		// unix style "homedir"
899

Zot's avatar
Zot committed
900
		if((substr(self::$cmd, 0, 1) === '~') || (substr(self::$cmd, 0, 1) === '@'))
901
			self::$cmd = 'channel/' . substr(self::$cmd, 1);
902

903
		/*
friendica's avatar
friendica committed
904
		 * Break the URL path into C style argc/argv style arguments for our
905 906
		 * modules. Given "http://example.com/module/arg1/arg2", self::$argc
		 * will be 3 (integer) and self::$argv will contain:
friendica's avatar
friendica committed
907 908 909 910 911
		 *   [0] => 'module'
		 *   [1] => 'arg1'
		 *   [2] => 'arg2'
		 *
		 * There will always be one argument. If provided a naked domain
912
		 * URL, self::$argv[0] is set to "home".
913
		 *
914 915
		 * If $argv[0] has a period in it, for example foo.json; rewrite
		 * to module = 'foo' and set $_REQUEST['module_format'] = 'json';
friendica's avatar
friendica committed
916
		 */
917

918
		self::$argv = explode('/', self::$cmd);
919

920 921
		self::$argc = count(self::$argv);
		if ((array_key_exists('0', self::$argv)) && strlen(self::$argv[0])) {
922 923 924 925 926
			if(strpos(self::$argv[0],'.')) {
				$_REQUEST['module_format'] = substr(self::$argv[0],strpos(self::$argv[0],'.')+1);
				self::$argv[0] =  substr(self::$argv[0],0,strpos(self::$argv[0],'.'));
			}

927 928
			self::$module = str_replace(".", "_", self::$argv[0]);
			self::$module = str_replace("-", "_", self::$module);
929 930
			if(strpos(self::$module,'_') === 0)
				self::$module = substr(self::$module,1);
931
		} else {
932 933 934
			self::$argc = 1;
			self::$argv = array('home');
			self::$module = 'home';
friendica's avatar
friendica committed
935
		}
936

937

938
		/*
friendica's avatar
friendica committed
939 940 941
		 * See if there is any page number information, and initialise
		 * pagination
		 */
Friendika's avatar
Friendika committed
942

943 944 945 946 947 948
		self::$pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
		self::$pager['itemspage'] = 60;
		self::$pager['start'] = (self::$pager['page'] * self::$pager['itemspage']) - self::$pager['itemspage'];
		if(self::$pager['start'] < 0)
			self::$pager['start'] = 0;
		self::$pager['total'] = 0;
949

950
		/*
951 952
		 * register template engines
		 */
953 954

		self::$meta= new Zotlabs\Web\HttpMeta();
redmatrix's avatar
redmatrix committed
955 956 957

		// create an instance of the smarty template engine so we can register it.

958
		$smarty = new Zotlabs\Render\SmartyTemplate();
959 960
		/// @todo validate if this is still the desired behavior
		self::register_template_engine(get_class($smarty));
961

friendica's avatar
friendica committed
962
	}
Friendika's avatar
Friendika committed
963

964 965 966 967 968 969
	public static function get_baseurl($ssl = false) {
		if(is_array(self::$config)
			&& array_key_exists('system',self::$config)
			&& is_array(self::$config['system'])
			&& array_key_exists('baseurl',self::$config['system'])
			&& strlen(self::$config['system']['baseurl'])) {
970 971 972 973
			// get_baseurl() is a heavily used function.
			// Do not use punify() here until we find a library that performs better than what we have now.
			//$url = punify(self::$config['system']['baseurl']);
			$url = self::$config['system']['baseurl'];
974
			$url = trim($url,'\\/');
975 976 977
			return $url;
		}

978
		$scheme = self::$scheme;
979

980
		self::$baseurl = $scheme . "://" . punify(self::$hostname) . ((isset(self::$path) && strlen(self::$path)) ? '/' . self::$path : '' );
981

982
		return self::$baseurl;
friendica's avatar
friendica committed
983
	}
984

985 986 987 988 989 990
	public static function set_baseurl($url) {
		if(is_array(self::$config)
			&& array_key_exists('system',self::$config)
			&& is_array(self::$config['system'])
			&& array_key_exists('baseurl',self::$config['system'])
			&& strlen(self::$config['system']['baseurl'])) {
991
			$url = punify(self::$config['system']['baseurl']);
992
			$url = trim($url,'\\/');
friendica's avatar
friendica committed
993
		}
994

friendica's avatar
friendica committed
995
		$parsed = @parse_url($url);
996

997
		self::$baseurl = $url;
998

999
		if($parsed !== false) {
1000
			self::$scheme = $parsed['scheme'];
1001

1002
			self::$hostname = punify($parsed['host']);
friendica's avatar
friendica committed
1003
			if(x($parsed,'port'))
1004
				self::$hostname .= ':' . $parsed['port'];
friendica's avatar
friendica committed
1005
			if(x($parsed,'path'))
1006
				self::$path = trim($parsed['path'],'\\/');
1007
		}
friendica's avatar
friendica committed
1008
	}
Zot's avatar
Zot committed
1009

1010 1011
	public static function get_scheme() {
		return self::$scheme;
1012 1013
	}

1014 1015
	public static function get_hostname() {
		return self::$hostname;
friendica's avatar
friendica committed
1016
	}
Zot's avatar
Zot committed
1017

1018 1019
	public static function set_hostname($h) {
		self::$hostname = $h;
friendica's avatar
friendica committed
1020
	}
1021

1022 1023
	public static function set_path($p) {
		self::$path = trim(trim($p), '/');
friendica's avatar
friendica committed
1024
	}
Zot's avatar
Zot committed
1025

1026 1027
	public static function get_path() {
		return self::$path;
friendica's avatar
friendica committed
1028
	}
1029

1030 1031 1032 1033 1034 1035 1036 1037
	public static function get_channel_links() {
		$s = '';
		$x = self::$channel_links;
		if($x && is_array($x) && count($x)) {
			foreach($x as $y) {
				if($s) {
					$s .= ',';
				}
1038
				$s .= '<' . $y['url'] . '>; rel="' . $y['rel'] . '"; type="' . $y['type'] . '"';
1039 1040 1041 1042
			}
		}
		return $s;
	}
1043 1044
	public static function set_account($acct) {
		self::$account = $acct;
friendica's avatar
friendica committed
1045
	}
1046

1047 1048
	public static function get_account() {
		return self::$account;
friendica's avatar
friendica committed
1049
	}
1050

1051 1052
	public static function set_channel($channel) {
		self::$channel = $channel;
friendica's avatar
friendica committed
1053
	}
1054

1055 1056
	public static function get_channel() {
		return self::$channel;
friendica's avatar
friendica committed
1057
	}
1058

1059 1060
	public static function set_observer($xchan) {
		self::$observer = $xchan;
friendica's avatar
friendica committed
1061
	}
1062

1063 1064
	public static function get_observer() {
		return self::$observer;
friendica's avatar
friendica committed
1065
	}
1066

1067 1068
	public static function set_perms($perms) {
		self::$perms = $perms;
friendica's avatar
friendica committed
1069
	}
1070

1071 1072
	public static function get_perms() {
		return self::$perms;
friendica's avatar
friendica committed
1073
	}
friendica's avatar
friendica committed
1074

1075 1076
	public static function set_oauth_key($consumer_id) {
		self::$oauth_key = $consumer_id;
1077 1078
	}

1079 1080
	public static function get_oauth_key() {
		return self::$oauth_key;
1081 1082
	}

1083 1084
	public static function get_apps() {
		return self::$apps;
friendica's avatar
friendica committed
1085
	}
friendica's avatar
friendica committed
1086

1087 1088
	public static function set_apps($arr) {
		self::$apps = $arr;
friendica's avatar
friendica committed
1089
	}
1090

1091 1092
	public static function set_groups($g) {
		self::$groups = $g;
friendica's avatar
friendica committed
1093
	}
friendica's avatar
friendica committed
1094

1095 1096
	public static function get_groups() {
		return self::$groups;
friendica's avatar
friendica committed
1097
	}
friendica's avatar
friendica committed
1098

1099 1100
	public static function set_pager_total($n) {
		self::$pager['total'] = intval($n);
friendica's avatar
friendica committed
1101
	}
Zot's avatar
Zot committed
1102

1103 1104 1105
	public static function set_pager_itemspage($n) {
		self::$pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
		self::$pager['start'] = (self::$pager['page'] * self::$pager['itemspage']) - self::$pager['itemspage'];
friendica's avatar
friendica committed
1106
	}
Zach Prezkuta's avatar
Zach Prezkuta committed
1107

1108
	public static function build_pagehead() {
Zach Prezkuta's avatar
Zach Prezkuta committed
1109

Mario's avatar
Mario committed
1110
		$user_scalable = ((local_channel()) ? get_pconfig(local_channel(),'system','user_scalable') : 0);
1111
		if ($user_scalable === false)
Mario's avatar
Mario committed
1112
			$user_scalable = 0;
1113

1114 1115 1116 1117
		$preload_images = ((local_channel()) ? get_pconfig(local_channel(),'system','preload_images') : 0);