diff --git a/jappixmini/README b/jappixmini/README new file mode 100644 index 00000000..2ef7c2f1 --- /dev/null +++ b/jappixmini/README @@ -0,0 +1,23 @@ +Jappix Mini Plugin +================== + +This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat +to Friendica. It uses Jappix Mini. + +It is necessary to use a BOSH proxy - so to use this plugin, you need to know the +address of a BOSH proxy that works with your account. + +The addon has an experimental autosubscribe and autosuggest functionality which tries +to add your Friendica contacts to your roster automatically. + +Installation +------------ + +Jappix Mini (AGPL license) is not distributed with this addon. You need to +install it manually: + +* Download latest zip file named friendica-addon-* from + https://github.com/Leberwurscht/jappix-friendica-addon/tags and place the zip file + in the addon folder. Make sure to name it 'jappix.zip' - the download link required + by the AGPL points there. +* Unpack the zip file, rename the folder to 'jappix'. Do not delete jappix.zip. diff --git a/jappixmini/jappixmini.php b/jappixmini/jappixmini.php new file mode 100644 index 00000000..88959448 --- /dev/null +++ b/jappixmini/jappixmini.php @@ -0,0 +1,382 @@ +You need to install the Jappix application, adapted for Friendica (see README).
'; + } + else if (!file_exists("addon/jappixmini/jappix.zip")) { + $o .= 'The source archive jappix.zip does not exist. This is probably a violation of the Jappix License (see README).
'; + } +} + +function jappixmini_plugin_admin_post(&$a) { +} + +function jappixmini_module() {} +function jappixmini_init(&$a) { + // Here, other friendica sites can fetch the jabber address of local users. + // Because we do not want to publish the addresses publicly, they are encrypted so + // that only contacts can read it. + $encrypt_for = $_REQUEST["encrypt_for"]; + if ($encrypt_for) { + $r = q("SELECT * FROM `contact` WHERE LENGTH(`pubkey`) AND `dfrn-id` = '%s' LIMIT 1", + dbesc($encrypt_for) + ); + if (!count($r)) killme(); + + // get public key to encrypt address + $pubkey = $r[0]['pubkey']; + + // get jabber address + $uid = $r[0]['uid']; + $username = get_pconfig($uid, 'jappixmini', 'username'); + if (!$username) killme(); + $server = get_pconfig($uid, 'jappixmini', 'server'); + if (!$server) killme(); + + $address = $username."@".$server; + + // encrypt address + $encrypted = ""; + openssl_public_encrypt($address,$encrypted,$pubkey); + + // calculate hex representation of encrypted address + $hex = bin2hex($encrypted); + + // construct answer + $answer = Array("status"=>"ok", "encrypted_address"=>$hex); + + // return answer as json + echo json_encode($answer); + killme(); + } + + // If we have only a private key, other site sends encrypted request, we answer unencrypted. + $encrypted_for = $_REQUEST["encrypted_for"]; + if (!$encrypted_for) killme(); + + $encrypted_request_hex = $_REQUEST["encrypted_request"]; + if (!$encrypted_request_hex) killme(); + $encrypted_request = hex2bin($encrypted_request_hex); + + $r = q("SELECT * FROM `contact` WHERE LENGTH(`prvkey`) AND `issued-id` = '%s' LIMIT 1", + dbesc($encrypted_for) + ); + if (!count($r)) killme(); + + // decrypt request, validate it + $prvkey = $r[0]['prvkey']; + $decrypted_request = ""; + openssl_private_decrypt($encrypted_request, $decrypted_request, $prvkey); + + if ($decrypted_request!=$encrypted_for) killme(); + + // get jabber address + $uid = $r[0]['uid']; + $username = get_pconfig($uid, 'jappixmini', 'username'); + if (!$username) killme(); + $server = get_pconfig($uid, 'jappixmini', 'server'); + if (!$server) killme(); + + $address = $username."@".$server; + + // construct answer + $answer = Array("status"=>"ok", "address"=>$address); + + // return answer as json + echo json_encode($answer); + killme(); +} + +function jappixmini_settings(&$a, &$s) { + $username = get_pconfig(local_user(),'jappixmini','username'); + $username = htmlentities($username); + $server = get_pconfig(local_user(),'jappixmini','server'); + $server = htmlentities($server); + $bosh = get_pconfig(local_user(),'jappixmini','bosh'); + $bosh = htmlentities($bosh); + $encrypted_password = get_pconfig(local_user(),'jappixmini','encrypted-password'); + $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe'); + $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : ''; + $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove'); + $autoapprove = intval($autoapprove) ? ' checked="checked"' : ''; + $activate = get_pconfig(local_user(),'jappixmini','activate'); + $activate = intval($activate) ? ' checked="checked"' : ''; + + $s .= '