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 b689b73eec..afee3ac77d 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 f67a821f9d..653e90b535 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 97c09c20a9..2e0409cb7a 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 c1a6120dbb..76662d666c 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 0b8b713667..564626317b 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 6ab4ec77d6..246f7c31fa 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 83f6f1ab95..f7423d7c69 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 45326e291d..6d318a539e 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 4212ec9b13..ade6737f62 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 506f9f162f..9a19cfc8d3 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 ba48bb3926..4f7af868d5 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 c5844d13df..a62eded39d 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 1f1fd11204..c2b5ef17c0 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 47c4aa5e4c..2f07cb6eee 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 7bfb7c8691..f4d7aac105 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 65b03f2b94..9deb071eb3 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 d1d2fd0779..0b96e85512 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 c4839de792..b1fb2a53e1 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 44f5141ad8..77fcbaa72c 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 7f010cee41..384f4e8dd6 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 b7029397b5..03f0e24037 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 60de55a509..ac90806d0c 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 a599ddc1ed..325d5f59bc 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 77529714f2..b2908455b7 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 a22f919c89..67a8735a59 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 dcef73ffb2..fa3c8ebcd9 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 8c951a7fcf..73630ded7d 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 838a550944..05f18c3627 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 f9bf60cf54..8b3d3d371e 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 8512bea51e..76ff2a15e0 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 3563f2d705..547e089672 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 d150ff3de6..b839d6a03c 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 4d8ab6bcaa..f69541824a 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 07444d2bb5..5cb6fb99e9 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 646a4230c5..9d5533a03d 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 50099ac69c..8a6973e6ad 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 f858d8913e..51fdcf41a0 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 77a45f8a39..554c02225b 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 336ec1c2dd..fd44df4fbc 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 269d537854..e8f8356fbd 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 d29efecc6a..1707040e6c 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 32b44e6d00..3e3a89840a 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 614344ab93..b0728245c6 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 d68ac2ac9b..cc05be4ccd 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 381b067167..6b111d6ad4 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 afee3ac77d..a26d503271 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 6f662cdf15..d635ee8725 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 a62eded39d..c24ab9dbdb 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 b87fc0e8e0..0afd7af107 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 2f07cb6eee..6259879de2 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 c7cfe8d70f..835627586c 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 fdaec05ccd..396361e91b 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 0026f5ca6e..e380681934 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 ac90806d0c..5707b1b728 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 2ba1958a25..ba5e05b0ee 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 f69541824a..289ad887f9 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 46d3fcff66..e1b38cfc4c 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 3e3a89840a..799df063c2 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 b0728245c6..3b917aef19 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 cc05be4ccd..0a1879fe06 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 e51b531b5a..17d4961fcd 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 e93aac1125..39888630a4 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 6b111d6ad4..b1ec4bae53 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 c674a99d99..dc8f29b2fa 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 a873e45131..0e34709e9c 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 d739f56f26..062ec3b8a9 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 7e4262cb6a..24f41073e7 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 0fe3404f69..306345d391 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 4c22f0a118..b09153876d 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 341c2b8310..47210012ca 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 fc908522a1..5647fd493a 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 1e97c6b462..568f267c1c 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'] ?> - +