use Friendica\App;
use Friendica\Content\OEmbed;
+use Friendica\Core\Addon;
use Friendica\Core\Config;
+use Friendica\Core\L10n;
use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBM;
use Friendica\Model\Contact;
use Friendica\Model\GContact;
use Friendica\Model\Group;
+use Friendica\Model\Item;
use Friendica\Model\Profile;
use Friendica\Model\Term;
use Friendica\Model\User;
use Friendica\Object\Image;
use Friendica\Protocol\OStatus;
use Friendica\Util\Crypto;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
use Friendica\Util\XML;
+use Friendica\Content\Text\BBCode;
use dba;
use DOMDocument;
}
}
- $check_date = datetime_convert('UTC', 'UTC', $last_update, 'Y-m-d H:i:s');
+ $check_date = DateTimeFormat::utc($last_update);
$r = q(
"SELECT `item`.*, `item`.`id` AS `item_id`,
$root = self::addHeader($doc, $owner, $author, $alternatelink, true);
/// @TODO This hook can't work anymore
- // call_hooks('atom_feed', $atom);
+ // Addon::callHooks('atom_feed', $atom);
if (!DBM::is_result($items) || $onlyheader) {
$atom = trim($doc->saveXML());
- call_hooks('atom_feed_end', $atom);
+ Addon::callHooks('atom_feed_end', $atom);
return $atom;
}
$atom = trim($doc->saveXML());
- call_hooks('atom_feed_end', $atom);
+ Addon::callHooks('atom_feed_end', $atom);
return $atom;
}
XML::addElement($doc, $mail, "dfrn:id", $item['uri']);
XML::addElement($doc, $mail, "dfrn:in-reply-to", $item['parent-uri']);
- XML::addElement($doc, $mail, "dfrn:sentdate", datetime_convert('UTC', 'UTC', $item['created'] . '+00:00', ATOM_TIME));
+ XML::addElement($doc, $mail, "dfrn:sentdate", DateTimeFormat::utc($item['created'] . '+00:00', DateTimeFormat::ATOM));
XML::addElement($doc, $mail, "dfrn:subject", $item['title']);
XML::addElement($doc, $mail, "dfrn:content", $item['body']);
/* get site pubkey. this could be a new installation with no site keys*/
$pubkey = Config::get('system', 'site_pubkey');
if (! $pubkey) {
- $res = Crypto::newKeypair(2048);
+ $res = Crypto::newKeypair(1024);
Config::set('system', 'site_prvkey', $res['prvkey']);
Config::set('system', 'site_pubkey', $res['pubkey']);
}
/// @todo We need a way to transmit the different page flags like "PAGE_PRVGROUP"
- XML::addElement($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME));
+ XML::addElement($doc, $root, "updated", DateTimeFormat::utcNow(DateTimeFormat::ATOM));
$author = self::addAuthor($doc, $owner, $authorelement, $public);
$root->appendChild($author);
$author = $doc->createElement($authorelement);
- $namdate = datetime_convert('UTC', 'UTC', $owner['name-date'].'+00:00', ATOM_TIME);
- $uridate = datetime_convert('UTC', 'UTC', $owner['uri-date'].'+00:00', ATOM_TIME);
- $picdate = datetime_convert('UTC', 'UTC', $owner['avatar-date'].'+00:00', ATOM_TIME);
+ $namdate = DateTimeFormat::utc($owner['name-date'].'+00:00', DateTimeFormat::ATOM);
+ $uridate = DateTimeFormat::utc($owner['uri-date'].'+00:00', DateTimeFormat::ATOM);
+ $picdate = DateTimeFormat::utc($owner['avatar-date'].'+00:00', DateTimeFormat::ATOM);
$attributes = [];
if ($activity) {
$entry = $doc->createElement($element);
- $r = parse_xml_string($activity, false);
+ $r = XML::parseString($activity, false);
if (!$r) {
return false;
}
$r->link = preg_replace('/\<link(.*?)\"\>/', '<link$1"/>', $r->link);
// XML does need a single element as root element so we add a dummy element here
- $data = parse_xml_string("<dummy>" . $r->link . "</dummy>", false);
+ $data = XML::parseString("<dummy>" . $r->link . "</dummy>", false);
if (is_object($data)) {
foreach ($data->link as $link) {
$attributes = [];
}
if ($item['deleted']) {
- $attributes = ["ref" => $item['uri'], "when" => datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00', ATOM_TIME)];
+ $attributes = ["ref" => $item['uri'], "when" => DateTimeFormat::utc($item['edited'] . '+00:00', DateTimeFormat::ATOM)];
return XML::createElement($doc, "at:deleted-entry", "", $attributes);
}
}
if ($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) {
- $body = fix_private_photos($item['body'], $owner['uid'], $item, $cid);
+ $body = Item::fixPrivatePhotos($item['body'], $owner['uid'], $item, $cid);
} else {
$body = $item['body'];
}
XML::addElement($doc, $entry, "id", $item["uri"]);
XML::addElement($doc, $entry, "title", $item["title"]);
- XML::addElement($doc, $entry, "published", datetime_convert("UTC", "UTC", $item["created"] . "+00:00", ATOM_TIME));
- XML::addElement($doc, $entry, "updated", datetime_convert("UTC", "UTC", $item["edited"] . "+00:00", ATOM_TIME));
+ XML::addElement($doc, $entry, "published", DateTimeFormat::utc($item["created"] . "+00:00", DateTimeFormat::ATOM));
+ XML::addElement($doc, $entry, "updated", DateTimeFormat::utc($item["edited"] . "+00:00", DateTimeFormat::ATOM));
// "dfrn:env" is used to read the content
XML::addElement($doc, $entry, "dfrn:env", base64url_encode($body, true));
XML::addElement($doc, $entry, "dfrn:diaspora_signature", $sign);
}
- XML::addElement($doc, $entry, "activity:verb", construct_verb($item));
+ XML::addElement($doc, $entry, "activity:verb", self::constructVerb($item));
if ($item['object-type'] != "") {
XML::addElement($doc, $entry, "activity:object-type", $item['object-type']);
$entry->appendChild($actarg);
}
- $tags = item_getfeedtags($item);
+ $tags = Item::getFeedTags($item);
if (count($tags)) {
foreach ($tags as $t) {
logger('dfrn_deliver: ' . $url);
- $ret = z_fetch_url($url);
+ $ret = Network::curl($url);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return -2; // timed out
return 3;
}
- $res = parse_xml_string($xml);
+ $res = XML::parseString($xml);
if ((intval($res->status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id))) {
return (($res->status) ? $res->status : 3);
switch ($rino_remote_version) {
case 1:
- case 2:
- // Force downgrade in case the remote server is still using the deprecated version 2
- $rino = 1;
- $rino_remote_version = 1;
-
$key = openssl_random_pseudo_bytes(16);
$data = self::aesEncrypt($postvars['data'], $key);
break;
$postvars['rino'] = $rino_remote_version;
$postvars['data'] = bin2hex($data);
- //logger('rino: sent key = ' . $key, LOGGER_DEBUG);
-
if ($dfrn_version >= 2.1) {
if (($contact['duplex'] && strlen($contact['pubkey']))
|| ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars, true), LOGGER_DATA);
- $xml = post_url($contact['notify'], $postvars);
+ $xml = Network::post($contact['notify'], $postvars);
logger('dfrn_deliver: ' . "RECEIVED: " . $xml, LOGGER_DATA);
Contact::unmarkForArchival($contact);
}
- $res = parse_xml_string($xml);
+ $res = XML::parseString($xml);
if (!isset($res->status)) {
return -11;
"SELECT `id` FROM `event` WHERE `uid` = %d AND `cid` = %d AND `start` = '%s' AND `type` = '%s' LIMIT 1",
intval($contact["uid"]),
intval($contact["id"]),
- dbesc(datetime_convert("UTC", "UTC", $birthday)),
+ dbesc(DateTimeFormat::utc($birthday)),
dbesc("birthday")
);
logger("updating birthday: ".$birthday." for contact ".$contact["id"]);
- $bdtext = sprintf(t("%s\'s birthday"), $contact["name"]);
- $bdtext2 = sprintf(t("Happy Birthday %s"), " [url=".$contact["url"]."]".$contact["name"]."[/url]");
+ $bdtext = L10n::t("%s\'s birthday", $contact["name"]);
+ $bdtext2 = L10n::t("Happy Birthday %s", " [url=".$contact["url"]."]".$contact["name"]."[/url]");
$r = q(
"INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
intval($contact["uid"]),
intval($contact["id"]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert("UTC", "UTC", $birthday)),
- dbesc(datetime_convert("UTC", "UTC", $birthday . " + 1 day ")),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utc($birthday)),
+ dbesc(DateTimeFormat::utc($birthday . " + 1 day ")),
dbesc($bdtext),
dbesc($bdtext2),
dbesc("birthday")
intval($suggest["cid"]),
dbesc($suggest["body"]),
dbesc($hash),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
intval(0)
);
{
$changed = false;
- if (edited_timestamp_is_newer($current, $item)) {
+ if (self::isEditedTimestampNewer($current, $item)) {
// do not accept (ignore) an earlier edit than one we currently have.
- if (datetime_convert("UTC", "UTC", $item["edited"]) < $current["edited"]) {
+ if (DateTimeFormat::utc($item["edited"]) < $current["edited"]) {
return false;
}
$fields = ['title' => $item["title"], 'body' => $item["body"],
- 'tag' => $item["tag"], 'changed' => datetime_convert(),
- 'edited' => datetime_convert("UTC", "UTC", $item["edited"])];
+ 'tag' => $item["tag"], 'changed' => DateTimeFormat::utcNow(),
+ 'edited' => DateTimeFormat::utc($item["edited"])];
$condition = ["`uri` = ? AND `uid` IN (0, ?)", $item["uri"], $importer["importer_uid"]];
dba::update('item', $fields, $condition);
* valid community action. Also forum_mode makes it valid for sure.
* If neither, it's not.
*/
-
- /// @TODO Maybe merge these if() blocks into one?
if ($is_a_remote_action && $community && (!$r[0]["forum_mode"]) && (!$r[0]["wall"])) {
$is_a_remote_action = false;
logger("not a community action");
if (!$verb) {
return;
}
- $xo = parse_xml_string($item["object"], false);
+ $xo = XML::parseString($item["object"], false);
if (($xo->type == ACTIVITY_OBJ_PERSON) && ($xo->id)) {
// somebody was poked/prodded. Was it me?
"to_email" => $importer["email"],
"uid" => $importer["importer_uid"],
"item" => $item,
- "link" => System::baseUrl()."/display/".urlencode(get_item_guid($posted_id)),
+ "link" => System::baseUrl()."/display/".urlencode(Item::getGuidById($posted_id)),
"source_name" => stripslashes($item["author-name"]),
"source_link" => $item["author-link"],
"source_photo" => ((link_compare($item["author-link"], $importer["url"]))
// This function once was responsible for DFRN and OStatus.
if (activity_match($item["verb"], ACTIVITY_FOLLOW)) {
logger("New follower");
- new_follower($importer, $contact, $item, $nickname);
+ Contact::addRelationship($importer, $contact, $item, $nickname);
return false;
}
if (activity_match($item["verb"], ACTIVITY_UNFOLLOW)) {
logger("Lost follower");
- lose_follower($importer, $contact, $item);
+ Contact::removeFollower($importer, $contact, $item);
return false;
}
if (activity_match($item["verb"], ACTIVITY_REQ_FRIEND)) {
logger("New friend request");
- new_follower($importer, $contact, $item, $nickname, true);
+ Contact::addRelationship($importer, $contact, $item, $nickname, true);
return false;
}
if (activity_match($item["verb"], ACTIVITY_UNFRIEND)) {
logger("Lost sharer");
- lose_sharer($importer, $contact, $item);
+ Contact::removeSharer($importer, $contact, $item);
return false;
}
} else {
}
if (($item["verb"] == ACTIVITY_TAG) && ($item["object-type"] == ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item["object"], false);
- $xt = parse_xml_string($item["target"], false);
+ $xo = XML::parseString($item["object"], false);
+ $xt = XML::parseString($item["target"], false);
if ($xt->type == ACTIVITY_OBJ_NOTE) {
$r = q(
$title = "";
foreach ($links as $link) {
foreach ($link->attributes as $attributes) {
- /// @TODO Rewrite these repeated (same) if () statements to a switch()
- if ($attributes->name == "href") {
- $href = $attributes->textContent;
- }
- if ($attributes->name == "rel") {
- $rel = $attributes->textContent;
- }
- if ($attributes->name == "type") {
- $type = $attributes->textContent;
- }
- if ($attributes->name == "length") {
- $length = $attributes->textContent;
- }
- if ($attributes->name == "title") {
- $title = $attributes->textContent;
+ switch ($attributes->name) {
+ case "href" : $href = $attributes->textContent; break;
+ case "rel" : $rel = $attributes->textContent; break;
+ case "type" : $type = $attributes->textContent; break;
+ case "length": $length = $attributes->textContent; break;
+ case "title" : $title = $attributes->textContent; break;
}
}
if (($rel != "") && ($href != "")) {
);
// Is there an existing item?
- if (DBM::is_result($current) && edited_timestamp_is_newer($current[0], $item)
- && (datetime_convert("UTC", "UTC", $item["edited"]) < $current[0]["edited"])
+ if (DBM::is_result($current) && self::isEditedTimestampNewer($current[0], $item)
+ && (DateTimeFormat::utc($item["edited"]) < $current[0]["edited"])
) {
logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG);
return;
// make sure nobody is trying to sneak some html tags by us
$item["body"] = notags(base64url_decode($item["body"]));
- $item["body"] = limit_body_size($item["body"]);
+ $item["body"] = BBCode::limitBodySize($item["body"]);
/// @todo Do we really need this check for HTML elements? (It was copied from the old function)
if ((strpos($item['body'], '<') !== false) && (strpos($item['body'], '>') !== false)) {
$item["guid"] = $xpath->query("dfrn:diaspora_guid/text()", $entry)->item(0)->nodeValue;
- // We store the data from "dfrn:diaspora_signature" in a different table, this is done in "item_store"
+ // We store the data from "dfrn:diaspora_signature" in a different table, this is done in "Item::insert"
$dsprsig = unxmlify($xpath->query("dfrn:diaspora_signature/text()", $entry)->item(0)->nodeValue);
if ($dsprsig != "") {
$item["dsprsig"] = $dsprsig;
$item["object"] = self::transformActivity($xpath, $object, "object");
if (trim($item["object"]) != "") {
- $r = parse_xml_string($item["object"], false);
+ $r = XML::parseString($item["object"], false);
if (isset($r->type)) {
$item["object-type"] = $r->type;
}
if (($item["network"] != $author["network"]) && ($author["network"] != "")) {
$item["network"] = $author["network"];
}
-
- /// @TODO maybe remove this old-lost code then?
- // This code was taken from the old DFRN code
- // When activated, forums don't work.
- // And: Why should we disallow commenting by followers?
- // the behaviour is now similar to the Diaspora part.
- //if ($importer["rel"] == CONTACT_IS_FOLLOWER) {
- // logger("Contact ".$importer["id"]." is only follower. Quitting", LOGGER_DEBUG);
- // return;
- //}
}
if ($entrytype == DFRN_REPLY_RC) {
$ev = bbtoevent($item["body"]);
if ((x($ev, "desc") || x($ev, "summary")) && x($ev, "start")) {
logger("Event in item ".$item["uri"]." was found.", LOGGER_DEBUG);
- /// @TODO Mixure of "/' ahead ...
- $ev["cid"] = $importer["id"];
- $ev["uid"] = $importer["uid"];
- $ev["uri"] = $item["uri"];
- $ev["edited"] = $item["edited"];
- $ev['private'] = $item['private'];
- $ev["guid"] = $item["guid"];
+ $ev["cid"] = $importer["id"];
+ $ev["uid"] = $importer["uid"];
+ $ev["uri"] = $item["uri"];
+ $ev["edited"] = $item["edited"];
+ $ev["private"] = $item["private"];
+ $ev["guid"] = $item["guid"];
$r = q(
"SELECT `id` FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
}
if (in_array($entrytype, [DFRN_REPLY, DFRN_REPLY_RC])) {
- $posted_id = item_store($item);
+ $posted_id = Item::insert($item);
$parent = 0;
if ($posted_id) {
/*
* The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
* but otherwise there's a possible data mixup on the sender's system.
- * the tgroup delivery code called from item_store will correct it if it's a forum,
+ * the tgroup delivery code called from Item::insert will correct it if it's a forum,
* but we're going to unconditionally correct it here so that the post will always be owned by our contact.
*/
logger('Correcting item owner.', LOGGER_DEBUG);
$item["owner-avatar"] = $importer["thumb"];
}
- if (($importer["rel"] == CONTACT_IS_FOLLOWER) && (!tgroup_check($importer["importer_uid"], $item))) {
+ if (($importer["rel"] == CONTACT_IS_FOLLOWER) && (!self::tgroupCheck($importer["importer_uid"], $item))) {
logger("Contact ".$importer["id"]." is only follower and tgroup check was negative.", LOGGER_DEBUG);
return;
}
// This is my contact on another system, but it's really me.
// Turn this into a wall post.
- $notify = item_is_remote_self($importer, $item);
+ $notify = Item::isRemoteSelf($importer, $item);
- $posted_id = item_store($item, false, $notify);
+ $posted_id = Item::insert($item, false, $notify);
logger("Item was stored with id ".$posted_id, LOGGER_DEBUG);
}
}
if ($when) {
- $when = datetime_convert("UTC", "UTC", $when, "Y-m-d H:i:s");
+ $when = DateTimeFormat::utc($when);
} else {
- $when = datetime_convert("UTC", "UTC", "now", "Y-m-d H:i:s");
+ $when = DateTimeFormat::utcNow();
}
if (!$uri || !$importer["id"]) {
}
if (($item["verb"] == ACTIVITY_TAG) && ($item["object-type"] == ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item["object"], false);
- $xt = parse_xml_string($item["target"], false);
+ $xo = XML::parseString($item["object"], false);
+ $xt = XML::parseString($item["target"], false);
if ($xt->type == ACTIVITY_OBJ_NOTE) {
$i = q(
`body` = '', `title` = ''
WHERE `parent-uri` = '%s' AND `uid` IN (0, %d)",
dbesc($when),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc($uri),
intval($importer["uid"])
);
`body` = '', `title` = ''
WHERE `uri` = '%s' AND `uid` IN (0, %d)",
dbesc($when),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc($uri),
intval($importer["uid"])
);
return;
}
+
+ /**
+ * @brief Returns the activity verb
+ *
+ * @param array $item Item array
+ *
+ * @return string activity verb
+ */
+ private static function constructVerb(array $item)
+ {
+ if ($item['verb']) {
+ return $item['verb'];
+ }
+ return ACTIVITY_POST;
+ }
+
+ private static function tgroupCheck($uid, $item)
+ {
+ $mention = false;
+
+ // check that the message originated elsewhere and is a top-level post
+
+ if ($item['wall'] || $item['origin'] || ($item['uri'] != $item['parent-uri'])) {
+ return false;
+ }
+
+ $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
+ intval($uid)
+ );
+ if (!DBM::is_result($u)) {
+ return false;
+ }
+
+ $community_page = ($u[0]['page-flags'] == PAGE_COMMUNITY);
+ $prvgroup = ($u[0]['page-flags'] == PAGE_PRVGROUP);
+
+ $link = normalise_link(System::baseUrl() . '/profile/' . $u[0]['nickname']);
+
+ /*
+ * Diaspora uses their own hardwired link URL in @-tags
+ * instead of the one we supply with webfinger
+ */
+ $dlink = normalise_link(System::baseUrl() . '/u/' . $u[0]['nickname']);
+
+ $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches, PREG_SET_ORDER);
+ if ($cnt) {
+ foreach ($matches as $mtch) {
+ if (link_compare($link, $mtch[1]) || link_compare($dlink, $mtch[1])) {
+ $mention = true;
+ logger('mention found: ' . $mtch[2]);
+ }
+ }
+ }
+
+ if (!$mention) {
+ return false;
+ }
+
+ return $community_page || $prvgroup;
+ }
+
+ /**
+ * This function returns true if $update has an edited timestamp newer
+ * than $existing, i.e. $update contains new data which should override
+ * what's already there. If there is no timestamp yet, the update is
+ * assumed to be newer. If the update has no timestamp, the existing
+ * item is assumed to be up-to-date. If the timestamps are equal it
+ * assumes the update has been seen before and should be ignored.
+ *
+ */
+ private static function isEditedTimestampNewer($existing, $update)
+ {
+ if (!x($existing, 'edited') || !$existing['edited']) {
+ return true;
+ }
+ if (!x($update, 'edited') || !$update['edited']) {
+ return false;
+ }
+
+ $existing_edited = DateTimeFormat::utc($existing['edited']);
+ $update_edited = DateTimeFormat::utc($update['edited']);
+
+ return (strcmp($existing_edited, $update_edited) < 0);
+ }
}