From 56ee734b00aead633d5d213a6b140b75bc17ba96 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 30 Apr 2017 00:01:26 -0400 Subject: [PATCH 01/14] Cleanup /format pre-move --- boot.php | 2 +- include/Probe.php | 4 +- include/api.php | 2 +- include/auth.php | 2 +- include/auth_ejabberd.php | 2 + include/bb2diaspora.php | 2 + include/bbcode.php | 3 +- include/cli_startup.php | 2 +- include/conversation.php | 1 - include/cronjobs.php | 3 +- include/dbstructure.php | 2 +- include/delivery.php | 2 +- include/diaspora.php | 2 +- include/event.php | 2 +- include/items.php | 4 +- include/message.php | 4 +- include/network.php | 2 +- include/notifier.php | 2 +- include/oauth.php | 52 ++-- include/oembed.php | 4 +- include/plaintext.php | 2 +- include/plugin.php | 12 +- include/poller.php | 5 +- include/pubsubpublish.php | 3 +- include/shadowupdate.php | 2 +- include/socgraph.php | 6 +- include/text.php | 1 - include/uimport.php | 16 +- index.php | 4 +- mod/_well_known.php | 2 +- mod/admin.php | 2 +- mod/amcd.php | 7 +- mod/apps.php | 25 +- mod/community.php | 3 +- mod/contactgroup.php | 2 - mod/credits.php | 26 +- mod/delegate.php | 1 - mod/dfrn_poll.php | 3 - mod/directory.php | 6 - mod/dirfind.php | 2 - mod/display.php | 1 - mod/filer.php | 1 - mod/friendica.php | 2 +- mod/hovercard.php | 1 + mod/install.php | 4 +- mod/login.php | 11 +- mod/maintenance.php | 2 +- mod/manifest.php | 37 ++- mod/match.php | 2 +- mod/mood.php | 1 - mod/newmember.php | 40 +--- mod/nodeinfo.php | 2 +- mod/notice.php | 30 +-- mod/openid.php | 1 - mod/opensearch.php | 22 +- mod/parse_url.php | 2 +- mod/photos.php | 5 +- mod/ping.php | 2 +- mod/poke.php | 5 +- mod/pretheme.php | 8 +- mod/probe.php | 13 +- mod/profile.php | 1 - mod/profile_photo.php | 2 - mod/qsearch.php | 1 - mod/receive.php | 2 - mod/robots_txt.php | 6 +- mod/rsd_xml.php | 36 +-- mod/smilies.php | 9 +- mod/statistics_json.php | 31 +-- mod/subthread.php | 1 - mod/tagger.php | 1 - mod/toggle_mobile.php | 1 - mod/uexport.php | 45 ++-- mod/uimport.php | 60 ++--- mod/videos.php | 1 - mod/wall_upload.php | 5 +- util/db_update.php | 2 +- util/maintenance.php | 2 +- util/php2po.php | 371 ++++++++++++++--------------- util/typo.php | 90 +++---- view/theme/duepuntozero/config.php | 1 + view/theme/frio/php/default.php | 4 +- view/theme/frio/php/frio_boot.php | 2 +- view/theme/quattro/config.php | 1 + view/theme/smoothly/theme.php | 7 +- 85 files changed, 522 insertions(+), 581 deletions(-) diff --git a/boot.php b/boot.php index b689b73ee..afee3ac77 100644 --- a/boot.php +++ b/boot.php @@ -19,7 +19,7 @@ require_once(__DIR__ . DIRECTORY_SEPARATOR. 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'); -use \Friendica\Core\Config; +use Friendica\Core\Config; require_once('include/config.php'); require_once('include/network.php'); diff --git a/include/Probe.php b/include/Probe.php index f67a821f9..653e90b53 100644 --- a/include/Probe.php +++ b/include/Probe.php @@ -5,8 +5,8 @@ * */ -use \Friendica\Core\Config; -use \Friendica\Core\PConfig; +use Friendica\Core\Config; +use Friendica\Core\PConfig; require_once("include/feed.php"); require_once('include/email.php'); diff --git a/include/api.php b/include/api.php index 97c09c20a..2e0409cb7 100644 --- a/include/api.php +++ b/include/api.php @@ -6,7 +6,7 @@ * @todo Automatically detect if incoming data is HTML or BBCode */ -use \Friendica\Core\Config; +use Friendica\Core\Config; require_once 'include/HTTPExceptions.php'; require_once 'include/bbcode.php'; diff --git a/include/auth.php b/include/auth.php index c1a6120db..76662d666 100644 --- a/include/auth.php +++ b/include/auth.php @@ -1,6 +1,6 @@ gen_token(); $sec = $this->gen_token(); - + if ($consumer->key){ $k = $consumer->key; } else { $k = $consumer; } - + $r = q("INSERT INTO tokens (id, secret, client_id, scope, expires) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d)", dbesc($key), dbesc($sec), @@ -80,19 +80,19 @@ class FKOAuthDataStore extends OAuthDataStore { function new_access_token($token, $consumer, $verifier = null) { logger(__function__.":".$token.", ". $consumer.", ". $verifier); - + // return a new access token attached to this consumer // for the user associated with this token if the request token // is authorized // should also invalidate the request token - + $ret=Null; - + // get user for this verifier $uverifier = get_config("oauth", $verifier); logger(__function__.":".$verifier.",".$uverifier); if (is_null($verifier) || ($uverifier!==false)){ - + $key = $this->gen_token(); $sec = $this->gen_token(); $r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)", @@ -103,13 +103,13 @@ class FKOAuthDataStore extends OAuthDataStore { intval(ACCESS_TOKEN_DURATION), intval($uverifier)); if ($r) - $ret = new OAuthToken($key,$sec); + $ret = new OAuthToken($key,$sec); } - - + + q("DELETE FROM tokens WHERE id='%s'", $token->key); - - + + if (!is_null($ret) && $uverifier!==false){ del_config("oauth", $verifier); /* $apps = get_pconfig($uverifier, "oauth", "apps"); @@ -117,9 +117,9 @@ class FKOAuthDataStore extends OAuthDataStore { $apps[] = $consumer->key; set_pconfig($uverifier, "oauth", "apps", $apps);*/ } - + return $ret; - + } } @@ -172,9 +172,9 @@ class FKOAuth1 extends OAuthServer { intval($_SESSION['uid']) ); - call_hooks('logged_in', $a->user); + call_hooks('logged_in', $a->user); } - + } /* class FKOAuth2 extends OAuth2 { @@ -190,13 +190,13 @@ class FKOAuth2 extends OAuth2 { dbesc($client_secret), dbesc($redirect_uri) ); - + return $r; } protected function checkClientCredentials($client_id, $client_secret = NULL) { $client_secret = $this->db_secret($client_secret); - + $r = q("SELECT pw FROM clients WHERE client_id = '%s'", dbesc($client_id)); @@ -218,21 +218,21 @@ class FKOAuth2 extends OAuth2 { protected function getAccessToken($oauth_token) { $r = q("SELECT client_id, expires, scope FROM tokens WHERE id = '%s'", dbesc($oauth_token)); - + if (dbm::is_result($r)) return $r[0]; return null; } - + protected function setAccessToken($oauth_token, $client_id, $expires, $scope = NULL) { $r = q("INSERT INTO tokens (id, client_id, expires, scope) VALUES ('%s', '%s', %d, '%s')", dbesc($oauth_token), dbesc($client_id), intval($expires), dbesc($scope)); - + return $r; } @@ -246,23 +246,23 @@ class FKOAuth2 extends OAuth2 { protected function getAuthCode($code) { $r = q("SELECT id, client_id, redirect_uri, expires, scope FROM auth_codes WHERE id = '%s'", dbesc($code)); - + if (dbm::is_result($r)) return $r[0]; return null; } protected function setAuthCode($code, $client_id, $redirect_uri, $expires, $scope = NULL) { - $r = q("INSERT INTO auth_codes - (id, client_id, redirect_uri, expires, scope) VALUES + $r = q("INSERT INTO auth_codes + (id, client_id, redirect_uri, expires, scope) VALUES ('%s', '%s', '%s', %d, '%s')", dbesc($code), dbesc($client_id), dbesc($redirect_uri), intval($expires), dbesc($scope)); - return $r; - } - + return $r; + } + } */ diff --git a/include/oembed.php b/include/oembed.php index 0b8b71366..564626317 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -4,8 +4,8 @@ * @file include/oembed.php */ -use \Friendica\ParseUrl; -use \Friendica\Core\Config; +use Friendica\ParseUrl; +use Friendica\Core\Config; function oembed_replacecb($matches){ $embedurl=$matches[1]; diff --git a/include/plaintext.php b/include/plaintext.php index 6ab4ec77d..246f7c31f 100644 --- a/include/plaintext.php +++ b/include/plaintext.php @@ -4,7 +4,7 @@ * @file include/plaintext.php */ -use \Friendica\ParseUrl; +use Friendica\ParseUrl; require_once("include/Photo.php"); require_once("include/bbcode.php"); diff --git a/include/plugin.php b/include/plugin.php index 83f6f1ab9..f7423d7c6 100644 --- a/include/plugin.php +++ b/include/plugin.php @@ -1,7 +1,7 @@ apps)==0) - notice( t('No installed applications.') . EOL); + $title = t('Applications'); + if (count($a->apps) == 0) { + notice(t('No installed applications.') . EOL); + } $tpl = get_markup_template("apps.tpl"); return replace_macros($tpl, array( '$title' => $title, '$apps' => $a->apps, )); - - - } diff --git a/mod/community.php b/mod/community.php index 45326e291..6d318a539 100644 --- a/mod/community.php +++ b/mod/community.php @@ -1,6 +1,6 @@ t('Credits'), - '$thanks' => t('Friendica is a community project, that would not be possible without the help of many people. Here is a list of those who have contributed to the code or the translation of Friendica. Thank you all!'), - '$names' => $arr, - )); + +function credits_content(App $a) { + /* fill the page with credits */ + $f = fopen('util/credits.txt', 'r'); + $names = fread($f, filesize('util/credits.txt')); + $arr = explode("\n", htmlspecialchars($names)); + fclose($f); + $tpl = get_markup_template('credits.tpl'); + return replace_macros($tpl, array( + '$title' => t('Credits'), + '$thanks' => t('Friendica is a community project, that would not be possible without the help of many people. Here is a list of those who have contributed to the code or the translation of Friendica. Thank you all!'), + '$names' => $arr, + )); } diff --git a/mod/delegate.php b/mod/delegate.php index 4212ec9b1..ade6737f6 100644 --- a/mod/delegate.php +++ b/mod/delegate.php @@ -5,7 +5,6 @@ function delegate_init(App $a) { return settings_init($a); } - function delegate_content(App $a) { if (! local_user()) { diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 506f9f162..9a19cfc8d 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -3,10 +3,7 @@ require_once('include/items.php'); require_once('include/auth.php'); require_once('include/dfrn.php'); - function dfrn_poll_init(App $a) { - - $dfrn_id = ((x($_GET,'dfrn_id')) ? $_GET['dfrn_id'] : ''); $type = ((x($_GET,'type')) ? $_GET['type'] : 'data'); $last_update = ((x($_GET,'last_update')) ? $_GET['last_update'] : ''); diff --git a/mod/directory.php b/mod/directory.php index ba48bb392..4f7af868d 100644 --- a/mod/directory.php +++ b/mod/directory.php @@ -9,24 +9,18 @@ function directory_init(App $a) { $a->page['aside'] .= findpeople_widget(); $a->page['aside'] .= follow_widget(); - } else { unset($_SESSION['theme']); unset($_SESSION['mobile-theme']); } - - } - function directory_post(App $a) { if(x($_POST,'search')) $a->data['search'] = $_POST['search']; } - - function directory_content(App $a) { global $db; diff --git a/mod/dirfind.php b/mod/dirfind.php index c5844d13d..a62eded39 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -21,8 +21,6 @@ function dirfind_init(App $a) { $a->page['aside'] .= follow_widget(); } - - function dirfind_content(App $a, $prefix = "") { $community = false; diff --git a/mod/display.php b/mod/display.php index 1f1fd1120..c2b5ef17c 100644 --- a/mod/display.php +++ b/mod/display.php @@ -106,7 +106,6 @@ function display_init(App $a) { } profile_load($a, $nick, 0, $profiledata); - } function display_fetchauthor($a, $item) { diff --git a/mod/filer.php b/mod/filer.php index 47c4aa5e4..2f07cb6ee 100644 --- a/mod/filer.php +++ b/mod/filer.php @@ -4,7 +4,6 @@ require_once('include/security.php'); require_once('include/bbcode.php'); require_once('include/items.php'); - function filer_content(App $a) { if (! local_user()) { diff --git a/mod/friendica.php b/mod/friendica.php index 7bfb7c869..f4d7aac10 100644 --- a/mod/friendica.php +++ b/mod/friendica.php @@ -1,6 +1,6 @@ argv[1] == "json"){ diff --git a/mod/hovercard.php b/mod/hovercard.php index 65b03f2b9..9deb071eb 100644 --- a/mod/hovercard.php +++ b/mod/hovercard.php @@ -15,6 +15,7 @@ function hovercard_init(App $a) { // Just for testing purposes $_GET["mode"] = "minimal"; } + function hovercard_content() { $profileurl = (x($_REQUEST,'profileurl') ? $_REQUEST['profileurl'] : ""); $datatype = (x($_REQUEST,'datatype') ?$_REQUEST['datatype'] : "json"); diff --git a/mod/install.php b/mod/install.php index d1d2fd077..0b96e8551 100755 --- a/mod/install.php +++ b/mod/install.php @@ -1,8 +1,8 @@ config['register_policy'] == REGISTER_CLOSED) ? false : true); - } diff --git a/mod/maintenance.php b/mod/maintenance.php index c4839de79..b1fb2a53e 100644 --- a/mod/maintenance.php +++ b/mod/maintenance.php @@ -1,6 +1,6 @@ App::get_baseurl(), - '$touch_icon' => $touch_icon, - '$title' => Config::get('config', 'sitename', 'Friendica'), - )); - - echo $o; - - killme(); + header('Content-type: application/manifest+json'); + $touch_icon = Config::get('system', 'touch_icon', 'images/friendica-128.png'); + if ($touch_icon == '') { + $touch_icon = 'images/friendica-128.png'; } -?> + + $o = replace_macros($tpl, array( + '$baseurl' => App::get_baseurl(), + '$touch_icon' => $touch_icon, + '$title' => Config::get('config', 'sitename', 'Friendica'), + )); + + echo $o; + + killme(); +} diff --git a/mod/match.php b/mod/match.php index 44f5141ad..77fcbaa72 100644 --- a/mod/match.php +++ b/mod/match.php @@ -1,5 +1,5 @@ ' . t('Welcome to Friendica') . ''; - $o .= '

' . t('New Member Checklist') . '

'; - $o .= '
'; - $o .= t('We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear.'); - $o .= '

' . t('Getting Started') . '

'; - $o .= ''; - $o .= '

' . t('Settings') . '

'; - $o .= ''; - $o .= '

' . t('Profile') . '

'; - $o .= ''; - $o .= '

' . t('Connecting') . '

'; - $o .= ''; - $o .= '

' . t('Groups') . '

'; - $o .= ''; - $o .= '

' . t('Getting Help') . '

'; - $o .= ''; - $o .= '
'; return $o; diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php index 7f010cee4..384f4e8dd 100644 --- a/mod/nodeinfo.php +++ b/mod/nodeinfo.php @@ -5,7 +5,7 @@ * Documentation: http://nodeinfo.diaspora.software/schema.html */ -use \Friendica\Core\Config; +use Friendica\Core\Config; require_once 'include/plugin.php'; diff --git a/mod/notice.php b/mod/notice.php index b7029397b..03f0e2403 100644 --- a/mod/notice.php +++ b/mod/notice.php @@ -1,20 +1,20 @@ friendica items permanent-url compatibility */ - function notice_init(App $a) { - $id = $a->argv[1]; - $r = q("SELECT user.nickname FROM user LEFT JOIN item ON item.uid=user.uid WHERE item.id=%d", - intval($id) - ); - if (dbm::is_result($r)){ - $nick = $r[0]['nickname']; - $url = App::get_baseurl()."/display/$nick/$id"; - goaway($url); - } else { - $a->error = 404; - notice( t('Item not found.') . EOL); +/* identi.ca -> friendica items permanent-url compatibility */ - } - return; +function notice_init(App $a) { + + $id = $a->argv[1]; + $r = q("SELECT `user`.`nickname` FROM `user` LEFT JOIN `item` ON `item`.`uid` = `user`.`uid` WHERE `item`.`id` = %d", intval($id)); + if (dbm::is_result($r)) { + $nick = $r[0]['nickname']; + $url = App::get_baseurl() . "/display/$nick/$id"; + goaway($url); + } else { + $a->error = 404; + notice(t('Item not found.') . EOL); } + + return; +} diff --git a/mod/openid.php b/mod/openid.php index 60de55a50..ac90806d0 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -3,7 +3,6 @@ require_once('library/openid.php'); - function openid_content(App $a) { $noid = get_config('system','no_openid'); diff --git a/mod/opensearch.php b/mod/opensearch.php index a599ddc1e..325d5f59b 100644 --- a/mod/opensearch.php +++ b/mod/opensearch.php @@ -1,18 +1,18 @@ App::get_baseurl(), - '$nodename' => $a->get_hostname(), - )); + $tpl = get_markup_template('opensearch.tpl'); - echo $o; + header("Content-type: application/opensearchdescription+xml"); - killme(); + $o = replace_macros($tpl, array( + '$baseurl' => App::get_baseurl(), + '$nodename' => $a->get_hostname(), + )); - } -?> \ No newline at end of file + echo $o; + + killme(); +} diff --git a/mod/parse_url.php b/mod/parse_url.php index 77529714f..b2908455b 100644 --- a/mod/parse_url.php +++ b/mod/parse_url.php @@ -10,7 +10,7 @@ * @see ParseUrl::getSiteinfo() for more information about scraping embeddable content */ -use \Friendica\ParseUrl; +use Friendica\ParseUrl; require_once("include/items.php"); diff --git a/mod/photos.php b/mod/photos.php index a22f919c8..67a8735a5 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1,4 +1,7 @@ argc > 1) { diff --git a/mod/ping.php b/mod/ping.php index dcef73ffb..fa3c8ebcd 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -1,5 +1,5 @@ get_theme_screenshot($theme), 'desc' => $desc, 'version' => $version, 'credits' => $credits)); } + killme(); } diff --git a/mod/probe.php b/mod/probe.php index 8c951a7fc..73630ded7 100644 --- a/mod/probe.php +++ b/mod/probe.php @@ -5,27 +5,26 @@ require_once('include/Scrape.php'); function probe_content(App $a) { if (!local_user()) { - http_status_exit(403, - array("title" => t("Public access denied."), - "description" => t("Only logged in users are permitted to perform a probing."))); + http_status_exit(403, array("title" => t("Public access denied."), + "description" => t("Only logged in users are permitted to perform a probing."))); killme(); } $o .= '

Probe Diagnostic

'; $o .= '
'; - $o .= 'Lookup address: '; + $o .= 'Lookup address: '; $o .= '
'; $o .= '

'; - if(x($_GET,'addr')) { - + if (x($_GET, 'addr')) { $addr = trim($_GET['addr']); $res = probe_url($addr); $o .= '
';
-		$o .= str_replace("\n",'
',print_r($res,true)); + $o .= str_replace("\n", '
', print_r($res, true)); $o .= '
'; } + return $o; } diff --git a/mod/profile.php b/mod/profile.php index 838a55094..05f18c362 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -3,7 +3,6 @@ require_once('include/contact_widgets.php'); require_once('include/redir.php'); - function profile_init(App $a) { if(! x($a->page,'aside')) diff --git a/mod/profile_photo.php b/mod/profile_photo.php index f9bf60cf5..8b3d3d371 100644 --- a/mod/profile_photo.php +++ b/mod/profile_photo.php @@ -9,10 +9,8 @@ function profile_photo_init(App $a) { } profile_load($a,$a->user['nickname']); - } - function profile_photo_post(App $a) { if (! local_user()) { diff --git a/mod/qsearch.php b/mod/qsearch.php index 8512bea51..76ff2a15e 100644 --- a/mod/qsearch.php +++ b/mod/qsearch.php @@ -48,4 +48,3 @@ function qsearch_init(App $a) { echo json_encode((object) $results); killme(); } - diff --git a/mod/receive.php b/mod/receive.php index 3563f2d70..547e08967 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -9,10 +9,8 @@ require_once('include/salmon.php'); require_once('include/crypto.php'); require_once('include/diaspora.php'); - function receive_post(App $a) { - $enabled = intval(get_config('system','diaspora_enabled')); if(! $enabled) { logger('mod-diaspora: disabled'); diff --git a/mod/robots_txt.php b/mod/robots_txt.php index d150ff3de..b839d6a03 100644 --- a/mod/robots_txt.php +++ b/mod/robots_txt.php @@ -1,4 +1,5 @@ - - - Friendica - http://friendica.com/ - - - - http://status.net/wiki/TwitterCompatibleAPI - false - - - - - - '; -die(); + + + Friendica + http://friendica.com/ + + + + http://status.net/wiki/TwitterCompatibleAPI + false + + + + +'; + + killme(); } \ No newline at end of file diff --git a/mod/smilies.php b/mod/smilies.php index 4d8ab6bca..f69541824 100644 --- a/mod/smilies.php +++ b/mod/smilies.php @@ -7,15 +7,14 @@ require_once("include/Smilies.php"); function smilies_content(App $a) { - if ($a->argv[1]==="json"){ + if ($a->argv[1] === "json") { $tmp = Smilies::get_list(); $results = array(); - for($i = 0; $i < count($tmp['texts']); $i++) { + for ($i = 0; $i < count($tmp['texts']); $i++) { $results[] = array('text' => $tmp['texts'][$i], 'icon' => $tmp['icons'][$i]); } json_return_and_die($results); - } - else { - return Smilies::replace('',true); + } else { + return Smilies::replace('', true); } } diff --git a/mod/statistics_json.php b/mod/statistics_json.php index 07444d2bb..5cb6fb99e 100644 --- a/mod/statistics_json.php +++ b/mod/statistics_json.php @@ -1,4 +1,5 @@ $a->config["sitename"], - "network" => FRIENDICA_PLATFORM, - "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION, - "registrations_open" => ($a->config['register_policy'] != 0), - "total_users" => get_config('nodeinfo','total_users'), - "active_users_halfyear" => get_config('nodeinfo','active_users_halfyear'), - "active_users_monthly" => get_config('nodeinfo','active_users_monthly'), - "local_posts" => get_config('nodeinfo','local_posts') - ); + "name" => $a->config["sitename"], + "network" => FRIENDICA_PLATFORM, + "version" => FRIENDICA_VERSION . "-" . DB_UPDATE_VERSION, + "registrations_open" => ($a->config['register_policy'] != 0), + "total_users" => get_config('nodeinfo', 'total_users'), + "active_users_halfyear" => get_config('nodeinfo', 'active_users_halfyear'), + "active_users_monthly" => get_config('nodeinfo', 'active_users_monthly'), + "local_posts" => get_config('nodeinfo', 'local_posts') + ); $statistics["services"] = array(); $statistics["services"]["appnet"] = plugin_enabled("appnet"); @@ -53,7 +54,7 @@ function statistics_json_init(App $a) { $statistics["wordpress"] = $statistics["services"]["wordpress"]; header("Content-Type: application/json"); - echo json_encode($statistics, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); - logger("statistics_init: printed ".print_r($statistics, true), LOGGER_DATA); + echo json_encode($statistics, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + logger("statistics_init: printed " . print_r($statistics, true), LOGGER_DATA); killme(); } diff --git a/mod/subthread.php b/mod/subthread.php index 646a4230c..9d5533a03 100644 --- a/mod/subthread.php +++ b/mod/subthread.php @@ -4,7 +4,6 @@ require_once('include/security.php'); require_once('include/bbcode.php'); require_once('include/items.php'); - function subthread_content(App $a) { if(! local_user() && ! remote_user()) { diff --git a/mod/tagger.php b/mod/tagger.php index 50099ac69..8a6973e6a 100644 --- a/mod/tagger.php +++ b/mod/tagger.php @@ -4,7 +4,6 @@ require_once('include/security.php'); require_once('include/bbcode.php'); require_once('include/items.php'); - function tagger_content(App $a) { if(! local_user() && ! remote_user()) { diff --git a/mod/toggle_mobile.php b/mod/toggle_mobile.php index f858d8913..51fdcf41a 100644 --- a/mod/toggle_mobile.php +++ b/mod/toggle_mobile.php @@ -16,4 +16,3 @@ function toggle_mobile_init(App $a) { goaway($address); } - diff --git a/mod/uexport.php b/mod/uexport.php index 77a45f8a3..554c02225 100644 --- a/mod/uexport.php +++ b/mod/uexport.php @@ -1,7 +1,7 @@ argc > 1) { header("Content-type: application/json"); - header('Content-Disposition: attachment; filename="'.$a->user['nickname'].'.'.$a->argv[1].'"'); - switch($a->argv[1]) { + header('Content-Disposition: attachment; filename="' . $a->user['nickname'] . '.' . $a->argv[1] . '"'); + switch ($a->argv[1]) { case "backup": uexport_all($a); killme(); @@ -51,9 +51,9 @@ function _uexport_multirow($query) { $result = array(); $r = q($query); if (dbm::is_result($r)) { - foreach($r as $rr){ + foreach ($r as $rr) { $p = array(); - foreach($rr as $k => $v) { + foreach ($rr as $k => $v) { $p[$k] = $v; } $result[] = $p; @@ -66,8 +66,8 @@ function _uexport_row($query) { $result = array(); $r = q($query); if (dbm::is_result($r)) { - foreach($r as $rr) { - foreach($rr as $k => $v) { + foreach ($r as $rr) { + foreach ($rr as $k => $v) { $result[$k] = $v; } } @@ -75,39 +75,38 @@ function _uexport_row($query) { return $result; } - -function uexport_account($a){ +function uexport_account($a) { $user = _uexport_row( - sprintf( "SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval(local_user()) ) + sprintf("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval(local_user())) ); $contact = _uexport_multirow( - sprintf( "SELECT * FROM `contact` WHERE `uid` = %d ",intval(local_user()) ) + sprintf("SELECT * FROM `contact` WHERE `uid` = %d ", intval(local_user())) ); - $profile =_uexport_multirow( - sprintf( "SELECT * FROM `profile` WHERE `uid` = %d ", intval(local_user()) ) + $profile = _uexport_multirow( + sprintf("SELECT * FROM `profile` WHERE `uid` = %d ", intval(local_user())) ); $photo = _uexport_multirow( - sprintf( "SELECT * FROM `photo` WHERE uid = %d AND profile = 1", intval(local_user()) ) + sprintf("SELECT * FROM `photo` WHERE uid = %d AND profile = 1", intval(local_user())) ); foreach ($photo as &$p) { $p['data'] = bin2hex($p['data']); } $pconfig = _uexport_multirow( - sprintf( "SELECT * FROM `pconfig` WHERE uid = %d",intval(local_user()) ) + sprintf("SELECT * FROM `pconfig` WHERE uid = %d", intval(local_user())) ); $group = _uexport_multirow( - sprintf( "SELECT * FROM `group` WHERE uid = %d",intval(local_user()) ) + sprintf("SELECT * FROM `group` WHERE uid = %d", intval(local_user())) ); $group_member = _uexport_multirow( - sprintf( "SELECT * FROM `group_member` WHERE uid = %d",intval(local_user()) ) + sprintf("SELECT * FROM `group_member` WHERE uid = %d", intval(local_user())) ); $output = array( @@ -150,13 +149,13 @@ function uexport_all(App $a) { intval($x), intval(500) ); - /*if (dbm::is_result($r)) { - foreach($r as $rr) - foreach($rr as $k => $v) - $item[][$k] = $v; - }*/ + /* if (dbm::is_result($r)) { + foreach($r as $rr) + foreach($rr as $k => $v) + $item[][$k] = $v; + } */ $output = array('item' => $r); - echo json_encode($output)."\n"; + echo json_encode($output) . "\n"; } } diff --git a/mod/uimport.php b/mod/uimport.php index 336ec1c2d..fd44df4fb 100644 --- a/mod/uimport.php +++ b/mod/uimport.php @@ -1,35 +1,35 @@ config['register_policy']) { - case REGISTER_OPEN: - $blocked = 0; - $verified = 1; - break; + switch ($a->config['register_policy']) { + case REGISTER_OPEN: + $blocked = 0; + $verified = 1; + break; - case REGISTER_APPROVE: - $blocked = 1; - $verified = 0; - break; + case REGISTER_APPROVE: + $blocked = 1; + $verified = 0; + break; - default: - case REGISTER_CLOSED: - if ((! x($_SESSION,'authenticated') && (! x($_SESSION,'administrator')))) { - notice( t('Permission denied.') . EOL ); - return; - } - $blocked = 1; - $verified = 0; - break; + default: + case REGISTER_CLOSED: + if ((!x($_SESSION, 'authenticated') && (!x($_SESSION, 'administrator')))) { + notice(t('Permission denied.') . EOL); + return; + } + $blocked = 1; + $verified = 0; + break; } - if (x($_FILES,'accountfile')){ + if (x($_FILES, 'accountfile')) { /// @TODO Pass $blocked / $verified, send email to admin on REGISTER_APPROVE import_account($a, $_FILES['accountfile']); return; @@ -38,26 +38,26 @@ function uimport_post(App $a) { function uimport_content(App $a) { - if ((! local_user()) && ($a->config['register_policy'] == REGISTER_CLOSED)) { + if ((!local_user()) && ($a->config['register_policy'] == REGISTER_CLOSED)) { notice("Permission denied." . EOL); return; } - $max_dailies = intval(get_config('system','max_daily_registrations')); + $max_dailies = intval(get_config('system', 'max_daily_registrations')); if ($max_dailies) { $r = q("select count(*) as total from user where register_date > UTC_TIMESTAMP - INTERVAL 1 day"); if ($r && $r[0]['total'] >= $max_dailies) { logger('max daily registrations exceeded.'); - notice( t('This site has exceeded the number of allowed daily account registrations. Please try again tomorrow.') . EOL); + notice(t('This site has exceeded the number of allowed daily account registrations. Please try again tomorrow.') . EOL); return; } } - if (x($_SESSION,'theme')) { + if (x($_SESSION, 'theme')) { unset($_SESSION['theme']); } - if (x($_SESSION,'mobile-theme')) { + if (x($_SESSION, 'mobile-theme')) { unset($_SESSION['mobile-theme']); } @@ -65,11 +65,11 @@ function uimport_content(App $a) { return replace_macros($tpl, array( '$regbutt' => t('Import'), '$import' => array( - 'title' => t("Move account"), - 'intro' => t("You can import an account from another Friendica server."), - 'instruct' => t("You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."), - 'warn' => t("This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"), - 'field' => array('accountfile', t('Account file'),'', t('To export your account, go to "Settings->Export your personal data" and select "Export account"')), + 'title' => t("Move account"), + 'intro' => t("You can import an account from another Friendica server."), + 'instruct' => t("You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."), + 'warn' => t("This feature is experimental. We can't import contacts from the OStatus network (GNU Social/Statusnet) or from Diaspora"), + 'field' => array('accountfile', t('Account file'), '', t('To export your account, go to "Settings->Export your personal data" and select "Export account"')), ), )); } diff --git a/mod/videos.php b/mod/videos.php index 269d53785..e8f8356fb 100644 --- a/mod/videos.php +++ b/mod/videos.php @@ -5,7 +5,6 @@ require_once('include/bbcode.php'); require_once('include/security.php'); require_once('include/redir.php'); - function videos_init(App $a) { if($a->argc > 1) diff --git a/mod/wall_upload.php b/mod/wall_upload.php index d29efecc6..1707040e6 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -3,17 +3,16 @@ /** * @file mod/wall_upload.php * @brief Module for uploading a picture to the profile wall - * + * * By default the picture will be stored in the photo album with the name Wall Photos. * You can specify a different album by adding an optional query string "album=" * to the url */ -use \Friendica\Core\Config; +use Friendica\Core\Config; require_once 'include/Photo.php'; - function wall_upload_post(App $a, $desktopmode = true) { logger("wall upload: starting new upload", LOGGER_DEBUG); diff --git a/util/db_update.php b/util/db_update.php index 32b44e6d0..3e3a89840 100644 --- a/util/db_update.php +++ b/util/db_update.php @@ -3,7 +3,7 @@ * @package util */ -/* +/* * require boot.php */ require_once("boot.php"); diff --git a/util/maintenance.php b/util/maintenance.php index 614344ab9..b0728245c 100644 --- a/util/maintenance.php +++ b/util/maintenance.php @@ -1,6 +1,6 @@ - * - * Output to - */ - - DEFINE("NORM_REGEXP", "|[\\\]|"); - - - if(! class_exists('App')) { - class TmpA { - public $strings = Array(); +/** + * Read strings.php file and create messages.po + * + * php utils/php2po.php + * + * Output to + */ + + +DEFINE("NORM_REGEXP", "|[\\\]|"); + +if(! class_exists('App')) { + class TmpA { + public $strings = Array(); + } + $a = new TmpA(); +} + +if ($argc<2 || in_array('-h', $argv) || in_array('--h', $argv)) { + print "Usage: ".$argv[0]." [-p ] \n\n"; + print "Options:\n"; + print "p\tNumber of plural forms. Default: 2\n"; + print "\n"; + return; +} + +$phpfile = $argv[1]; +$pofile = dirname($phpfile)."/messages.po"; + +if (!file_exists($phpfile)){ + print "Unable to find '$phpfile'\n"; + return; +} + +// utility functions +function startsWith($haystack, $needle) { + // search backwards starting from haystack length characters from the end + return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE; +} + + +// start ! +include_once($phpfile); + +$out = ''; +$out .= "# FRIENDICA Distributed Social Network\n"; +$out .= "# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project\n"; +$out .= "# This file is distributed under the same license as the Friendica package.\n"; +$out .= "# \n"; +$out .= 'msgid ""' ."\n"; +$out .= 'msgstr ""' ."\n"; +$out .= '"Project-Id-Version: friendica\n"' ."\n"; +$out .= '"Report-Msgid-Bugs-To: \n"' ."\n"; +$out .= '"POT-Creation-Date: '. date("Y-m-d H:i:sO").'\n"' ."\n"; +$out .= '"MIME-Version: 1.0\n"' ."\n"; +$out .= '"Content-Type: text/plain; charset=UTF-8\n"' ."\n"; +$out .= '"Content-Transfer-Encoding: 8bit\n"' ."\n"; + +// search for plural info +$lang = ""; +$lang_logic = ""; +$lang_pnum = 2; + +$_idx = array_search('-p', $argv); +if ($_idx !== false) { + $lang_pnum = $argv[$_idx+1]; +} + +$infile = file($phpfile); +foreach($infile as $l) { + $l = trim($l); + if (startsWith($l, 'function string_plural_select_')) { + $lang = str_replace( 'function string_plural_select_' , '', str_replace( '($n){','', $l) ); + } + if (startsWith($l, 'return')) { + $lang_logic = str_replace( '$', '', trim( str_replace( 'return ' , '', $l) , ';') ); + break; + } +} + +echo "Language: $lang\n"; +echo "Plural forms: $lang_pnum\n"; +echo "Plural logic: $lang_logic;\n"; + +$out .= sprintf('"Language: %s\n"', $lang) ."\n"; +$out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) ."\n"; +$out .= "\n"; + +print "\nLoading base message.po..."; + +// load base messages.po and extract msgids +$base_msgids = array(); +$norm_base_msgids = array(); +$base_f = file("util/messages.po") or die("No base messages.po\n"); +$_f = 0; $_mid = ""; $_mids = array(); +foreach( $base_f as $l) { + $l = trim($l); + //~ print $l."\n"; + + if (startsWith($l, 'msgstr')) { + if ($_mid != '""') { + $base_msgids[$_mid] = $_mids; + $norm_base_msgids[preg_replace(NORM_REGEXP, "", $_mid)] = $_mid; + //~ print "\t\t\t".$_mid. print_r($base_msgids[$_mid], true); } - $a = new TmpA(); + + $_f = 0; + $_mid = ""; + $_mids = array(); + } - if ($argc<2 || in_array('-h', $argv) || in_array('--h', $argv)) { - print "Usage: ".$argv[0]." [-p ] \n\n"; - print "Options:\n"; - print "p\tNumber of plural forms. Default: 2\n"; - print "\n"; - return; + if (startsWith($l, '"') && $_f==2) { + $_mids[count($_mids)-1] .= "\n".$l; + //~ print "\t\t+mids: ".print_t($_mids, true); + } + if (startsWith($l, 'msgid_plural ')) { + $_f = 2; + $_mids[] = str_replace('msgid_plural ', '' , $l); + //~ print "\t\t mids: ".print_r($_mids, true); } - $phpfile = $argv[1]; - $pofile = dirname($phpfile)."/messages.po"; - - if (!file_exists($phpfile)){ - print "Unable to find '$phpfile'\n"; - return; + if (startsWith($l, '"') && $_f==1) { + $_mid .= "\n".$l; + $_mids[count($_mids)-1] .= "\n".$l; + //~ print "\t+mid: $_mid \n"; } - - // utility functions - function startsWith($haystack, $needle) { - // search backwards starting from haystack length characters from the end - return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE; + if (startsWith($l, 'msgid ')) { + $_f = 1; + $_mid = str_replace('msgid ', '' , $l); + $_mids = array($_mid); + //~ print "\t mid: $_mid \n"; } + //~ print "\t\t\t\t$_f\n\n"; +} +print " done\n"; +print "Creating '$pofile'..."; +// create msgid and msgstr - // start ! - include_once($phpfile); +/** + * Get a string and retun a message.po ready text + * - replace " with \" + * - replace tab char with \t + * - manage multiline strings + */ +function massage_string($str) { + $str = str_replace('\\','\\\\',$str); + $str = str_replace('"','\"',$str); + $str = str_replace("\t",'\t',$str); + $str = str_replace("\n",'\n"'."\n".'"',$str); + if (strpos($str, "\n")!==false && $str[0]!=='"') $str = '"'."\n".$str; + $str = preg_replace("|\n([^\"])|", "\n\"$1", $str); + return sprintf('"%s"', $str); +} - $out = ''; - $out .= "# FRIENDICA Distributed Social Network\n"; - $out .= "# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project\n"; - $out .= "# This file is distributed under the same license as the Friendica package.\n"; - $out .= "# \n"; - $out .= 'msgid ""' ."\n"; - $out .= 'msgstr ""' ."\n"; - $out .= '"Project-Id-Version: friendica\n"' ."\n"; - $out .= '"Report-Msgid-Bugs-To: \n"' ."\n"; - $out .= '"POT-Creation-Date: '. date("Y-m-d H:i:sO").'\n"' ."\n"; - $out .= '"MIME-Version: 1.0\n"' ."\n"; - $out .= '"Content-Type: text/plain; charset=UTF-8\n"' ."\n"; - $out .= '"Content-Transfer-Encoding: 8bit\n"' ."\n"; - - // search for plural info - $lang = ""; - $lang_logic = ""; - $lang_pnum = 2; - - $_idx = array_search('-p', $argv); - if ($_idx !== false) { - $lang_pnum = $argv[$_idx+1]; +function find_original_msgid($str) { + global $norm_base_msgids; + $norm_str = preg_replace(NORM_REGEXP, "", $str); + if (array_key_exists($norm_str, $norm_base_msgids)) { + return $norm_base_msgids[$norm_str]; } - - $infile = file($phpfile); - foreach($infile as $l) { - $l = trim($l); - if (startsWith($l, 'function string_plural_select_')) { - $lang = str_replace( 'function string_plural_select_' , '', str_replace( '($n){','', $l) ); + return $str; +} + +$warnings = ""; +foreach($a->strings as $key=>$str) { + $msgid = massage_string($key); + + if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) { + $out .= "#, php-format\n"; + } + $msgid = find_original_msgid($msgid); + $out .= 'msgid '. $msgid . "\n"; + + if (is_array($str)) { + if (array_key_exists($msgid, $base_msgids) && isset($base_msgids[$msgid][1])) { + $out .= 'msgid_plural '. $base_msgids[$msgid][1] . "\n"; + } else { + $out .= 'msgid_plural '. $msgid . "\n"; + $warnings .= "[W] No source plural form for msgid:\n". str_replace("\n","\n\t", $msgid) . "\n\n"; } - if (startsWith($l, 'return')) { - $lang_logic = str_replace( '$', '', trim( str_replace( 'return ' , '', $l) , ';') ); - break; + foreach ( $str as $n => $msgstr) { + $out .= 'msgstr['.$n.'] '. massage_string($msgstr) . "\n"; } + } else { + $out .= 'msgstr '. massage_string($str) . "\n"; } - - echo "Language: $lang\n"; - echo "Plural forms: $lang_pnum\n"; - echo "Plural logic: $lang_logic;\n"; - - $out .= sprintf('"Language: %s\n"', $lang) ."\n"; - $out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) ."\n"; + $out .= "\n"; - print "\nLoading base message.po..."; - - // load base messages.po and extract msgids - $base_msgids = array(); - $norm_base_msgids = array(); - $base_f = file("util/messages.po") or die("No base messages.po\n"); - $_f = 0; $_mid = ""; $_mids = array(); - foreach( $base_f as $l) { - $l = trim($l); - //~ print $l."\n"; - - if (startsWith($l, 'msgstr')) { - if ($_mid != '""') { - $base_msgids[$_mid] = $_mids; - $norm_base_msgids[preg_replace(NORM_REGEXP, "", $_mid)] = $_mid; - //~ print "\t\t\t".$_mid. print_r($base_msgids[$_mid], true); - } - - $_f = 0; - $_mid = ""; - $_mids = array(); - - } - - if (startsWith($l, '"') && $_f==2) { - $_mids[count($_mids)-1] .= "\n".$l; - //~ print "\t\t+mids: ".print_t($_mids, true); - } - if (startsWith($l, 'msgid_plural ')) { - $_f = 2; - $_mids[] = str_replace('msgid_plural ', '' , $l); - //~ print "\t\t mids: ".print_r($_mids, true); - } - - if (startsWith($l, '"') && $_f==1) { - $_mid .= "\n".$l; - $_mids[count($_mids)-1] .= "\n".$l; - //~ print "\t+mid: $_mid \n"; - } - if (startsWith($l, 'msgid ')) { - $_f = 1; - $_mid = str_replace('msgid ', '' , $l); - $_mids = array($_mid); - //~ print "\t mid: $_mid \n"; - } - //~ print "\t\t\t\t$_f\n\n"; - } - - print " done\n"; - print "Creating '$pofile'..."; - // create msgid and msgstr - - /** - * Get a string and retun a message.po ready text - * - replace " with \" - * - replace tab char with \t - * - manage multiline strings - */ - function massage_string($str) { - $str = str_replace('\\','\\\\',$str); - $str = str_replace('"','\"',$str); - $str = str_replace("\t",'\t',$str); - $str = str_replace("\n",'\n"'."\n".'"',$str); - if (strpos($str, "\n")!==false && $str[0]!=='"') $str = '"'."\n".$str; - $str = preg_replace("|\n([^\"])|", "\n\"$1", $str); - return sprintf('"%s"', $str); - } - - function find_original_msgid($str) { - global $norm_base_msgids; - $norm_str = preg_replace(NORM_REGEXP, "", $str); - if (array_key_exists($norm_str, $norm_base_msgids)) { - return $norm_base_msgids[$norm_str]; - } - return $str; - } - - $warnings = ""; - foreach($a->strings as $key=>$str) { - $msgid = massage_string($key); - - if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) { - $out .= "#, php-format\n"; - } - $msgid = find_original_msgid($msgid); - $out .= 'msgid '. $msgid . "\n"; - - if (is_array($str)) { - if (array_key_exists($msgid, $base_msgids) && isset($base_msgids[$msgid][1])) { - $out .= 'msgid_plural '. $base_msgids[$msgid][1] . "\n"; - } else { - $out .= 'msgid_plural '. $msgid . "\n"; - $warnings .= "[W] No source plural form for msgid:\n". str_replace("\n","\n\t", $msgid) . "\n\n"; - } - foreach ( $str as $n => $msgstr) { - $out .= 'msgstr['.$n.'] '. massage_string($msgstr) . "\n"; - } - } else { - $out .= 'msgstr '. massage_string($str) . "\n"; - } - - $out .= "\n"; - - } +} - file_put_contents($pofile, $out); - - print " done\n"; - - if ($warnings=="") { - print "No warnings.\n"; - } else { - print $warnings; - } - +file_put_contents($pofile, $out); + +print " done\n"; + +if ($warnings=="") { + print "No warnings.\n"; +} else { + print $warnings; +} diff --git a/util/typo.php b/util/typo.php index d68ac2ac9..cc05be4cc 100644 --- a/util/typo.php +++ b/util/typo.php @@ -1,59 +1,59 @@ config,'php_path')) - $phpath = $a->config['php_path']; - else - $phpath = 'php'; +if(x($a->config,'php_path')) + $phpath = $a->config['php_path']; +else + $phpath = 'php'; - echo "Directory: mod\n"; - $files = glob('mod/*.php'); +echo "Directory: mod\n"; +$files = glob('mod/*.php'); +foreach($files as $file) { + passthru("$phpath -l $file", $ret); $ret===0 or die(); +} + +echo "Directory: include\n"; +$files = glob('include/*.php'); +foreach($files as $file) { + passthru("$phpath -l $file", $ret); $ret===0 or die(); +} + +echo "Directory: object\n"; +$files = glob('object/*.php'); +foreach($files as $file) { + passthru("$phpath -l $file", $ret); $ret===0 or die(); +} + +echo "Directory: addon\n"; +$dirs = glob('addon/*'); + +foreach($dirs as $dir) { + $addon = basename($dir); + $files = glob($dir . '/' . $addon . '.php'); foreach($files as $file) { - passthru("$phpath -l $file", $ret); $ret===0 or die(); - } - - echo "Directory: include\n"; - $files = glob('include/*.php'); - foreach($files as $file) { - passthru("$phpath -l $file", $ret); $ret===0 or die(); - } - - echo "Directory: object\n"; - $files = glob('object/*.php'); - foreach($files as $file) { - passthru("$phpath -l $file", $ret); $ret===0 or die(); - } - - echo "Directory: addon\n"; - $dirs = glob('addon/*'); - - foreach($dirs as $dir) { - $addon = basename($dir); - $files = glob($dir . '/' . $addon . '.php'); - foreach($files as $file) { - passthru("$phpath -l $file", $ret); $ret===0 or die(); - } + passthru("$phpath -l $file", $ret); $ret===0 or die(); } +} - echo "String files\n"; +echo "String files\n"; - echo 'util/strings.php' . "\n"; - passthru("$phpath -l util/strings.php", $ret); $ret===0 or die(); +echo 'util/strings.php' . "\n"; +passthru("$phpath -l util/strings.php", $ret); $ret===0 or die(); - $files = glob('view/lang/*/strings.php'); - foreach($files as $file) { - passthru("$phpath -l $file", $ret); $ret===0 or die(); - } +$files = glob('view/lang/*/strings.php'); +foreach($files as $file) { + passthru("$phpath -l $file", $ret); $ret===0 or die(); +} diff --git a/view/theme/duepuntozero/config.php b/view/theme/duepuntozero/config.php index 381b06716..6b111d6ad 100644 --- a/view/theme/duepuntozero/config.php +++ b/view/theme/duepuntozero/config.php @@ -1,4 +1,5 @@ var frio=""; - page['htmlhead'] .= <<< EOT + $a->page['htmlhead'] .= <<< EOT EOT; - /** custom css **/ + /** custom css **/ if (!is_null($cssFile)) { $a->page['htmlhead'] .= sprintf('', $cssFile); } -_js_in_foot(); - + _js_in_foot(); } if (! function_exists('_js_in_foot')) { From 20043914e6111ba53df85e1efd3389c99d37302f Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 30 Apr 2017 00:07:00 -0400 Subject: [PATCH 02/14] Move App to src - Add `use Friendica\App;` wherever needed --- boot.php | 983 +----------------------- include/Contact.php | 2 + include/ForumManager.php | 2 + include/Photo.php | 2 + include/Probe.php | 1 + include/acl_selectors.php | 2 + include/api.php | 1 + include/auth.php | 1 + include/bbcode.php | 1 + include/cli_startup.php | 1 + include/contact_widgets.php | 2 + include/conversation.php | 2 + include/cronjobs.php | 1 + include/dbstructure.php | 1 + include/delivery.php | 1 + include/dfrn.php | 2 + include/diaspora.php | 1 + include/enotify.php | 3 + include/event.php | 2 + include/follow.php | 3 + include/identity.php | 2 + include/items.php | 1 + include/like.php | 3 + include/message.php | 1 + include/nav.php | 2 + include/network.php | 1 + include/notifier.php | 1 + include/oauth.php | 2 + include/oembed.php | 1 + include/ostatus.php | 2 + include/plaintext.php | 1 + include/plugin.php | 1 + include/poller.php | 1 + include/pubsubpublish.php | 1 + include/redir.php | 2 + include/security.php | 2 + include/shadowupdate.php | 1 + include/socgraph.php | 1 + include/tags.php | 3 + include/text.php | 2 + include/threads.php | 3 + include/uimport.php | 2 + index.php | 1 + mod/_well_known.php | 1 + mod/acctlink.php | 2 + mod/acl.php | 2 + mod/admin.php | 1 + mod/allfriends.php | 2 + mod/amcd.php | 2 + mod/api.php | 2 + mod/apps.php | 1 + mod/attach.php | 2 + mod/babel.php | 2 + mod/bookmarklet.php | 2 + mod/cal.php | 2 + mod/cb.php | 1 + mod/common.php | 2 + mod/community.php | 1 + mod/contactgroup.php | 2 + mod/contacts.php | 2 + mod/content.php | 1 + mod/credits.php | 1 + mod/crepair.php | 3 + mod/delegate.php | 3 + mod/dfrn_confirm.php | 2 + mod/dfrn_notify.php | 3 + mod/dfrn_poll.php | 3 + mod/dfrn_request.php | 2 + mod/directory.php | 2 + mod/dirfind.php | 3 + mod/display.php | 2 + mod/editpost.php | 2 + mod/events.php | 3 + mod/fbrowser.php | 2 + mod/fetch.php | 3 + mod/filer.php | 2 + mod/filerm.php | 2 + mod/follow.php | 2 + mod/friendica.php | 1 + mod/fsuggest.php | 1 + mod/group.php | 1 + mod/hcard.php | 2 + mod/help.php | 3 + mod/home.php | 2 + mod/hostxrd.php | 2 + mod/hovercard.php | 2 + mod/ignored.php | 1 + mod/install.php | 2 + mod/invite.php | 2 + mod/item.php | 2 + mod/like.php | 2 + mod/localtime.php | 3 +- mod/lockview.php | 1 + mod/login.php | 2 + mod/lostpass.php | 2 + mod/maintenance.php | 1 + mod/manage.php | 3 +- mod/manifest.php | 1 + mod/match.php | 3 + mod/message.php | 2 + mod/modexp.php | 2 + mod/mood.php | 2 + mod/msearch.php | 2 + mod/navigation.php | 2 + mod/network.php | 3 + mod/newmember.php | 1 + mod/nodeinfo.php | 1 + mod/nogroup.php | 2 + mod/noscrape.php | 2 + mod/notes.php | 2 + mod/notice.php | 1 + mod/notifications.php | 2 + mod/notify.php | 3 + mod/oembed.php | 3 + mod/oexchange.php | 3 + mod/openid.php | 1 + mod/opensearch.php | 1 + mod/ostatus_subscribe.php | 2 + mod/p.php | 3 + mod/parse_url.php | 1 + mod/photo.php | 2 + mod/photos.php | 1 + mod/ping.php | 3 + mod/poco.php | 2 + mod/poke.php | 6 +- mod/post.php | 1 + mod/pretheme.php | 2 + mod/probe.php | 2 + mod/profile.php | 2 + mod/profile_photo.php | 2 + mod/profiles.php | 3 + mod/profperm.php | 2 + mod/proxy.php | 2 + mod/pubsub.php | 2 + mod/pubsubhubbub.php | 2 + mod/qsearch.php | 2 + mod/randprof.php | 1 + mod/receive.php | 1 + mod/redir.php | 2 + mod/register.php | 2 + mod/regmod.php | 2 + mod/removeme.php | 2 + mod/repair_ostatus.php | 2 + mod/robots_txt.php | 1 + mod/rsd_xml.php | 1 + mod/salmon.php | 2 + mod/search.php | 3 + mod/session.php | 2 + mod/settings.php | 2 + mod/share.php | 3 + mod/smilies.php | 1 + mod/starred.php | 1 + mod/statistics_json.php | 2 + mod/subthread.php | 2 + mod/suggest.php | 2 + mod/tagger.php | 2 + mod/tagrm.php | 2 + mod/toggle_mobile.php | 2 + mod/uexport.php | 2 + mod/uimport.php | 2 + mod/update_community.php | 2 + mod/update_display.php | 2 + mod/update_network.php | 2 + mod/update_notes.php | 2 + mod/update_profile.php | 2 + mod/videos.php | 3 + mod/viewcontacts.php | 3 + mod/viewsrc.php | 1 + mod/wall_attach.php | 2 + mod/wall_upload.php | 1 + mod/wallmessage.php | 2 + mod/webfinger.php | 3 + mod/xrd.php | 2 + src/App.php | 961 +++++++++++++++++++++++ util/db_update.php | 2 + util/maintenance.php | 1 + util/php2po.php | 1 + util/typo.php | 1 + view/php/default.php | 2 +- view/php/minimal.php | 2 +- view/theme/duepuntozero/config.php | 2 + view/theme/duepuntozero/theme.php | 2 + view/theme/frio/config.php | 3 + view/theme/frio/php/default.php | 4 +- view/theme/frio/php/frio_boot.php | 1 + view/theme/frio/php/standard.php | 4 +- view/theme/frio/theme.php | 2 + view/theme/frost-mobile/php/default.php | 2 +- view/theme/frost-mobile/theme.php | 2 + view/theme/frost/php/default.php | 2 +- view/theme/frost/theme.php | 2 + view/theme/quattro/config.php | 2 + view/theme/quattro/theme.php | 2 + view/theme/smoothly/php/default.php | 2 +- view/theme/smoothly/theme.php | 2 + view/theme/vier/config.php | 3 +- view/theme/vier/theme.php | 2 + 197 files changed, 1321 insertions(+), 996 deletions(-) create mode 100644 src/App.php diff --git a/boot.php b/boot.php index afee3ac77..a26d50327 100644 --- a/boot.php +++ b/boot.php @@ -19,6 +19,7 @@ require_once(__DIR__ . DIRECTORY_SEPARATOR. 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'); +use Friendica\App; use Friendica\Core\Config; require_once('include/config.php'); @@ -502,988 +503,6 @@ function startup() { } -/** - * - * class: App - * - * @brief Our main application structure for the life of this page. - * - * Primarily deals with the URL that got us here - * and tries to make some sense of it, and - * stores our page contents and config storage - * and anything else that might need to be passed around - * before we spit the page out. - * - */ -class App { - - /// @TODO decide indending as a colorful mixure is ahead ... - public $module_loaded = false; - public $query_string; - public $config; - public $page; - public $profile; - public $profile_uid; - public $user; - public $cid; - public $contact; - public $contacts; - public $page_contact; - public $content; - public $data = array(); - public $error = false; - public $cmd; - public $argv; - public $argc; - public $module; - public $pager; - public $strings; - public $path; - public $hooks; - public $timezone; - public $interactive = true; - public $plugins; - public $apps = array(); - public $identities; - public $is_mobile = false; - public $is_tablet = false; - public $is_friendica_app; - public $performance = array(); - public $callstack = array(); - public $theme_info = array(); - public $backend = true; - - public $nav_sel; - - public $category; - - - // Allow themes to control internal parameters - // by changing App values in theme.php - - public $sourcename = ''; - public $videowidth = 425; - public $videoheight = 350; - public $force_max_items = 0; - public $theme_thread_allow = true; - public $theme_events_in_profile = true; - - /** - * @brief An array for all theme-controllable parameters - * - * Mostly unimplemented yet. Only options 'template_engine' and - * beyond are used. - */ - public $theme = array( - 'sourcename' => '', - 'videowidth' => 425, - 'videoheight' => 350, - 'force_max_items' => 0, - 'thread_allow' => true, - 'stylesheet' => '', - 'template_engine' => 'smarty3', - ); - - /** - * @brief An array of registered template engines ('name'=>'class name') - */ - public $template_engines = array(); - /** - * @brief An array of instanced template engines ('name'=>'instance') - */ - public $template_engine_instance = array(); - - public $process_id; - - private $ldelim = array( - 'internal' => '', - 'smarty3' => '{{' - ); - private $rdelim = array( - 'internal' => '', - 'smarty3' => '}}' - ); - - private $scheme; - private $hostname; - private $db; - - private $curl_code; - private $curl_content_type; - private $curl_headers; - - private $cached_profile_image; - private $cached_profile_picdate; - - private static $a; - - /** - * @brief App constructor. - */ - function __construct() { - - global $default_timezone; - - $hostname = ""; - - if (file_exists(".htpreconfig.php")) { - include ".htpreconfig.php"; - } - - $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC'); - - date_default_timezone_set($this->timezone); - - $this->performance["start"] = microtime(true); - $this->performance["database"] = 0; - $this->performance["database_write"] = 0; - $this->performance["network"] = 0; - $this->performance["file"] = 0; - $this->performance["rendering"] = 0; - $this->performance["parser"] = 0; - $this->performance["marktime"] = 0; - $this->performance["markstart"] = microtime(true); - - $this->callstack["database"] = array(); - $this->callstack["database_write"] = array(); - $this->callstack["network"] = array(); - $this->callstack["file"] = array(); - $this->callstack["rendering"] = array(); - $this->callstack["parser"] = array(); - - $this->config = array(); - $this->page = array(); - $this->pager= array(); - - $this->query_string = ''; - - $this->process_id = uniqid("log", true); - - startup(); - - set_include_path( - get_include_path() . PATH_SEPARATOR - . 'include' . PATH_SEPARATOR - . 'library' . PATH_SEPARATOR - . 'library/langdet' . PATH_SEPARATOR - . '.' ); - - $this->scheme = 'http'; - - if ((x($_SERVER, 'HTTPS') && $_SERVER['HTTPS']) || - (x($_SERVER, 'HTTP_FORWARDED') && preg_match("/proto=https/", $_SERVER['HTTP_FORWARDED'])) || - (x($_SERVER, 'HTTP_X_FORWARDED_PROTO') && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || - (x($_SERVER, 'HTTP_X_FORWARDED_SSL') && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || - (x($_SERVER, 'FRONT_END_HTTPS') && $_SERVER['FRONT_END_HTTPS'] == 'on') || - (x($_SERVER, 'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443)) // XXX: reasonable assumption, but isn't this hardcoding too much? - ) { - $this->scheme = 'https'; - } - - if (x($_SERVER, 'SERVER_NAME')) { - $this->hostname = $_SERVER['SERVER_NAME']; - - if (x($_SERVER, 'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) { - $this->hostname .= ':' . $_SERVER['SERVER_PORT']; - } - /* - * Figure out if we are running at the top of a domain - * or in a sub-directory and adjust accordingly - */ - - /// @TODO This kind of escaping breaks syntax-highlightning on CoolEdit (Midnight Commander) - $path = trim(dirname($_SERVER['SCRIPT_NAME']), '/\\'); - if (isset($path) && strlen($path) && ($path != $this->path)) { - $this->path = $path; - } - } - - if ($hostname != "") { - $this->hostname = $hostname; - } - - if (is_array($_SERVER["argv"]) && $_SERVER["argc"] > 1 && substr(end($_SERVER["argv"]), 0, 4) == "http" ) { - $this->set_baseurl(array_pop($_SERVER["argv"])); - $_SERVER["argc"] --; - } - - if ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 9) === "pagename=") { - $this->query_string = substr($_SERVER['QUERY_STRING'], 9); - - // removing trailing / - maybe a nginx problem - $this->query_string = ltrim($this->query_string, '/'); - } elseif ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 2) === "q=") { - $this->query_string = substr($_SERVER['QUERY_STRING'], 2); - - // removing trailing / - maybe a nginx problem - $this->query_string = ltrim($this->query_string, '/'); - } - - if (x($_GET, 'pagename')) { - $this->cmd = trim($_GET['pagename'], '/\\'); - } elseif (x($_GET, 'q')) { - $this->cmd = trim($_GET['q'], '/\\'); - } - - - // fix query_string - $this->query_string = str_replace($this->cmd . "&", $this->cmd . "?", $this->query_string); - - // unix style "homedir" - if (substr($this->cmd, 0, 1) === '~') { - $this->cmd = 'profile/' . substr($this->cmd, 1); - } - - // Diaspora style profile url - if (substr($this->cmd, 0, 2) === 'u/') { - $this->cmd = 'profile/' . substr($this->cmd, 2); - } - - - /* - * Break the URL path into C style argc/argv style arguments for our - * modules. Given "http://example.com/module/arg1/arg2", $this->argc - * will be 3 (integer) and $this->argv will contain: - * [0] => 'module' - * [1] => 'arg1' - * [2] => 'arg2' - * - * - * There will always be one argument. If provided a naked domain - * URL, $this->argv[0] is set to "home". - */ - - $this->argv = explode('/', $this->cmd); - $this->argc = count($this->argv); - if ((array_key_exists('0', $this->argv)) && strlen($this->argv[0])) { - $this->module = str_replace(".", "_", $this->argv[0]); - $this->module = str_replace("-", "_", $this->module); - } else { - $this->argc = 1; - $this->argv = array('home'); - $this->module = 'home'; - } - - /* - * See if there is any page number information, and initialise - * pagination - */ - - $this->pager['page'] = ((x($_GET, 'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1); - $this->pager['itemspage'] = 50; - $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; - - if ($this->pager['start'] < 0) { - $this->pager['start'] = 0; - } - $this->pager['total'] = 0; - - /* - * Detect mobile devices - */ - - $mobile_detect = new Mobile_Detect(); - $this->is_mobile = $mobile_detect->isMobile(); - $this->is_tablet = $mobile_detect->isTablet(); - - // Friendica-Client - $this->is_friendica_app = ($_SERVER['HTTP_USER_AGENT'] == "Apache-HttpClient/UNAVAILABLE (java 1.4)"); - - /* - * register template engines - */ - $dc = get_declared_classes(); - foreach ($dc as $k) { - if (in_array("ITemplateEngine", class_implements($k))){ - $this->register_template_engine($k); - } - } - - self::$a = $this; - - } - - public static function get_basepath() { - - $basepath = get_config("system", "basepath"); - - if ($basepath == "") { - $basepath = dirname(__FILE__); - } - - if ($basepath == "") { - $basepath = $_SERVER["DOCUMENT_ROOT"]; - } - - if ($basepath == "") { - $basepath = $_SERVER["PWD"]; - } - - return $basepath; - } - - function get_scheme() { - return $this->scheme; - } - - /** - * @brief Retrieves the Friendica instance base URL - * - * This function assembles the base URL from multiple parts: - * - Protocol is determined either by the request or a combination of - * system.ssl_policy and the $ssl parameter. - * - Host name is determined either by system.hostname or inferred from request - * - Path is inferred from SCRIPT_NAME - * - * Note: $ssl parameter value doesn't directly correlate with the resulting protocol - * - * @param bool $ssl Whether to append http or https under SSL_POLICY_SELFSIGN - * @return string Friendica server base URL - */ - function get_baseurl($ssl = false) { - - // Is the function called statically? - if (!(isset($this) && get_class($this) == __CLASS__)) { - return self::$a->get_baseurl($ssl); - } - - $scheme = $this->scheme; - - if (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL) { - $scheme = 'https'; - } - - // Basically, we have $ssl = true on any links which can only be seen by a logged in user - // (and also the login link). Anything seen by an outsider will have it turned off. - - if (Config::get('system', 'ssl_policy') == SSL_POLICY_SELFSIGN) { - if ($ssl) { - $scheme = 'https'; - } else { - $scheme = 'http'; - } - } - - if (Config::get('config', 'hostname') != '') { - $this->hostname = Config::get('config', 'hostname'); - } - - return $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); - } - - /** - * @brief Initializes the baseurl components - * - * Clears the baseurl cache to prevent inconstistencies - * - * @param string $url - */ - function set_baseurl($url) { - $parsed = @parse_url($url); - - if ($parsed) { - $this->scheme = $parsed['scheme']; - - $hostname = $parsed['host']; - if (x($parsed, 'port')) { - $hostname .= ':' . $parsed['port']; - } - if (x($parsed, 'path')) { - $this->path = trim($parsed['path'], '\\/'); - } - - if (file_exists(".htpreconfig.php")) { - include ".htpreconfig.php"; - } - - if (get_config('config', 'hostname') != '') { - $this->hostname = get_config('config', 'hostname'); - } - - if (!isset($this->hostname) OR ($this->hostname == '')) { - $this->hostname = $hostname; - } - } - } - - function get_hostname() { - if (get_config('config', 'hostname') != "") { - $this->hostname = get_config('config', 'hostname'); - } - - return $this->hostname; - } - - function set_hostname($h) { - $this->hostname = $h; - } - - function set_path($p) { - $this->path = trim(trim($p), '/'); - } - - function get_path() { - return $this->path; - } - - function set_pager_total($n) { - $this->pager['total'] = intval($n); - } - - function set_pager_itemspage($n) { - $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0); - $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; - } - - function set_pager_page($n) { - $this->pager['page'] = $n; - $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; - } - - function init_pagehead() { - $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000); - - // If the update is "deactivated" set it to the highest integer number (~24 days) - if ($interval < 0) { - $interval = 2147483647; - } - - if ($interval < 10000) { - $interval = 40000; - } - - // compose the page title from the sitename and the - // current module called - if (!$this->module == '') { - $this->page['title'] = $this->config['sitename'] . ' (' . $this->module . ')'; - } else { - $this->page['title'] = $this->config['sitename']; - } - - /* put the head template at the beginning of page['htmlhead'] - * since the code added by the modules frequently depends on it - * being first - */ - if (!isset($this->page['htmlhead'])) { - $this->page['htmlhead'] = ''; - } - - // If we're using Smarty, then doing replace_macros() will replace - // any unrecognized variables with a blank string. Since we delay - // replacing $stylesheet until later, we need to replace it now - // with another variable name - if ($this->theme['template_engine'] === 'smarty3') { - $stylesheet = $this->get_template_ldelim('smarty3') . '$stylesheet' . $this->get_template_rdelim('smarty3'); - } else { - $stylesheet = '$stylesheet'; - } - - $shortcut_icon = get_config("system", "shortcut_icon"); - if ($shortcut_icon == "") { - $shortcut_icon = "images/friendica-32.png"; - } - - $touch_icon = get_config("system", "touch_icon"); - if ($touch_icon == "") { - $touch_icon = "images/friendica-128.png"; - } - - // get data wich is needed for infinite scroll on the network page - $invinite_scroll = infinite_scroll_data($this->module); - - $tpl = get_markup_template('head.tpl'); - $this->page['htmlhead'] = replace_macros($tpl,array( - '$baseurl' => $this->get_baseurl(), // FIXME for z_path!!!! - '$local_user' => local_user(), - '$generator' => 'Friendica' . ' ' . FRIENDICA_VERSION, - '$delitem' => t('Delete this item?'), - '$showmore' => t('show more'), - '$showfewer' => t('show fewer'), - '$update_interval' => $interval, - '$shortcut_icon' => $shortcut_icon, - '$touch_icon' => $touch_icon, - '$stylesheet' => $stylesheet, - '$infinite_scroll' => $invinite_scroll, - )) . $this->page['htmlhead']; - } - - function init_page_end() { - if (!isset($this->page['end'])) { - $this->page['end'] = ''; - } - $tpl = get_markup_template('end.tpl'); - $this->page['end'] = replace_macros($tpl,array( - '$baseurl' => $this->get_baseurl() // FIXME for z_path!!!! - )) . $this->page['end']; - } - - function set_curl_code($code) { - $this->curl_code = $code; - } - - function get_curl_code() { - return $this->curl_code; - } - - function set_curl_content_type($content_type) { - $this->curl_content_type = $content_type; - } - - function get_curl_content_type() { - return $this->curl_content_type; - } - - function set_curl_headers($headers) { - $this->curl_headers = $headers; - } - - function get_curl_headers() { - return $this->curl_headers; - } - - function get_cached_avatar_image($avatar_image){ - return $avatar_image; - } - - - /** - * @brief Removes the baseurl from an url. This avoids some mixed content problems. - * - * @param string $orig_url - * - * @return string The cleaned url - */ - function remove_baseurl($orig_url){ - - // Is the function called statically? - if (!(isset($this) && get_class($this) == __CLASS__)) { - return self::$a->remove_baseurl($orig_url); - } - - // Remove the hostname from the url if it is an internal link - $nurl = normalise_link($orig_url); - $base = normalise_link($this->get_baseurl()); - $url = str_replace($base."/", "", $nurl); - - // if it is an external link return the orignal value - if ($url == normalise_link($orig_url)) { - return $orig_url; - } else { - return $url; - } - } - - /** - * @brief Register template engine class - * - * If $name is "", is used class static property $class::$name - * - * @param string $class - * @param string $name - */ - function register_template_engine($class, $name = '') { - /// @TODO Really === and not just == ? - if ($name === "") { - $v = get_class_vars( $class ); - if (x($v,"name")) $name = $v['name']; - } - if ($name === "") { - echo "template engine $class cannot be registered without a name.\n"; - killme(); - } - $this->template_engines[$name] = $class; - } - - /** - * @brief Return template engine instance. - * - * If $name is not defined, return engine defined by theme, - * or default - * - * @param strin $name Template engine name - * @return object Template Engine instance - */ - function template_engine($name = '') { - /// @TODO really type-check included? - if ($name !== "") { - $template_engine = $name; - } else { - $template_engine = 'smarty3'; - if (x($this->theme, 'template_engine')) { - $template_engine = $this->theme['template_engine']; - } - } - - if (isset($this->template_engines[$template_engine])){ - if (isset($this->template_engine_instance[$template_engine])){ - return $this->template_engine_instance[$template_engine]; - } else { - $class = $this->template_engines[$template_engine]; - $obj = new $class; - $this->template_engine_instance[$template_engine] = $obj; - return $obj; - } - } - - echo "template engine $template_engine is not registered!\n"; killme(); - } - - /** - * @brief Returns the active template engine. - * - * @return string - */ - function get_template_engine() { - return $this->theme['template_engine']; - } - - function set_template_engine($engine = 'smarty3') { - $this->theme['template_engine'] = $engine; - } - - function get_template_ldelim($engine = 'smarty3') { - return $this->ldelim[$engine]; - } - - function get_template_rdelim($engine = 'smarty3') { - return $this->rdelim[$engine]; - } - - function save_timestamp($stamp, $value) { - if (!isset($this->config['system']['profiler']) || !$this->config['system']['profiler']) { - return; - } - - $duration = (float)(microtime(true)-$stamp); - - if (!isset($this->performance[$value])) { - // Prevent ugly E_NOTICE - $this->performance[$value] = 0; - } - - $this->performance[$value] += (float)$duration; - $this->performance["marktime"] += (float)$duration; - - $callstack = $this->callstack(); - - if (!isset($this->callstack[$value][$callstack])) { - // Prevent ugly E_NOTICE - $this->callstack[$value][$callstack] = 0; - } - - $this->callstack[$value][$callstack] += (float)$duration; - - } - - /** - * @brief Log active processes into the "process" table - */ - function start_process() { - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); - - $command = basename($trace[0]["file"]); - - $this->remove_inactive_processes(); - - q("START TRANSACTION"); - - $r = q("SELECT `pid` FROM `process` WHERE `pid` = %d", intval(getmypid())); - if (!dbm::is_result($r)) { - q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')", - intval(getmypid()), - dbesc($command), - dbesc(datetime_convert())); - } - q("COMMIT"); - } - - /** - * @brief Remove inactive processes - */ - function remove_inactive_processes() { - q("START TRANSACTION"); - - $r = q("SELECT `pid` FROM `process`"); - if (dbm::is_result($r)) { - foreach ($r AS $process) { - if (!posix_kill($process["pid"], 0)) { - q("DELETE FROM `process` WHERE `pid` = %d", intval($process["pid"])); - } - } - } - q("COMMIT"); - } - - /** - * @brief Remove the active process from the "process" table - */ - function end_process() { - q("DELETE FROM `process` WHERE `pid` = %d", intval(getmypid())); - } - - /** - * @brief Returns a string with a callstack. Can be used for logging. - * - * @return string - */ - function callstack() { - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 6); - - // We remove the first two items from the list since they contain data that we don't need. - array_shift($trace); - array_shift($trace); - - $callstack = array(); - foreach ($trace AS $func) { - $callstack[] = $func["function"]; - } - - return implode(", ", $callstack); - } - - function get_useragent() { - return - FRIENDICA_PLATFORM . " '" . - FRIENDICA_CODENAME . "' " . - FRIENDICA_VERSION . "-" . - DB_UPDATE_VERSION . "; " . - $this->get_baseurl(); - } - - function is_friendica_app() { - return $this->is_friendica_app; - } - - /** - * @brief Checks if the site is called via a backend process - * - * This isn't a perfect solution. But we need this check very early. - * So we cannot wait until the modules are loaded. - * - * @return bool Is it a known backend? - */ - function is_backend() { - static $backends = array(); - $backends[] = "_well_known"; - $backends[] = "api"; - $backends[] = "dfrn_notify"; - $backends[] = "fetch"; - $backends[] = "hcard"; - $backends[] = "hostxrd"; - $backends[] = "nodeinfo"; - $backends[] = "noscrape"; - $backends[] = "p"; - $backends[] = "poco"; - $backends[] = "post"; - $backends[] = "proxy"; - $backends[] = "pubsub"; - $backends[] = "pubsubhubbub"; - $backends[] = "receive"; - $backends[] = "rsd_xml"; - $backends[] = "salmon"; - $backends[] = "statistics_json"; - $backends[] = "xrd"; - - // Check if current module is in backend or backend flag is set - return (in_array($this->module, $backends) || $this->backend); - } - - /** - * @brief Checks if the maximum number of database processes is reached - * - * @return bool Is the limit reached? - */ - function max_processes_reached() { - - if ($this->is_backend()) { - $process = "backend"; - $max_processes = get_config('system', 'max_processes_backend'); - if (intval($max_processes) == 0) { - $max_processes = 5; - } - } else { - $process = "frontend"; - $max_processes = get_config('system', 'max_processes_frontend'); - if (intval($max_processes) == 0) { - $max_processes = 20; - } - } - - $processlist = dbm::processlist(); - if ($processlist["list"] != "") { - logger("Processcheck: Processes: ".$processlist["amount"]." - Processlist: ".$processlist["list"], LOGGER_DEBUG); - - if ($processlist["amount"] > $max_processes) { - logger("Processcheck: Maximum number of processes for ".$process." tasks (".$max_processes.") reached.", LOGGER_DEBUG); - return true; - } - } - return false; - } - - /** - * @brief Checks if the minimal memory is reached - * - * @return bool Is the memory limit reached? - */ - public function min_memory_reached() { - $min_memory = Config::get('system', 'min_memory', 0); - if ($min_memory == 0) { - return false; - } - - if (!is_readable("/proc/meminfo")) { - return false; - } - - $memdata = explode("\n", file_get_contents('/proc/meminfo')); - - $meminfo = array(); - foreach ($memdata as $line) { - list($key, $val) = explode(":", $line); - $meminfo[$key] = (int)trim(str_replace("kB", "", $val)); - $meminfo[$key] = (int)($meminfo[$key] / 1024); - } - - if (!isset($meminfo['MemAvailable']) OR !isset($meminfo['MemFree'])) { - return false; - } - - $free = $meminfo['MemAvailable'] + $meminfo['MemFree']; - - $reached = ($free < $min_memory); - - if ($reached) { - logger('Minimal memory reached: '.$free.'/'.$meminfo['MemTotal'].' - limit '.$min_memory, LOGGER_DEBUG); - } - - return $reached; - } - - /** - * @brief Checks if the maximum load is reached - * - * @return bool Is the load reached? - */ - function maxload_reached() { - - if ($this->is_backend()) { - $process = "backend"; - $maxsysload = intval(get_config('system', 'maxloadavg')); - if ($maxsysload < 1) { - $maxsysload = 50; - } - } else { - $process = "frontend"; - $maxsysload = intval(get_config('system','maxloadavg_frontend')); - if ($maxsysload < 1) { - $maxsysload = 50; - } - } - - $load = current_load(); - if ($load) { - if (intval($load) > $maxsysload) { - logger('system: load '.$load.' for '.$process.' tasks ('.$maxsysload.') too high.'); - return true; - } - } - return false; - } - - function proc_run($args) { - - if (!function_exists("proc_open")) { - return; - } - - // If the last worker fork was less than 10 seconds before then don't fork another one. - // This should prevent the forking of masses of workers. - $cachekey = "app:proc_run:started"; - $result = Cache::get($cachekey); - - if (!is_null($result) AND (time() - $result) < 10) { - return; - } - - // Set the timestamp of the last proc_run - Cache::set($cachekey, time(), CACHE_MINUTE); - - array_unshift($args, ((x($this->config,'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php')); - - // add baseurl to args. cli scripts can't construct it - $args[] = $this->get_baseurl(); - - for ($x = 0; $x < count($args); $x ++) { - $args[$x] = escapeshellarg($args[$x]); - } - - $cmdline = implode($args, " "); - - if ($this->min_memory_reached()) { - return; - } - - if (get_config('system', 'proc_windows')) { - $resource = proc_open('cmd /c start /b ' . $cmdline, array(), $foo, dirname(__FILE__)); - } else { - $resource = proc_open($cmdline . " &", array(), $foo, dirname(__FILE__)); - } - if (!is_resource($resource)) { - logger('We got no resource for command '.$cmdline, LOGGER_DEBUG); - return; - } - proc_close($resource); - } - - /** - * @brief Returns the system user that is executing the script - * - * This mostly returns something like "www-data". - * - * @return string system username - */ - static function systemuser() { - if (!function_exists('posix_getpwuid') OR !function_exists('posix_geteuid')) { - return ''; - } - - $processUser = posix_getpwuid(posix_geteuid()); - return $processUser['name']; - } - - /** - * @brief Checks if a given directory is usable for the system - * - * @return boolean the directory is usable - */ - static function directory_usable($directory) { - - if ($directory == '') { - logger("Directory is empty. This shouldn't happen.", LOGGER_DEBUG); - return false; - } - - if (!file_exists($directory)) { - logger('Path "'.$directory.'" does not exist for user '.self::systemuser(), LOGGER_DEBUG); - return false; - } - if (is_file($directory)) { - logger('Path "'.$directory.'" is a file for user '.self::systemuser(), LOGGER_DEBUG); - return false; - } - if (!is_dir($directory)) { - logger('Path "'.$directory.'" is not a directory for user '.self::systemuser(), LOGGER_DEBUG); - return false; - } - if (!is_writable($directory)) { - logger('Path "'.$directory.'" is not writable for user '.self::systemuser(), LOGGER_DEBUG); - return false; - } - return true; - } -} - /** * @brief Retrieve the App structure * diff --git a/include/Contact.php b/include/Contact.php index 6f662cdf1..d635ee872 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -1,5 +1,7 @@ set_pager_itemspage(60); diff --git a/mod/dirfind.php b/mod/dirfind.php index a62eded39..c24ab9dbd 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -1,4 +1,7 @@ */ +use Friendica\App; + require_once('include/Photo.php'); /** diff --git a/mod/fetch.php b/mod/fetch.php index b87fc0e8e..0afd7af10 100644 --- a/mod/fetch.php +++ b/mod/fetch.php @@ -2,6 +2,9 @@ /* This file is part of the Diaspora protocol. It is used for fetching single public posts. */ + +use Friendica\App; + require_once("include/crypto.php"); require_once("include/diaspora.php"); require_once("include/xml.php"); diff --git a/mod/filer.php b/mod/filer.php index 2f07cb6ee..6259879de 100644 --- a/mod/filer.php +++ b/mod/filer.php @@ -1,5 +1,7 @@ argc > 1) diff --git a/mod/notes.php b/mod/notes.php index c7cfe8d70..835627586 100644 --- a/mod/notes.php +++ b/mod/notes.php @@ -1,5 +1,7 @@ friendica items permanent-url compatibility */ +use Friendica\App; function notice_init(App $a) { diff --git a/mod/notifications.php b/mod/notifications.php index fdaec05cc..396361e91 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -5,6 +5,8 @@ * @brief The notifications module */ +use Friendica\App; + require_once("include/NotificationsManager.php"); require_once("include/contact_selectors.php"); require_once("include/network.php"); diff --git a/mod/notify.php b/mod/notify.php index 0026f5ca6..e38068193 100644 --- a/mod/notify.php +++ b/mod/notify.php @@ -1,4 +1,7 @@ argc > 1) && ($a->argv[1] === 'xrd')) { diff --git a/mod/openid.php b/mod/openid.php index ac90806d0..5707b1b72 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -1,5 +1,6 @@ +use Friendica\App; + define('PROXY_DEFAULT_TIME', 86400); // 1 Day define('PROXY_SIZE_MICRO', 'micro'); diff --git a/mod/pubsub.php b/mod/pubsub.php index 2ba1958a2..ba5e05b0e 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -1,5 +1,7 @@ argc > 1) ? intval($a->argv[1]) : 0); diff --git a/mod/smilies.php b/mod/smilies.php index f69541824..289ad887f 100644 --- a/mod/smilies.php +++ b/mod/smilies.php @@ -3,6 +3,7 @@ /** * @file mod/smilies.php */ +use Friendica\App; require_once("include/Smilies.php"); diff --git a/mod/starred.php b/mod/starred.php index 46d3fcff6..e1b38cfc4 100644 --- a/mod/starred.php +++ b/mod/starred.php @@ -1,5 +1,6 @@ '', + 'videowidth' => 425, + 'videoheight' => 350, + 'force_max_items' => 0, + 'thread_allow' => true, + 'stylesheet' => '', + 'template_engine' => 'smarty3', + ); + + /** + * @brief An array of registered template engines ('name'=>'class name') + */ + public $template_engines = array(); + + /** + * @brief An array of instanced template engines ('name'=>'instance') + */ + public $template_engine_instance = array(); + public $process_id; + private $ldelim = array( + 'internal' => '', + 'smarty3' => '{{' + ); + private $rdelim = array( + 'internal' => '', + 'smarty3' => '}}' + ); + private $scheme; + private $hostname; + private $db; + private $curl_code; + private $curl_content_type; + private $curl_headers; + private $cached_profile_image; + private $cached_profile_picdate; + private static $a; + + /** + * @brief App constructor. + */ + function __construct() { + + global $default_timezone; + + $hostname = ''; + + if (file_exists('.htpreconfig.php')) { + include '.htpreconfig.php'; + } + + $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC'); + + date_default_timezone_set($this->timezone); + + $this->performance['start'] = microtime(true); + $this->performance['database'] = 0; + $this->performance['database_write'] = 0; + $this->performance['network'] = 0; + $this->performance['file'] = 0; + $this->performance['rendering'] = 0; + $this->performance['parser'] = 0; + $this->performance['marktime'] = 0; + $this->performance['markstart'] = microtime(true); + + $this->callstack['database'] = array(); + $this->callstack['database_write'] = array(); + $this->callstack['network'] = array(); + $this->callstack['file'] = array(); + $this->callstack['rendering'] = array(); + $this->callstack['parser'] = array(); + + $this->config = array(); + $this->page = array(); + $this->pager = array(); + + $this->query_string = ''; + + $this->process_id = uniqid('log', true); + + startup(); + + set_include_path( + get_include_path() . PATH_SEPARATOR + . 'include' . PATH_SEPARATOR + . 'library' . PATH_SEPARATOR + . 'library/langdet' . PATH_SEPARATOR + . '.'); + + $this->scheme = 'http'; + + if ((x($_SERVER, 'HTTPS') && $_SERVER['HTTPS']) || + (x($_SERVER, 'HTTP_FORWARDED') && preg_match('/proto=https/', $_SERVER['HTTP_FORWARDED'])) || + (x($_SERVER, 'HTTP_X_FORWARDED_PROTO') && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || + (x($_SERVER, 'HTTP_X_FORWARDED_SSL') && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || + (x($_SERVER, 'FRONT_END_HTTPS') && $_SERVER['FRONT_END_HTTPS'] == 'on') || + (x($_SERVER, 'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443)) // XXX: reasonable assumption, but isn't this hardcoding too much? + ) { + $this->scheme = 'https'; + } + + if (x($_SERVER, 'SERVER_NAME')) { + $this->hostname = $_SERVER['SERVER_NAME']; + + if (x($_SERVER, 'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) { + $this->hostname .= ':' . $_SERVER['SERVER_PORT']; + } + /* + * Figure out if we are running at the top of a domain + * or in a sub-directory and adjust accordingly + */ + + /// @TODO This kind of escaping breaks syntax-highlightning on CoolEdit (Midnight Commander) + $path = trim(dirname($_SERVER['SCRIPT_NAME']), '/\\'); + if (isset($path) && strlen($path) && ($path != $this->path)) { + $this->path = $path; + } + } + + if ($hostname != '') { + $this->hostname = $hostname; + } + + if (is_array($_SERVER['argv']) && $_SERVER['argc'] > 1 && substr(end($_SERVER['argv']), 0, 4) == 'http') { + $this->set_baseurl(array_pop($_SERVER['argv'])); + $_SERVER['argc'] --; + } + + if ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 9) === 'pagename=') { + $this->query_string = substr($_SERVER['QUERY_STRING'], 9); + + // removing trailing / - maybe a nginx problem + $this->query_string = ltrim($this->query_string, '/'); + } elseif ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 2) === 'q=') { + $this->query_string = substr($_SERVER['QUERY_STRING'], 2); + + // removing trailing / - maybe a nginx problem + $this->query_string = ltrim($this->query_string, '/'); + } + + if (x($_GET, 'pagename')) { + $this->cmd = trim($_GET['pagename'], '/\\'); + } elseif (x($_GET, 'q')) { + $this->cmd = trim($_GET['q'], '/\\'); + } + + // fix query_string + $this->query_string = str_replace($this->cmd . '&', $this->cmd . '?', $this->query_string); + + // unix style "homedir" + if (substr($this->cmd, 0, 1) === '~') { + $this->cmd = 'profile/' . substr($this->cmd, 1); + } + + // Diaspora style profile url + if (substr($this->cmd, 0, 2) === 'u/') { + $this->cmd = 'profile/' . substr($this->cmd, 2); + } + + /* + * Break the URL path into C style argc/argv style arguments for our + * modules. Given "http://example.com/module/arg1/arg2", $this->argc + * will be 3 (integer) and $this->argv will contain: + * [0] => 'module' + * [1] => 'arg1' + * [2] => 'arg2' + * + * + * There will always be one argument. If provided a naked domain + * URL, $this->argv[0] is set to "home". + */ + + $this->argv = explode('/', $this->cmd); + $this->argc = count($this->argv); + if ((array_key_exists('0', $this->argv)) && strlen($this->argv[0])) { + $this->module = str_replace('.', '_', $this->argv[0]); + $this->module = str_replace('-', '_', $this->module); + } else { + $this->argc = 1; + $this->argv = array('home'); + $this->module = 'home'; + } + + // See if there is any page number information, and initialise pagination + $this->pager['page'] = ((x($_GET, 'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1); + $this->pager['itemspage'] = 50; + $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; + + if ($this->pager['start'] < 0) { + $this->pager['start'] = 0; + } + $this->pager['total'] = 0; + + // Detect mobile devices + $mobile_detect = new \Mobile_Detect(); + $this->is_mobile = $mobile_detect->isMobile(); + $this->is_tablet = $mobile_detect->isTablet(); + + // Friendica-Client + $this->is_friendica_app = ($_SERVER['HTTP_USER_AGENT'] == 'Apache-HttpClient/UNAVAILABLE (java 1.4)'); + + // Register template engines + $dc = get_declared_classes(); + foreach ($dc as $k) { + if (in_array('ITemplateEngine', class_implements($k))) { + $this->register_template_engine($k); + } + } + + self::$a = $this; + } + + public static function get_basepath() { + $basepath = get_config('system', 'basepath'); + + if ($basepath == '') { + $basepath = dirname(__FILE__); + } + + if ($basepath == '') { + $basepath = $_SERVER['DOCUMENT_ROOT']; + } + + if ($basepath == '') { + $basepath = $_SERVER['PWD']; + } + + return $basepath; + } + + function get_scheme() { + return $this->scheme; + } + + /** + * @brief Retrieves the Friendica instance base URL + * + * This function assembles the base URL from multiple parts: + * - Protocol is determined either by the request or a combination of + * system.ssl_policy and the $ssl parameter. + * - Host name is determined either by system.hostname or inferred from request + * - Path is inferred from SCRIPT_NAME + * + * Note: $ssl parameter value doesn't directly correlate with the resulting protocol + * + * @param bool $ssl Whether to append http or https under SSL_POLICY_SELFSIGN + * @return string Friendica server base URL + */ + function get_baseurl($ssl = false) { + // Is the function called statically? + if (!(isset($this) && get_class($this) == __CLASS__)) { + return self::$a->get_baseurl($ssl); + } + + $scheme = $this->scheme; + + if (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL) { + $scheme = 'https'; + } + + // Basically, we have $ssl = true on any links which can only be seen by a logged in user + // (and also the login link). Anything seen by an outsider will have it turned off. + + if (Config::get('system', 'ssl_policy') == SSL_POLICY_SELFSIGN) { + if ($ssl) { + $scheme = 'https'; + } else { + $scheme = 'http'; + } + } + + if (Config::get('config', 'hostname') != '') { + $this->hostname = Config::get('config', 'hostname'); + } + + return $scheme . '://' . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); + } + + /** + * @brief Initializes the baseurl components + * + * Clears the baseurl cache to prevent inconstistencies + * + * @param string $url + */ + function set_baseurl($url) { + $parsed = @parse_url($url); + + if ($parsed) { + $this->scheme = $parsed['scheme']; + + $hostname = $parsed['host']; + if (x($parsed, 'port')) { + $hostname .= ':' . $parsed['port']; + } + if (x($parsed, 'path')) { + $this->path = trim($parsed['path'], '\\/'); + } + + if (file_exists('.htpreconfig.php')) { + include '.htpreconfig.php'; + } + + if (get_config('config', 'hostname') != '') { + $this->hostname = get_config('config', 'hostname'); + } + + if (!isset($this->hostname) OR ( $this->hostname == '')) { + $this->hostname = $hostname; + } + } + } + + function get_hostname() { + if (get_config('config', 'hostname') != '') { + $this->hostname = get_config('config', 'hostname'); + } + + return $this->hostname; + } + + function set_hostname($h) { + $this->hostname = $h; + } + + function set_path($p) { + $this->path = trim(trim($p), '/'); + } + + function get_path() { + return $this->path; + } + + function set_pager_total($n) { + $this->pager['total'] = intval($n); + } + + function set_pager_itemspage($n) { + $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0); + $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; + } + + function set_pager_page($n) { + $this->pager['page'] = $n; + $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage']; + } + + function init_pagehead() { + $interval = ((local_user()) ? get_pconfig(local_user(), 'system', 'update_interval') : 40000); + + // If the update is 'deactivated' set it to the highest integer number (~24 days) + if ($interval < 0) { + $interval = 2147483647; + } + + if ($interval < 10000) { + $interval = 40000; + } + + // compose the page title from the sitename and the + // current module called + if (!$this->module == '') { + $this->page['title'] = $this->config['sitename'] . ' (' . $this->module . ')'; + } else { + $this->page['title'] = $this->config['sitename']; + } + + /* put the head template at the beginning of page['htmlhead'] + * since the code added by the modules frequently depends on it + * being first + */ + if (!isset($this->page['htmlhead'])) { + $this->page['htmlhead'] = ''; + } + + // If we're using Smarty, then doing replace_macros() will replace + // any unrecognized variables with a blank string. Since we delay + // replacing $stylesheet until later, we need to replace it now + // with another variable name + if ($this->theme['template_engine'] === 'smarty3') { + $stylesheet = $this->get_template_ldelim('smarty3') . '$stylesheet' . $this->get_template_rdelim('smarty3'); + } else { + $stylesheet = '$stylesheet'; + } + + $shortcut_icon = get_config('system', 'shortcut_icon'); + if ($shortcut_icon == '') { + $shortcut_icon = 'images/friendica-32.png'; + } + + $touch_icon = get_config('system', 'touch_icon'); + if ($touch_icon == '') { + $touch_icon = 'images/friendica-128.png'; + } + + // get data wich is needed for infinite scroll on the network page + $invinite_scroll = infinite_scroll_data($this->module); + + $tpl = get_markup_template('head.tpl'); + $this->page['htmlhead'] = replace_macros($tpl, array( + '$baseurl' => $this->get_baseurl(), // FIXME for z_path!!!! + '$local_user' => local_user(), + '$generator' => 'Friendica' . ' ' . FRIENDICA_VERSION, + '$delitem' => t('Delete this item?'), + '$showmore' => t('show more'), + '$showfewer' => t('show fewer'), + '$update_interval' => $interval, + '$shortcut_icon' => $shortcut_icon, + '$touch_icon' => $touch_icon, + '$stylesheet' => $stylesheet, + '$infinite_scroll' => $invinite_scroll, + )) . $this->page['htmlhead']; + } + + function init_page_end() { + if (!isset($this->page['end'])) { + $this->page['end'] = ''; + } + $tpl = get_markup_template('end.tpl'); + $this->page['end'] = replace_macros($tpl, array( + '$baseurl' => $this->get_baseurl() // FIXME for z_path!!!! + )) . $this->page['end']; + } + + function set_curl_code($code) { + $this->curl_code = $code; + } + + function get_curl_code() { + return $this->curl_code; + } + + function set_curl_content_type($content_type) { + $this->curl_content_type = $content_type; + } + + function get_curl_content_type() { + return $this->curl_content_type; + } + + function set_curl_headers($headers) { + $this->curl_headers = $headers; + } + + function get_curl_headers() { + return $this->curl_headers; + } + + function get_cached_avatar_image($avatar_image) { + return $avatar_image; + } + + /** + * @brief Removes the baseurl from an url. This avoids some mixed content problems. + * + * @param string $orig_url + * + * @return string The cleaned url + */ + function remove_baseurl($orig_url) { + + // Is the function called statically? + if (!(isset($this) && get_class($this) == __CLASS__)) { + return self::$a->remove_baseurl($orig_url); + } + + // Remove the hostname from the url if it is an internal link + $nurl = normalise_link($orig_url); + $base = normalise_link($this->get_baseurl()); + $url = str_replace($base . '/', '', $nurl); + + // if it is an external link return the orignal value + if ($url == normalise_link($orig_url)) { + return $orig_url; + } else { + return $url; + } + } + + /** + * @brief Register template engine class + * + * If $name is '', is used class static property $class::$name + * + * @param string $class + * @param string $name + */ + function register_template_engine($class, $name = '') { + /// @TODO Really === and not just == ? + if ($name === '') { + $v = get_class_vars($class); + if (x($v, 'name')) + $name = $v['name']; + } + if ($name === '') { + echo "template engine $class cannot be registered without a name.\n"; + killme(); + } + $this->template_engines[$name] = $class; + } + + /** + * @brief Return template engine instance. + * + * If $name is not defined, return engine defined by theme, + * or default + * + * @param strin $name Template engine name + * @return object Template Engine instance + */ + function template_engine($name = '') { + /// @TODO really type-check included? + if ($name !== '') { + $template_engine = $name; + } else { + $template_engine = 'smarty3'; + if (x($this->theme, 'template_engine')) { + $template_engine = $this->theme['template_engine']; + } + } + + if (isset($this->template_engines[$template_engine])) { + if (isset($this->template_engine_instance[$template_engine])) { + return $this->template_engine_instance[$template_engine]; + } else { + $class = $this->template_engines[$template_engine]; + $obj = new $class; + $this->template_engine_instance[$template_engine] = $obj; + return $obj; + } + } + + echo "template engine $template_engine is not registered!\n"; + killme(); + } + + /** + * @brief Returns the active template engine. + * + * @return string + */ + function get_template_engine() { + return $this->theme['template_engine']; + } + + function set_template_engine($engine = 'smarty3') { + $this->theme['template_engine'] = $engine; + } + + function get_template_ldelim($engine = 'smarty3') { + return $this->ldelim[$engine]; + } + + function get_template_rdelim($engine = 'smarty3') { + return $this->rdelim[$engine]; + } + + function save_timestamp($stamp, $value) { + if (!isset($this->config['system']['profiler']) || !$this->config['system']['profiler']) { + return; + } + + $duration = (float) (microtime(true) - $stamp); + + if (!isset($this->performance[$value])) { + // Prevent ugly E_NOTICE + $this->performance[$value] = 0; + } + + $this->performance[$value] += (float) $duration; + $this->performance['marktime'] += (float) $duration; + + $callstack = $this->callstack(); + + if (!isset($this->callstack[$value][$callstack])) { + // Prevent ugly E_NOTICE + $this->callstack[$value][$callstack] = 0; + } + + $this->callstack[$value][$callstack] += (float) $duration; + } + + /** + * @brief Log active processes into the "process" table + */ + function start_process() { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); + + $command = basename($trace[0]['file']); + + $this->remove_inactive_processes(); + + q('START TRANSACTION'); + + $r = q('SELECT `pid` FROM `process` WHERE `pid` = %d', intval(getmypid())); + if (!dbm::is_result($r)) { + q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')", intval(getmypid()), dbesc($command), dbesc(datetime_convert())); + } + q('COMMIT'); + } + + /** + * @brief Remove inactive processes + */ + function remove_inactive_processes() { + q('START TRANSACTION'); + + $r = q('SELECT `pid` FROM `process`'); + if (dbm::is_result($r)) { + foreach ($r AS $process) { + if (!posix_kill($process['pid'], 0)) { + q('DELETE FROM `process` WHERE `pid` = %d', intval($process['pid'])); + } + } + } + q('COMMIT'); + } + + /** + * @brief Remove the active process from the "process" table + */ + function end_process() { + q('DELETE FROM `process` WHERE `pid` = %d', intval(getmypid())); + } + + /** + * @brief Returns a string with a callstack. Can be used for logging. + * + * @return string + */ + function callstack() { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 6); + + // We remove the first two items from the list since they contain data that we don't need. + array_shift($trace); + array_shift($trace); + + $callstack = array(); + foreach ($trace AS $func) { + $callstack[] = $func['function']; + } + + return implode(', ', $callstack); + } + + function get_useragent() { + return + FRIENDICA_PLATFORM . " '" . + FRIENDICA_CODENAME . "' " . + FRIENDICA_VERSION . '-' . + DB_UPDATE_VERSION . '; ' . + $this->get_baseurl(); + } + + function is_friendica_app() { + return $this->is_friendica_app; + } + + /** + * @brief Checks if the site is called via a backend process + * + * This isn't a perfect solution. But we need this check very early. + * So we cannot wait until the modules are loaded. + * + * @return bool Is it a known backend? + */ + function is_backend() { + static $backends = array(); + $backends[] = '_well_known'; + $backends[] = 'api'; + $backends[] = 'dfrn_notify'; + $backends[] = 'fetch'; + $backends[] = 'hcard'; + $backends[] = 'hostxrd'; + $backends[] = 'nodeinfo'; + $backends[] = 'noscrape'; + $backends[] = 'p'; + $backends[] = 'poco'; + $backends[] = 'post'; + $backends[] = 'proxy'; + $backends[] = 'pubsub'; + $backends[] = 'pubsubhubbub'; + $backends[] = 'receive'; + $backends[] = 'rsd_xml'; + $backends[] = 'salmon'; + $backends[] = 'statistics_json'; + $backends[] = 'xrd'; + + // Check if current module is in backend or backend flag is set + return (in_array($this->module, $backends) || $this->backend); + } + + /** + * @brief Checks if the maximum number of database processes is reached + * + * @return bool Is the limit reached? + */ + function max_processes_reached() { + + if ($this->is_backend()) { + $process = 'backend'; + $max_processes = get_config('system', 'max_processes_backend'); + if (intval($max_processes) == 0) { + $max_processes = 5; + } + } else { + $process = 'frontend'; + $max_processes = get_config('system', 'max_processes_frontend'); + if (intval($max_processes) == 0) { + $max_processes = 20; + } + } + + $processlist = dbm::processlist(); + if ($processlist['list'] != '') { + logger('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list'], LOGGER_DEBUG); + + if ($processlist['amount'] > $max_processes) { + logger('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.', LOGGER_DEBUG); + return true; + } + } + return false; + } + + /** + * @brief Checks if the minimal memory is reached + * + * @return bool Is the memory limit reached? + */ + public function min_memory_reached() { + $min_memory = Config::get('system', 'min_memory', 0); + if ($min_memory == 0) { + return false; + } + + if (!is_readable('/proc/meminfo')) { + return false; + } + + $memdata = explode("\n", file_get_contents('/proc/meminfo')); + + $meminfo = array(); + foreach ($memdata as $line) { + list($key, $val) = explode(':', $line); + $meminfo[$key] = (int) trim(str_replace('kB', '', $val)); + $meminfo[$key] = (int) ($meminfo[$key] / 1024); + } + + if (!isset($meminfo['MemAvailable']) OR ! isset($meminfo['MemFree'])) { + return false; + } + + $free = $meminfo['MemAvailable'] + $meminfo['MemFree']; + + $reached = ($free < $min_memory); + + if ($reached) { + logger('Minimal memory reached: ' . $free . '/' . $meminfo['MemTotal'] . ' - limit ' . $min_memory, LOGGER_DEBUG); + } + + return $reached; + } + + /** + * @brief Checks if the maximum load is reached + * + * @return bool Is the load reached? + */ + function maxload_reached() { + + if ($this->is_backend()) { + $process = 'backend'; + $maxsysload = intval(get_config('system', 'maxloadavg')); + if ($maxsysload < 1) { + $maxsysload = 50; + } + } else { + $process = 'frontend'; + $maxsysload = intval(get_config('system', 'maxloadavg_frontend')); + if ($maxsysload < 1) { + $maxsysload = 50; + } + } + + $load = current_load(); + if ($load) { + if (intval($load) > $maxsysload) { + logger('system: load ' . $load . ' for ' . $process . ' tasks (' . $maxsysload . ') too high.'); + return true; + } + } + return false; + } + + function proc_run($args) { + + if (!function_exists('proc_open')) { + return; + } + + // If the last worker fork was less than 10 seconds before then don't fork another one. + // This should prevent the forking of masses of workers. + $cachekey = 'app:proc_run:started'; + $result = Cache::get($cachekey); + + if (!is_null($result) AND ( time() - $result) < 10) { + return; + } + + // Set the timestamp of the last proc_run + Cache::set($cachekey, time(), CACHE_MINUTE); + + array_unshift($args, ((x($this->config, 'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php')); + + // add baseurl to args. cli scripts can't construct it + $args[] = $this->get_baseurl(); + + for ($x = 0; $x < count($args); $x ++) { + $args[$x] = escapeshellarg($args[$x]); + } + + $cmdline = implode($args, ' '); + + if ($this->min_memory_reached()) { + return; + } + + if (get_config('system', 'proc_windows')) { + $resource = proc_open('cmd /c start /b ' . $cmdline, array(), $foo, dirname(__FILE__)); + } else { + $resource = proc_open($cmdline . ' &', array(), $foo, dirname(__FILE__)); + } + if (!is_resource($resource)) { + logger('We got no resource for command ' . $cmdline, LOGGER_DEBUG); + return; + } + proc_close($resource); + } + + /** + * @brief Returns the system user that is executing the script + * + * This mostly returns something like "www-data". + * + * @return string system username + */ + static function systemuser() { + if (!function_exists('posix_getpwuid') OR ! function_exists('posix_geteuid')) { + return ''; + } + + $processUser = posix_getpwuid(posix_geteuid()); + return $processUser['name']; + } + + /** + * @brief Checks if a given directory is usable for the system + * + * @return boolean the directory is usable + */ + static function directory_usable($directory) { + if ($directory == '') { + logger('Directory is empty. This shouldn\'t happen.', LOGGER_DEBUG); + return false; + } + + if (!file_exists($directory)) { + logger('Path "' . $directory . '" does not exist for user ' . self::systemuser(), LOGGER_DEBUG); + return false; + } + if (is_file($directory)) { + logger('Path "' . $directory . '" is a file for user ' . self::systemuser(), LOGGER_DEBUG); + return false; + } + if (!is_dir($directory)) { + logger('Path "' . $directory . '" is not a directory for user ' . self::systemuser(), LOGGER_DEBUG); + return false; + } + if (!is_writable($directory)) { + logger('Path "' . $directory . '" is not writable for user ' . self::systemuser(), LOGGER_DEBUG); + return false; + } + return true; + } + +} diff --git a/util/db_update.php b/util/db_update.php index 3e3a89840..799df063c 100644 --- a/util/db_update.php +++ b/util/db_update.php @@ -3,6 +3,8 @@ * @package util */ +use Friendica\App; + /* * require boot.php */ diff --git a/util/maintenance.php b/util/maintenance.php index b0728245c..3b917aef1 100644 --- a/util/maintenance.php +++ b/util/maintenance.php @@ -1,5 +1,6 @@ */ +use Friendica\App; DEFINE("NORM_REGEXP", "|[\\\]|"); diff --git a/util/typo.php b/util/typo.php index cc05be4cc..0a1879fe0 100644 --- a/util/typo.php +++ b/util/typo.php @@ -3,6 +3,7 @@ // Run this from cmdline in basedir and quickly see if we've // got any parse errors in our application files. +use Friendica\App; error_reporting(E_ERROR | E_WARNING | E_PARSE ); ini_set('display_errors', '1'); diff --git a/view/php/default.php b/view/php/default.php index e51b531b5..17d4961fc 100644 --- a/view/php/default.php +++ b/view/php/default.php @@ -2,7 +2,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - + diff --git a/view/php/minimal.php b/view/php/minimal.php index e93aac112..39888630a 100644 --- a/view/php/minimal.php +++ b/view/php/minimal.php @@ -2,7 +2,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - + diff --git a/view/theme/duepuntozero/config.php b/view/theme/duepuntozero/config.php index 6b111d6ad..b1ec4bae5 100644 --- a/view/theme/duepuntozero/config.php +++ b/view/theme/duepuntozero/config.php @@ -4,6 +4,8 @@ * Theme settings */ +use Friendica\App; + function theme_content(App $a) { if (!local_user()) { return; diff --git a/view/theme/duepuntozero/theme.php b/view/theme/duepuntozero/theme.php index c674a99d9..dc8f29b2f 100644 --- a/view/theme/duepuntozero/theme.php +++ b/view/theme/duepuntozero/theme.php @@ -1,5 +1,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - + - + - + - + diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index a873e4513..0e34709e9 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -7,6 +7,8 @@ * */ +use Friendica\App; + $frio = "view/theme/frio"; global $frio; diff --git a/view/theme/frost-mobile/php/default.php b/view/theme/frost-mobile/php/default.php index d739f56f2..062ec3b8a 100644 --- a/view/theme/frost-mobile/php/default.php +++ b/view/theme/frost-mobile/php/default.php @@ -2,7 +2,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - + module === 'home') echo 'onLoad="setTimeout(\'homeRedirect()\', 1500)"'?>> diff --git a/view/theme/frost-mobile/theme.php b/view/theme/frost-mobile/theme.php index 7e4262cb6..24f41073e 100644 --- a/view/theme/frost-mobile/theme.php +++ b/view/theme/frost-mobile/theme.php @@ -9,6 +9,8 @@ * Maintainer: Zach P */ +use Friendica\App; + function frost_mobile_init(App $a) { $a->sourcename = 'Friendica mobile web'; $a->videowidth = 250; diff --git a/view/theme/frost/php/default.php b/view/theme/frost/php/default.php index 0fe3404f6..306345d39 100644 --- a/view/theme/frost/php/default.php +++ b/view/theme/frost/php/default.php @@ -2,7 +2,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - + module === 'home') echo 'onLoad="setTimeout(\'homeRedirect()\', 1500)"'?>> diff --git a/view/theme/frost/theme.php b/view/theme/frost/theme.php index 4c22f0a11..b09153876 100644 --- a/view/theme/frost/theme.php +++ b/view/theme/frost/theme.php @@ -9,6 +9,8 @@ * Maintainer: Zach P */ +use Friendica\App; + function frost_init(App $a) { $a->videowidth = 400; $a->videoheight = 330; diff --git a/view/theme/quattro/config.php b/view/theme/quattro/config.php index 341c2b831..47210012c 100644 --- a/view/theme/quattro/config.php +++ b/view/theme/quattro/config.php @@ -4,6 +4,8 @@ * Theme settings */ +use Friendica\App; + function theme_content(App $a) { if (!local_user()) { return; diff --git a/view/theme/quattro/theme.php b/view/theme/quattro/theme.php index fc908522a..5647fd493 100644 --- a/view/theme/quattro/theme.php +++ b/view/theme/quattro/theme.php @@ -7,6 +7,8 @@ * Maintainer: Tobias */ +use Friendica\App; + function quattro_init(App $a) { $a->page['htmlhead'] .= ''; $a->page['htmlhead'] .= '';; diff --git a/view/theme/smoothly/php/default.php b/view/theme/smoothly/php/default.php index 1e97c6b46..568f267c1 100644 --- a/view/theme/smoothly/php/default.php +++ b/view/theme/smoothly/php/default.php @@ -2,7 +2,7 @@ <?php if(x($page,'title')) echo $page['title'] ?> - +