1
1
Fork 0

Merge pull request #3473 from Quix0r/rewrites/coding-convention-split2-6-2

Coding convention applied split 2-6-2 (of 2-14-2)
This commit is contained in:
Hypolite Petovan 2017-06-18 18:44:34 -04:00 committed by GitHub
commit ea88e15a8c
19 changed files with 748 additions and 621 deletions

View file

@ -9,37 +9,37 @@ Account - Basics
Nicht alle Friendica-Knoten bieten die Möglichkeit zur Registrierung. Nicht alle Friendica-Knoten bieten die Möglichkeit zur Registrierung.
Wenn die Registrierung möglich ist, wird ein "Registrieren"-Link unter dem Login-Feld auf der Startseite angezeigt, der zur Registrierungsseite führt. Wenn die Registrierung möglich ist, wird ein "Registrieren"-Link unter dem Login-Feld auf der Startseite angezeigt, der zur Registrierungsseite führt.
Die Stärke unseres Netzwerks ist, dass die verschiedenen Knoten komplett kompatibel zueinander sind. Die Stärke unseres Netzwerks ist, dass die verschiedenen Knoten komplett kompatibel zueinander sind.
Wenn der Knoten, den Du besuchst, keine Registrierung anbietet, oder wenn Du glaubst, dass Dir eine andere Seite möglicherweise besser gefällt, dann kannst Du hier eine <a href="https://dir.friendica.social/servers">Liste von öffentlichen Servern (Knoten)</a> finden und den Knoten heraus suchen, der am Besten zu Deinen Anforderungen passt. Wenn der Knoten, den Du besuchst, keine Registrierung anbietet, oder wenn Du glaubst, dass Dir eine andere Seite möglicherweise besser gefällt, dann kannst Du hier eine <a href="https://dir.friendica.social/servers">Liste von öffentlichen Servern (Knoten)</a> finden und den Knoten heraus suchen, der am Besten zu Deinen Anforderungen passt.
Wenn Du Deinen eigenen Server aufsetzen willst, kannst Du das ebenfalls machen. Wenn Du Deinen eigenen Server aufsetzen willst, kannst Du das ebenfalls machen.
Besuche <a href="http://friendi.ca">die Friendica-Webseite</a>, um den Code mit den Installationsanleitungen herunterzuladen. Besuche <a href="http://friendi.ca">die Friendica-Webseite</a>, um den Code mit den Installationsanleitungen herunterzuladen.
Es ist ein einfacher Installationsprozess, den jeder mit ein wenig Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen einfach handhaben kann. Es ist ein einfacher Installationsprozess, den jeder mit ein wenig Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen einfach handhaben kann.
*OpenID* *OpenID*
Das erste Feld auf der Registrierungsseite ist für eine OpenID-Adresse. Das erste Feld auf der Registrierungsseite ist für eine OpenID-Adresse.
Wenn Du keine OpenID-Adresse hast oder nicht wünschst, diese zu nutzen, dann lasse das Feld frei. Wenn Du keine OpenID-Adresse hast oder nicht wünschst, diese zu nutzen, dann lasse das Feld frei.
Wenn Du einen OpenID-Account hast und diesen nutzen willst, gib die Adresse in das Feld ein und klicke auf "Registrieren". Wenn Du einen OpenID-Account hast und diesen nutzen willst, gib die Adresse in das Feld ein und klicke auf "Registrieren".
Friendica wird versuchen, so viele Informationen wie möglich von Deinem OpenID-Provider zu übernehmen, um diese in Dein Profil auf dieser Seite einzutragen. Friendica wird versuchen, so viele Informationen wie möglich von Deinem OpenID-Provider zu übernehmen, um diese in Dein Profil auf dieser Seite einzutragen.
*Dein vollständiger Name* *Dein vollständiger Name*
Bitte trage Deinen vollständigen Namen **so ein, wie Du ihn im System anzeigen lassen willst**. Bitte trage Deinen vollständigen Namen **so ein, wie Du ihn im System anzeigen lassen willst**.
Viele Leute nutzen ihren richtigen Namen hierfür, allerdings besteht für dich keine Pflicht, das auch so zu machen. Viele Leute nutzen ihren richtigen Namen hierfür, allerdings besteht für dich keine Pflicht, das auch so zu machen.
*Email-Adresse* *Email-Adresse*
Bitte trage eine richtige Email-Adresse ein. Bitte trage eine richtige Email-Adresse ein.
Deine Email-Adresse wird **niemals** veröffentlicht. Deine Email-Adresse wird **niemals** veröffentlicht.
Wir benötigen diese, um Dir Account-Informationen und die Login-Daten zu schicken. Wir benötigen diese, um Dir Account-Informationen und die Login-Daten zu schicken.
Du erhältst zudem von Zeit zu Zeit Benachrichtigungen über eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit benötigen. Du erhältst zudem von Zeit zu Zeit Benachrichtigungen über eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit benötigen.
Du hast aber auch die Möglichkeit, diese Nachrichten in Deinen Account-Einstellungen komplett abzuschalten. Du hast aber auch die Möglichkeit, diese Nachrichten in Deinen Account-Einstellungen komplett abzuschalten.
Du musst nicht Deine Haupt-Email-Adresse sein, jedoch wird eine funktionierende Adresse benötigt. Du musst nicht Deine Haupt-Email-Adresse sein, jedoch wird eine funktionierende Adresse benötigt.
Ohne dieses kannst Du weder Dein Initialpasswort erhalten, noch Dein Passwort zurücksetzen. Ohne dieses kannst Du weder Dein Initialpasswort erhalten, noch Dein Passwort zurücksetzen.
Dies ist die einzige persönliche Information, die korrekt sein muss. Dies ist die einzige persönliche Information, die korrekt sein muss.
@ -85,7 +85,7 @@ Falls Du Schwierigkeiten beim Login hast, prüfe bitte, ob z. B. Deine Feststell
**Passwort ändern** **Passwort ändern**
Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst. Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst.
**Der Anfang** **Der Anfang**
@ -95,7 +95,7 @@ Ein ['Tipp für neue Mitglieder'](newmember)-Link zeigt sich in den ersten beide
**Persönliche Daten exportieren** **Persönliche Daten exportieren**
Du kannst eine Kopie Deiner persönlichen Daten in einer XML-Datei exportieren. Du kannst eine Kopie Deiner persönlichen Daten in einer XML-Datei exportieren.
Gehe hierzu in Deinen Einstellungen auf "Persönliche Daten exportieren". Gehe hierzu in Deinen Einstellungen auf "Persönliche Daten exportieren".

View file

