2011-08-09 06:44:29 +02:00
< ? php
2011-08-10 03:55:46 +02:00
require_once ( 'include/crypto.php' );
2011-08-16 08:19:17 +02:00
require_once ( 'include/items.php' );
2011-08-23 12:02:31 +02:00
require_once ( 'include/bb2diaspora.php' );
2011-08-28 14:00:30 +02:00
require_once ( 'include/contact_selectors.php' );
2011-10-21 12:33:34 +02:00
require_once ( 'include/queue_fn.php' );
2011-08-09 06:44:29 +02:00
2011-09-15 04:33:42 +02:00
function diaspora_dispatch_public ( $msg ) {
2011-09-19 10:17:12 +02:00
$r = q ( " SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 " ,
2011-09-15 04:33:42 +02:00
dbesc ( NETWORK_DIASPORA ),
dbesc ( $msg [ 'author' ])
);
if ( count ( $r )) {
foreach ( $r as $rr ) {
2011-09-16 23:51:25 +02:00
logger ( 'diaspora_public: delivering to: ' . $rr [ 'username' ]);
2011-09-15 04:33:42 +02:00
diaspora_dispatch ( $rr , $msg );
}
}
2011-09-16 23:51:25 +02:00
else
logger ( 'diaspora_public: no subscribers' );
2011-09-15 04:33:42 +02:00
}
2011-08-24 10:21:24 +02:00
function diaspora_dispatch ( $importer , $msg ) {
2011-09-15 04:33:42 +02:00
$ret = 0 ;
2011-10-18 02:39:25 +02:00
// php doesn't like dashes in variable names
$msg [ 'message' ] = str_replace (
array ( '<activity_streams-photo>' , '</activity_streams-photo>' ),
array ( '<asphoto>' , '</asphoto>' ),
$msg [ 'message' ]);
2011-08-24 10:21:24 +02:00
$parsed_xml = parse_xml_string ( $msg [ 'message' ], false );
$xmlbase = $parsed_xml -> post ;
if ( $xmlbase -> request ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_request ( $importer , $xmlbase -> request );
2011-08-24 10:21:24 +02:00
}
elseif ( $xmlbase -> status_message ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_post ( $importer , $xmlbase -> status_message );
2011-08-24 10:21:24 +02:00
}
2011-10-14 03:32:02 +02:00
elseif ( $xmlbase -> profile ) {
$ret = diaspora_profile ( $importer , $xmlbase -> profile );
}
2011-08-24 10:21:24 +02:00
elseif ( $xmlbase -> comment ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_comment ( $importer , $xmlbase -> comment , $msg );
2011-08-24 10:21:24 +02:00
}
elseif ( $xmlbase -> like ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_like ( $importer , $xmlbase -> like , $msg );
2011-08-24 10:21:24 +02:00
}
2011-10-18 02:39:25 +02:00
elseif ( $xmlbase -> asphoto ) {
$ret = diaspora_asphoto ( $importer , $xmlbase -> asphoto );
}
2011-10-19 00:56:35 +02:00
elseif ( $xmlbase -> reshare ) {
$ret = diaspora_reshare ( $importer , $xmlbase -> reshare );
}
2011-08-24 10:21:24 +02:00
elseif ( $xmlbase -> retraction ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_retraction ( $importer , $xmlbase -> retraction , $msg );
2011-08-24 10:21:24 +02:00
}
2011-11-05 22:45:29 +01:00
elseif ( $xmlbase -> signed_retraction ) {
$ret = diaspora_signed_retraction ( $importer , $xmlbase -> retraction , $msg );
}
2011-08-24 10:21:24 +02:00
elseif ( $xmlbase -> photo ) {
2011-09-15 04:33:42 +02:00
$ret = diaspora_photo ( $importer , $xmlbase -> photo , $msg );
2011-08-24 10:21:24 +02:00
}
else {
logger ( 'diaspora_dispatch: unknown message type: ' . print_r ( $xmlbase , true ));
}
2011-09-15 04:33:42 +02:00
return $ret ;
2011-08-24 10:21:24 +02:00
}
2011-08-23 04:27:40 +02:00
function diaspora_get_contact_by_handle ( $uid , $handle ) {
$r = q ( " SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1 " ,
dbesc ( NETWORK_DIASPORA ),
intval ( $uid ),
dbesc ( $handle )
);
if ( $r && count ( $r ))
return $r [ 0 ];
return false ;
}
function find_diaspora_person_by_handle ( $handle ) {
2011-09-20 10:49:08 +02:00
$update = false ;
2011-08-23 04:27:40 +02:00
$r = q ( " select * from fcontact where network = '%s' and addr = '%s' limit 1 " ,
dbesc ( NETWORK_DIASPORA ),
dbesc ( $handle )
);
if ( count ( $r )) {
2011-10-26 04:59:57 +02:00
logger ( 'find_diaspora_person_by handle: in cache ' . print_r ( $r , true ), LOGGER_DEBUG );
2011-08-23 04:27:40 +02:00
// update record occasionally so it doesn't get stale
$d = strtotime ( $r [ 0 ][ 'updated' ] . ' +00:00' );
2011-09-20 10:49:08 +02:00
if ( $d > strtotime ( 'now - 14 days' ))
2011-08-23 04:27:40 +02:00
return $r [ 0 ];
2011-09-20 10:49:08 +02:00
$update = true ;
2011-08-23 04:27:40 +02:00
}
2011-10-26 04:59:57 +02:00
logger ( 'find_diaspora_person_by_handle: refresh' , LOGGER_DEBUG );
2011-08-23 04:27:40 +02:00
require_once ( 'include/Scrape.php' );
$r = probe_url ( $handle , PROBE_DIASPORA );
if (( count ( $r )) && ( $r [ 'network' ] === NETWORK_DIASPORA )) {
2011-09-20 10:49:08 +02:00
add_fcontact ( $r , $update );
2011-08-23 04:27:40 +02:00
return ( $r );
}
return false ;
}
2011-08-09 11:53:51 +02:00
function get_diaspora_key ( $uri ) {
logger ( 'Fetching diaspora key for: ' . $uri );
2011-08-18 13:20:30 +02:00
$r = find_diaspora_person_by_handle ( $uri );
if ( $r )
return $r [ 'pubkey' ];
2011-08-09 11:53:51 +02:00
return '' ;
}
2011-08-09 06:44:29 +02:00
2011-09-19 05:17:44 +02:00
function diaspora_pubmsg_build ( $msg , $user , $contact , $prvkey , $pubkey ) {
$a = get_app ();
logger ( 'diaspora_pubmsg_build: ' . $msg , LOGGER_DATA );
$handle = $user [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
2011-09-22 13:11:39 +02:00
// $b64_data = base64_encode($msg);
// $b64url_data = base64url_encode($b64_data);
$b64url_data = base64url_encode ( $msg );
2011-09-19 05:17:44 +02:00
$data = str_replace ( array ( " \n " , " \r " , " " , " \t " ), array ( '' , '' , '' , '' ), $b64url_data );
$type = 'application/xml' ;
$encoding = 'base64url' ;
$alg = 'RSA-SHA256' ;
$signable_data = $data . '.' . base64url_encode ( $type ) . '.'
. base64url_encode ( $encoding ) . '.' . base64url_encode ( $alg ) ;
$signature = rsa_sign ( $signable_data , $prvkey );
$sig = base64url_encode ( $signature );
$magic_env = <<< EOT
< ? xml version = '1.0' encoding = 'UTF-8' ?>
2011-09-22 13:11:39 +02:00
< diaspora xmlns = " https://joindiaspora.com/protocol " xmlns : me = " http://salmon-protocol.org/ns/magic-env " >
2011-09-19 05:17:44 +02:00
< header >
< author_id > $handle </ author_id >
</ header >
< me : env >
< me : encoding > base64url </ me : encoding >
< me : alg > RSA - SHA256 </ me : alg >
< me : data type = " application/xml " > $data </ me : data >
< me : sig > $sig </ me : sig >
</ me : env >
</ diaspora >
EOT ;
logger ( 'diaspora_pubmsg_build: magic_env: ' . $magic_env , LOGGER_DATA );
return $magic_env ;
}
2011-09-22 13:11:39 +02:00
function diaspora_msg_build ( $msg , $user , $contact , $prvkey , $pubkey , $public = false ) {
2011-08-09 06:44:29 +02:00
$a = get_app ();
2011-09-22 13:11:39 +02:00
if ( $public )
return diaspora_pubmsg_build ( $msg , $user , $contact , $prvkey , $pubkey );
2011-08-19 13:48:54 +02:00
logger ( 'diaspora_msg_build: ' . $msg , LOGGER_DATA );
2011-08-09 06:51:56 +02:00
$inner_aes_key = random_string ( 32 );
2011-08-09 06:44:29 +02:00
$b_inner_aes_key = base64_encode ( $inner_aes_key );
2011-08-19 23:34:28 +02:00
$inner_iv = random_string ( 16 );
2011-08-09 06:44:29 +02:00
$b_inner_iv = base64_encode ( $inner_iv );
2011-08-09 06:51:56 +02:00
$outer_aes_key = random_string ( 32 );
2011-08-09 06:44:29 +02:00
$b_outer_aes_key = base64_encode ( $outer_aes_key );
2011-08-19 23:34:28 +02:00
$outer_iv = random_string ( 16 );
2011-08-09 06:44:29 +02:00
$b_outer_iv = base64_encode ( $outer_iv );
2011-09-16 02:47:16 +02:00
$handle = $user [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
2011-08-09 06:44:29 +02:00
2011-08-09 11:53:51 +02:00
$padded_data = pkcs5_pad ( $msg , 16 );
2011-08-09 06:44:29 +02:00
$inner_encrypted = mcrypt_encrypt ( MCRYPT_RIJNDAEL_128 , $inner_aes_key , $padded_data , MCRYPT_MODE_CBC , $inner_iv );
$b64_data = base64_encode ( $inner_encrypted );
2011-08-09 15:40:28 +02:00
2011-08-09 11:53:51 +02:00
2011-08-09 06:44:29 +02:00
$b64url_data = base64url_encode ( $b64_data );
2011-09-15 04:33:42 +02:00
$data = str_replace ( array ( " \n " , " \r " , " " , " \t " ), array ( '' , '' , '' , '' ), $b64url_data );
2011-09-16 02:47:16 +02:00
$type = 'application/xml' ;
2011-08-09 06:44:29 +02:00
$encoding = 'base64url' ;
$alg = 'RSA-SHA256' ;
2011-09-15 04:33:42 +02:00
$signable_data = $data . '.' . base64url_encode ( $type ) . '.'
. base64url_encode ( $encoding ) . '.' . base64url_encode ( $alg ) ;
2011-08-09 06:44:29 +02:00
2011-08-10 03:55:46 +02:00
$signature = rsa_sign ( $signable_data , $prvkey );
2011-08-09 06:44:29 +02:00
$sig = base64url_encode ( $signature );
$decrypted_header = <<< EOT
< decrypted_header >
< iv > $b_inner_iv </ iv >
< aes_key > $b_inner_aes_key </ aes_key >
2011-09-16 02:47:16 +02:00
< author_id > $handle </ author_id >
2011-08-09 06:44:29 +02:00
</ decrypted_header >
EOT ;
2011-08-09 11:53:51 +02:00
$decrypted_header = pkcs5_pad ( $decrypted_header , 16 );
2011-08-09 06:44:29 +02:00
2011-08-09 15:40:28 +02:00
$ciphertext = mcrypt_encrypt ( MCRYPT_RIJNDAEL_128 , $outer_aes_key , $decrypted_header , MCRYPT_MODE_CBC , $outer_iv );
2011-08-09 11:53:51 +02:00
$outer_json = json_encode ( array ( 'iv' => $b_outer_iv , 'key' => $b_outer_aes_key ));
2011-08-22 13:55:09 +02:00
2011-08-09 06:44:29 +02:00
$encrypted_outer_key_bundle = '' ;
openssl_public_encrypt ( $outer_json , $encrypted_outer_key_bundle , $pubkey );
2011-08-22 13:55:09 +02:00
2011-08-09 06:44:29 +02:00
$b64_encrypted_outer_key_bundle = base64_encode ( $encrypted_outer_key_bundle );
2011-08-22 13:55:09 +02:00
2011-08-29 06:41:42 +02:00
logger ( 'outer_bundle: ' . $b64_encrypted_outer_key_bundle . ' key: ' . $pubkey , LOGGER_DATA );
2011-08-22 13:55:09 +02:00
2011-08-09 06:44:29 +02:00
$encrypted_header_json_object = json_encode ( array ( 'aes_key' => base64_encode ( $encrypted_outer_key_bundle ),
'ciphertext' => base64_encode ( $ciphertext )));
2011-08-22 02:24:50 +02:00
$cipher_json = base64_encode ( $encrypted_header_json_object );
$encrypted_header = '<encrypted_header>' . $cipher_json . '</encrypted_header>' ;
2011-08-09 06:44:29 +02:00
2011-08-09 11:53:51 +02:00
$magic_env = <<< EOT
2011-08-09 06:44:29 +02:00
< ? xml version = '1.0' encoding = 'UTF-8' ?>
2011-09-22 13:11:39 +02:00
< diaspora xmlns = " https://joindiaspora.com/protocol " xmlns : me = " http://salmon-protocol.org/ns/magic-env " >
2011-08-09 06:44:29 +02:00
$encrypted_header
2011-09-16 23:46:04 +02:00
< me : env >
2011-08-09 06:44:29 +02:00
< me : encoding > base64url </ me : encoding >
< me : alg > RSA - SHA256 </ me : alg >
2011-09-15 04:33:42 +02:00
< me : data type = " application/xml " > $data </ me : data >
2011-08-09 06:44:29 +02:00
< me : sig > $sig </ me : sig >
</ me : env >
2011-09-16 23:46:04 +02:00
</ diaspora >
2011-08-09 06:44:29 +02:00
EOT ;
2011-08-19 13:48:54 +02:00
logger ( 'diaspora_msg_build: magic_env: ' . $magic_env , LOGGER_DATA );
2011-08-09 06:44:29 +02:00
return $magic_env ;
2011-08-09 11:53:51 +02:00
}
2011-08-17 13:24:26 +02:00
/**
*
* diaspora_decode ( $importer , $xml )
* array $importer -> from user table
* string $xml -> urldecoded Diaspora salmon
*
* Returns array
* 'message' -> decoded Diaspora XML message
* 'author' -> author diaspora handle
* 'key' -> author public key ( converted to pkcs #8)
*
* Author and key are used elsewhere to save a lookup for verifying replies and likes
*/
2011-08-09 11:53:51 +02:00
2011-08-15 14:27:24 +02:00
2011-08-17 13:24:26 +02:00
function diaspora_decode ( $importer , $xml ) {
2011-08-15 14:27:24 +02:00
2011-09-15 04:33:42 +02:00
$public = false ;
2011-08-09 15:40:28 +02:00
$basedom = parse_xml_string ( $xml );
2011-08-09 11:53:51 +02:00
2011-09-16 02:47:16 +02:00
$children = $basedom -> children ( 'https://joindiaspora.com/protocol' );
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
if ( $children -> header ) {
$public = true ;
2011-09-16 23:57:41 +02:00
$author_link = str_replace ( 'acct:' , '' , $children -> header -> author_id );
2011-09-15 04:33:42 +02:00
}
else {
2011-08-17 13:24:26 +02:00
2011-09-15 04:33:42 +02:00
$encrypted_header = json_decode ( base64_decode ( $children -> encrypted_header ));
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
$encrypted_aes_key_bundle = base64_decode ( $encrypted_header -> aes_key );
$ciphertext = base64_decode ( $encrypted_header -> ciphertext );
$outer_key_bundle = '' ;
openssl_private_decrypt ( $encrypted_aes_key_bundle , $outer_key_bundle , $importer [ 'prvkey' ]);
$j_outer_key_bundle = json_decode ( $outer_key_bundle );
$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 );
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
/**
* $decrypted now contains something like
*
* < decrypted_header >
* < iv > 8 e + G2 + ET8l5BPuW0sVTnQw ==</ iv >
* < aes_key > UvSMb4puPeB14STkcDWq + 4 QE302Edu15oaprAQSkLKU =</ aes_key >
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
***** OBSOLETE
2011-08-15 15:27:17 +02:00
2011-09-15 04:33:42 +02:00
* < author >
* < name > Ryan Hughes </ name >
* < uri > acct : galaxor @ diaspora . pirateship . org </ uri >
* </ author >
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
***** CURRENT
2011-08-09 11:53:51 +02:00
2011-09-22 13:11:39 +02:00
* < author_id > galaxor @ diaspora . priateship . org </ author_id >
2011-08-20 13:53:11 +02:00
2011-09-15 04:33:42 +02:00
***** END DIFFS
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
* </ decrypted_header >
*/
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
logger ( 'decrypted: ' . $decrypted , LOGGER_DEBUG );
$idom = parse_xml_string ( $decrypted , false );
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
$inner_iv = base64_decode ( $idom -> iv );
$inner_aes_key = base64_decode ( $idom -> aes_key );
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
$author_link = str_replace ( 'acct:' , '' , $idom -> author_id );
}
2011-08-09 11:53:51 +02:00
$dom = $basedom -> children ( NAMESPACE_SALMON_ME );
// figure out where in the DOM tree our data is hiding
if ( $dom -> provenance -> data )
$base = $dom -> provenance ;
elseif ( $dom -> env -> data )
$base = $dom -> env ;
elseif ( $dom -> data )
$base = $dom ;
if ( ! $base ) {
logger ( 'mod-diaspora: unable to locate salmon data in xml ' );
2011-08-15 05:38:31 +02:00
http_status_exit ( 400 );
2011-08-09 11:53:51 +02:00
}
// Stash the signature away for now. We have to find their key or it won't be good for anything.
$signature = base64url_decode ( $base -> sig );
// unpack the data
// strip whitespace so our data element will return to one big base64 blob
$data = str_replace ( array ( " " , " \t " , " \r " , " \n " ), array ( " " , " " , " " , " " ), $base -> data );
2011-08-17 13:24:26 +02:00
2011-08-09 11:53:51 +02:00
// stash away some other stuff for later
$type = $base -> data [ 0 ] -> attributes () -> type [ 0 ];
$keyhash = $base -> sig [ 0 ] -> attributes () -> keyhash [ 0 ];
$encoding = $base -> encoding ;
$alg = $base -> alg ;
2011-08-17 13:24:26 +02:00
2011-09-15 04:33:42 +02:00
$signed_data = $data . '.' . base64url_encode ( $type ) . '.' . base64url_encode ( $encoding ) . '.' . base64url_encode ( $alg );
2011-08-09 11:53:51 +02:00
// decode the data
$data = base64url_decode ( $data );
2011-09-15 04:33:42 +02:00
if ( $public ) {
$inner_decrypted = $data ;
}
else {
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
// Decode the encrypted blob
2011-08-09 11:53:51 +02:00
2011-09-15 04:33:42 +02:00
$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 );
}
2011-08-09 11:53:51 +02:00
if ( ! $author_link ) {
logger ( 'mod-diaspora: Could not retrieve author URI.' );
2011-08-10 03:55:46 +02:00
http_status_exit ( 400 );
2011-08-09 11:53:51 +02:00
}
// Once we have the author URI, go to the web and try to find their public key
2011-08-21 00:09:09 +02:00
// (first this will look it up locally if it is in the fcontact cache)
// This will also convert diaspora public key from pkcs#1 to pkcs#8
2011-08-09 11:53:51 +02:00
logger ( 'mod-diaspora: Fetching key for ' . $author_link );
$key = get_diaspora_key ( $author_link );
if ( ! $key ) {
2011-08-09 15:40:28 +02:00
logger ( 'mod-diaspora: Could not retrieve author key.' );
2011-08-10 03:55:46 +02:00
http_status_exit ( 400 );
2011-08-09 11:53:51 +02:00
}
2011-08-10 03:55:46 +02:00
$verify = rsa_verify ( $signed_data , $signature , $key );
2011-08-09 11:53:51 +02:00
if ( ! $verify ) {
logger ( 'mod-diaspora: Message did not verify. Discarding.' );
2011-09-19 12:36:41 +02:00
http_status_exit ( 400 );
2011-08-09 11:53:51 +02:00
}
logger ( 'mod-diaspora: Message verified.' );
2011-08-17 07:31:14 +02:00
return array ( 'message' => $inner_decrypted , 'author' => $author_link , 'key' => $key );
2011-08-09 11:53:51 +02:00
}
2011-08-18 13:20:30 +02:00
2011-08-16 08:19:17 +02:00
function diaspora_request ( $importer , $xml ) {
2011-08-10 14:10:48 +02:00
2011-11-12 13:06:33 +01:00
$a = get_app ();
2011-08-16 09:52:34 +02:00
$sender_handle = unxmlify ( $xml -> sender_handle );
$recipient_handle = unxmlify ( $xml -> recipient_handle );
2011-08-12 12:01:11 +02:00
if ( ! $sender_handle || ! $recipient_handle )
return ;
2011-08-16 08:19:17 +02:00
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $sender_handle );
if ( $contact ) {
2011-08-17 13:24:26 +02:00
// perhaps we were already sharing with this person. Now they're sharing with us.
// That makes us friends.
2011-08-16 08:19:17 +02:00
if ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) {
2011-08-19 06:31:34 +02:00
q ( " UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
2011-08-16 08:19:17 +02:00
intval ( CONTACT_IS_FRIEND ),
intval ( $contact [ 'id' ]),
intval ( $importer [ 'uid' ])
);
}
2011-11-12 13:06:33 +01:00
// send notification
$r = q ( " SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1 " ,
intval ( $importer [ 'uid' ])
);
if (( count ( $r )) && ( $r [ 0 ][ 'hide-friends' ] == 0 )) {
require_once ( 'include/items.php' );
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $importer [ 'uid' ])
);
2011-11-16 08:12:56 +01:00
// they are not CONTACT_IS_FOLLOWER anymore but that's what we have in the array
if ( count ( $self ) && $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) {
2011-11-12 13:06:33 +01:00
$arr = array ();
$arr [ 'uri' ] = $arr [ 'parent-uri' ] = item_new_uri ( $a -> get_hostname (), $importer [ 'uid' ]);
$arr [ 'uid' ] = $importer [ 'uid' ];
$arr [ 'contact-id' ] = $self [ 0 ][ 'id' ];
$arr [ 'wall' ] = 1 ;
$arr [ 'type' ] = 'wall' ;
$arr [ 'gravity' ] = 0 ;
$arr [ 'origin' ] = 1 ;
$arr [ 'author-name' ] = $arr [ 'owner-name' ] = $self [ 0 ][ 'name' ];
$arr [ 'author-link' ] = $arr [ 'owner-link' ] = $self [ 0 ][ 'url' ];
$arr [ 'author-avatar' ] = $arr [ 'owner-avatar' ] = $self [ 0 ][ 'thumb' ];
$arr [ 'verb' ] = ACTIVITY_FRIEND ;
$arr [ 'object-type' ] = ACTIVITY_OBJ_PERSON ;
$A = '[url=' . $self [ 0 ][ 'url' ] . ']' . $self [ 0 ][ 'name' ] . '[/url]' ;
$B = '[url=' . $contact [ 'url' ] . ']' . $contact [ 'name' ] . '[/url]' ;
$BPhoto = '[url=' . $contact [ 'url' ] . ']' . '[img]' . $contact [ 'thumb' ] . '[/img][/url]' ;
$arr [ 'body' ] = sprintf ( t ( '%1$s is now friends with %2$s' ), $A , $B ) . " \n \n \n " . $Bphoto ;
$arr [ 'object' ] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact [ 'name' ] . '</title>'
. '<id>' . $contact [ 'url' ] . '/' . $contact [ 'name' ] . '</id>' ;
$arr [ 'object' ] .= '<link>' . xmlify ( '<link rel="alternate" type="text/html" href="' . $contact [ 'url' ] . '" />' . " \n " );
$arr [ 'object' ] .= xmlify ( '<link rel="photo" type="image/jpeg" href="' . $contact [ 'thumb' ] . '" />' . " \n " );
$arr [ 'object' ] .= '</link></object>' . " \n " ;
$arr [ 'last-child' ] = 1 ;
$arr [ 'allow_cid' ] = $user [ 0 ][ 'allow_cid' ];
$arr [ 'allow_gid' ] = $user [ 0 ][ 'allow_gid' ];
$arr [ 'deny_cid' ] = $user [ 0 ][ 'deny_cid' ];
$arr [ 'deny_gid' ] = $user [ 0 ][ 'deny_gid' ];
$i = item_store ( $arr );
if ( $i )
proc_run ( 'php' , " include/notifier.php " , " activity " , " $i " );
}
}
2011-08-12 12:01:11 +02:00
return ;
}
2011-08-19 07:01:35 +02:00
$ret = find_diaspora_person_by_handle ( $sender_handle );
2011-08-13 15:52:33 +02:00
2011-08-12 12:01:11 +02:00
if (( ! count ( $ret )) || ( $ret [ 'network' ] != NETWORK_DIASPORA )) {
logger ( 'diaspora_request: Cannot resolve diaspora handle ' . $sender_handle . ' for ' . $recipient_handle );
return ;
2011-08-13 15:52:33 +02:00
}
2011-08-19 07:03:58 +02:00
2011-09-22 13:11:39 +02:00
$batch = (( $ret [ 'batch' ]) ? $ret [ 'batch' ] : implode ( '/' , array_slice ( explode ( '/' , $ret [ 'url' ]), 0 , 3 )) . '/receive/public' );
2011-11-02 00:08:07 +01:00
$r = q ( " INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`nurl`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
VALUES ( % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , % d ) " ,
2011-08-13 15:52:33 +02:00
intval ( $importer [ 'uid' ]),
dbesc ( $ret [ 'network' ]),
dbesc ( $ret [ 'addr' ]),
datetime_convert (),
dbesc ( $ret [ 'url' ]),
2011-11-02 00:08:07 +01:00
dbesc ( normalise_link ( $ret [ 'url' ])),
2011-09-22 13:11:39 +02:00
dbesc ( $batch ),
2011-08-13 15:52:33 +02:00
dbesc ( $ret [ 'name' ]),
dbesc ( $ret [ 'nick' ]),
dbesc ( $ret [ 'photo' ]),
dbesc ( $ret [ 'pubkey' ]),
dbesc ( $ret [ 'notify' ]),
dbesc ( $ret [ 'poll' ]),
1 ,
2
);
// find the contact record we just created
2011-08-16 09:52:34 +02:00
$contact_record = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $sender_handle );
2011-08-12 12:01:11 +02:00
2011-08-13 15:52:33 +02:00
$hash = random_string () . ( string ) time (); // Generate a confirm_key
2011-08-16 09:52:34 +02:00
if ( $contact_record ) {
2011-08-19 06:50:41 +02:00
$ret = q ( " INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime` )
2011-08-19 07:03:58 +02:00
VALUES ( % d , % d , % d , % d , '%s' , '%s' , '%s' ) " ,
2011-08-13 15:52:33 +02:00
intval ( $importer [ 'uid' ]),
intval ( $contact_record [ 'id' ]),
0 ,
2011-08-19 07:03:58 +02:00
0 ,
2011-08-13 15:52:33 +02:00
dbesc ( t ( 'Sharing notification from Diaspora network' )),
dbesc ( $hash ),
dbesc ( datetime_convert ())
);
}
2011-08-19 07:03:58 +02:00
2011-08-13 15:52:33 +02:00
return ;
2011-08-10 14:10:48 +02:00
}
2011-08-16 08:19:17 +02:00
function diaspora_post ( $importer , $xml ) {
2011-08-10 14:10:48 +02:00
2011-09-03 14:23:36 +02:00
$a = get_app ();
2011-08-14 01:39:59 +02:00
$guid = notags ( unxmlify ( $xml -> guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
2011-08-16 08:19:17 +02:00
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
logger ( 'diaspora_post: Ignoring this author.' );
2011-09-15 04:33:42 +02:00
return 202 ;
2011-08-16 08:19:17 +02:00
}
2011-08-14 01:39:59 +02:00
$message_id = $diaspora_handle . ':' . $guid ;
$r = q ( " SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1 " ,
intval ( $importer [ 'uid' ]),
dbesc ( $message_id ),
dbesc ( $guid )
);
2011-08-30 07:50:41 +02:00
if ( count ( $r )) {
logger ( 'diaspora_post: message exists: ' . $guid );
2011-08-14 01:39:59 +02:00
return ;
2011-08-30 07:50:41 +02:00
}
2011-08-14 01:39:59 +02:00
2011-08-14 04:03:59 +02:00
// allocate a guid on our system - we aren't fixing any collisions.
// we're ignoring them
$g = q ( " select * from guid where guid = '%s' limit 1 " ,
dbesc ( $guid )
2011-08-14 01:39:59 +02:00
);
2011-08-14 04:03:59 +02:00
if ( ! count ( $g )) {
q ( " insert into guid ( guid ) values ( '%s' ) " ,
dbesc ( $guid )
);
}
2011-08-14 01:39:59 +02:00
$created = unxmlify ( $xml -> created_at );
$private = (( unxmlify ( $xml -> public ) == 'false' ) ? 1 : 0 );
2011-08-26 01:37:27 +02:00
$body = diaspora2bb ( $xml -> raw_message );
2011-08-14 01:39:59 +02:00
$datarray = array ();
2011-10-06 05:48:00 +02:00
$str_tags = '' ;
$tags = get_tags ( $body );
if ( count ( $tags )) {
foreach ( $tags as $tag ) {
if ( strpos ( $tag , '#' ) === 0 ) {
if ( strpos ( $tag , '[url=' ))
continue ;
$basetag = str_replace ( '_' , ' ' , substr ( $tag , 1 ));
$body = str_replace ( $tag , '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' , $body );
if ( strlen ( $str_tags ))
$str_tags .= ',' ;
$str_tags .= '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' ;
continue ;
}
}
}
2011-08-14 01:39:59 +02:00
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
$datarray [ 'wall' ] = 0 ;
$datarray [ 'guid' ] = $guid ;
2011-08-16 04:39:49 +02:00
$datarray [ 'uri' ] = $datarray [ 'parent-uri' ] = $message_id ;
2011-08-16 06:01:44 +02:00
$datarray [ 'created' ] = $datarray [ 'edited' ] = datetime_convert ( 'UTC' , 'UTC' , $created );
$datarray [ 'private' ] = $private ;
$datarray [ 'parent' ] = 0 ;
2011-08-14 04:03:59 +02:00
$datarray [ 'owner-name' ] = $contact [ 'name' ];
$datarray [ 'owner-link' ] = $contact [ 'url' ];
$datarray [ 'owner-avatar' ] = $contact [ 'thumb' ];
2011-08-14 01:39:59 +02:00
$datarray [ 'author-name' ] = $contact [ 'name' ];
$datarray [ 'author-link' ] = $contact [ 'url' ];
$datarray [ 'author-avatar' ] = $contact [ 'thumb' ];
2011-08-16 04:46:47 +02:00
$datarray [ 'body' ] = $body ;
2011-10-06 05:48:00 +02:00
$datarray [ 'tag' ] = $str_tags ;
2011-08-27 02:52:24 +02:00
$datarray [ 'app' ] = 'Diaspora' ;
2011-08-14 01:39:59 +02:00
2011-10-20 00:18:41 +02:00
// if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible.
$datarray [ 'visible' ] = (( strlen ( $body )) ? 1 : 0 );
2011-09-01 06:46:37 +02:00
$message_id = item_store ( $datarray );
if ( $message_id ) {
q ( " update item set plink = '%s' where id = %d limit 1 " ,
dbesc ( $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $message_id ),
intval ( $message_id )
);
}
2011-08-14 01:39:59 +02:00
return ;
2011-08-10 14:10:48 +02:00
}
2011-10-19 00:56:35 +02:00
function diaspora_reshare ( $importer , $xml ) {
2011-10-20 11:07:38 +02:00
logger ( 'diaspora_reshare: init: ' . print_r ( $xml , true ));
2011-10-19 00:56:35 +02:00
$a = get_app ();
$guid = notags ( unxmlify ( $xml -> guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
2011-10-20 11:07:38 +02:00
2011-10-19 00:56:35 +02:00
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
2011-10-20 06:34:48 +02:00
logger ( 'diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r ( $xml , true ));
2011-10-19 00:56:35 +02:00
return 202 ;
}
$message_id = $diaspora_handle . ':' . $guid ;
$r = q ( " SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1 " ,
intval ( $importer [ 'uid' ]),
dbesc ( $message_id ),
dbesc ( $guid )
);
if ( count ( $r )) {
logger ( 'diaspora_reshare: message exists: ' . $guid );
return ;
}
$orig_author = notags ( unxmlify ( $xml -> root_diaspora_id ));
$orig_guid = notags ( unxmlify ( $xml -> root_guid ));
$source_url = 'https://' . substr ( $orig_author , strpos ( $orig_author , '@' ) + 1 ) . '/p/' . $orig_guid . '.xml' ;
$x = fetch_url ( $source_url );
if ( ! $x )
$x = fetch_url ( str_replace ( 'https://' , 'http://' , $source_url ));
if ( ! $x ) {
logger ( 'diaspora_reshare: unable to fetch source url ' . $source_url );
return ;
}
2011-10-20 12:56:10 +02:00
logger ( 'diaspora_reshare: source: ' . $x );
2011-10-19 00:56:35 +02:00
$x = str_replace ( array ( '<activity_streams-photo>' , '</activity_streams-photo>' ), array ( '<asphoto>' , '</asphoto>' ), $x );
2011-10-20 00:08:16 +02:00
$source_xml = parse_xml_string ( $x , false );
2011-10-19 00:56:35 +02:00
2011-10-28 11:50:00 +02:00
if ( strlen ( $source_xml -> post -> asphoto -> objectId ) && ( $source_xml -> post -> asphoto -> objectId != 0 ) && ( $source_xml -> post -> asphoto -> image_url )) {
2011-10-20 10:16:03 +02:00
$body = '[url=' . notags ( unxmlify ( $source_xml -> post -> asphoto -> image_url )) . '][img]' . notags ( unxmlify ( $source_xml -> post -> asphoto -> objectId )) . '[/img][/url]' . " \n " ;
2011-10-28 11:50:00 +02:00
$body = scale_diaspora_images ( $body , false );
}
elseif ( $source_xml -> post -> asphoto -> image_url ) {
2011-10-20 10:16:03 +02:00
$body = '[img]' . notags ( unxmlify ( $source_xml -> post -> asphoto -> image_url )) . '[/img]' . " \n " ;
2011-10-28 11:50:00 +02:00
$body = scale_diaspora_images ( $body );
}
2011-10-20 10:16:03 +02:00
elseif ( $source_xml -> post -> status_message ) {
$body = diaspora2bb ( $source_xml -> post -> status_message -> raw_message );
2011-10-28 11:50:00 +02:00
$body = scale_diaspora_images ( $body );
2011-10-19 00:56:35 +02:00
}
else {
2011-10-20 00:08:16 +02:00
logger ( 'diaspora_reshare: no reshare content found: ' . print_r ( $source_xml , true ));
2011-10-19 00:56:35 +02:00
return ;
}
if ( ! $body ) {
logger ( 'diaspora_reshare: empty body: source= ' . $x );
return ;
}
$person = find_diaspora_person_by_handle ( $orig_author );
if ( is_array ( $person ) && x ( $person , 'name' ) && x ( $person , 'url' ))
$details = '[url=' . $person [ 'url' ] . ']' . $person [ 'name' ] . '[/url]' ;
else
$details = $orig_author ;
$prefix = '♲ ' . $details . " \n " ;
// allocate a guid on our system - we aren't fixing any collisions.
// we're ignoring them
$g = q ( " select * from guid where guid = '%s' limit 1 " ,
dbesc ( $guid )
);
if ( ! count ( $g )) {
q ( " insert into guid ( guid ) values ( '%s' ) " ,
dbesc ( $guid )
);
}
$created = unxmlify ( $xml -> created_at );
$private = (( unxmlify ( $xml -> public ) == 'false' ) ? 1 : 0 );
$datarray = array ();
$str_tags = '' ;
$tags = get_tags ( $body );
if ( count ( $tags )) {
foreach ( $tags as $tag ) {
if ( strpos ( $tag , '#' ) === 0 ) {
if ( strpos ( $tag , '[url=' ))
continue ;
$basetag = str_replace ( '_' , ' ' , substr ( $tag , 1 ));
$body = str_replace ( $tag , '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' , $body );
if ( strlen ( $str_tags ))
$str_tags .= ',' ;
$str_tags .= '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' ;
continue ;
}
}
}
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
$datarray [ 'wall' ] = 0 ;
$datarray [ 'guid' ] = $guid ;
$datarray [ 'uri' ] = $datarray [ 'parent-uri' ] = $message_id ;
$datarray [ 'created' ] = $datarray [ 'edited' ] = datetime_convert ( 'UTC' , 'UTC' , $created );
$datarray [ 'private' ] = $private ;
$datarray [ 'parent' ] = 0 ;
$datarray [ 'owner-name' ] = $contact [ 'name' ];
$datarray [ 'owner-link' ] = $contact [ 'url' ];
$datarray [ 'owner-avatar' ] = $contact [ 'thumb' ];
$datarray [ 'author-name' ] = $contact [ 'name' ];
$datarray [ 'author-link' ] = $contact [ 'url' ];
$datarray [ 'author-avatar' ] = $contact [ 'thumb' ];
$datarray [ 'body' ] = $prefix . $body ;
$datarray [ 'tag' ] = $str_tags ;
$datarray [ 'app' ] = 'Diaspora' ;
$message_id = item_store ( $datarray );
if ( $message_id ) {
q ( " update item set plink = '%s' where id = %d limit 1 " ,
dbesc ( $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $message_id ),
intval ( $message_id )
);
}
return ;
}
2011-10-18 02:39:25 +02:00
function diaspora_asphoto ( $importer , $xml ) {
2011-10-18 13:28:36 +02:00
logger ( 'diaspora_asphoto called' );
2011-10-18 02:39:25 +02:00
$a = get_app ();
$guid = notags ( unxmlify ( $xml -> guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
logger ( 'diaspora_asphoto: Ignoring this author.' );
return 202 ;
}
$message_id = $diaspora_handle . ':' . $guid ;
$r = q ( " SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1 " ,
intval ( $importer [ 'uid' ]),
dbesc ( $message_id ),
dbesc ( $guid )
);
if ( count ( $r )) {
logger ( 'diaspora_asphoto: message exists: ' . $guid );
return ;
}
// allocate a guid on our system - we aren't fixing any collisions.
// we're ignoring them
$g = q ( " select * from guid where guid = '%s' limit 1 " ,
dbesc ( $guid )
);
if ( ! count ( $g )) {
q ( " insert into guid ( guid ) values ( '%s' ) " ,
dbesc ( $guid )
);
}
$created = unxmlify ( $xml -> created_at );
$private = (( unxmlify ( $xml -> public ) == 'false' ) ? 1 : 0 );
2011-10-29 01:13:54 +02:00
if ( strlen ( $xml -> objectId ) && ( $xml -> objectId != 0 ) && ( $xml -> image_url )) {
2011-10-19 09:29:43 +02:00
$body = '[url=' . notags ( unxmlify ( $xml -> image_url )) . '][img]' . notags ( unxmlify ( $xml -> objectId )) . '[/img][/url]' . " \n " ;
2011-10-29 01:13:54 +02:00
$body = scale_diaspora_images ( $body , false );
}
elseif ( $xml -> image_url ) {
2011-10-19 09:29:43 +02:00
$body = '[img]' . notags ( unxmlify ( $xml -> image_url )) . '[/img]' . " \n " ;
2011-10-29 01:13:54 +02:00
$body = scale_diaspora_images ( $body );
}
2011-10-18 02:39:25 +02:00
else {
logger ( 'diaspora_asphoto: no photo url found.' );
return ;
}
$datarray = array ();
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
$datarray [ 'wall' ] = 0 ;
$datarray [ 'guid' ] = $guid ;
$datarray [ 'uri' ] = $datarray [ 'parent-uri' ] = $message_id ;
$datarray [ 'created' ] = $datarray [ 'edited' ] = datetime_convert ( 'UTC' , 'UTC' , $created );
$datarray [ 'private' ] = $private ;
$datarray [ 'parent' ] = 0 ;
$datarray [ 'owner-name' ] = $contact [ 'name' ];
$datarray [ 'owner-link' ] = $contact [ 'url' ];
$datarray [ 'owner-avatar' ] = $contact [ 'thumb' ];
$datarray [ 'author-name' ] = $contact [ 'name' ];
$datarray [ 'author-link' ] = $contact [ 'url' ];
$datarray [ 'author-avatar' ] = $contact [ 'thumb' ];
$datarray [ 'body' ] = $body ;
$datarray [ 'app' ] = 'Diaspora/Cubbi.es' ;
$message_id = item_store ( $datarray );
if ( $message_id ) {
q ( " update item set plink = '%s' where id = %d limit 1 " ,
dbesc ( $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $message_id ),
intval ( $message_id )
);
}
return ;
}
2011-08-17 07:31:14 +02:00
function diaspora_comment ( $importer , $xml , $msg ) {
2011-08-17 13:24:26 +02:00
2011-09-03 14:23:36 +02:00
$a = get_app ();
2011-08-14 04:03:59 +02:00
$guid = notags ( unxmlify ( $xml -> guid ));
2011-08-17 13:24:26 +02:00
$parent_guid = notags ( unxmlify ( $xml -> parent_guid ));
2011-08-14 04:03:59 +02:00
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
2011-08-17 13:24:26 +02:00
$target_type = notags ( unxmlify ( $xml -> target_type ));
$text = unxmlify ( $xml -> text );
$author_signature = notags ( unxmlify ( $xml -> author_signature ));
2011-08-16 08:19:17 +02:00
2011-08-17 13:24:26 +02:00
$parent_author_signature = (( $xml -> parent_author_signature ) ? notags ( unxmlify ( $xml -> parent_author_signature )) : '' );
2011-08-16 08:19:17 +02:00
2011-08-17 13:24:26 +02:00
$text = $xml -> text ;
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $msg [ 'author' ]);
2011-08-30 07:50:41 +02:00
if ( ! $contact ) {
logger ( 'diaspora_comment: cannot find contact: ' . $msg [ 'author' ]);
2011-08-16 08:19:17 +02:00
return ;
2011-08-30 07:50:41 +02:00
}
2011-08-16 08:19:17 +02:00
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
logger ( 'diaspora_comment: Ignoring this author.' );
2011-09-15 04:33:42 +02:00
return 202 ;
2011-08-16 08:19:17 +02:00
}
2011-08-27 02:52:24 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1 " ,
intval ( $importer [ 'uid' ]),
dbesc ( $guid )
);
if ( count ( $r )) {
2011-08-30 07:50:41 +02:00
logger ( 'diaspora_comment: our comment just got relayed back to us (or there was a guid collision) : ' . $guid );
2011-08-27 02:52:24 +02:00
return ;
}
2011-08-17 13:24:26 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1 " ,
2011-08-14 04:03:59 +02:00
intval ( $importer [ 'uid' ]),
2011-08-17 13:24:26 +02:00
dbesc ( $parent_guid )
2011-08-14 04:03:59 +02:00
);
2011-08-17 13:24:26 +02:00
if ( ! count ( $r )) {
2011-08-19 11:53:44 +02:00
logger ( 'diaspora_comment: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid );
2011-08-14 04:03:59 +02:00
return ;
2011-08-17 13:24:26 +02:00
}
$parent_item = $r [ 0 ];
2011-08-14 04:03:59 +02:00
2011-08-17 13:24:26 +02:00
$author_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle ;
$author_signature = base64_decode ( $author_signature );
2011-08-21 02:50:39 +02:00
if ( strcasecmp ( $diaspora_handle , $msg [ 'author' ]) == 0 ) {
2011-08-17 13:24:26 +02:00
$person = $contact ;
$key = $msg [ 'key' ];
}
else {
2011-08-18 13:20:30 +02:00
$person = find_diaspora_person_by_handle ( $diaspora_handle );
2011-08-17 13:24:26 +02:00
if ( is_array ( $person ) && x ( $person , 'pubkey' ))
$key = $person [ 'pubkey' ];
else {
logger ( 'diaspora_comment: unable to find author details' );
return ;
}
}
2011-09-15 04:33:42 +02:00
if ( ! rsa_verify ( $author_signed_data , $author_signature , $key , 'sha256' )) {
2011-08-17 13:24:26 +02:00
logger ( 'diaspora_comment: verification failed.' );
2011-08-21 05:54:03 +02:00
return ;
2011-08-17 13:24:26 +02:00
}
2011-08-14 04:03:59 +02:00
2011-08-17 13:24:26 +02:00
if ( $parent_author_signature ) {
2011-08-24 04:54:35 +02:00
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle ;
2011-08-17 13:24:26 +02:00
$parent_author_signature = base64_decode ( $parent_author_signature );
$key = $msg [ 'key' ];
2011-09-15 04:33:42 +02:00
if ( ! rsa_verify ( $owner_signed_data , $parent_author_signature , $key , 'sha256' )) {
2011-08-17 13:24:26 +02:00
logger ( 'diaspora_comment: owner verification failed.' );
2011-08-21 05:54:03 +02:00
return ;
2011-08-17 13:24:26 +02:00
}
}
// Phew! Everything checks out. Now create an item.
2011-08-26 01:37:27 +02:00
$body = diaspora2bb ( $text );
2011-08-17 13:24:26 +02:00
$message_id = $diaspora_handle . ':' . $guid ;
$datarray = array ();
2011-10-06 05:48:00 +02:00
$str_tags = '' ;
$tags = get_tags ( $body );
if ( count ( $tags )) {
foreach ( $tags as $tag ) {
if ( strpos ( $tag , '#' ) === 0 ) {
if ( strpos ( $tag , '[url=' ))
continue ;
$basetag = str_replace ( '_' , ' ' , substr ( $tag , 1 ));
$body = str_replace ( $tag , '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' , $body );
if ( strlen ( $str_tags ))
$str_tags .= ',' ;
$str_tags .= '#[url=' . $a -> get_baseurl () . '/search?search=' . rawurlencode ( $basetag ) . ']' . $basetag . '[/url]' ;
continue ;
}
}
}
2011-08-17 13:24:26 +02:00
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
$datarray [ 'wall' ] = $parent_item [ 'wall' ];
$datarray [ 'gravity' ] = GRAVITY_COMMENT ;
$datarray [ 'guid' ] = $guid ;
$datarray [ 'uri' ] = $message_id ;
$datarray [ 'parent-uri' ] = $parent_item [ 'uri' ];
// No timestamps for comments? OK, we'll the use current time.
$datarray [ 'created' ] = $datarray [ 'edited' ] = datetime_convert ();
$datarray [ 'private' ] = $parent_item [ 'private' ];
2011-10-06 04:16:05 +02:00
$datarray [ 'owner-name' ] = $parent_item [ 'owner-name' ];
$datarray [ 'owner-link' ] = $parent_item [ 'owner-link' ];
$datarray [ 'owner-avatar' ] = $parent_item [ 'owner-avatar' ];
2011-08-17 13:24:26 +02:00
$datarray [ 'author-name' ] = $person [ 'name' ];
$datarray [ 'author-link' ] = $person [ 'url' ];
$datarray [ 'author-avatar' ] = (( x ( $person , 'thumb' )) ? $person [ 'thumb' ] : $person [ 'photo' ]);
$datarray [ 'body' ] = $body ;
2011-10-06 05:48:00 +02:00
$datarray [ 'tag' ] = $str_tags ;
2011-10-26 04:59:57 +02:00
// We can't be certain what the original app is if the message is relayed.
if (( $parent_item [ 'origin' ]) && ( ! $parent_author_signature ))
$datarray [ 'app' ] = 'Diaspora' ;
2011-08-17 13:24:26 +02:00
2011-08-18 14:08:39 +02:00
$message_id = item_store ( $datarray );
2011-09-01 06:46:37 +02:00
if ( $message_id ) {
q ( " update item set plink = '%s' where id = %d limit 1 " ,
dbesc ( $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $message_id ),
intval ( $message_id )
);
}
2011-10-21 12:33:34 +02:00
if (( $parent_item [ 'origin' ]) && ( ! $parent_author_signature )) {
2011-08-18 14:08:39 +02:00
q ( " insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') " ,
intval ( $message_id ),
dbesc ( $author_signed_data ),
dbesc ( base64_encode ( $author_signature )),
dbesc ( $diaspora_handle )
);
2011-08-17 13:24:26 +02:00
2011-08-24 13:42:28 +02:00
// if the message isn't already being relayed, notify others
// the existence of parent_author_signature means the parent_author or owner
// is already relaying.
2011-08-23 04:27:40 +02:00
2011-08-24 13:42:28 +02:00
proc_run ( 'php' , 'include/notifier.php' , 'comment' , $message_id );
}
2011-08-17 13:24:26 +02:00
return ;
2011-08-10 14:10:48 +02:00
}
2011-08-24 03:17:35 +02:00
function diaspora_photo ( $importer , $xml , $msg ) {
2011-09-03 14:23:36 +02:00
$a = get_app ();
2011-08-24 03:17:35 +02:00
$remote_photo_path = notags ( unxmlify ( $xml -> remote_photo_path ));
$remote_photo_name = notags ( unxmlify ( $xml -> remote_photo_name ));
$status_message_guid = notags ( unxmlify ( $xml -> status_message_guid ));
$guid = notags ( unxmlify ( $xml -> guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
$public = notags ( unxmlify ( $xml -> public ));
$created_at = notags ( unxmlify ( $xml_created_at ));
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $msg [ 'author' ]);
if ( ! $contact )
return ;
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
logger ( 'diaspora_photo: Ignoring this author.' );
2011-09-15 04:33:42 +02:00
return 202 ;
2011-08-24 03:17:35 +02:00
}
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1 " ,
intval ( $importer [ 'uid' ]),
dbesc ( $status_message_guid )
);
if ( ! count ( $r )) {
logger ( 'diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid );
return ;
}
$parent_item = $r [ 0 ];
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . " \n " ;
2011-10-29 01:13:54 +02:00
$link_text = scale_diaspora_images ( $link_text );
2011-10-06 06:04:53 +02:00
if ( strpos ( $parent_item [ 'body' ], $link_text ) === false ) {
2011-10-20 00:18:41 +02:00
$r = q ( " update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d limit 1 " ,
2011-10-06 06:02:00 +02:00
dbesc ( $link_text . $parent_item [ 'body' ]),
intval ( $parent_item [ 'id' ]),
intval ( $parent_item [ 'uid' ])
);
}
2011-08-24 03:17:35 +02:00
return ;
}
2011-08-17 07:31:14 +02:00
function diaspora_like ( $importer , $xml , $msg ) {
2011-08-10 14:10:48 +02:00
2011-08-21 03:08:43 +02:00
$a = get_app ();
2011-08-14 04:03:59 +02:00
$guid = notags ( unxmlify ( $xml -> guid ));
2011-08-17 07:31:14 +02:00
$parent_guid = notags ( unxmlify ( $xml -> parent_guid ));
2011-08-14 04:03:59 +02:00
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
2011-08-17 07:31:14 +02:00
$target_type = notags ( unxmlify ( $xml -> target_type ));
$positive = notags ( unxmlify ( $xml -> positive ));
2011-08-17 13:24:26 +02:00
$author_signature = notags ( unxmlify ( $xml -> author_signature ));
2011-08-16 08:19:17 +02:00
2011-08-17 07:31:14 +02:00
$parent_author_signature = (( $xml -> parent_author_signature ) ? notags ( unxmlify ( $xml -> parent_author_signature )) : '' );
2011-08-16 08:19:17 +02:00
2011-08-17 13:24:26 +02:00
// likes on comments not supported here and likes on photos not supported by Diaspora
2011-08-17 07:31:14 +02:00
if ( $target_type !== 'Post' )
return ;
2011-08-17 13:24:26 +02:00
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $msg [ 'author' ]);
2011-08-30 07:50:41 +02:00
if ( ! $contact ) {
logger ( 'diaspora_like: cannot find contact: ' . $msg [ 'author' ]);
2011-08-16 08:19:17 +02:00
return ;
2011-08-30 07:50:41 +02:00
}
2011-08-16 08:19:17 +02:00
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) || ( $contact [ 'blocked' ]) || ( $contact [ 'readonly' ])) {
logger ( 'diaspora_like: Ignoring this author.' );
2011-09-15 04:33:42 +02:00
return 202 ;
2011-08-16 08:19:17 +02:00
}
2011-08-17 07:31:14 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1 " ,
2011-08-14 04:03:59 +02:00
intval ( $importer [ 'uid' ]),
2011-08-17 07:31:14 +02:00
dbesc ( $parent_guid )
2011-08-14 04:03:59 +02:00
);
2011-08-17 07:31:14 +02:00
if ( ! count ( $r )) {
logger ( 'diaspora_like: parent item not found: ' . $guid );
2011-08-14 04:03:59 +02:00
return ;
2011-08-17 07:31:14 +02:00
}
2011-08-14 04:03:59 +02:00
2011-08-17 07:31:14 +02:00
$parent_item = $r [ 0 ];
2011-08-21 03:05:05 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1 " ,
2011-08-17 07:31:14 +02:00
intval ( $importer [ 'uid' ]),
dbesc ( $guid )
2011-08-14 04:03:59 +02:00
);
2011-08-17 07:31:14 +02:00
if ( count ( $r )) {
if ( $positive === 'true' ) {
logger ( 'diaspora_like: duplicate like: ' . $guid );
return ;
}
if ( $positive === 'false' ) {
q ( " UPDATE `item` SET `deleted` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $r [ 0 ][ 'id' ]),
intval ( $importer [ 'uid' ])
);
// FIXME
// send notification via proc_run()
return ;
}
}
if ( $positive === 'false' ) {
logger ( 'diaspora_like: unlike received with no corresponding like' );
return ;
}
2011-08-22 10:57:52 +02:00
$author_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle ;
2011-08-17 07:31:14 +02:00
$author_signature = base64_decode ( $author_signature );
2011-08-21 02:50:39 +02:00
if ( strcasecmp ( $diaspora_handle , $msg [ 'author' ]) == 0 ) {
2011-08-17 13:24:26 +02:00
$person = $contact ;
2011-08-17 07:31:14 +02:00
$key = $msg [ 'key' ];
2011-08-17 13:24:26 +02:00
}
else {
2011-08-18 13:20:30 +02:00
$person = find_diaspora_person_by_handle ( $diaspora_handle );
2011-08-17 13:24:26 +02:00
if ( is_array ( $person ) && x ( $person , 'pubkey' ))
$key = $person [ 'pubkey' ];
else {
2011-08-21 13:18:39 +02:00
logger ( 'diaspora_like: unable to find author details' );
2011-08-17 13:24:26 +02:00
return ;
}
}
2011-08-17 07:31:14 +02:00
2011-09-15 04:33:42 +02:00
if ( ! rsa_verify ( $author_signed_data , $author_signature , $key , 'sha256' )) {
2011-08-17 07:31:14 +02:00
logger ( 'diaspora_like: verification failed.' );
2011-08-22 10:57:52 +02:00
return ;
2011-08-17 07:31:14 +02:00
}
2011-08-14 04:03:59 +02:00
2011-08-17 07:31:14 +02:00
if ( $parent_author_signature ) {
2011-08-31 04:20:56 +02:00
$owner_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle ;
2011-08-14 04:03:59 +02:00
2011-08-17 07:31:14 +02:00
$parent_author_signature = base64_decode ( $parent_author_signature );
2011-08-14 04:03:59 +02:00
2011-08-17 07:31:14 +02:00
$key = $msg [ 'key' ];
2011-09-15 04:33:42 +02:00
if ( ! rsa_verify ( $owner_signed_data , $parent_author_signature , $key , 'sha256' )) {
2011-08-17 07:31:14 +02:00
logger ( 'diaspora_like: owner verification failed.' );
2011-08-22 10:57:52 +02:00
return ;
2011-08-17 07:31:14 +02:00
}
}
// Phew! Everything checks out. Now create an item.
$uri = $diaspora_handle . ':' . $guid ;
2011-08-17 13:24:26 +02:00
$activity = ACTIVITY_LIKE ;
2011-08-17 07:31:14 +02:00
$post_type = (( $parent_item [ 'resource-id' ]) ? t ( 'photo' ) : t ( 'status' ));
$objtype = (( $parent_item [ 'resource-id' ]) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
$link = xmlify ( '<link rel="alternate" type="text/html" href="' . $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $parent_item [ 'id' ] . '" />' . " \n " ) ;
$body = $parent_item [ 'body' ];
2011-08-14 04:03:59 +02:00
$obj = <<< EOT
< object >
< type > $objtype </ type >
< local > 1 </ local >
2011-08-17 07:31:14 +02:00
< id > { $parent_item [ 'uri' ]} </ id >
2011-08-14 04:03:59 +02:00
< link > $link </ link >
< title ></ title >
< content > $body </ content >
</ object >
EOT ;
2011-08-17 07:31:14 +02:00
$bodyverb = t ( '%1$s likes %2$s\'s %3$s' );
2011-08-14 04:03:59 +02:00
$arr = array ();
$arr [ 'uri' ] = $uri ;
2011-08-17 07:31:14 +02:00
$arr [ 'uid' ] = $importer [ 'uid' ];
2011-08-21 03:14:19 +02:00
$arr [ 'guid' ] = $guid ;
2011-08-14 04:03:59 +02:00
$arr [ 'contact-id' ] = $contact [ 'id' ];
$arr [ 'type' ] = 'activity' ;
2011-08-17 07:31:14 +02:00
$arr [ 'wall' ] = $parent_item [ 'wall' ];
2011-08-14 04:03:59 +02:00
$arr [ 'gravity' ] = GRAVITY_LIKE ;
2011-08-17 07:31:14 +02:00
$arr [ 'parent' ] = $parent_item [ 'id' ];
$arr [ 'parent-uri' ] = $parent_item [ 'uri' ];
2011-10-21 12:33:34 +02:00
$arr [ 'owner-name' ] = $parent_item [ 'name' ];
$arr [ 'owner-link' ] = $parent_item [ 'url' ];
$arr [ 'owner-avatar' ] = $parent_item [ 'thumb' ];
2011-08-17 07:31:14 +02:00
2011-08-21 03:14:19 +02:00
$arr [ 'author-name' ] = $person [ 'name' ];
$arr [ 'author-link' ] = $person [ 'url' ];
$arr [ 'author-avatar' ] = (( x ( $person , 'thumb' )) ? $person [ 'thumb' ] : $person [ 'photo' ]);
2011-08-14 04:03:59 +02:00
$ulink = '[url=' . $contact [ 'url' ] . ']' . $contact [ 'name' ] . '[/url]' ;
2011-08-17 07:31:14 +02:00
$alink = '[url=' . $parent_item [ 'author-link' ] . ']' . $parent_item [ 'author-name' ] . '[/url]' ;
$plink = '[url=' . $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $parent_item [ 'id' ] . ']' . $post_type . '[/url]' ;
2011-08-14 04:03:59 +02:00
$arr [ 'body' ] = sprintf ( $bodyverb , $ulink , $alink , $plink );
2011-08-27 02:52:24 +02:00
$arr [ 'app' ] = 'Diaspora' ;
2011-08-17 13:24:26 +02:00
$arr [ 'private' ] = $parent_item [ 'private' ];
2011-08-14 04:03:59 +02:00
$arr [ 'verb' ] = $activity ;
$arr [ 'object-type' ] = $objtype ;
$arr [ 'object' ] = $obj ;
$arr [ 'visible' ] = 1 ;
$arr [ 'unseen' ] = 1 ;
$arr [ 'last-child' ] = 0 ;
2011-08-18 14:08:39 +02:00
$message_id = item_store ( $arr );
2011-08-14 04:03:59 +02:00
2011-09-01 06:46:37 +02:00
if ( $message_id ) {
q ( " update item set plink = '%s' where id = %d limit 1 " ,
dbesc ( $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $message_id ),
intval ( $message_id )
);
}
2011-08-18 14:08:39 +02:00
if ( ! $parent_author_signature ) {
q ( " insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') " ,
intval ( $message_id ),
dbesc ( $author_signed_data ),
dbesc ( base64_encode ( $author_signature )),
dbesc ( $diaspora_handle )
);
}
2011-08-14 04:03:59 +02:00
2011-08-24 13:42:28 +02:00
// if the message isn't already being relayed, notify others
// the existence of parent_author_signature means the parent_author or owner
2011-10-21 12:33:34 +02:00
// is already relaying. The parent_item['origin'] indicates the message was created on our system
2011-08-24 13:42:28 +02:00
2011-10-21 12:33:34 +02:00
if (( $parent_item [ 'origin' ]) && ( ! $parent_author_signature ))
2011-08-24 13:42:28 +02:00
proc_run ( 'php' , 'include/notifier.php' , 'comment' , $message_id );
2011-08-14 04:03:59 +02:00
2011-08-18 14:08:39 +02:00
return ;
2011-08-10 14:10:48 +02:00
}
2011-08-16 08:19:17 +02:00
function diaspora_retraction ( $importer , $xml ) {
$guid = notags ( unxmlify ( $xml -> guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
2011-08-23 05:35:34 +02:00
$type = notags ( unxmlify ( $xml -> type ));
2011-08-16 08:19:17 +02:00
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
2011-08-23 05:35:34 +02:00
if ( $type === 'Person' ) {
contact_remove ( $contact [ 'id' ]);
}
elseif ( $type === 'Post' ) {
$r = q ( " select * from item where guid = '%s' and uid = %d limit 1 " ,
dbesc ( 'guid' ),
intval ( $importer [ 'uid' ])
);
if ( count ( $r )) {
if ( link_compare ( $r [ 0 ][ 'author-link' ], $contact [ 'url' ])) {
q ( " update item set `deleted` = 1, `changed` = '%s' where `id` = %d limit 1 " ,
dbesc ( datetime_convert ()),
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
2011-08-10 14:10:48 +02:00
2011-09-15 04:33:42 +02:00
return 202 ;
2011-08-23 05:35:34 +02:00
// NOTREACHED
2011-08-10 14:10:48 +02:00
}
2011-10-14 03:32:02 +02:00
2011-11-05 22:45:29 +01:00
function diaspora_signed_retraction ( $importer , $xml ) {
$guid = notags ( unxmlify ( $xml -> target_guid ));
$diaspora_handle = notags ( unxmlify ( $xml -> sender_handle ));
$type = notags ( unxmlify ( $xml -> target_type ));
$sig = notags ( unxmlify ( $xml -> target_author_signature ));
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
// this may not yet work for comments. Need to see how the relaying works
// and figure out who signs it.
$signed_data = $guid . ';' . $type ;
$sig = base64_decode ( $sig );
$key = $msg [ 'key' ];
if ( ! rsa_verify ( $signed_data , $sig , $key , 'sha256' )) {
logger ( 'diaspora_signed_retraction: owner verification failed.' . print_r ( $msg , true ));
return ;
}
if ( $type === 'StatusMessage' ) {
$r = q ( " select * from item where guid = '%s' and uid = %d limit 1 " ,
dbesc ( 'guid' ),
intval ( $importer [ 'uid' ])
);
if ( count ( $r )) {
if ( link_compare ( $r [ 0 ][ 'author-link' ], $contact [ 'url' ])) {
q ( " update item set `deleted` = 1, `changed` = '%s' where `id` = %d limit 1 " ,
dbesc ( datetime_convert ()),
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
return 202 ;
// NOTREACHED
}
2011-10-14 03:32:02 +02:00
function diaspora_profile ( $importer , $xml ) {
$a = get_app ();
$diaspora_handle = notags ( unxmlify ( $xml -> diaspora_handle ));
$contact = diaspora_get_contact_by_handle ( $importer [ 'uid' ], $diaspora_handle );
if ( ! $contact )
return ;
if ( $contact [ 'blocked' ]) {
logger ( 'diaspora_post: Ignoring this author.' );
return 202 ;
}
$name = unxmlify ( $xml -> first_name ) . (( strlen ( $xml -> last_name )) ? ' ' . unxmlify ( $xml -> last_name ) : '' );
$image_url = unxmlify ( $xml -> image_url );
$birthday = unxmlify ( $xml -> birthday );
$r = q ( " SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' " ,
intval ( $importer [ 'uid' ]),
intval ( $contact [ 'id' ])
);
$oldphotos = (( count ( $r )) ? $r : null );
2011-10-18 10:12:51 +02:00
require_once ( 'include/Photo.php' );
2011-10-14 03:32:02 +02:00
$images = import_profile_photo ( $image_url , $importer [ 'uid' ], $contact [ 'id' ]);
2011-10-14 09:20:37 +02:00
// Generic birthday. We don't know the timezone. The year is irrelevant.
2011-10-14 03:32:02 +02:00
2011-10-18 10:12:51 +02:00
$birthday = str_replace ( '1000' , '1901' , $birthday );
2011-10-14 09:20:37 +02:00
$birthday = datetime_convert ( 'UTC' , 'UTC' , $birthday , 'Y-m-d' );
$r = q ( " UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
2011-10-14 03:32:02 +02:00
dbesc ( $name ),
dbesc ( datetime_convert ()),
dbesc ( $images [ 0 ]),
dbesc ( $images [ 1 ]),
dbesc ( $images [ 2 ]),
dbesc ( datetime_convert ()),
2011-10-18 10:12:51 +02:00
dbesc ( $birthday ),
2011-10-14 03:32:02 +02:00
intval ( $contact [ 'id' ]),
2011-10-18 10:12:51 +02:00
intval ( $importer [ 'uid' ])
2011-10-14 03:32:02 +02:00
);
2011-10-18 10:12:51 +02:00
2011-10-14 03:32:02 +02:00
if ( $r ) {
if ( $oldphotos ) {
foreach ( $oldphotos as $ph ) {
q ( " DELETE FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' AND `resource-id` = '%s' " ,
intval ( $importer [ 'uid' ]),
intval ( $contact [ 'id' ]),
dbesc ( $ph [ 'resource-id' ])
);
}
}
}
return ;
}
2011-08-10 14:10:48 +02:00
2011-08-15 05:38:31 +02:00
function diaspora_share ( $me , $contact ) {
$a = get_app ();
$myaddr = $me [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
$theiraddr = $contact [ 'addr' ];
$tpl = get_markup_template ( 'diaspora_share.tpl' );
$msg = replace_macros ( $tpl , array (
2011-08-19 14:20:30 +02:00
'$sender' => $myaddr ,
2011-08-15 05:38:31 +02:00
'$recipient' => $theiraddr
));
2011-08-19 11:24:30 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $me , $contact , $me [ 'prvkey' ], $contact [ 'pubkey' ])));
2011-08-15 05:38:31 +02:00
2011-10-08 00:49:41 +02:00
return ( diaspora_transmit ( $owner , $contact , $slap , false ));
2011-08-15 05:38:31 +02:00
}
2011-08-23 05:35:34 +02:00
function diaspora_unshare ( $me , $contact ) {
$a = get_app ();
$myaddr = $me [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
$tpl = get_markup_template ( 'diaspora_retract.tpl' );
$msg = replace_macros ( $tpl , array (
'$guid' => $me [ 'guid' ],
'$type' => 'Person' ,
'$handle' => $myaddr
));
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $me , $contact , $me [ 'prvkey' ], $contact [ 'pubkey' ])));
2011-10-08 00:49:41 +02:00
return ( diaspora_transmit ( $owner , $contact , $slap , false ));
2011-08-24 10:21:24 +02:00
2011-08-23 05:35:34 +02:00
}
2011-09-22 13:11:39 +02:00
function diaspora_send_status ( $item , $owner , $contact , $public_batch = false ) {
2011-08-15 06:23:02 +02:00
$a = get_app ();
2011-08-19 06:09:44 +02:00
$myaddr = $owner [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
2011-08-15 06:23:02 +02:00
$theiraddr = $contact [ 'addr' ];
2011-08-24 03:17:35 +02:00
$images = array ();
$body = $item [ 'body' ];
2011-10-24 01:01:04 +02:00
/*
2011-10-24 04:05:32 +02:00
// We're trying to match Diaspora's split message/photo protocol but
// all the photos are displayed on D* as links and not img's - even
// though we're sending pretty much precisely what they send us when
// doing the same operation.
// Commented out for now, we'll use bb2diaspora to convert photos to markdown
// which seems to get through intact.
2011-08-24 03:17:35 +02:00
$cnt = preg_match_all ( '|\[img\](.*?)\[\/img\]|' , $body , $matches , PREG_SET_ORDER );
if ( $cnt ) {
foreach ( $matches as $mtch ) {
$detail = array ();
$detail [ 'str' ] = $mtch [ 0 ];
2011-08-24 03:50:18 +02:00
$detail [ 'path' ] = dirname ( $mtch [ 1 ]) . '/' ;
2011-08-24 03:17:35 +02:00
$detail [ 'file' ] = basename ( $mtch [ 1 ]);
$detail [ 'guid' ] = $item [ 'guid' ];
$detail [ 'handle' ] = $myaddr ;
$images [] = $detail ;
2011-10-20 11:21:57 +02:00
$body = str_replace ( $detail [ 'str' ], $mtch [ 1 ], $body );
2011-08-24 03:17:35 +02:00
}
}
2011-10-24 01:01:04 +02:00
*/
2011-08-24 03:17:35 +02:00
2011-08-27 02:52:24 +02:00
$body = xmlify ( html_entity_decode ( bb2diaspora ( $body )));
2011-11-02 01:30:52 +01:00
if ( $item [ 'attach' ]) {
$cnt = preg_match_all ( '/href=\"(.*?)\"(.*?)title=\"(.*?)\"/ism' , $item [ 'attach' ], $matches , PREG_SET_ORDER );
if ( cnt ) {
$body .= " \n " . t ( 'Attachments:' ) . " \n " ;
foreach ( $matches as $mtch ) {
$body .= '[' . $mtch [ 3 ] . '](' . $mtch [ 1 ] . ')' . " \n " ;
}
}
}
2011-08-15 06:23:02 +02:00
$public = (( $item [ 'private' ]) ? 'false' : 'true' );
require_once ( 'include/datetime.php' );
2011-08-30 03:01:59 +02:00
$created = datetime_convert ( 'UTC' , 'UTC' , $item [ 'created' ], 'Y-m-d H:i:s \U\T\C' );
2011-08-15 06:23:02 +02:00
$tpl = get_markup_template ( 'diaspora_post.tpl' );
$msg = replace_macros ( $tpl , array (
'$body' => $body ,
'$guid' => $item [ 'guid' ],
'$handle' => xmlify ( $myaddr ),
'$public' => $public ,
'$created' => $created
));
2011-08-24 03:50:18 +02:00
logger ( 'diaspora_send_status: ' . $owner [ 'username' ] . ' -> ' . $contact [ 'name' ] . ' base message: ' . $msg , LOGGER_DATA );
2011-08-15 06:23:02 +02:00
2011-09-22 13:11:39 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $owner , $contact , $owner [ 'uprvkey' ], $contact [ 'pubkey' ], $public_batch )));
2011-08-15 06:23:02 +02:00
2011-09-22 13:11:39 +02:00
$return_code = diaspora_transmit ( $owner , $contact , $slap , $public_batch );
2011-08-24 03:17:35 +02:00
if ( count ( $images )) {
2011-09-22 13:11:39 +02:00
diaspora_send_images ( $item , $owner , $contact , $images , $public_batch );
2011-08-24 03:17:35 +02:00
}
2011-08-15 06:23:02 +02:00
return $return_code ;
}
2011-08-19 06:09:44 +02:00
2011-09-22 13:11:39 +02:00
function diaspora_send_images ( $item , $owner , $contact , $images , $public_batch = false ) {
2011-08-24 03:17:35 +02:00
$a = get_app ();
if ( ! count ( $images ))
return ;
$mysite = substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 ) . '/photo' ;
$tpl = get_markup_template ( 'diaspora_photo.tpl' );
foreach ( $images as $image ) {
if ( ! stristr ( $image [ 'path' ], $mysite ))
continue ;
$resource = str_replace ( '.jpg' , '' , $image [ 'file' ]);
$resource = substr ( $resource , 0 , strpos ( $resource , '-' ));
$r = q ( " select * from photo where `resource-id` = '%s' and `uid` = %d limit 1 " ,
dbesc ( $resource ),
intval ( $owner [ 'uid' ])
);
if ( ! count ( $r ))
continue ;
$public = (( $r [ 0 ][ 'allow_cid' ] || $r [ 0 ][ 'allow_gid' ] || $r [ 0 ][ 'deny_cid' ] || $r [ 0 ][ 'deny_gid' ]) ? 'false' : 'true' );
$msg = replace_macros ( $tpl , array (
'$path' => xmlify ( $image [ 'path' ]),
'$filename' => xmlify ( $image [ 'file' ]),
'$msg_guid' => xmlify ( $image [ 'guid' ]),
'$guid' => xmlify ( $r [ 0 ][ 'guid' ]),
'$handle' => xmlify ( $image [ 'handle' ]),
'$public' => xmlify ( $public ),
2011-08-30 03:01:59 +02:00
'$created_at' => xmlify ( datetime_convert ( 'UTC' , 'UTC' , $r [ 0 ][ 'created' ], 'Y-m-d H:i:s \U\T\C' ))
2011-08-24 03:17:35 +02:00
));
2011-08-24 10:21:24 +02:00
2011-08-24 03:17:35 +02:00
logger ( 'diaspora_send_photo: base message: ' . $msg , LOGGER_DATA );
2011-09-22 13:11:39 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $owner , $contact , $owner [ 'uprvkey' ], $contact [ 'pubkey' ], $public_batch )));
2011-08-24 03:17:35 +02:00
2011-09-22 13:11:39 +02:00
diaspora_transmit ( $owner , $contact , $slap , $public_batch );
2011-08-24 03:17:35 +02:00
}
}
2011-09-22 13:11:39 +02:00
function diaspora_send_followup ( $item , $owner , $contact , $public_batch = false ) {
2011-08-19 06:09:44 +02:00
$a = get_app ();
2011-08-19 11:24:30 +02:00
$myaddr = $owner [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
2011-08-19 06:09:44 +02:00
$theiraddr = $contact [ 'addr' ];
$p = q ( " select guid from item where parent = %d limit 1 " ,
$item [ 'parent' ]
);
if ( count ( $p ))
$parent_guid = $p [ 0 ][ 'guid' ];
else
return ;
if ( $item [ 'verb' ] === ACTIVITY_LIKE ) {
$tpl = get_markup_template ( 'diaspora_like.tpl' );
$like = true ;
$target_type = 'Post' ;
$positive = (( $item [ 'deleted' ]) ? 'false' : 'true' );
}
else {
$tpl = get_markup_template ( 'diaspora_comment.tpl' );
$like = false ;
}
2011-08-27 02:52:24 +02:00
$text = html_entity_decode ( bb2diaspora ( $item [ 'body' ]));
2011-08-19 06:09:44 +02:00
// sign it
if ( $like )
2011-08-23 10:00:29 +02:00
$signed_text = $item [ 'guid' ] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr ;
2011-08-19 06:09:44 +02:00
else
2011-08-19 11:24:30 +02:00
$signed_text = $item [ 'guid' ] . ';' . $parent_guid . ';' . $text . ';' . $myaddr ;
2011-08-19 06:09:44 +02:00
2011-09-15 04:33:42 +02:00
$authorsig = base64_encode ( rsa_sign ( $signed_text , $owner [ 'uprvkey' ], 'sha256' ));
2011-08-19 06:09:44 +02:00
$msg = replace_macros ( $tpl , array (
'$guid' => xmlify ( $item [ 'guid' ]),
'$parent_guid' => xmlify ( $parent_guid ),
'$target_type' => xmlify ( $target_type ),
'$authorsig' => xmlify ( $authorsig ),
2011-08-19 11:24:30 +02:00
'$body' => xmlify ( $text ),
2011-08-19 06:09:44 +02:00
'$positive' => xmlify ( $positive ),
2011-08-19 11:24:30 +02:00
'$handle' => xmlify ( $myaddr )
2011-08-19 06:09:44 +02:00
));
logger ( 'diaspora_followup: base message: ' . $msg , LOGGER_DATA );
2011-09-22 13:11:39 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $owner , $contact , $owner [ 'uprvkey' ], $contact [ 'pubkey' ], $public_batch )));
2011-08-19 06:09:44 +02:00
2011-09-22 13:11:39 +02:00
return ( diaspora_transmit ( $owner , $contact , $slap , $public_batch ));
2011-08-19 06:09:44 +02:00
}
2011-09-22 13:11:39 +02:00
function diaspora_send_relay ( $item , $owner , $contact , $public_batch = false ) {
2011-08-19 06:09:44 +02:00
2011-08-19 11:24:30 +02:00
$a = get_app ();
$myaddr = $owner [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
$theiraddr = $contact [ 'addr' ];
2011-08-19 06:09:44 +02:00
$p = q ( " select guid from item where parent = %d limit 1 " ,
$item [ 'parent' ]
);
if ( count ( $p ))
$parent_guid = $p [ 0 ][ 'guid' ];
else
return ;
if ( $item [ 'verb' ] === ACTIVITY_LIKE ) {
$tpl = get_markup_template ( 'diaspora_like_relay.tpl' );
$like = true ;
$target_type = 'Post' ;
$positive = (( $item [ 'deleted' ]) ? 'false' : 'true' );
}
else {
$tpl = get_markup_template ( 'diaspora_comment_relay.tpl' );
$like = false ;
}
2011-08-28 14:04:49 +02:00
$body = $item [ 'body' ];
$text = html_entity_decode ( bb2diaspora ( $body ));
2011-08-19 06:09:44 +02:00
2011-08-26 16:29:22 +02:00
// fetch the original signature if somebody sent the post to us to relay
2011-08-29 09:51:08 +02:00
// If we are relaying for a reply originating on our own account, there wasn't a 'send to relay'
2011-08-26 16:29:22 +02:00
// action. It wasn't needed. In that case create the original signature and the
// owner (parent author) signature
2011-08-29 09:51:08 +02:00
// comments from other networks will be relayed under our name, with a brief
// preamble to describe what's happening and noting the real author
2011-08-19 06:09:44 +02:00
2011-08-26 16:29:22 +02:00
$r = q ( " select * from sign where iid = %d limit 1 " ,
intval ( $item [ 'id' ])
);
if ( count ( $r )) {
$orig_sign = $r [ 0 ];
$signed_text = $orig_sign [ 'signed_text' ];
$authorsig = $orig_sign [ 'signature' ];
2011-08-29 09:51:08 +02:00
$handle = $orig_sign [ 'signer' ];
2011-08-26 16:29:22 +02:00
}
else {
2011-08-28 14:00:30 +02:00
2011-08-29 04:22:27 +02:00
$itemcontact = q ( " select * from contact where `id` = %d limit 1 " ,
intval ( $item [ 'contact-id' ])
);
if ( count ( $itemcontact )) {
if ( ! $itemcontact [ 0 ][ 'self' ]) {
$prefix = sprintf ( t ( '[Relayed] Comment authored by %s from network %s' ),
'[' . $item [ 'author-name' ] . ']' . '(' . $item [ 'author-link' ] . ')' ,
network_to_name ( $itemcontact [ 'network' ])) . " \n " ;
$body = $prefix . $body ;
}
}
else {
2011-08-28 14:00:30 +02:00
2011-08-29 04:22:27 +02:00
if ( $like )
$signed_text = $item [ 'guid' ] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr ;
else
$signed_text = $item [ 'guid' ] . ';' . $parent_guid . ';' . $text . ';' . $myaddr ;
2011-08-28 14:00:30 +02:00
2011-09-15 04:33:42 +02:00
$authorsig = base64_encode ( rsa_sign ( $signed_text , $owner [ 'uprvkey' ], 'sha256' ));
2011-08-28 14:00:30 +02:00
2011-08-29 04:22:27 +02:00
q ( " insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') " ,
intval ( $item [ 'id' ]),
dbesc ( $signed_text ),
dbesc ( base64_encode ( $authorsig )),
dbesc ( $myaddr )
);
2011-08-29 09:51:08 +02:00
$handle = $myaddr ;
2011-08-29 04:22:27 +02:00
}
2011-08-26 16:29:22 +02:00
}
// sign it
2011-08-19 06:09:44 +02:00
2011-09-15 04:33:42 +02:00
$parentauthorsig = base64_encode ( rsa_sign ( $signed_text , $owner [ 'uprvkey' ], 'sha256' ));
2011-08-19 06:09:44 +02:00
$msg = replace_macros ( $tpl , array (
'$guid' => xmlify ( $item [ 'guid' ]),
'$parent_guid' => xmlify ( $parent_guid ),
'$target_type' => xmlify ( $target_type ),
'$authorsig' => xmlify ( $orig_sign [ 'signature' ]),
'$parentsig' => xmlify ( $parentauthorsig ),
2011-08-26 16:29:22 +02:00
'$body' => xmlify ( $text ),
2011-08-19 06:09:44 +02:00
'$positive' => xmlify ( $positive ),
2011-08-29 09:51:08 +02:00
'$handle' => xmlify ( $handle )
2011-08-19 06:09:44 +02:00
));
logger ( 'diaspora_relay_comment: base message: ' . $msg , LOGGER_DATA );
2011-09-22 13:11:39 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $owner , $contact , $owner [ 'uprvkey' ], $contact [ 'pubkey' ], $public_batch )));
2011-08-19 06:09:44 +02:00
2011-09-22 13:11:39 +02:00
return ( diaspora_transmit ( $owner , $contact , $slap , $public_batch ));
2011-08-19 06:09:44 +02:00
}
2011-09-22 13:11:39 +02:00
function diaspora_send_retraction ( $item , $owner , $contact , $public_batch = false ) {
2011-08-19 06:09:44 +02:00
2011-08-23 05:35:34 +02:00
$a = get_app ();
$myaddr = $owner [ 'nickname' ] . '@' . substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ) + 3 );
2011-08-19 06:09:44 +02:00
2011-11-05 22:45:29 +01:00
$signed_text = $item [ 'guid' ] . ';' . 'StatusMessage' ;
$tpl = get_markup_template ( 'diaspora_signed_retract.tpl' );
2011-08-23 05:35:34 +02:00
$msg = replace_macros ( $tpl , array (
'$guid' => $item [ 'guid' ],
2011-11-05 22:45:29 +01:00
'$type' => 'StatusMessage' ,
'$handle' => $myaddr ,
'$signature' => base64_encode ( rsa_sign ( $signed_text , $owner [ 'uprvkey' ], 'sha256' ))
2011-08-23 05:35:34 +02:00
));
2011-08-19 06:09:44 +02:00
2011-09-22 13:11:39 +02:00
$slap = 'xml=' . urlencode ( urlencode ( diaspora_msg_build ( $msg , $owner , $contact , $owner [ 'uprvkey' ], $contact [ 'pubkey' ], $public_batch )));
2011-08-19 06:09:44 +02:00
2011-09-22 13:11:39 +02:00
return ( diaspora_transmit ( $owner , $contact , $slap , $public_batch ));
2011-08-24 10:21:24 +02:00
}
2011-09-22 13:11:39 +02:00
function diaspora_transmit ( $owner , $contact , $slap , $public_batch ) {
2011-08-24 10:21:24 +02:00
$a = get_app ();
2011-09-22 13:11:39 +02:00
$logid = random_string ( 4 );
2011-11-07 01:48:13 +01:00
$dest_url = (( $public_batch ) ? $contact [ 'batch' ] : $contact [ 'notify' ]);
if ( ! $dest_url ) {
logger ( 'diaspora_transmit: no url for contact: ' . $contact [ 'id' ] . ' batch mode =' . $public_batch );
return 0 ;
}
logger ( 'diaspora_transmit: ' . $logid . ' ' . $dest_url );
post_url ( $dest_url . '/' , $slap );
2011-08-23 05:35:34 +02:00
$return_code = $a -> get_curl_code ();
2011-09-22 13:11:39 +02:00
logger ( 'diaspora_transmit: ' . $logid . ' returns: ' . $return_code );
2011-08-24 10:21:24 +02:00
2011-11-07 01:48:13 +01:00
if (( ! $return_code ) || (( $return_code == 503 ) && ( stristr ( $a -> get_curl_headers (), 'retry-after' )))) {
2011-08-24 10:21:24 +02:00
logger ( 'diaspora_transmit: queue message' );
2011-11-07 01:48:13 +01:00
$r = q ( " SELECT id from queue where cid = %d and network = '%s' and content = '%s' and batch = %d limit 1 " ,
intval ( $contact [ 'id' ]),
dbesc ( NETWORK_DIASPORA ),
dbesc ( $slap ),
intval ( $public_batch )
);
if ( count ( $r )) {
logger ( 'diaspora_transmit: add_to_queue ignored - identical item already in queue' );
}
else {
// queue message for redelivery
add_to_queue ( $contact [ 'id' ], NETWORK_DIASPORA , $slap , $public_batch );
}
2011-08-24 10:21:24 +02:00
}
2011-08-19 06:09:44 +02:00
2011-09-28 04:27:47 +02:00
2011-08-24 10:21:24 +02:00
return (( $return_code ) ? $return_code : ( - 1 ));
}