X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdiaspora.php;h=b8eff62b1130f2a25ecd1503d043d130240b8704;hb=7f1c71c9fd2dbcc8c85c0042602766bc8767f744;hp=eca22092d81352987a2a8a0e6981c8c7aa3fb206;hpb=61a01141d7e897c30b5931b66675cbb09d6368b8;p=friendica.git diff --git a/include/diaspora.php b/include/diaspora.php index eca22092d8..b8eff62b11 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -10,17 +10,17 @@ use \Friendica\Core\Config; -require_once("include/items.php"); -require_once("include/bb2diaspora.php"); -require_once("include/Scrape.php"); -require_once("include/Contact.php"); -require_once("include/Photo.php"); -require_once("include/socgraph.php"); -require_once("include/group.php"); -require_once("include/xml.php"); -require_once("include/datetime.php"); -require_once("include/queue_fn.php"); -require_once("include/cache.php"); +require_once 'include/items.php'; +require_once 'include/bb2diaspora.php'; +require_once 'include/Scrape.php'; +require_once 'include/Contact.php'; +require_once 'include/Photo.php'; +require_once 'include/socgraph.php'; +require_once 'include/group.php'; +require_once 'include/xml.php'; +require_once 'include/datetime.php'; +require_once 'include/queue_fn.php'; +require_once 'include/cache.php'; /** * @brief This class contain functions to create and send Diaspora XML files @@ -45,7 +45,7 @@ class Diaspora { $servers = explode(",", $serverdata); - foreach($servers AS $server) { + foreach ($servers AS $server) { $server = trim($server); $addr = "relay@".str_replace("http://", "", normalise_link($server)); $batch = $server."/receive/public"; @@ -160,6 +160,32 @@ class Diaspora { return $data; } + /** + * @brief encrypts data via AES + * + * @param string $key The AES key + * @param string $iv The IV (is used for CBC encoding) + * @param string $data The data that is to be encrypted + * + * @return string encrypted data + */ + private static function aes_encrypt($key, $iv, $data) { + return openssl_encrypt($data, 'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA, str_pad($iv, 16, "\0")); + } + + /** + * @brief decrypts data via AES + * + * @param string $key The AES key + * @param string $iv The IV (is used for CBC encoding) + * @param string $encrypted The encrypted data + * + * @return string decrypted data + */ + private static function aes_decrypt($key, $iv, $encrypted) { + return openssl_decrypt($encrypted,'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA,str_pad($iv, 16, "\0")); + } + /** * @brief: Decodes incoming Diaspora message * @@ -181,7 +207,7 @@ class Diaspora { $children = $basedom->children('https://joindiaspora.com/protocol'); - if($children->header) { + if ($children->header) { $public = true; $author_link = str_replace('acct:','',$children->header->author_id); } else { @@ -199,10 +225,7 @@ class Diaspora { $outer_iv = base64_decode($j_outer_key_bundle->iv); $outer_key = base64_decode($j_outer_key_bundle->key); - $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv); - - - $decrypted = pkcs5_unpad($decrypted); + $decrypted = self::aes_decrypt($outer_key, $outer_iv, $ciphertext); logger('decrypted: '.$decrypted, LOGGER_DEBUG); $idom = parse_xml_string($decrypted,false); @@ -217,11 +240,11 @@ class Diaspora { // figure out where in the DOM tree our data is hiding - if($dom->provenance->data) + if ($dom->provenance->data) $base = $dom->provenance; - elseif($dom->env->data) + elseif ($dom->env->data) $base = $dom->env; - elseif($dom->data) + elseif ($dom->data) $base = $dom; if (!$base) { @@ -254,15 +277,14 @@ class Diaspora { $data = base64url_decode($data); - if($public) + if ($public) $inner_decrypted = $data; else { // Decode the encrypted blob $inner_encrypted = base64_decode($data); - $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv); - $inner_decrypted = pkcs5_unpad($inner_decrypted); + $inner_decrypted = self::aes_decrypt($inner_aes_key, $inner_iv, $inner_encrypted); } if (!$author_link) { @@ -556,7 +578,7 @@ class Diaspora { logger("Fetching diaspora key for: ".$handle); $r = self::person_by_handle($handle); - if($r) + if ($r) return $r["pubkey"]; return ""; @@ -612,7 +634,7 @@ class Diaspora { */ private static function add_fcontact($arr, $update = false) { - if($update) { + if ($update) { $r = q("UPDATE `fcontact` SET `name` = '%s', `photo` = '%s', @@ -796,7 +818,7 @@ class Diaspora { // perhaps we were already sharing with this person. Now they're sharing with us. // 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", intval(CONTACT_IS_FRIEND), intval($contact["id"]), @@ -806,12 +828,12 @@ class Diaspora { logger("defining user ".$contact["nick"]." as friend"); } - if(($contact["blocked"]) || ($contact["readonly"]) || ($contact["archive"])) + if (($contact["blocked"]) || ($contact["readonly"]) || ($contact["archive"])) return false; - if($contact["rel"] == CONTACT_IS_SHARING || $contact["rel"] == CONTACT_IS_FRIEND) + if ($contact["rel"] == CONTACT_IS_SHARING || $contact["rel"] == CONTACT_IS_FRIEND) return true; - if($contact["rel"] == CONTACT_IS_FOLLOWER) - if(($importer["page-flags"] == PAGE_COMMUNITY) OR $is_comment) + if ($contact["rel"] == CONTACT_IS_FOLLOWER) + if (($importer["page-flags"] == PAGE_COMMUNITY) OR $is_comment) return true; // Messages for the global users are always accepted @@ -969,7 +991,7 @@ class Diaspora { logger("Fetch post from ".$source_url, LOGGER_DEBUG); $envelope = fetch_url($source_url); - if($envelope) { + if ($envelope) { logger("Envelope was fetched.", LOGGER_DEBUG); $x = self::verify_magic_envelope($envelope); if (!$x) @@ -985,7 +1007,7 @@ class Diaspora { logger("Fetch post from ".$source_url, LOGGER_DEBUG); $x = fetch_url($source_url); - if(!$x) + if (!$x) return false; } @@ -1042,7 +1064,7 @@ class Diaspora { FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($uid), dbesc($guid)); - if(!$r) { + if (!$r) { $result = self::store_by_guid($guid, $contact["url"], $uid); if (!$result) { @@ -1303,7 +1325,7 @@ class Diaspora { } // If we are the origin of the parent we store the original data and notify our followers - if($message_id AND $parent_item["origin"]) { + if ($message_id AND $parent_item["origin"]) { // Formerly we stored the signed text, the signature and the author in different fields. // We now store the raw data so that we are more flexible. @@ -1480,7 +1502,7 @@ class Diaspora { intval($importer["uid"]), dbesc($guid) ); - if($c) + if ($c) $conversation = $c[0]; else { $r = q("INSERT INTO `conv` (`uid`, `guid`, `creator`, `created`, `updated`, `subject`, `recips`) @@ -1493,13 +1515,13 @@ class Diaspora { dbesc($subject), dbesc($participants) ); - if($r) + if ($r) $c = q("SELECT * FROM `conv` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($importer["uid"]), dbesc($guid) ); - if($c) + if ($c) $conversation = $c[0]; } if (!$conversation) { @@ -1507,7 +1529,7 @@ class Diaspora { return; } - foreach($messages as $mesg) + foreach ($messages as $mesg) self::receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation); return true; @@ -1637,7 +1659,7 @@ class Diaspora { logger("Stored like ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); // If we are the origin of the parent we store the original data and notify our followers - if($message_id AND $parent_item["origin"]) { + if ($message_id AND $parent_item["origin"]) { // Formerly we stored the signed text, the signature and the author in different fields. // We now store the raw data so that we are more flexible. @@ -1812,10 +1834,10 @@ class Diaspora { $handle_parts = explode("@", $author); $nick = $handle_parts[0]; - if($name === "") + if ($name === "") $name = $handle_parts[0]; - if( preg_match("|^https?://|", $image_url) === 0) + if ( preg_match("|^https?://|", $image_url) === 0) $image_url = "http://".$handle_parts[1].$image_url; update_contact_avatar($image_url, $importer["uid"], $contact["id"]); @@ -1830,7 +1852,7 @@ class Diaspora { // this is to prevent multiple birthday notifications in a single year // if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year - if(substr($birthday,5) === substr($contact["bd"],5)) + if (substr($birthday,5) === substr($contact["bd"],5)) $birthday = $contact["bd"]; $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `name-date` = '%s', `bd` = '%s', @@ -1848,18 +1870,15 @@ class Diaspora { intval($importer["uid"]) ); - if ($searchable) { - poco_check($contact["url"], $name, NETWORK_DIASPORA, $image_url, $about, $location, $gender, $keywords, "", - datetime_convert(), 2, $contact["id"], $importer["uid"]); - } - $gcontact = array("url" => $contact["url"], "network" => NETWORK_DIASPORA, "generation" => 2, "photo" => $image_url, "name" => $name, "location" => $location, "about" => $about, "birthday" => $birthday, "gender" => $gender, "addr" => $author, "nick" => $nick, "keywords" => $keywords, "hide" => !$searchable, "nsfw" => $nsfw); - update_gcontact($gcontact); + $gcid = update_gcontact($gcontact); + + link_gcontact($gcid, $importer["uid"], $contact["id"]); logger("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"], LOGGER_DEBUG); @@ -1876,7 +1895,7 @@ class Diaspora { $a = get_app(); - 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", intval(CONTACT_IS_FRIEND), intval($contact["id"]), @@ -1889,7 +1908,7 @@ class Diaspora { intval($importer["uid"]) ); - if($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(get_pconfig($importer["uid"], "system", "post_newfriend"))) { + if ($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(get_pconfig($importer["uid"], "system", "post_newfriend"))) { $self = q("SELECT * FROM `contact` WHERE `self` AND `uid` = %d LIMIT 1", intval($importer["uid"]) @@ -1897,7 +1916,7 @@ class Diaspora { // they are not CONTACT_IS_FOLLOWER anymore but that's what we have in the array - if($self && $contact["rel"] == CONTACT_IS_FOLLOWER) { + if ($self && $contact["rel"] == CONTACT_IS_FOLLOWER) { $arr = array(); $arr["uri"] = $arr["parent-uri"] = item_new_uri($a->get_hostname(), $importer["uid"]); @@ -1928,7 +1947,7 @@ class Diaspora { $arr["deny_gid"] = $user[0]["deny_gid"]; $i = item_store($arr); - if($i) + if ($i) proc_run(PRIORITY_HIGH, "include/notifier.php", "activity", $i); } } @@ -2067,12 +2086,12 @@ class Diaspora { $def_gid = get_default_group($importer['uid'], $ret["network"]); - if(intval($def_gid)) + if (intval($def_gid)) group_add_member($importer["uid"], "", $contact_record["id"], $def_gid); update_contact_avatar($ret["photo"], $importer['uid'], $contact_record["id"], true); - if($importer["page-flags"] == PAGE_NORMAL) { + if ($importer["page-flags"] == PAGE_NORMAL) { logger("Sending intra message for author ".$author.".", LOGGER_DEBUG); @@ -2122,7 +2141,7 @@ class Diaspora { ); $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); - if($u) { + if ($u) { logger("Sending share message (Relation: ".$new_relation.") to author ".$author." - Contact: ".$contact_record["id"]." - User: ".$importer["uid"], LOGGER_DEBUG); $ret = self::send_share($u[0], $contact_record); @@ -2621,20 +2640,19 @@ class Diaspora { return false; } - $inner_aes_key = random_string(32); + $inner_aes_key = openssl_random_pseudo_bytes(32); $b_inner_aes_key = base64_encode($inner_aes_key); - $inner_iv = random_string(16); + $inner_iv = openssl_random_pseudo_bytes(16); $b_inner_iv = base64_encode($inner_iv); - $outer_aes_key = random_string(32); + $outer_aes_key = openssl_random_pseudo_bytes(32); $b_outer_aes_key = base64_encode($outer_aes_key); - $outer_iv = random_string(16); + $outer_iv = openssl_random_pseudo_bytes(16); $b_outer_iv = base64_encode($outer_iv); $handle = self::my_handle($user); - $padded_data = pkcs5_pad($msg,16); - $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv); + $inner_encrypted = self::aes_encrypt($inner_aes_key, $inner_iv, $msg); $b64_data = base64_encode($inner_encrypted); @@ -2656,9 +2674,8 @@ class Diaspora { "author_id" => $handle)); $decrypted_header = xml::from_array($xmldata, $xml, true); - $decrypted_header = pkcs5_pad($decrypted_header,16); - $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $outer_aes_key, $decrypted_header, MCRYPT_MODE_CBC, $outer_iv); + $ciphertext = self::aes_encrypt($outer_aes_key, $outer_iv, $decrypted_header); $outer_json = json_encode(array("iv" => $b_outer_iv, "key" => $b_outer_aes_key)); @@ -2748,7 +2765,7 @@ class Diaspora { $a = get_app(); $enabled = intval(get_config("system", "diaspora_enabled")); - if(!$enabled) + if (!$enabled) return 200; $logid = random_string(4); @@ -3087,14 +3104,14 @@ class Diaspora { $body = html_entity_decode(bb2diaspora($body)); // Adding the title - if(strlen($title)) + if (strlen($title)) $body = "## ".html_entity_decode($title)."\n\n".$body; if ($item["attach"]) { $cnt = preg_match_all('/href=\"(.*?)\"(.*?)title=\"(.*?)\"/ism', $item["attach"], $matches, PREG_SET_ORDER); - if(cnt) { + if (cnt) { $body .= "\n".t("Attachments:")."\n"; - foreach($matches as $mtch) + foreach ($matches as $mtch) $body .= "[".$mtch[3]."](".$mtch[1].")\n"; } } @@ -3574,7 +3591,7 @@ class Diaspora { if ($searchable === 'true') { $dob = '1000-00-00'; - if (($profile['dob']) && ($profile['dob'] != '0000-00-00')) + if (($profile['dob']) && ($profile['dob'] > '0001-01-01')) $dob = ((intval($profile['dob'])) ? intval($profile['dob']) : '1000') .'-'. datetime_convert('UTC','UTC',$profile['dob'],'m-d'); $about = $profile['about']; @@ -3587,7 +3604,7 @@ class Diaspora { $kw = str_replace(' ',' ',$kw); $arr = explode(' ',$profile['pub_keywords']); if (count($arr)) { - for($x = 0; $x < 5; $x ++) { + for ($x = 0; $x < 5; $x ++) { if (trim($arr[$x])) $tags .= '#'. trim($arr[$x]) .' '; } @@ -3609,7 +3626,7 @@ class Diaspora { "searchable" => $searchable, "tag_string" => $tags); - foreach($recips as $recip) { + foreach ($recips as $recip) { logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG); self::build_and_transmit($profile, $recip, "profile", $message, false, "", true); } @@ -3632,17 +3649,20 @@ class Diaspora { } $r = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1", intval($contact['uid'])); - if(!$r) + if (!dbm::is_result($r)) { return false; + } $contact["uprvkey"] = $r[0]['prvkey']; $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", intval($post_id)); - if (!$r) + if (!dbm::is_result($r)) { return false; + } - if (!in_array($r[0]["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE))) + if (!in_array($r[0]["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE))) { return false; + } $message = self::construct_like($r[0], $contact); $message["author_signature"] = self::signature($contact, $message);