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).

'; } else { $o .= '

Jappix is installed.

'; } // warn if cron job has not yet been executed $cron_run = get_config("jappixmini", "last_cron_execution"); if (!$cron_run) $o .= "

Warning: The cron job has not yet been executed. If this message is still there after some time (usually 10 minutes), this means that autosubscribe and autoaccept will not work.

"; // bosh proxy $bosh_proxy = intval(get_config("jappixmini", "bosh_proxy")); $bosh_proxy = intval($bosh_proxy) ? ' checked="checked"' : ''; $o .= ''; $o .= '
'; // info text field $info_text = get_config("jappixmini", "infotext"); $o .= '


'; $o .= '

'; // submit button $o .= ''; } function jappixmini_plugin_admin_post(&$a) { // set info text $submit = $_REQUEST['jappixmini-admin-settings']; if ($submit) { $info_text = $_REQUEST['jappixmini-infotext']; $bosh_proxy = intval($_REQUEST['jappixmini-proxy']); set_config("jappixmini", "infotext", $info_text); set_config("jappixmini", "bosh_proxy", $bosh_proxy); } } function jappixmini_module() {} function jappixmini_init(&$a) { // module page where other Friendica sites can submit Jabber addresses to and also can query Jabber addresses // of local users if (!file_exists("addon/jappixmini/jappix")) killme(); $dfrn_id = $_REQUEST["dfrn_id"]; if (!$dfrn_id) killme(); $role = $_REQUEST["role"]; if ($role=="pub") { $r = q("SELECT * FROM `contact` WHERE LENGTH(`pubkey`) AND `dfrn-id`='%s' LIMIT 1", dbesc($dfrn_id) ); if (!count($r)) killme(); $encrypt_func = openssl_public_encrypt; $decrypt_func = openssl_public_decrypt; $key = $r[0]["pubkey"]; } else if ($role=="prv") { $r = q("SELECT * FROM `contact` WHERE LENGTH(`prvkey`) AND `issued-id`='%s' LIMIT 1", dbesc($dfrn_id) ); if (!count($r)) killme(); $encrypt_func = openssl_private_encrypt; $decrypt_func = openssl_private_decrypt; $key = $r[0]["prvkey"]; } else { killme(); } $uid = $r[0]["uid"]; // save the Jabber address we received try { $signed_address_hex = $_REQUEST["signed_address"]; $signed_address = hex2bin($signed_address_hex); $trusted_address = ""; $decrypt_func($signed_address, $trusted_address, $key); $now = intval(time()); set_pconfig($uid, "jappixmini", "id:$dfrn_id", "$now:$trusted_address"); } catch (Exception $e) { } // do not return an address if user deactivated plugin $activated = get_pconfig($uid, 'jappixmini', 'activate'); if (!$activated) killme(); // return the requested Jabber address try { $username = get_pconfig($uid, 'jappixmini', 'username'); $server = get_pconfig($uid, 'jappixmini', 'server'); $address = "$username@$server"; $encrypted_address = ""; $encrypt_func($address, $encrypted_address, $key); $encrypted_address_hex = bin2hex($encrypted_address); $answer = Array( "status"=>"ok", "encrypted_address"=>$encrypted_address_hex ); $answer_json = json_encode($answer); echo $answer_json; killme(); } catch (Exception $e) { killme(); } } function jappixmini_settings(&$a, &$s) { // addon settings for a user if (!file_exists("addon/jappixmini/jappix")) return; $activate = get_pconfig(local_user(),'jappixmini','activate'); $activate = intval($activate) ? ' checked="checked"' : ''; $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); $password = get_pconfig(local_user(),'jappixmini','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"' : ''; $encrypt = intval(get_pconfig(local_user(),'jappixmini','encrypt')); $encrypt_checked = $encrypt ? ' checked="checked"' : ''; $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"'; $info_text = get_config("jappixmini", "infotext"); $info_text = htmlentities($info_text); $info_text = str_replace("\n", "
", $info_text); if (!$activate) { // load scripts if not yet activated so that password can be saved $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; } $s .= '
'; $s .= '

Jappix Mini addon settings

'; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= ' '; $s .= '
'; $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();"; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; $s .= '
'; if ($info_text) $s .= '
Configuration help:

'.$info_text.'