@ -14,18 +14,19 @@ $objDDDBLResultHandler = new DataObjectPool('Result-Handler');
* *
**/ **/
$cloPDOStatementResultHandler = function(Queue $objQueue) { $cloPDOStatementResultHandler = function(Queue $objQueue) {
$objPDO = $objQueue->getState()->get('PDOStatement');
$objQueue->getState()->update(array('result' => $objPDO));
$objPDO = $objQueue->getState()->get('PDOStatement'); /*
$objQueue->getState()->update(array('result' => $objPDO)); * delete handler which closes the PDOStatement-cursor
* this will be done manual if using this handler
# delete handler which closes the PDOStatement-cursor */
# this will be done manual if using this handler $objQueue->deleteHandler(QUEUE_CLOSE_CURSOR_POSITION);
$objQueue->deleteHandler(QUEUE_CLOSE_CURSOR_POSITION);
}; };
$objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementResultHandler)); $objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementResultHandler));
if (! class_exists('dba')) {
/** /**
* *
* MySQL database class * MySQL database class
@ -36,8 +37,6 @@ $objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementR
* the debugging stream is safe to view within both terminals and web pages. * the debugging stream is safe to view within both terminals and web pages.
* *
*/ */
if (! class_exists('dba')) {
class dba { class dba {
private $debug = 0; private $debug = 0;
@ -146,16 +145,17 @@ class dba {
$a->save_timestamp($stamp1, "database"); $a->save_timestamp($stamp1, "database");
/// @TODO really check $a->config for 'system'? it is very generic and should be there /*
if (x($a->config, 'system') && x($a->config['system'], 'db_log')) { * Check if the configuration group 'system' and db_log is there. The
if (($duration > $a->config["system"]["db_loglimit"])) { * extra first check needs to be done to avoid endless loop.
$duration = round($duration, 3); */
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); if (x($a->config, 'system') && x($a->config['system'], 'db_log') && ($duration > $a->config["system"]["db_loglimit"])) {
@file_put_contents($a->config["system"]["db_log"], datetime_convert()."\t".$duration."\t". $duration = round($duration, 3);
basename($backtrace[1]["file"])."\t". $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
$backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t". @file_put_contents($a->config["system"]["db_log"], datetime_convert()."\t".$duration."\t".
substr($sql, 0, 2000)."\n", FILE_APPEND); basename($backtrace[1]["file"])."\t".
} $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
substr($sql, 0, 2000)."\n", FILE_APPEND);
} }
if ($intErrorCode) { if ($intErrorCode) {
@ -202,8 +202,11 @@ class dba {
} }
if ($onlyquery) { if ($onlyquery) {
$this->result = $r; # this will store an PDOStatement Object in result // this will store an PDOStatement Object in result
$this->result->execute(); # execute the Statement, to get its result $this->result = $r;
// execute the Statement, to get its result
$this->result->execute();
return true; return true;
} }
@ -262,7 +265,8 @@ function printable($s) {
return $s; return $s;
}} }}
// Procedural functions // --- Procedural functions ---
if (! function_exists('dbg')) { if (! function_exists('dbg')) {
function dbg($state) { function dbg($state) {
global $db; global $db;
@ -273,18 +277,20 @@ function dbg($state) {
if (! function_exists('dbesc')) { if (! function_exists('dbesc')) {
function dbesc($str) { function dbesc($str) {
global $db; global $db;
if ($db && $db->connected)
return($db->escape($str)); if ($db && $db->connected) {
else return $db->escape($str);
return(str_replace("'","\\'",$str)); } else {
return str_replace("'","\\'",$str);
}
}} }}
if (! function_exists('q')) { if (! function_exists('q')) {
/** /*
* Function: q($sql,$args); * Function: q($sql,$args);
* Description: execute SQL query with printf style args. * Description: execute SQL query with printf style args.
* Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d", * Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
* 'user', 1); * 'user', 1);
*/ */
function q($sql) { function q($sql) {
@ -301,23 +307,19 @@ function q($sql) {
return $db->q($stmt); return $db->q($stmt);
} }
/** /*
*
* This will happen occasionally trying to store the * This will happen occasionally trying to store the
* session data after abnormal program termination * session data after abnormal program termination
*
*/ */
logger('dba: no database: ' . print_r($args,true)); logger('dba: no database: ' . print_r($args,true));
return false; return false;
}} }}
if (! function_exists('dbq')) { if (! function_exists('dbq')) {
/** /*
* Raw db query, no arguments * Raw db query, no arguments
*/ */
function dbq($sql) { function dbq($sql) {
global $db; global $db;
if ($db && $db->connected) { if ($db && $db->connected) {
$ret = $db->q($sql); $ret = $db->q($sql);
@ -327,15 +329,14 @@ function dbq($sql) {
return $ret; return $ret;
}} }}
/*
* Caller is responsible for ensuring that any integer arguments to
* dbesc_array are actually integers and not malformed strings containing
* SQL injection vectors. All integer array elements should be specifically
* cast to int to avoid trouble.
*/
if (! function_exists('dbesc_array_cb')) { if (! function_exists('dbesc_array_cb')) {
function dbesc_array_cb(&$item, $key) { function dbesc_array_cb(&$item, $key) {
/*
* Caller is responsible for ensuring that any integer arguments to
* dbesc_array are actually integers and not malformed strings containing
* SQL injection vectors. All integer array elements should be specifically
* cast to int to avoid trouble.
*/
if (is_string($item)) { if (is_string($item)) {
$item = dbesc($item); $item = dbesc($item);
} }

View file

@ -30,7 +30,7 @@ function convert_to_innodb() {
$sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME'])); $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME']));
echo $sql."\n"; echo $sql."\n";
$result = @$db->q($sql); $result = $db->q($sql);
if (!dbm::is_result($result)) { if (!dbm::is_result($result)) {
print_update_error($db, $sql); print_update_error($db, $sql);
} }
@ -85,6 +85,7 @@ function update_fail($update_id, $error_message) {
/* /*
@TODO deprecated code?
$email_tpl = get_intltext_template("update_fail_eml.tpl"); $email_tpl = get_intltext_template("update_fail_eml.tpl");
$email_msg = replace_macros($email_tpl, array( $email_msg = replace_macros($email_tpl, array(
'$sitename' => $a->config['sitename'], '$sitename' => $a->config['sitename'],
@ -1764,10 +1765,10 @@ function dbstructure_run(&$argv, &$argc) {
} }
if (is_null($db)) { if (is_null($db)) {
@include(".htconfig.php"); @include ".htconfig.php";
require_once("include/dba.php"); require_once "include/dba.php";
$db = new dba($db_host, $db_user, $db_pass, $db_data); $db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data);
} }
if ($argc == 2) { if ($argc == 2) {

View file

@ -880,11 +880,14 @@ class Diaspora {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
return $r[0]; return $r[0];
} else { } else {
// We haven't found it? /*
// We use another function for it that will possibly create a contact entry * We haven't found it?
* We use another function for it that will possibly create a contact entry.
*/
$cid = get_contact($handle, $uid); $cid = get_contact($handle, $uid);
if ($cid > 0) { if ($cid > 0) {
/// @TODO Contact retrieval should be encapsulated into an "entity" class like `Contact`
$r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid)); $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -919,9 +922,11 @@ class Diaspora {
*/ */
private static function post_allow($importer, $contact, $is_comment = false) { private static function post_allow($importer, $contact, $is_comment = false) {
// perhaps we were already sharing with this person. Now they're sharing with us. /*
// That makes us friends. * Perhaps we were already sharing with this person. Now they're sharing with us.
// Normally this should have handled by getting a request - but this could get lost * That makes us friends.
* Normally this should have handled by getting a request - but this could get lost
*/
if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) {
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
intval(CONTACT_IS_FRIEND), intval(CONTACT_IS_FRIEND),
@ -934,16 +939,19 @@ class Diaspora {
// We don't seem to like that person // We don't seem to like that person
if ($contact["blocked"] || $contact["readonly"] || $contact["archive"]) { if ($contact["blocked"] || $contact["readonly"] || $contact["archive"]) {
// Maybe blocked, don't accept.
return false; return false;
// We are following this person? Then it is okay // We are following this person?
} elseif (($contact["rel"] == CONTACT_IS_SHARING) || ($contact["rel"] == CONTACT_IS_FRIEND)) { } elseif (($contact["rel"] == CONTACT_IS_SHARING) || ($contact["rel"] == CONTACT_IS_FRIEND)) {
// Yes, then it is fine.
return true; return true;
// Is it a post to a community? That's good // Is it a post to a community?
} elseif (($contact["rel"] == CONTACT_IS_FOLLOWER) && ($importer["page-flags"] == PAGE_COMMUNITY)) { } elseif (($contact["rel"] == CONTACT_IS_FOLLOWER) && ($importer["page-flags"] == PAGE_COMMUNITY)) {
// That's good
return true; return true;
} // Is the message a global user or a comment?
// Messages for the global users and comments are always accepted } elseif (($importer["uid"] == 0) || $is_comment) {
if (($importer["uid"] == 0) || $is_comment) { // Messages for the global users and comments are always accepted
return true; return true;
} }

View file

@ -853,18 +853,22 @@ function widget_events() {
return; return;
} }
// Cal logged in user (test permission at foreign profile page) /*
// If the $owner uid is available we know it is part of one of the profile pages (like /cal) * Cal logged in user (test permission at foreign profile page)
// So we have to test if if it's the own profile page of the logged in user * If the $owner uid is available we know it is part of one of the profile pages (like /cal)
// or a foreign one. For foreign profile pages we need to check if the feature * So we have to test if if it's the own profile page of the logged in user
// for exporting the cal is enabled (otherwise the widget would appear for logged in users * or a foreign one. For foreign profile pages we need to check if the feature
// on foreigen profile pages even if the widget is disabled) * for exporting the cal is enabled (otherwise the widget would appear for logged in users
* on foreigen profile pages even if the widget is disabled)
*/
if (intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) { if (intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) {
return; return;
} }
// If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and /*
// export feature isn't enabled * If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and
* export feature isn't enabled
*/
if (intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) { if (intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) {
return; return;
} }

View file

@ -158,7 +158,7 @@ function removelinebreak($message)
$currquotelevel = 0; $currquotelevel = 0;
$currline = $line; $currline = $line;
while ((strlen($currline)>0) && ((substr($currline, 0, 1) == '>') while ((strlen($currline)>0) && ((substr($currline, 0, 1) == '>')
|| (substr($currline, 0, 1) == ' '))) { || (substr($currline, 0, 1) == ' '))) {
if (substr($currline, 0, 1) == '>') if (substr($currline, 0, 1) == '>')
$currquotelevel++; $currquotelevel++;
@ -168,7 +168,7 @@ function removelinebreak($message)
$quotelevel = 0; $quotelevel = 0;
$nextline = trim($arrbody[$i+1]); $nextline = trim($arrbody[$i+1]);
while ((strlen($nextline)>0) && ((substr($nextline, 0, 1) == '>') while ((strlen($nextline)>0) && ((substr($nextline, 0, 1) == '>')
|| (substr($nextline, 0, 1) == ' '))) { || (substr($nextline, 0, 1) == ' '))) {
if (substr($nextline, 0, 1) == '>') if (substr($nextline, 0, 1) == '>')
$quotelevel++; $quotelevel++;
@ -203,7 +203,7 @@ function removelinebreak($message)
$lines[$lineno] .= ' '; $lines[$lineno] .= ' ';
while ((strlen($line)>0) && ((substr($line, 0, 1) == '>') while ((strlen($line)>0) && ((substr($line, 0, 1) == '>')
|| (substr($line, 0, 1) == ' '))) { || (substr($line, 0, 1) == ' '))) {
$line = ltrim(substr($line, 1)); $line = ltrim(substr($line, 1));
} }

View file

@ -91,7 +91,6 @@ function pop_lang() {
$lang = $a->langsave; $lang = $a->langsave;
} }
// l // l
if (! function_exists('load_translation_table')) { if (! function_exists('load_translation_table')) {

View file

@ -2,15 +2,15 @@
use Friendica\Core\Config; use Friendica\Core\Config;
require_once('include/queue_fn.php'); require_once 'include/queue_fn.php';
require_once('include/dfrn.php'); require_once 'include/dfrn.php';
require_once("include/datetime.php"); require_once 'include/datetime.php';
require_once('include/items.php'); require_once 'include/items.php';
require_once('include/bbcode.php'); require_once 'include/bbcode.php';
require_once('include/socgraph.php'); require_once 'include/socgraph.php';
require_once('include/cache.php'); require_once 'include/cache.php';
function queue_run(&$argv, &$argc){ function queue_run(&$argv, &$argc) {
global $a; global $a;
if ($argc > 1) { if ($argc > 1) {
@ -41,9 +41,10 @@ function queue_run(&$argv, &$argc){
q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
} }
// For the first 12 hours we'll try to deliver every 15 minutes /*
// After that, we'll only attempt delivery once per hour. * For the first 12 hours we'll try to deliver every 15 minutes
* After that, we'll only attempt delivery once per hour.
*/
$r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`"); $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
call_hooks('queue_predeliver', $a, $r); call_hooks('queue_predeliver', $a, $r);
@ -60,8 +61,8 @@ function queue_run(&$argv, &$argc){
// delivering // delivering
require_once('include/salmon.php'); require_once 'include/salmon.php';
require_once('include/diaspora.php'); require_once 'include/diaspora.php';
$r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1", $r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id)); intval($queue_id));

View file

@ -6,13 +6,13 @@ function auto_redir(App $a, $contact_nick) {
// prevent looping // prevent looping
if(x($_REQUEST,'redir') && intval($_REQUEST['redir'])) if (x($_REQUEST,'redir') && intval($_REQUEST['redir']))
return; return;
if((! $contact_nick) || ($contact_nick === $a->user['nickname'])) if ((! $contact_nick) || ($contact_nick === $a->user['nickname']))
return; return;
if(local_user()) { if (local_user()) {
// We need to find out if $contact_nick is a user on this hub, and if so, if I // We need to find out if $contact_nick is a user on this hub, and if so, if I
// am a contact of that user. However, that user may have other contacts with the // am a contact of that user. However, that user may have other contacts with the
@ -24,7 +24,7 @@ function auto_redir(App $a, $contact_nick) {
$baseurl = App::get_baseurl(); $baseurl = App::get_baseurl();
$domain_st = strpos($baseurl, "://"); $domain_st = strpos($baseurl, "://");
if($domain_st === false) if ($domain_st === false)
return; return;
$baseurl = substr($baseurl, $domain_st + 3); $baseurl = substr($baseurl, $domain_st + 3);
$nurl = normalise_link($baseurl); $nurl = normalise_link($baseurl);
@ -58,11 +58,11 @@ function auto_redir(App $a, $contact_nick) {
$dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']); $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
if($r[0]['duplex'] && $r[0]['issued-id']) { if ($r[0]['duplex'] && $r[0]['issued-id']) {
$orig_id = $r[0]['issued-id']; $orig_id = $r[0]['issued-id'];
$dfrn_id = '1:' . $orig_id; $dfrn_id = '1:' . $orig_id;
} }
if($r[0]['duplex'] && $r[0]['dfrn-id']) { if ($r[0]['duplex'] && $r[0]['dfrn-id']) {
$orig_id = $r[0]['dfrn-id']; $orig_id = $r[0]['dfrn-id'];
$dfrn_id = '0:' . $orig_id; $dfrn_id = '0:' . $orig_id;
} }
@ -70,7 +70,7 @@ function auto_redir(App $a, $contact_nick) {
// ensure that we've got a valid ID. There may be some edge cases with forums and non-duplex mode // ensure that we've got a valid ID. There may be some edge cases with forums and non-duplex mode
// that may have triggered some of the "went to {profile/intro} and got an RSS feed" issues // that may have triggered some of the "went to {profile/intro} and got an RSS feed" issues
if(strlen($dfrn_id) < 3) if (strlen($dfrn_id) < 3)
return; return;
$sec = random_string(); $sec = random_string();

View file

@ -170,11 +170,14 @@ function slapper($owner, $url, $slap) {
} }
logger('slapper for '.$url.' returned ' . $return_code); logger('slapper for '.$url.' returned ' . $return_code);
if (! $return_code) { if (! $return_code) {
return(-1); return -1;
} }
if (($return_code == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) { if (($return_code == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) {
return(-1); return -1;
} }
return ((($return_code >= 200) && ($return_code < 300)) ? 0 : 1); return ((($return_code >= 200) && ($return_code < 300)) ? 0 : 1);
} }

View file

@ -56,58 +56,65 @@ function authenticate_success($user_record, $login_initial = false, $interactive
$a->user = $user_record; $a->user = $user_record;
if($interactive) { if ($interactive) {
if ($a->user['login_date'] <= NULL_DATE) { if ($a->user['login_date'] <= NULL_DATE) {
$_SESSION['return_url'] = 'profile_photo/new'; $_SESSION['return_url'] = 'profile_photo/new';
$a->module = 'profile_photo'; $a->module = 'profile_photo';
info( t("Welcome ") . $a->user['username'] . EOL); info( t("Welcome ") . $a->user['username'] . EOL);
info( t('Please upload a profile photo.') . EOL); info( t('Please upload a profile photo.') . EOL);
} } else {
else
info( t("Welcome back ") . $a->user['username'] . EOL); info( t("Welcome back ") . $a->user['username'] . EOL);
}
} }
$member_since = strtotime($a->user['register_date']); $member_since = strtotime($a->user['register_date']);
if(time() < ($member_since + ( 60 * 60 * 24 * 14))) if (time() < ($member_since + ( 60 * 60 * 24 * 14))) {
$_SESSION['new_member'] = true; $_SESSION['new_member'] = true;
else } else {
$_SESSION['new_member'] = false; $_SESSION['new_member'] = false;
if(strlen($a->user['timezone'])) { }
if (strlen($a->user['timezone'])) {
date_default_timezone_set($a->user['timezone']); date_default_timezone_set($a->user['timezone']);
$a->timezone = $a->user['timezone']; $a->timezone = $a->user['timezone'];
} }
$master_record = $a->user; $master_record = $a->user;
if((x($_SESSION,'submanage')) && intval($_SESSION['submanage'])) { if ((x($_SESSION,'submanage')) && intval($_SESSION['submanage'])) {
$r = q("select * from user where uid = %d limit 1", $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($_SESSION['submanage']) intval($_SESSION['submanage'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$master_record = $r[0]; $master_record = $r[0];
}
} }
$r = q("SELECT `uid`,`username`,`nickname` FROM `user` WHERE `password` = '%s' AND `email` = '%s' AND `account_removed` = 0 ", $r = q("SELECT `uid`,`username`,`nickname` FROM `user` WHERE `password` = '%s' AND `email` = '%s' AND `account_removed` = 0 ",
dbesc($master_record['password']), dbesc($master_record['password']),
dbesc($master_record['email']) dbesc($master_record['email'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$a->identities = $r; $a->identities = $r;
else } else {
$a->identities = array(); $a->identities = array();
}
$r = q("select `user`.`uid`, `user`.`username`, `user`.`nickname` $r = q("SELECT `user`.`uid`, `user`.`username`, `user`.`nickname`
from manage INNER JOIN user on manage.mid = user.uid where `user`.`account_removed` = 0 FROM `manage`
and `manage`.`uid` = %d", INNER JOIN `user` ON `manage`.`mid` = `user`.`uid`
WHERE `user`.`account_removed` = 0 AND `manage`.`uid` = %d",
intval($master_record['uid']) intval($master_record['uid'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$a->identities = array_merge($a->identities,$r); $a->identities = array_merge($a->identities,$r);
}
if($login_initial) if ($login_initial) {
logger('auth_identities: ' . print_r($a->identities,true), LOGGER_DEBUG); logger('auth_identities: ' . print_r($a->identities,true), LOGGER_DEBUG);
if($login_refresh) }
if ($login_refresh) {
logger('auth_identities refresh: ' . print_r($a->identities,true), LOGGER_DEBUG); logger('auth_identities refresh: ' . print_r($a->identities,true), LOGGER_DEBUG);
}
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
intval($_SESSION['uid'])); intval($_SESSION['uid']));
@ -119,7 +126,7 @@ function authenticate_success($user_record, $login_initial = false, $interactive
header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] .'"'); header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] .'"');
if($login_initial || $login_refresh) { if ($login_initial || $login_refresh) {
q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d", q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
@ -228,7 +235,7 @@ function can_write_wall(App $a, $owner) {
} }
function permissions_sql($owner_id,$remote_verified = false,$groups = null) { function permissions_sql($owner_id, $remote_verified = false, $groups = null) {
$local_user = local_user(); $local_user = local_user();
$remote_user = remote_user(); $remote_user = remote_user();
@ -238,7 +245,6 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
* *
* default permissions - anonymous user * default permissions - anonymous user
*/ */
$sql = " AND allow_cid = '' $sql = " AND allow_cid = ''
AND allow_gid = '' AND allow_gid = ''
AND deny_cid = '' AND deny_cid = ''
@ -249,21 +255,18 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
* Profile owner - everything is visible * Profile owner - everything is visible
*/ */
if(($local_user) && ($local_user == $owner_id)) { if (($local_user) && ($local_user == $owner_id)) {
$sql = ''; $sql = '';
} } elseif ($remote_user) {
/*
* Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to.
* If pre-verified, the caller is expected to have already
* done this and passed the groups into this function.
*/
/** if (! $remote_verified) {
* Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to.
* If pre-verified, the caller is expected to have already
* done this and passed the groups into this function.
*/
elseif($remote_user) {
if(! $remote_verified) {
$r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1", $r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1",
intval($remote_user), intval($remote_user),
intval($owner_id) intval($owner_id)
@ -273,16 +276,18 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
$groups = init_groups_visitor($remote_user); $groups = init_groups_visitor($remote_user);
} }
} }
if($remote_verified) { if ($remote_verified) {
$gs = '<<>>'; // should be impossible to match $gs = '<<>>'; // should be impossible to match
if(is_array($groups) && count($groups)) { if (is_array($groups) && count($groups)) {
foreach($groups as $g) foreach ($groups as $g)
$gs .= '|<' . intval($g) . '>'; $gs .= '|<' . intval($g) . '>';
} }
/*$sql = sprintf( /*
* @TODO old-lost code found?
$sql = sprintf(
" AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' ) " AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' )
AND ( deny_cid = '' OR NOT deny_cid REGEXP '<%d>' ) AND ( deny_cid = '' OR NOT deny_cid REGEXP '<%d>' )
AND ( allow_gid = '' OR allow_gid REGEXP '%s' ) AND ( allow_gid = '' OR allow_gid REGEXP '%s' )
@ -292,7 +297,8 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
intval($remote_user), intval($remote_user),
dbesc($gs), dbesc($gs),
dbesc($gs) dbesc($gs)
);*/ );
*/
$sql = sprintf( $sql = sprintf(
" AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s') " AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') ) AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
@ -309,7 +315,7 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
} }
function item_permissions_sql($owner_id,$remote_verified = false,$groups = null) { function item_permissions_sql($owner_id, $remote_verified = false, $groups = null) {
$local_user = local_user(); $local_user = local_user();
$remote_user = remote_user(); $remote_user = remote_user();
@ -319,7 +325,6 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
* *
* default permissions - anonymous user * default permissions - anonymous user
*/ */
$sql = " AND `item`.allow_cid = '' $sql = " AND `item`.allow_cid = ''
AND `item`.allow_gid = '' AND `item`.allow_gid = ''
AND `item`.deny_cid = '' AND `item`.deny_cid = ''
@ -330,22 +335,17 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
/** /**
* Profile owner - everything is visible * Profile owner - everything is visible
*/ */
if ($local_user && ($local_user == $owner_id)) {
if($local_user && ($local_user == $owner_id)) {
$sql = ''; $sql = '';
} } elseif ($remote_user) {
/*
/** * Authenticated visitor. Unless pre-verified,
* Authenticated visitor. Unless pre-verified, * check that the contact belongs to this $owner_id
* check that the contact belongs to this $owner_id * and load the groups the visitor belongs to.
* and load the groups the visitor belongs to. * If pre-verified, the caller is expected to have already
* If pre-verified, the caller is expected to have already * done this and passed the groups into this function.
* done this and passed the groups into this function. */
*/ if (! $remote_verified) {
elseif($remote_user) {
if(! $remote_verified) {
$r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1", $r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1",
intval($remote_user), intval($remote_user),
intval($owner_id) intval($owner_id)
@ -355,13 +355,14 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
$groups = init_groups_visitor($remote_user); $groups = init_groups_visitor($remote_user);
} }
} }
if($remote_verified) { if ($remote_verified) {
$gs = '<<>>'; // should be impossible to match $gs = '<<>>'; // should be impossible to match
if(is_array($groups) && count($groups)) { if (is_array($groups) && count($groups)) {
foreach($groups as $g) foreach ($groups as $g) {
$gs .= '|<' . intval($g) . '>'; $gs .= '|<' . intval($g) . '>';
}
} }
$sql = sprintf( $sql = sprintf(
@ -412,7 +413,11 @@ function get_form_security_token($typename = '') {
} }
function check_form_security_token($typename = '', $formname = 'form_security_token') { function check_form_security_token($typename = '', $formname = 'form_security_token') {
if (!x($_REQUEST, $formname)) return false; if (!x($_REQUEST, $formname)) {
return false;
}
/// @TODO Careful, not secured!
$hash = $_REQUEST[$formname]; $hash = $_REQUEST[$formname];
$max_livetime = 10800; // 3 hours $max_livetime = 10800; // 3 hours
@ -420,7 +425,9 @@ function check_form_security_token($typename = '', $formname = 'form_security_to
$a = get_app(); $a = get_app();
$x = explode('.', $hash); $x = explode('.', $hash);
if (time() > (IntVal($x[0]) + $max_livetime)) return false; if (time() > (IntVal($x[0]) + $max_livetime)) {
return false;
}
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename); $sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename);
@ -441,7 +448,7 @@ function check_form_security_token_redirectOnErr($err_redirect, $typename = '',
} }
function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'form_security_token') { function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'form_security_token') {
if (!check_form_security_token($typename, $formname)) { if (!check_form_security_token($typename, $formname)) {
$a = get_app(); $a = get_app();
logger('check_form_security_token failed: user ' . $a->user['guid'] . ' - form element ' . $typename); logger('check_form_security_token failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
logger('check_form_security_token failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA); logger('check_form_security_token failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
header('HTTP/1.1 403 Forbidden'); header('HTTP/1.1 403 Forbidden');
@ -454,7 +461,7 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
// DFRN contact. They are *not* neccessarily unique across the entire site. // DFRN contact. They are *not* neccessarily unique across the entire site.
if(! function_exists('init_groups_visitor')) { if (! function_exists('init_groups_visitor')) {
function init_groups_visitor($contact_id) { function init_groups_visitor($contact_id) {
$groups = array(); $groups = array();
$r = q("SELECT `gid` FROM `group_member` $r = q("SELECT `gid` FROM `group_member`
@ -462,9 +469,8 @@ function init_groups_visitor($contact_id) {
intval($contact_id) intval($contact_id)
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach($r as $rr) foreach ($r as $rr)
$groups[] = $rr['gid']; $groups[] = $rr['gid'];
} }
return $groups; return $groups;
}} }}

View file

@ -53,8 +53,8 @@ function poco_load($cid, $uid = 0, $zcid = 0, $url = null) {
function poco_load_worker($cid, $uid, $zcid, $url) { function poco_load_worker($cid, $uid, $zcid, $url) {
$a = get_app(); $a = get_app();
if($cid) { if ($cid) {
if((! $url) || (! $uid)) { if ((! $url) || (! $uid)) {
$r = q("select `poco`, `uid` from `contact` where `id` = %d limit 1", $r = q("select `poco`, `uid` from `contact` where `id` = %d limit 1",
intval($cid) intval($cid)
); );
@ -63,12 +63,14 @@ function poco_load_worker($cid, $uid, $zcid, $url) {
$uid = $r[0]['uid']; $uid = $r[0]['uid'];
} }
} }
if(! $uid) if (! $uid) {
return; return;
}
} }
if(! $url) if (! $url) {
return; return;
}
$url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation') ; $url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation') ;
@ -80,18 +82,20 @@ function poco_load_worker($cid, $uid, $zcid, $url) {
logger('poco_load: return code: ' . $a->get_curl_code(), LOGGER_DEBUG); logger('poco_load: return code: ' . $a->get_curl_code(), LOGGER_DEBUG);
if(($a->get_curl_code() > 299) || (! $s)) if (($a->get_curl_code() > 299) || (! $s)) {
return; return;
}
$j = json_decode($s); $j = json_decode($s);
logger('poco_load: json: ' . print_r($j,true),LOGGER_DATA); logger('poco_load: json: ' . print_r($j,true),LOGGER_DATA);
if(! isset($j->entry)) if (! isset($j->entry)) {
return; return;
}
$total = 0; $total = 0;
foreach($j->entry as $entry) { foreach ($j->entry as $entry) {
$total ++; $total ++;
$profile_url = ''; $profile_url = '';
@ -155,13 +159,14 @@ function poco_load_worker($cid, $uid, $zcid, $url) {
} }
if (isset($entry->tags)) { if (isset($entry->tags)) {
foreach($entry->tags as $tag) { foreach ($entry->tags as $tag) {
$keywords = implode(", ", $tag); $keywords = implode(", ", $tag);
} }
} }
if (isset($entry->contactType) && ($entry->contactType >= 0)) if (isset($entry->contactType) && ($entry->contactType >= 0)) {
$contact_type = $entry->contactType; $contact_type = $entry->contactType;
}
$gcontact = array("url" => $profile_url, $gcontact = array("url" => $profile_url,
"name" => $name, "name" => $name,
@ -267,7 +272,7 @@ function sanitize_gcontact($gcontact) {
dbesc(normalise_link($gcontact['url'])) dbesc(normalise_link($gcontact['url']))
); );
if (count($x)) { if (dbm::is_result($x)) {
if (!isset($gcontact['network']) && ($x[0]["network"] != NETWORK_STATUSNET)) { if (!isset($gcontact['network']) && ($x[0]["network"] != NETWORK_STATUSNET)) {
$gcontact['network'] = $x[0]["network"]; $gcontact['network'] = $x[0]["network"];
} }
@ -299,7 +304,7 @@ function sanitize_gcontact($gcontact) {
if ($alternate && ($gcontact['network'] == NETWORK_OSTATUS)) { if ($alternate && ($gcontact['network'] == NETWORK_OSTATUS)) {
// Delete the old entry - if it exists // Delete the old entry - if it exists
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile))); $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
if ($r) { if (dbm::is_result($r)) {
q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile))); q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"])); q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"]));
} }
@ -353,6 +358,7 @@ function link_gcontact($gcid, $uid = 0, $cid = 0, $zcid = 0) {
intval($gcid), intval($gcid),
intval($zcid) intval($zcid)
); );
if (!dbm::is_result($r)) { if (!dbm::is_result($r)) {
q("INSERT INTO `glink` (`cid`, `uid`, `gcid`, `zcid`, `updated`) VALUES (%d, %d, %d, %d, '%s') ", q("INSERT INTO `glink` (`cid`, `uid`, `gcid`, `zcid`, `updated`) VALUES (%d, %d, %d, %d, '%s') ",
intval($cid), intval($cid),
@ -374,11 +380,13 @@ function link_gcontact($gcid, $uid = 0, $cid = 0, $zcid = 0) {
function poco_reachable($profile, $server = "", $network = "", $force = false) { function poco_reachable($profile, $server = "", $network = "", $force = false) {
if ($server == "") if ($server == "") {
$server = poco_detect_server($profile); $server = poco_detect_server($profile);
}
if ($server == "") if ($server == "") {
return true; return true;
}
return poco_check_server($server, $network, $force); return poco_check_server($server, $network, $force);
} }
@ -661,7 +669,7 @@ function poco_last_updated($profile, $force = false) {
$last_updated = ""; $last_updated = "";
foreach ($entries AS $entry) { foreach ($entries as $entry) {
$published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue; $published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
$updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue; $updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue;
@ -694,48 +702,55 @@ function poco_last_updated($profile, $force = false) {
function poco_do_update($created, $updated, $last_failure, $last_contact) { function poco_do_update($created, $updated, $last_failure, $last_contact) {
$now = strtotime(datetime_convert()); $now = strtotime(datetime_convert());
if ($updated > $last_contact) if ($updated > $last_contact) {
$contact_time = strtotime($updated); $contact_time = strtotime($updated);
else } else {
$contact_time = strtotime($last_contact); $contact_time = strtotime($last_contact);
}
$failure_time = strtotime($last_failure); $failure_time = strtotime($last_failure);
$created_time = strtotime($created); $created_time = strtotime($created);
// If there is no "created" time then use the current time // If there is no "created" time then use the current time
if ($created_time <= 0) if ($created_time <= 0) {
$created_time = $now; $created_time = $now;
}
// If the last contact was less than 24 hours then don't update // If the last contact was less than 24 hours then don't update
if (($now - $contact_time) < (60 * 60 * 24)) if (($now - $contact_time) < (60 * 60 * 24)) {
return false; return false;
}
// If the last failure was less than 24 hours then don't update // If the last failure was less than 24 hours then don't update
if (($now - $failure_time) < (60 * 60 * 24)) if (($now - $failure_time) < (60 * 60 * 24)) {
return false; return false;
}
// If the last contact was less than a week ago and the last failure is older than a week then don't update // If the last contact was less than a week ago and the last failure is older than a week then don't update
//if ((($now - $contact_time) < (60 * 60 * 24 * 7)) && ($contact_time > $failure_time)) //if ((($now - $contact_time) < (60 * 60 * 24 * 7)) && ($contact_time > $failure_time))
// return false; // return false;
// If the last contact time was more than a week ago and the contact was created more than a week ago, then only try once a week // If the last contact time was more than a week ago and the contact was created more than a week ago, then only try once a week
if ((($now - $contact_time) > (60 * 60 * 24 * 7)) && (($now - $created_time) > (60 * 60 * 24 * 7)) && (($now - $failure_time) < (60 * 60 * 24 * 7))) if ((($now - $contact_time) > (60 * 60 * 24 * 7)) && (($now - $created_time) > (60 * 60 * 24 * 7)) && (($now - $failure_time) < (60 * 60 * 24 * 7))) {
return false; return false;
}
// If the last contact time was more than a month ago and the contact was created more than a month ago, then only try once a month // If the last contact time was more than a month ago and the contact was created more than a month ago, then only try once a month
if ((($now - $contact_time) > (60 * 60 * 24 * 30)) && (($now - $created_time) > (60 * 60 * 24 * 30)) && (($now - $failure_time) < (60 * 60 * 24 * 30))) if ((($now - $contact_time) > (60 * 60 * 24 * 30)) && (($now - $created_time) > (60 * 60 * 24 * 30)) && (($now - $failure_time) < (60 * 60 * 24 * 30))) {
return false; return false;
}
return true; return true;
} }
function poco_to_boolean($val) { function poco_to_boolean($val) {
if (($val == "true") || ($val == 1)) if (($val == "true") || ($val == 1)) {
return(true); return true;
if (($val == "false") || ($val == 0)) } elseif (($val == "false") || ($val == 0)) {
return(false); return false;
}
return ($val); return $val;
} }
/** /**
@ -763,7 +778,7 @@ function poco_detect_poco_data($data) {
return false; return false;
} }
foreach ($data->entry[0]->urls AS $url) { foreach ($data->entry[0]->urls as $url) {
if ($url->type == 'zot') { if ($url->type == 'zot') {
$server = array(); $server = array();
$server["platform"] = 'Hubzilla'; $server["platform"] = 'Hubzilla';
@ -798,7 +813,7 @@ function poco_fetch_nodeinfo($server_url) {
$nodeinfo_url = ''; $nodeinfo_url = '';
foreach ($nodeinfo->links AS $link) { foreach ($nodeinfo->links as $link) {
if ($link->rel == 'http://nodeinfo.diaspora.software/ns/schema/1.0') { if ($link->rel == 'http://nodeinfo.diaspora.software/ns/schema/1.0') {
$nodeinfo_url = $link->href; $nodeinfo_url = $link->href;
} }
@ -851,7 +866,7 @@ function poco_fetch_nodeinfo($server_url) {
$gnusocial = false; $gnusocial = false;
if (is_array($nodeinfo->protocols->inbound)) { if (is_array($nodeinfo->protocols->inbound)) {
foreach ($nodeinfo->protocols->inbound AS $inbound) { foreach ($nodeinfo->protocols->inbound as $inbound) {
if ($inbound == 'diaspora') { if ($inbound == 'diaspora') {
$diaspora = true; $diaspora = true;
} }
@ -926,13 +941,11 @@ function poco_detect_server_type($body) {
$attr[$attribute->name] = $attribute->value; $attr[$attribute->name] = $attribute->value;
} }
} }
if ($attr['property'] == 'generator') { if ($attr['property'] == 'generator' && in_array($attr['content'], array("hubzilla", "BlaBlaNet"))) {
if (in_array($attr['content'], array("hubzilla", "BlaBlaNet"))) { $server = array();
$server = array(); $server["platform"] = $attr['content'];
$server["platform"] = $attr['content']; $server["version"] = "";
$server["version"] = ""; $server["network"] = NETWORK_DIASPORA;
$server["network"] = NETWORK_DIASPORA;
}
} }
} }
} }
@ -951,8 +964,9 @@ function poco_check_server($server_url, $network = "", $force = false) {
$server_url = trim($server_url, "/"); $server_url = trim($server_url, "/");
$server_url = str_replace("/index.php", "", $server_url); $server_url = str_replace("/index.php", "", $server_url);
if ($server_url == "") if ($server_url == "") {
return false; return false;
}
$servers = q("SELECT * FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url))); $servers = q("SELECT * FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url)));
if (dbm::is_result($servers)) { if (dbm::is_result($servers)) {
@ -964,8 +978,9 @@ function poco_check_server($server_url, $network = "", $force = false) {
$poco = $servers[0]["poco"]; $poco = $servers[0]["poco"];
$noscrape = $servers[0]["noscrape"]; $noscrape = $servers[0]["noscrape"];
if ($network == "") if ($network == "") {
$network = $servers[0]["network"]; $network = $servers[0]["network"];
}
$last_contact = $servers[0]["last_contact"]; $last_contact = $servers[0]["last_contact"];
$last_failure = $servers[0]["last_failure"]; $last_failure = $servers[0]["last_failure"];
@ -1083,10 +1098,10 @@ function poco_check_server($server_url, $network = "", $force = false) {
} }
$lines = explode("\n",$serverret["header"]); $lines = explode("\n",$serverret["header"]);
if(count($lines)) { if (count($lines)) {
foreach($lines as $line) { foreach($lines as $line) {
$line = trim($line); $line = trim($line);
if(stristr($line,'X-Diaspora-Version:')) { if (stristr($line,'X-Diaspora-Version:')) {
$platform = "Diaspora"; $platform = "Diaspora";
$version = trim(str_replace("X-Diaspora-Version:", "", $line)); $version = trim(str_replace("X-Diaspora-Version:", "", $line));
$version = trim(str_replace("x-diaspora-version:", "", $version)); $version = trim(str_replace("x-diaspora-version:", "", $version));
@ -1095,7 +1110,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
$version = $versionparts[0]; $version = $versionparts[0];
} }
if(stristr($line,'Server: Mastodon')) { if (stristr($line,'Server: Mastodon')) {
$platform = "Mastodon"; $platform = "Mastodon";
$network = NETWORK_OSTATUS; $network = NETWORK_OSTATUS;
} }
@ -1165,10 +1180,11 @@ function poco_check_server($server_url, $network = "", $force = false) {
$network = NETWORK_DIASPORA; $network = NETWORK_DIASPORA;
} }
if (isset($data->site->redmatrix)) { if (isset($data->site->redmatrix)) {
if (isset($data->site->redmatrix->PLATFORM_NAME)) if (isset($data->site->redmatrix->PLATFORM_NAME)) {
$platform = $data->site->redmatrix->PLATFORM_NAME; $platform = $data->site->redmatrix->PLATFORM_NAME;
elseif (isset($data->site->redmatrix->RED_PLATFORM)) } elseif (isset($data->site->redmatrix->RED_PLATFORM)) {
$platform = $data->site->redmatrix->RED_PLATFORM; $platform = $data->site->redmatrix->RED_PLATFORM;
}
$version = $data->site->redmatrix->RED_VERSION; $version = $data->site->redmatrix->RED_VERSION;
$network = NETWORK_DIASPORA; $network = NETWORK_DIASPORA;
@ -1185,12 +1201,13 @@ function poco_check_server($server_url, $network = "", $force = false) {
$data->site->private = poco_to_boolean($data->site->private); $data->site->private = poco_to_boolean($data->site->private);
$data->site->inviteonly = poco_to_boolean($data->site->inviteonly); $data->site->inviteonly = poco_to_boolean($data->site->inviteonly);
if (!$data->site->closed && !$data->site->private and $data->site->inviteonly) if (!$data->site->closed && !$data->site->private and $data->site->inviteonly) {
$register_policy = REGISTER_APPROVE; $register_policy = REGISTER_APPROVE;
elseif (!$data->site->closed && !$data->site->private) } elseif (!$data->site->closed && !$data->site->private) {
$register_policy = REGISTER_OPEN; $register_policy = REGISTER_OPEN;
else } else {
$register_policy = REGISTER_CLOSED; $register_policy = REGISTER_CLOSED;
}
} }
} }
} }
@ -1254,8 +1271,9 @@ function poco_check_server($server_url, $network = "", $force = false) {
if (!$failure && in_array($network, array(NETWORK_DFRN, NETWORK_OSTATUS))) { if (!$failure && in_array($network, array(NETWORK_DFRN, NETWORK_OSTATUS))) {
$serverret = z_fetch_url($server_url."/friendica/json"); $serverret = z_fetch_url($server_url."/friendica/json");
if (!$serverret["success"]) if (!$serverret["success"]) {
$serverret = z_fetch_url($server_url."/friendika/json"); $serverret = z_fetch_url($server_url."/friendika/json");
}
if ($serverret["success"]) { if ($serverret["success"]) {
$data = json_decode($serverret["body"]); $data = json_decode($serverret["body"]);
@ -1299,7 +1317,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
if (($last_contact <= $last_failure) && !$failure) { if (($last_contact <= $last_failure) && !$failure) {
logger("Server ".$server_url." seems to be alive, but last contact wasn't set - could be a bug", LOGGER_DEBUG); logger("Server ".$server_url." seems to be alive, but last contact wasn't set - could be a bug", LOGGER_DEBUG);
} else if (($last_contact >= $last_failure) && $failure) { } elseif (($last_contact >= $last_failure) && $failure) {
logger("Server ".$server_url." seems to be dead, but last failure wasn't set - could be a bug", LOGGER_DEBUG); logger("Server ".$server_url." seems to be dead, but last failure wasn't set - could be a bug", LOGGER_DEBUG);
} }
@ -1346,12 +1364,12 @@ function poco_check_server($server_url, $network = "", $force = false) {
dbesc(datetime_convert()) dbesc(datetime_convert())
); );
} }
logger("End discovery for server ".$server_url, LOGGER_DEBUG); logger("End discovery for server " . $server_url, LOGGER_DEBUG);
return !$failure; return !$failure;
} }
function count_common_friends($uid,$cid) { function count_common_friends($uid, $cid) {
$r = q("SELECT count(*) as `total` $r = q("SELECT count(*) as `total`
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
@ -1364,20 +1382,22 @@ function count_common_friends($uid,$cid) {
intval($cid) intval($cid)
); );
// logger("count_common_friends: $uid $cid {$r[0]['total']}"); // logger("count_common_friends: $uid $cid {$r[0]['total']}");
if (dbm::is_result($r)) if (dbm::is_result($r)) {
return $r[0]['total']; return $r[0]['total'];
}
return 0; return 0;
} }
function common_friends($uid,$cid,$start = 0,$limit=9999,$shuffle = false) { function common_friends($uid, $cid, $start = 0, $limit = 9999, $shuffle = false) {
if($shuffle) if ($shuffle) {
$sql_extra = " order by rand() "; $sql_extra = " order by rand() ";
else } else {
$sql_extra = " order by `gcontact`.`name` asc "; $sql_extra = " order by `gcontact`.`name` asc ";
}
$r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid` $r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid`
FROM `glink` FROM `glink`
@ -1396,12 +1416,13 @@ function common_friends($uid,$cid,$start = 0,$limit=9999,$shuffle = false) {
intval($limit) intval($limit)
); );
/// @TODO Check all calling-findings of this function if they properly use dbm::is_result()
return $r; return $r;
} }
function count_common_friends_zcid($uid,$zcid) { function count_common_friends_zcid($uid, $zcid) {
$r = q("SELECT count(*) as `total` $r = q("SELECT count(*) as `total`
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
@ -1411,18 +1432,20 @@ function count_common_friends_zcid($uid,$zcid) {
intval($uid) intval($uid)
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
return $r[0]['total']; return $r[0]['total'];
}
return 0; return 0;
} }
function common_friends_zcid($uid,$zcid,$start = 0, $limit = 9999,$shuffle = false) { function common_friends_zcid($uid, $zcid, $start = 0, $limit = 9999, $shuffle = false) {
if($shuffle) if ($shuffle) {
$sql_extra = " order by rand() "; $sql_extra = " order by rand() ";
else } else {
$sql_extra = " order by `gcontact`.`name` asc "; $sql_extra = " order by `gcontact`.`name` asc ";
}
$r = q("SELECT `gcontact`.* $r = q("SELECT `gcontact`.*
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
@ -1435,12 +1458,13 @@ function common_friends_zcid($uid,$zcid,$start = 0, $limit = 9999,$shuffle = fal
intval($limit) intval($limit)
); );
/// @TODO Check all calling-findings of this function if they properly use dbm::is_result()
return $r; return $r;
} }
function count_all_friends($uid,$cid) { function count_all_friends($uid, $cid) {
$r = q("SELECT count(*) as `total` $r = q("SELECT count(*) as `total`
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
@ -1450,14 +1474,15 @@ function count_all_friends($uid,$cid) {
intval($uid) intval($uid)
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
return $r[0]['total']; return $r[0]['total'];
}
return 0; return 0;
} }
function all_friends($uid,$cid,$start = 0, $limit = 80) { function all_friends($uid, $cid, $start = 0, $limit = 80) {
$r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid` $r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid`
FROM `glink` FROM `glink`
@ -1473,6 +1498,7 @@ function all_friends($uid,$cid,$start = 0, $limit = 80) {
intval($limit) intval($limit)
); );
/// @TODO Check all calling-findings of this function if they properly use dbm::is_result()
return $r; return $r;
} }
@ -1484,20 +1510,24 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
return array(); return array();
} }
// Uncommented because the result of the queries are to big to store it in the cache. /*
// We need to decide if we want to change the db column type or if we want to delete it. * Uncommented because the result of the queries are to big to store it in the cache.
// $list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit); * We need to decide if we want to change the db column type or if we want to delete it.
// if (!is_null($list)) { */
// return $list; //$list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit);
// } //if (!is_null($list)) {
// return $list;
//}
$network = array(NETWORK_DFRN); $network = array(NETWORK_DFRN);
if (get_config('system','diaspora_enabled')) if (get_config('system','diaspora_enabled')) {
$network[] = NETWORK_DIASPORA; $network[] = NETWORK_DIASPORA;
}
if (!get_config('system','ostatus_disabled')) if (!get_config('system','ostatus_disabled')) {
$network[] = NETWORK_OSTATUS; $network[] = NETWORK_OSTATUS;
}
$sql_network = implode("', '", $network); $sql_network = implode("', '", $network);
$sql_network = "'".$sql_network."'"; $sql_network = "'".$sql_network."'";
@ -1524,9 +1554,11 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
); );
if (dbm::is_result($r) && count($r) >= ($limit -1)) { if (dbm::is_result($r) && count($r) >= ($limit -1)) {
// Uncommented because the result of the queries are to big to store it in the cache. /*
// We need to decide if we want to change the db column type or if we want to delete it. * Uncommented because the result of the queries are to big to store it in the cache.
// Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES); * We need to decide if we want to change the db column type or if we want to delete it.
*/
//Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES);
return $r; return $r;
} }
@ -1550,18 +1582,23 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
); );
$list = array(); $list = array();
foreach ($r2 AS $suggestion) foreach ($r2 as $suggestion) {
$list[$suggestion["nurl"]] = $suggestion; $list[$suggestion["nurl"]] = $suggestion;
}
foreach ($r AS $suggestion) foreach ($r as $suggestion) {
$list[$suggestion["nurl"]] = $suggestion; $list[$suggestion["nurl"]] = $suggestion;
}
while (sizeof($list) > ($limit)) while (sizeof($list) > ($limit)) {
array_pop($list); array_pop($list);
}
// Uncommented because the result of the queries are to big to store it in the cache. /*
// We need to decide if we want to change the db column type or if we want to delete it. * Uncommented because the result of the queries are to big to store it in the cache.
// Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES); * We need to decide if we want to change the db column type or if we want to delete it.
*/
//Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES);
return $list; return $list;
} }
@ -1572,7 +1609,7 @@ function update_suggestions() {
$done = array(); $done = array();
/// @TODO Check if it is really neccessary to poll the own server /// @TODO Check if it is really neccessary to poll the own server
poco_load(0,0,0,App::get_baseurl() . '/poco'); poco_load(0, 0, 0, App::get_baseurl() . '/poco');
$done[] = App::get_baseurl() . '/poco'; $done[] = App::get_baseurl() . '/poco';
@ -1602,8 +1639,9 @@ function update_suggestions() {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r as $rr) { foreach ($r as $rr) {
$base = substr($rr['poco'],0,strrpos($rr['poco'],'/')); $base = substr($rr['poco'],0,strrpos($rr['poco'],'/'));
if(! in_array($base,$done)) if (! in_array($base,$done)) {
poco_load(0,0,0,$base); poco_load(0,0,0,$base);
}
} }
} }
} }
@ -1624,7 +1662,7 @@ function poco_fetch_serverlist($poco) {
return; return;
} }
foreach ($serverlist AS $server) { foreach ($serverlist as $server) {
$server_url = str_replace("/index.php", "", $server->url); $server_url = str_replace("/index.php", "", $server->url);
$r = q("SELECT `nurl` FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url))); $r = q("SELECT `nurl` FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url)));
@ -1640,8 +1678,9 @@ function poco_discover_federation() {
if ($last) { if ($last) {
$next = $last + (24 * 60 * 60); $next = $last + (24 * 60 * 60);
if($next > time()) if ($next > time()) {
return; return;
}
} }
// Discover Friendica, Hubzilla and Diaspora servers // Discover Friendica, Hubzilla and Diaspora servers
@ -1650,7 +1689,7 @@ function poco_discover_federation() {
if ($serverdata) { if ($serverdata) {
$servers = json_decode($serverdata); $servers = json_decode($serverdata);
foreach ($servers->pods AS $server) { foreach ($servers->pods as $server) {
proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode("https://".$server->host)); proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode("https://".$server->host));
} }
} }
@ -1662,7 +1701,7 @@ function poco_discover_federation() {
if ($serverdata) { if ($serverdata) {
$servers = json_decode($serverdata); $servers = json_decode($serverdata);
foreach ($servers AS $server) { foreach ($servers as $server) {
$url = (is_null($server->https_score) ? 'http' : 'https').'://'.$server->name; $url = (is_null($server->https_score) ? 'http' : 'https').'://'.$server->name;
proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($url)); proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($url));
} }
@ -1679,7 +1718,7 @@ function poco_discover_federation() {
// if ($result["success"]) { // if ($result["success"]) {
// $servers = json_decode($result["body"]); // $servers = json_decode($result["body"]);
// foreach($servers->data AS $server) // foreach($servers->data as $server)
// poco_check_server($server->instance_address); // poco_check_server($server->instance_address);
// } // }
//} //}
@ -1765,7 +1804,7 @@ function poco_discover($complete = false) {
$r = q("SELECT `id`, `url`, `network` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update)); $r = q("SELECT `id`, `url`, `network` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r AS $server) { foreach ($r as $server) {
if (!poco_check_server($server["url"], $server["network"])) { if (!poco_check_server($server["url"], $server["network"])) {
// The server is not reachable? Okay, then we will try it later // The server is not reachable? Okay, then we will try it later
@ -1785,18 +1824,20 @@ function poco_discover($complete = false) {
function poco_discover_server_users($data, $server) { function poco_discover_server_users($data, $server) {
if (!isset($data->entry)) if (!isset($data->entry)) {
return; return;
}
foreach ($data->entry AS $entry) { foreach ($data->entry as $entry) {
$username = ""; $username = "";
if (isset($entry->urls)) { if (isset($entry->urls)) {
foreach($entry->urls as $url) foreach ($entry->urls as $url) {
if ($url->type == 'profile') { if ($url->type == 'profile') {
$profile_url = $url->value; $profile_url = $url->value;
$urlparts = parse_url($profile_url); $urlparts = parse_url($profile_url);
$username = end(explode("/", $urlparts["path"])); $username = end(explode("/", $urlparts["path"]));
} }
}
} }
if ($username != "") { if ($username != "") {
logger("Fetch contacts for the user ".$username." from the server ".$server["nurl"], LOGGER_DEBUG); logger("Fetch contacts for the user ".$username." from the server ".$server["nurl"], LOGGER_DEBUG);
@ -1805,20 +1846,22 @@ function poco_discover_server_users($data, $server) {
$url = $server["poco"]."/".$username."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation"; $url = $server["poco"]."/".$username."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
$retdata = z_fetch_url($url); $retdata = z_fetch_url($url);
if ($retdata["success"]) if ($retdata["success"]) {
poco_discover_server(json_decode($retdata["body"]), 3); poco_discover_server(json_decode($retdata["body"]), 3);
}
} }
} }
} }
function poco_discover_server($data, $default_generation = 0) { function poco_discover_server($data, $default_generation = 0) {
if (!isset($data->entry) || !count($data->entry)) if (!isset($data->entry) || !count($data->entry)) {
return false; return false;
}
$success = false; $success = false;
foreach ($data->entry AS $entry) { foreach ($data->entry as $entry) {
$profile_url = ''; $profile_url = '';
$profile_photo = ''; $profile_photo = '';
$connect_url = ''; $connect_url = '';
@ -1835,7 +1878,7 @@ function poco_discover_server($data, $default_generation = 0) {
$name = $entry->displayName; $name = $entry->displayName;
if (isset($entry->urls)) { if (isset($entry->urls)) {
foreach($entry->urls as $url) { foreach ($entry->urls as $url) {
if ($url->type == 'profile') { if ($url->type == 'profile') {
$profile_url = $url->value; $profile_url = $url->value;
continue; continue;
@ -1860,19 +1903,19 @@ function poco_discover_server($data, $default_generation = 0) {
$updated = date("Y-m-d H:i:s", strtotime($entry->updated)); $updated = date("Y-m-d H:i:s", strtotime($entry->updated));
} }
if(isset($entry->network)) { if (isset($entry->network)) {
$network = $entry->network; $network = $entry->network;
} }
if(isset($entry->currentLocation)) { if (isset($entry->currentLocation)) {
$location = $entry->currentLocation; $location = $entry->currentLocation;
} }
if(isset($entry->aboutMe)) { if (isset($entry->aboutMe)) {
$about = html2bbcode($entry->aboutMe); $about = html2bbcode($entry->aboutMe);
} }
if(isset($entry->gender)) { if (isset($entry->gender)) {
$gender = $entry->gender; $gender = $entry->gender;
} }
@ -1884,7 +1927,7 @@ function poco_discover_server($data, $default_generation = 0) {
$contact_type = $entry->contactType; $contact_type = $entry->contactType;
} }
if(isset($entry->tags)) { if (isset($entry->tags)) {
foreach ($entry->tags as $tag) { foreach ($entry->tags as $tag) {
$keywords = implode(", ", $tag); $keywords = implode(", ", $tag);
} }
@ -1930,19 +1973,23 @@ function poco_discover_server($data, $default_generation = 0) {
function clean_contact_url($url) { function clean_contact_url($url) {
$parts = parse_url($url); $parts = parse_url($url);
if (!isset($parts["scheme"]) || !isset($parts["host"])) if (!isset($parts["scheme"]) || !isset($parts["host"])) {
return $url; return $url;
}
$new_url = $parts["scheme"]."://".$parts["host"]; $new_url = $parts["scheme"]."://".$parts["host"];
if (isset($parts["port"])) if (isset($parts["port"])) {
$new_url .= ":".$parts["port"]; $new_url .= ":".$parts["port"];
}
if (isset($parts["path"])) if (isset($parts["path"])) {
$new_url .= $parts["path"]; $new_url .= $parts["path"];
}
if ($new_url != $url) if ($new_url != $url) {
logger("Cleaned contact url ".$url." to ".$new_url." - Called by: ".App::callstack(), LOGGER_DEBUG); logger("Cleaned contact url ".$url." to ".$new_url." - Called by: ".App::callstack(), LOGGER_DEBUG);
}
return $new_url; return $new_url;
} }
@ -1981,19 +2028,22 @@ function get_gcontact_id($contact) {
return false; return false;
} }
if ($contact["network"] == NETWORK_STATUSNET) if ($contact["network"] == NETWORK_STATUSNET) {
$contact["network"] = NETWORK_OSTATUS; $contact["network"] = NETWORK_OSTATUS;
}
// All new contacts are hidden by default // All new contacts are hidden by default
if (!isset($contact["hide"])) if (!isset($contact["hide"])) {
$contact["hide"] = true; $contact["hide"] = true;
}
// Replace alternate OStatus user format with the primary one // Replace alternate OStatus user format with the primary one
fix_alternate_contact_address($contact); fix_alternate_contact_address($contact);
// Remove unwanted parts from the contact url (e.g. "?zrl=...") // Remove unwanted parts from the contact url (e.g. "?zrl=...")
if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
$contact["url"] = clean_contact_url($contact["url"]); $contact["url"] = clean_contact_url($contact["url"]);
}
dba::lock('gcontact'); dba::lock('gcontact');
$r = q("SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", $r = q("SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
@ -2031,7 +2081,7 @@ function get_gcontact_id($contact) {
$r = q("SELECT `id`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 2", $r = q("SELECT `id`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 2",
dbesc(normalise_link($contact["url"]))); dbesc(normalise_link($contact["url"])));
if ($r) { if (dbm::is_result($r)) {
$gcontact_id = $r[0]["id"]; $gcontact_id = $r[0]["id"];
$doprobing = in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, "")); $doprobing = in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""));
@ -2064,8 +2114,9 @@ function update_gcontact($contact) {
$gcontact_id = get_gcontact_id($contact); $gcontact_id = get_gcontact_id($contact);
if (!$gcontact_id) if (!$gcontact_id) {
return false; return false;
}
$r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`,
`contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url` `contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url`
@ -2074,8 +2125,9 @@ function update_gcontact($contact) {
// Get all field names // Get all field names
$fields = array(); $fields = array();
foreach ($r[0] AS $field => $data) foreach ($r[0] as $field => $data) {
$fields[$field] = $data; $fields[$field] = $data;
}
unset($fields["url"]); unset($fields["url"]);
unset($fields["updated"]); unset($fields["updated"]);
@ -2083,47 +2135,58 @@ function update_gcontact($contact) {
// Bugfix: We had an error in the storing of keywords which lead to the "0" // Bugfix: We had an error in the storing of keywords which lead to the "0"
// This value is still transmitted via poco. // This value is still transmitted via poco.
if ($contact["keywords"] == "0") if ($contact["keywords"] == "0") {
unset($contact["keywords"]); unset($contact["keywords"]);
}
if ($r[0]["keywords"] == "0") if ($r[0]["keywords"] == "0") {
$r[0]["keywords"] = ""; $r[0]["keywords"] = "";
}
// assign all unassigned fields from the database entry // assign all unassigned fields from the database entry
foreach ($fields AS $field => $data) foreach ($fields as $field => $data) {
if (!isset($contact[$field]) || ($contact[$field] == "")) if (!isset($contact[$field]) || ($contact[$field] == "")) {
$contact[$field] = $r[0][$field]; $contact[$field] = $r[0][$field];
}
}
if (!isset($contact["hide"])) if (!isset($contact["hide"])) {
$contact["hide"] = $r[0]["hide"]; $contact["hide"] = $r[0]["hide"];
}
$fields["hide"] = $r[0]["hide"]; $fields["hide"] = $r[0]["hide"];
if ($contact["network"] == NETWORK_STATUSNET) if ($contact["network"] == NETWORK_STATUSNET) {
$contact["network"] = NETWORK_OSTATUS; $contact["network"] = NETWORK_OSTATUS;
}
// Replace alternate OStatus user format with the primary one // Replace alternate OStatus user format with the primary one
fix_alternate_contact_address($contact); fix_alternate_contact_address($contact);
if (!isset($contact["updated"])) if (!isset($contact["updated"])) {
$contact["updated"] = dbm::date(); $contact["updated"] = dbm::date();
}
if ($contact["server_url"] == "") { if ($contact["server_url"] == "") {
$server_url = $contact["url"]; $server_url = $contact["url"];
$server_url = matching_url($server_url, $contact["alias"]); $server_url = matching_url($server_url, $contact["alias"]);
if ($server_url != "") if ($server_url != "") {
$contact["server_url"] = $server_url; $contact["server_url"] = $server_url;
}
$server_url = matching_url($server_url, $contact["photo"]); $server_url = matching_url($server_url, $contact["photo"]);
if ($server_url != "") if ($server_url != "") {
$contact["server_url"] = $server_url; $contact["server_url"] = $server_url;
}
$server_url = matching_url($server_url, $contact["notify"]); $server_url = matching_url($server_url, $contact["notify"]);
if ($server_url != "") if ($server_url != "") {
$contact["server_url"] = $server_url; $contact["server_url"] = $server_url;
} else }
} else {
$contact["server_url"] = normalise_link($contact["server_url"]); $contact["server_url"] = normalise_link($contact["server_url"]);
}
if (($contact["addr"] == "") && ($contact["server_url"] != "") && ($contact["nick"] != "")) { if (($contact["addr"] == "") && ($contact["server_url"] != "") && ($contact["nick"] != "")) {
$hostname = str_replace("http://", "", $contact["server_url"]); $hostname = str_replace("http://", "", $contact["server_url"]);
@ -2135,11 +2198,12 @@ function update_gcontact($contact) {
unset($fields["generation"]); unset($fields["generation"]);
if ((($contact["generation"] > 0) && ($contact["generation"] <= $r[0]["generation"])) || ($r[0]["generation"] == 0)) { if ((($contact["generation"] > 0) && ($contact["generation"] <= $r[0]["generation"])) || ($r[0]["generation"] == 0)) {
foreach ($fields AS $field => $data) foreach ($fields as $field => $data) {
if ($contact[$field] != $r[0][$field]) { if ($contact[$field] != $r[0][$field]) {
logger("Difference for contact ".$contact["url"]." in field '".$field."'. New value: '".$contact[$field]."', old value '".$r[0][$field]."'", LOGGER_DEBUG); logger("Difference for contact ".$contact["url"]." in field '".$field."'. New value: '".$contact[$field]."', old value '".$r[0][$field]."'", LOGGER_DEBUG);
$update = true; $update = true;
} }
}
if ($contact["generation"] < $r[0]["generation"]) { if ($contact["generation"] < $r[0]["generation"]) {
logger("Difference for contact ".$contact["url"]." in field 'generation'. new value: '".$contact["generation"]."', old value '".$r[0]["generation"]."'", LOGGER_DEBUG); logger("Difference for contact ".$contact["url"]." in field 'generation'. new value: '".$contact["generation"]."', old value '".$r[0]["generation"]."'", LOGGER_DEBUG);
@ -2171,7 +2235,7 @@ function update_gcontact($contact) {
$r = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0 ORDER BY `id` LIMIT 1", $r = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0 ORDER BY `id` LIMIT 1",
dbesc(normalise_link($contact["url"]))); dbesc(normalise_link($contact["url"])));
if ($r) { if (dbm::is_result($r)) {
logger("Update shadow contact ".$r[0]["id"], LOGGER_DEBUG); logger("Update shadow contact ".$r[0]["id"], LOGGER_DEBUG);
update_contact_avatar($contact["photo"], 0, $r[0]["id"]); update_contact_avatar($contact["photo"], 0, $r[0]["id"]);
@ -2231,10 +2295,11 @@ function update_gcontact_for_user($uid) {
"country-name" => $r[0]["country-name"])); "country-name" => $r[0]["country-name"]));
// The "addr" field was added in 3.4.3 so it can be empty for older users // The "addr" field was added in 3.4.3 so it can be empty for older users
if ($r[0]["addr"] != "") if ($r[0]["addr"] != "") {
$addr = $r[0]["nickname"].'@'.str_replace(array("http://", "https://"), "", App::get_baseurl()); $addr = $r[0]["nickname"].'@'.str_replace(array("http://", "https://"), "", App::get_baseurl());
else } else {
$addr = $r[0]["addr"]; $addr = $r[0]["addr"];
}
$gcontact = array("name" => $r[0]["name"], "location" => $location, "about" => $r[0]["about"], $gcontact = array("name" => $r[0]["name"], "location" => $location, "about" => $r[0]["about"],
"gender" => $r[0]["gender"], "keywords" => $r[0]["pub_keywords"], "gender" => $r[0]["gender"], "keywords" => $r[0]["pub_keywords"],
@ -2262,33 +2327,37 @@ function gs_fetch_users($server) {
$url = $server."/main/statistics"; $url = $server."/main/statistics";
$result = z_fetch_url($url); $result = z_fetch_url($url);
if (!$result["success"]) if (!$result["success"]) {
return false; return false;
}
$statistics = json_decode($result["body"]); $statistics = json_decode($result["body"]);
if (is_object($statistics->config)) { if (is_object($statistics->config)) {
if ($statistics->config->instance_with_ssl) if ($statistics->config->instance_with_ssl) {
$server = "https://"; $server = "https://";
else } else {
$server = "http://"; $server = "http://";
}
$server .= $statistics->config->instance_address; $server .= $statistics->config->instance_address;
$hostname = $statistics->config->instance_address; $hostname = $statistics->config->instance_address;
} else { } else {
if ($statistics->instance_with_ssl) /// @TODO is_object() above means here no object, still $statistics is being used as object
if ($statistics->instance_with_ssl) {
$server = "https://"; $server = "https://";
else } else {
$server = "http://"; $server = "http://";
}
$server .= $statistics->instance_address; $server .= $statistics->instance_address;
$hostname = $statistics->instance_address; $hostname = $statistics->instance_address;
} }
if (is_object($statistics->users)) if (is_object($statistics->users)) {
foreach ($statistics->users AS $nick => $user) { foreach ($statistics->users as $nick => $user) {
$profile_url = $server."/".$user->nickname; $profile_url = $server."/".$user->nickname;
$contact = array("url" => $profile_url, $contact = array("url" => $profile_url,
@ -2300,6 +2369,7 @@ function gs_fetch_users($server) {
"photo" => App::get_baseurl()."/images/person-175.jpg"); "photo" => App::get_baseurl()."/images/person-175.jpg");
get_gcontact_id($contact); get_gcontact_id($contact);
} }
}
} }
/** /**
@ -2315,10 +2385,11 @@ function gs_discover() {
$r = q("SELECT `nurl`, `url` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `network` = '%s' AND `last_poco_query` < '%s' ORDER BY RAND() LIMIT 5", $r = q("SELECT `nurl`, `url` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `network` = '%s' AND `last_poco_query` < '%s' ORDER BY RAND() LIMIT 5",
dbesc(NETWORK_OSTATUS), dbesc($last_update)); dbesc(NETWORK_OSTATUS), dbesc($last_update));
if (!$r) if (!dbm::is_result($r)) {
return; return;
}
foreach ($r AS $server) { foreach ($r as $server) {
gs_fetch_users($server["url"]); gs_fetch_users($server["url"]);
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"])); q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
} }
@ -2337,5 +2408,6 @@ function poco_serverlist() {
if (!dbm::is_result($r)) { if (!dbm::is_result($r)) {
return false; return false;
} }
return $r; return $r;
} }

View file

@ -58,10 +58,10 @@ function create_tags_from_item($itemid) {
if (substr(trim($tag), 0, 1) == "#") { if (substr(trim($tag), 0, 1) == "#") {
// try to ignore #039 or #1 or anything like that // try to ignore #039 or #1 or anything like that
if(ctype_digit(substr(trim($tag),1))) if (ctype_digit(substr(trim($tag),1)))
continue; continue;
// try to ignore html hex escapes, e.g. #x2317 // try to ignore html hex escapes, e.g. #x2317
if((substr(trim($tag),1,1) == 'x' || substr(trim($tag),1,1) == 'X') && ctype_digit(substr(trim($tag),2))) if ((substr(trim($tag),1,1) == 'x' || substr(trim($tag),1,1) == 'X') && ctype_digit(substr(trim($tag),2)))
continue; continue;
$type = TERM_HASHTAG; $type = TERM_HASHTAG;
$term = substr($tag, 1); $term = substr($tag, 1);
@ -107,9 +107,10 @@ function create_tags_from_item($itemid) {
function create_tags_from_itemuri($itemuri, $uid) { function create_tags_from_itemuri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if(count($messages)) { if (count($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
create_tags_from_item($message["id"]); create_tags_from_item($message["id"]);
}
} }
} }

View file

@ -69,7 +69,7 @@ class Template implements ITemplateEngine {
* {{ if <$var>==<val|$var> }}...[{{ else }} ...]{{ endif }} * {{ if <$var>==<val|$var> }}...[{{ else }} ...]{{ endif }}
* {{ if <$var>!=<val|$var> }}...[{{ else }} ...]{{ endif }} * {{ if <$var>!=<val|$var> }}...[{{ else }} ...]{{ endif }}
*/ */
private function _replcb_if($args) { private function _replcb_if ($args) {
if (strpos($args[2], "==") > 0) { if (strpos($args[2], "==") > 0) {
list($a, $b) = array_map("trim", explode("==", $args[2])); list($a, $b) = array_map("trim", explode("==", $args[2]));
$a = $this->_get_var($a); $a = $this->_get_var($a);
@ -95,7 +95,7 @@ class Template implements ITemplateEngine {
* {{ for <$var> as $name }}...{{ endfor }} * {{ for <$var> as $name }}...{{ endfor }}
* {{ for <$var> as $key=>$name }}...{{ endfor }} * {{ for <$var> as $key=>$name }}...{{ endfor }}
*/ */
private function _replcb_for($args) { private function _replcb_for ($args) {
$m = array_map('trim', explode(" as ", $args[2])); $m = array_map('trim', explode(" as ", $args[2]));
$x = explode("=>", $m[1]); $x = explode("=>", $m[1]);
if (count($x) == 1) { if (count($x) == 1) {
@ -109,14 +109,16 @@ class Template implements ITemplateEngine {
//$vals = $this->r[$m[0]]; //$vals = $this->r[$m[0]];
$vals = $this->_get_var($m[0]); $vals = $this->_get_var($m[0]);
$ret = ""; $ret = "";
if (!is_array($vals)) if (!is_array($vals)) {
return $ret; return $ret;
}
foreach ($vals as $k => $v) { foreach ($vals as $k => $v) {
$this->_push_stack(); $this->_push_stack();
$r = $this->r; $r = $this->r;
$r[$varname] = $v; $r[$varname] = $v;
if ($keyname != '') if ($keyname != '') {
$r[$keyname] = (($k === 0) ? '0' : $k); $r[$keyname] = (($k === 0) ? '0' : $k);
}
$ret .= $this->replace($args[3], $r); $ret .= $this->replace($args[3], $r);
$this->_pop_stack(); $this->_pop_stack();
} }

File diff suppressed because it is too large Load diff

View file

@ -177,29 +177,34 @@ function add_shadow_entry($itemid) {
function update_thread_uri($itemuri, $uid) { function update_thread_uri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if (dbm::is_result($messages)) if (dbm::is_result($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
update_thread($message["id"]); update_thread($message["id"]);
}
}
} }
function update_thread($itemid, $setmention = false) { function update_thread($itemid, $setmention = false) {
$items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`, $items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`,
`deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid)); `deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
if (!dbm::is_result($items)) if (!dbm::is_result($items)) {
return; return;
}
$item = $items[0]; $item = $items[0];
if ($setmention) if ($setmention) {
$item["mention"] = 1; $item["mention"] = 1;
}
$sql = ""; $sql = "";
foreach ($item AS $field => $data) foreach ($item AS $field => $data)
if (!in_array($field, array("guid", "title", "body", "rendered-html", "rendered-hash"))) { if (!in_array($field, array("guid", "title", "body", "rendered-html", "rendered-hash"))) {
if ($sql != "") if ($sql != "") {
$sql .= ", "; $sql .= ", ";
}
$sql .= "`".$field."` = '".dbesc($data)."'"; $sql .= "`".$field."` = '".dbesc($data)."'";
} }
@ -211,8 +216,9 @@ function update_thread($itemid, $setmention = false) {
// Updating a shadow item entry // Updating a shadow item entry
$items = q("SELECT `id` FROM `item` WHERE `guid` = '%s' AND `uid` = 0 LIMIT 1", dbesc($item["guid"])); $items = q("SELECT `id` FROM `item` WHERE `guid` = '%s' AND `uid` = 0 LIMIT 1", dbesc($item["guid"]));
if (!$items) if (!dbm::is_result($items)) {
return; return;
}
$result = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d", $result = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d",
dbesc($item["title"]), dbesc($item["title"]),
@ -227,9 +233,11 @@ function update_thread($itemid, $setmention = false) {
function delete_thread_uri($itemuri, $uid) { function delete_thread_uri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if(count($messages)) if (dbm::is_result($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
delete_thread($message["id"], $itemuri); delete_thread($message["id"], $itemuri);
}
}
} }
function delete_thread($itemid, $itemuri = "") { function delete_thread($itemid, $itemuri = "") {

View file

@ -56,7 +56,7 @@ server {
#Traditional SSL #Traditional SSL
ssl_certificate /etc/nginx/ssl/friendica.example.net.chain.pem; ssl_certificate /etc/nginx/ssl/friendica.example.net.chain.pem;
ssl_certificate_key /etc/nginx/ssl/example.net.key; ssl_certificate_key /etc/nginx/ssl/example.net.key;
# If you have used letsencrypt as your SSL provider, remove the previous two lines, and uncomment the following two (adjusting the path) instead. # If you have used letsencrypt as your SSL provider, remove the previous two lines, and uncomment the following two (adjusting the path) instead.
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

View file

@ -1,7 +1,7 @@
# FRIENDICA Distributed Social Network # FRIENDICA Distributed Social Network
# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project # Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project
# This file is distributed under the same license as the Friendica package. # This file is distributed under the same license as the Friendica package.
# #
# Translators: # Translators:
# Andy H3 <andy@hubup.pro>, 2017 # Andy H3 <andy@hubup.pro>, 2017
msgid "" msgid ""

View file

@ -1,7 +1,7 @@
# FRIENDICA Distributed Social Network # FRIENDICA Distributed Social Network
# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project # Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project
# This file is distributed under the same license as the Friendica package. # This file is distributed under the same license as the Friendica package.
# #
# Translators: # Translators:
msgid "" msgid ""
msgstr "" msgstr ""