'; $s .= ''; $s .= ' '; $s .= '
'; $s .= '
'; $a->page['htmlhead'] .= ""; } function jappixmini_settings_post(&$a,&$b) { // save addon settings for a user if (!file_exists("addon/jappixmini/jappix")) return; if(! local_user()) return; $uid = local_user(); if($_POST['jappixmini-submit']) { $encrypt = intval($b['jappixmini-encrypt']); if ($encrypt) { // check that Jabber password was encrypted with correct Friendica password $friendica_password = trim($b['jappixmini-friendica-password']); $encrypted = hash('whirlpool',$friendica_password); $r = q("SELECT * FROM `user` WHERE `uid`=$uid AND `password`='%s'", dbesc($encrypted) ); if (!count($r)) { info("Wrong friendica password!"); return; } } $purge = intval($b['jappixmini-purge']); $username = trim($b['jappixmini-username']); $old_username = get_pconfig($uid,'jappixmini','username'); if ($username!=$old_username) $purge = 1; $server = trim($b['jappixmini-server']); $old_server = get_pconfig($uid,'jappixmini','server'); if ($server!=$old_server) $purge = 1; set_pconfig($uid,'jappixmini','username',$username); set_pconfig($uid,'jappixmini','server',$server); set_pconfig($uid,'jappixmini','bosh',trim($b['jappixmini-bosh'])); set_pconfig($uid,'jappixmini','password',trim($b['jappixmini-encrypted-password'])); set_pconfig($uid,'jappixmini','autosubscribe',intval($b['jappixmini-autosubscribe'])); set_pconfig($uid,'jappixmini','autoapprove',intval($b['jappixmini-autoapprove'])); set_pconfig($uid,'jappixmini','activate',intval($b['jappixmini-activate'])); set_pconfig($uid,'jappixmini','encrypt',$encrypt); info( 'Jappix Mini settings saved.' ); if ($purge) { q("DELETE FROM `pconfig` WHERE `uid`=$uid AND `cat`='jappixmini' and `k` LIKE 'id%%'"); info( 'List of addresses purged.' ); } } } function jappixmini_script(&$a,&$s) { // adds the script to the page header which starts Jappix Mini if (!file_exists("addon/jappixmini/jappix")) return; if(! local_user()) return; $activate = get_pconfig(local_user(),'jappixmini','activate'); if (!$activate) return; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $a->page['htmlhead'] .= ''."\r\n"; $username = get_pconfig(local_user(),'jappixmini','username'); $username = str_replace("'", "\\'", $username); $server = get_pconfig(local_user(),'jappixmini','server'); $server = str_replace("'", "\\'", $server); $bosh = get_pconfig(local_user(),'jappixmini','bosh'); $bosh = str_replace("'", "\\'", $bosh); $encrypt = get_pconfig(local_user(),'jappixmini','encrypt'); $encrypt = intval($encrypt); $password = get_pconfig(local_user(),'jappixmini','password'); $password = str_replace("'", "\\'", $password); $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove'); $autoapprove = intval($autoapprove); $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe'); $autosubscribe = intval($autosubscribe); // set proxy if necessary $use_proxy = get_config('jappixmini','bosh_proxy'); if ($use_proxy) { $proxy = $a->get_baseurl().'/addon/jappixmini/jappix/php/bosh.php'; } else { $proxy = ""; } // get a list of jabber accounts of the contacts $contacts = Array(); $uid = local_user(); $rows = q("SELECT * FROM `pconfig` WHERE `uid`=$uid AND `cat`='jappixmini' and `k` LIKE 'id%%'"); foreach ($rows as $row) { $key = $row['k']; $pos = strpos($key, ":"); $dfrn_id = substr($key, $pos+1); $r = q("SELECT `name` FROM `contact` WHERE `uid`=$uid AND `dfrn-id`='%s' OR `issued-id`='%s'", dbesc($dfrn_id), dbesc($dfrn_id) ); $name = $r[0]["name"]; $value = $row['v']; $pos = strpos($value, ":"); $address = substr($value, $pos+1); if (!$address) continue; if (!$name) $name = $address; $contacts[$address] = $name; } $contacts_json = json_encode($contacts); // get nickname $r = q("SELECT `username` FROM `user` WHERE `uid`=$uid"); $nickname = json_encode($r[0]["username"]); // add javascript to start Jappix Mini $a->page['htmlhead'] .= ""; return; } function jappixmini_login(&$a, &$o) { // create client secret on login to be able to encrypt jabber passwords if (!file_exists("addon/jappixmini/jappix")) return; // for setDB, needed by jappixmini_addon_set_client_secret $a->page['htmlhead'] .= ''."\r\n"; // for str_sha1, needed by jappixmini_addon_set_client_secret $a->page['htmlhead'] .= ''."\r\n"; // for jappixmini_addon_set_client_secret $a->page['htmlhead'] .= ''."\r\n"; // save hash of password $o = str_replace("
status != "ok") throw new Exception(); $encrypted_address_hex = $answer->encrypted_address; if (!$encrypted_address_hex) throw new Exception(); $encrypted_address = hex2bin($encrypted_address_hex); if (!$encrypted_address) throw new Exception(); // decrypt address $decrypted_address = ""; $decrypt_func($encrypted_address, $decrypted_address, $key); if (!$decrypted_address) throw new Exception(); } catch (Exception $e) { $decrypted_address = ""; } // save address set_pconfig($uid, "jappixmini", "id:$dfrn_id", "$now:$decrypted_address"); } } } function jappixmini_download_source(&$a,&$b) { // Jappix Mini source download link on About page if (!file_exists("addon/jappixmini/jappix")) return; $b .= '

Jappix Mini

'; $b .= '

This site uses Jappix Mini by the Jappix authors, which is distributed under the terms of the GNU Affero General Public License.

'; $b .= '

You can download the source code.

'; }