make bosh proxy optional, add subscribe functionality and some more improvements of jappixmini addon

This commit is contained in:
Leberwurscht 2012-04-15 12:20:53 +02:00
parent 011bf47e59
commit c376bc162b
3 changed files with 128 additions and 21 deletions

View file

@ -4,17 +4,20 @@ Jappix Mini Plugin
This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat
to Friendica. It uses Jappix Mini. to Friendica. It uses Jappix Mini.
It is necessary to use a BOSH proxy - so to use this plugin, you need to know It is necessary to use a BOSH host - so to use this plugin, each users need to
the address of a BOSH proxy that works with your account. The BOSH server of know the address of a BOSH host that works with his account. The BOSH server of
the Jappix project (https://bind.jappix.com/) is not locked to a specific XMPP the Jappix project (https://bind.jappix.com/) is not locked to a specific XMPP
provider, but keep in mind that only personal usage is approved according to provider, but keep in mind that only personal usage is approved according to
http://codingteam.net/project/jappix/doc/BoshServer. http://codingteam.net/project/jappix/doc/BoshServer.
If you have a larger server, it is recommended that you install your own BOSH
server, add it to the <bosh> tag in jappix/store/conf/hosts.xml, and disable
the bosh proxy in jappix/store/conf/main.xml.
The addon has an experimental autosubscribe and autosuggest functionality which The addon has an experimental autosubscribe and autosuggest functionality which
tries to add your Friendica contacts to your roster automatically. tries to add your Friendica contacts to your roster automatically.
Limitations: Limitations:
- The addon can only handle Jabber passwords that are at most 39 characters - Jabber passwords can only be encrypted if they are at most 39 characters
long. long.
Installation Installation

View file

@ -93,6 +93,9 @@ function jappixmini_plugin_admin(&$a, &$o) {
else if (!file_exists("addon/jappixmini/jappix.zip")) { else if (!file_exists("addon/jappixmini/jappix.zip")) {
$o .= '<p><strong style="color:#fff;background-color:#f00">The source archive jappix.zip does not exist. This is probably a violation of the Jappix License (see README).</strong></p>'; $o .= '<p><strong style="color:#fff;background-color:#f00">The source archive jappix.zip does not exist. This is probably a violation of the Jappix License (see README).</strong></p>';
} }
else {
$o .= '<p>Jappix is installed.</p>';
}
} }
function jappixmini_plugin_admin_post(&$a) { function jappixmini_plugin_admin_post(&$a) {
@ -103,6 +106,8 @@ function jappixmini_init(&$a) {
// module page where other Friendica sites can submit Jabber addresses to and also can query Jabber addresses // module page where other Friendica sites can submit Jabber addresses to and also can query Jabber addresses
// of local users // of local users
if (!file_exists("addon/jappixmini/jappix")) killme();
$dfrn_id = $_REQUEST["dfrn_id"]; $dfrn_id = $_REQUEST["dfrn_id"];
if (!$dfrn_id) killme(); if (!$dfrn_id) killme();
@ -171,6 +176,8 @@ function jappixmini_init(&$a) {
function jappixmini_settings(&$a, &$s) { function jappixmini_settings(&$a, &$s) {
// addon settings for a user // addon settings for a user
if (!file_exists("addon/jappixmini/jappix")) return;
$activate = get_pconfig(local_user(),'jappixmini','activate'); $activate = get_pconfig(local_user(),'jappixmini','activate');
$activate = intval($activate) ? ' checked="checked"' : ''; $activate = intval($activate) ? ' checked="checked"' : '';
@ -180,11 +187,26 @@ function jappixmini_settings(&$a, &$s) {
$server = htmlentities($server); $server = htmlentities($server);
$bosh = get_pconfig(local_user(),'jappixmini','bosh'); $bosh = get_pconfig(local_user(),'jappixmini','bosh');
$bosh = htmlentities($bosh); $bosh = htmlentities($bosh);
$encrypted_password = get_pconfig(local_user(),'jappixmini','encrypted-password'); $password = get_pconfig(local_user(),'jappixmini','password');
$autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe'); $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe');
$autosubscribe = intval($autosubscribe) ? ' checked="checked"' : ''; $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : '';
$autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove'); $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove');
$autoapprove = intval($autoapprove) ? ' checked="checked"' : ''; $autoapprove = intval($autoapprove) ? ' checked="checked"' : '';
$encrypt = intval(get_pconfig(local_user(),'jappixmini','encrypt'));
$encrypt_checked = $encrypt ? ' checked="checked"' : '';
$encrypt_disabled = $encrypt ? '' : ' disabled="disabled"';
if (!$activate) {
// load scripts if not yet activated so that password can be saved
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;g=mini.xml"></script>'."\r\n";
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=presence.js"></script>'."\r\n";
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=caps.js"></script>'."\r\n";
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=name.js"></script>'."\r\n";
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=roster.js"></script>'."\r\n";
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/lib.js"></script>'."\r\n";
}
$s .= '<div class="settings-block">'; $s .= '<div class="settings-block">';
$s .= '<h3>Jappix Mini addon settings</h3>'; $s .= '<h3>Jappix Mini addon settings</h3>';
@ -198,13 +220,25 @@ function jappixmini_settings(&$a, &$s) {
$s .= '<label for="jappixmini-server">Jabber server</label>'; $s .= '<label for="jappixmini-server">Jabber server</label>';
$s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="'.$server.'" />'; $s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="'.$server.'" />';
$s .= '<br />'; $s .= '<br />';
$s .= '<label for="jappixmini-bosh">Jabber BOSH host</label>';
$s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="'.$bosh.'" />'; $conf = file_get_contents("addon/jappixmini/jappix/store/conf/main.xml");
$s .= '<br />'; preg_match("/<bosh_proxy>(.*)<\/bosh_proxy>/", $conf, $matches);
if ($matches[1]=="on") {
$s .= '<label for="jappixmini-bosh">Jabber BOSH host</label>';
$s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="'.$bosh.'" />';
$s .= '<br />';
}
$s .= '<label for="jappixmini-password">Jabber password</label>'; $s .= '<label for="jappixmini-password">Jabber password</label>';
$s .= ' <input type="hidden" id="jappixmini-encrypted-password" name="jappixmini-encrypted-password" value="'.$encrypted_password.'" />'; $s .= ' <input type="hidden" id="jappixmini-password" name="jappixmini-encrypted-password" value="'.$password.'" />';
$onchange = "document.getElementById('jappixmini-encrypted-password').value = jappixmini_addon_encrypt_password(document.getElementById('jappixmini-password').value);"; $s .= ' <input id="jappixmini-clear-password" type="password" value="" onchange="jappixmini_set_password();" />';
$s .= ' <input id="jappixmini-password" type="password" value="" onchange="'.$onchange.'" />'; $s .= '<br />';
$onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();";
$s .= '<label for="jappixmini-encrypt">Encrypt Jabber password with Friendica password (recommended)</label>';
$s .= ' <input id="jappixmini-encrypt" type="checkbox" name="jappixmini-encrypt" onchange="'.$onchange.'" value="1"'.$encrypt_checked.' />';
$s .= '<br />';
$s .= '<label for="jappixmini-friendica-password">Friendica password</label>';
$s .= ' <input id="jappixmini-friendica-password" name="jappixmini-friendica-password" type="password" onchange="jappixmini_set_password();" value=""'.$encrypt_disabled.' />';
$s .= '<br />'; $s .= '<br />';
$s .= '<label for="jappixmini-autoapprove">Approve subscription requests from Friendica contacts automatically</label>'; $s .= '<label for="jappixmini-autoapprove">Approve subscription requests from Friendica contacts automatically</label>';
$s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"'.$autoapprove.' />'; $s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"'.$autoapprove.' />';
@ -216,11 +250,34 @@ function jappixmini_settings(&$a, &$s) {
$s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />'; $s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />';
$s .= '<br />'; $s .= '<br />';
$s .= '<input type="submit" name="jappixmini-submit" value="' . t('Submit') . '" />'; $s .= '<input type="submit" name="jappixmini-submit" value="' . t('Submit') . '" />';
$s .= ' <input type="button" value="Add contact" onclick="jappixmini_addon_subscribe();" />';
$s .= '</div>'; $s .= '</div>';
$a->page['htmlhead'] .= "<script type=\"text/javascript\"> $a->page['htmlhead'] .= "<script type=\"text/javascript\">
function jappixmini_set_password() {
encrypt = document.getElementById('jappixmini-encrypt').checked;
password = document.getElementById('jappixmini-password');
clear_password = document.getElementById('jappixmini-clear-password');
if (encrypt) {
friendica_password = document.getElementById('jappixmini-friendica-password');
jappixmini_addon_set_client_secret(friendica_password.value);
password.value = jappixmini_addon_encrypt_password(clear_password.value);
}
else {
password.value = clear_password.value;
}
}
jQuery(document).ready(function() { jQuery(document).ready(function() {
document.getElementById('jappixmini-password').value = jappixmini_addon_decrypt_password('$encrypted_password'); encrypt = document.getElementById('jappixmini-encrypt').checked;
password = document.getElementById('jappixmini-password');
clear_password = document.getElementById('jappixmini-clear-password');
if (encrypt) {
clear_password.value = jappixmini_addon_decrypt_password(password.value);
}
else {
clear_password.value = password.value;
}
}); });
</script>"; </script>";
} }
@ -228,10 +285,26 @@ function jappixmini_settings(&$a, &$s) {
function jappixmini_settings_post(&$a,&$b) { function jappixmini_settings_post(&$a,&$b) {
// save addon settings for a user // save addon settings for a user
if (!file_exists("addon/jappixmini/jappix")) return;
if(! local_user()) return; if(! local_user()) return;
$uid = local_user(); $uid = local_user();
if($_POST['jappixmini-submit']) { 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']); $purge = intval($b['jappixmini-purge']);
$username = trim($b['jappixmini-username']); $username = trim($b['jappixmini-username']);
@ -245,10 +318,11 @@ function jappixmini_settings_post(&$a,&$b) {
set_pconfig($uid,'jappixmini','username',$username); set_pconfig($uid,'jappixmini','username',$username);
set_pconfig($uid,'jappixmini','server',$server); set_pconfig($uid,'jappixmini','server',$server);
set_pconfig($uid,'jappixmini','bosh',trim($b['jappixmini-bosh'])); set_pconfig($uid,'jappixmini','bosh',trim($b['jappixmini-bosh']));
set_pconfig($uid,'jappixmini','encrypted-password',trim($b['jappixmini-encrypted-password'])); set_pconfig($uid,'jappixmini','password',trim($b['jappixmini-encrypted-password']));
set_pconfig($uid,'jappixmini','autosubscribe',intval($b['jappixmini-autosubscribe'])); set_pconfig($uid,'jappixmini','autosubscribe',intval($b['jappixmini-autosubscribe']));
set_pconfig($uid,'jappixmini','autoapprove',intval($b['jappixmini-autoapprove'])); set_pconfig($uid,'jappixmini','autoapprove',intval($b['jappixmini-autoapprove']));
set_pconfig($uid,'jappixmini','activate',intval($b['jappixmini-activate'])); set_pconfig($uid,'jappixmini','activate',intval($b['jappixmini-activate']));
set_pconfig($uid,'jappixmini','encrypt',$encrypt);
info( 'Jappix Mini settings saved.' ); info( 'Jappix Mini settings saved.' );
if ($purge) { if ($purge) {
@ -261,6 +335,7 @@ function jappixmini_settings_post(&$a,&$b) {
function jappixmini_script(&$a,&$s) { function jappixmini_script(&$a,&$s) {
// adds the script to the page header which starts Jappix Mini // adds the script to the page header which starts Jappix Mini
if (!file_exists("addon/jappixmini/jappix")) return;
if(! local_user()) return; if(! local_user()) return;
$activate = get_pconfig(local_user(),'jappixmini','activate'); $activate = get_pconfig(local_user(),'jappixmini','activate');
@ -281,14 +356,23 @@ function jappixmini_script(&$a,&$s) {
$server = str_replace("'", "\\'", $server); $server = str_replace("'", "\\'", $server);
$bosh = get_pconfig(local_user(),'jappixmini','bosh'); $bosh = get_pconfig(local_user(),'jappixmini','bosh');
$bosh = str_replace("'", "\\'", $bosh); $bosh = str_replace("'", "\\'", $bosh);
$encrypted_password = get_pconfig(local_user(),'jappixmini','encrypted-password'); $encrypt = get_pconfig(local_user(),'jappixmini','encrypt');
$encrypted_password = str_replace("'", "\\'", $encrypted_password); $encrypt = intval($encrypt);
$password = get_pconfig(local_user(),'jappixmini','password');
$password = str_replace("'", "\\'", $password);
$autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove'); $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove');
$autoapprove = intval($autoapprove); $autoapprove = intval($autoapprove);
$autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe'); $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe');
$autosubscribe = intval($autosubscribe); $autosubscribe = intval($autosubscribe);
// deactivate bosh host if proxy is off
$conf = file_get_contents("addon/jappixmini/jappix/store/conf/main.xml");
preg_match("/<bosh_proxy>(.*)<\/bosh_proxy>/", $conf, $matches);
if ($matches[1]!="on") {
$bosh = '';
}
// get a list of jabber accounts of the contacts // get a list of jabber accounts of the contacts
$contacts = Array(); $contacts = Array();
$uid = local_user(); $uid = local_user();
@ -320,7 +404,7 @@ function jappixmini_script(&$a,&$s) {
// add javascript to start Jappix Mini // add javascript to start Jappix Mini
$a->page['htmlhead'] .= "<script type=\"text/javascript\"> $a->page['htmlhead'] .= "<script type=\"text/javascript\">
jQuery(document).ready(function() { jQuery(document).ready(function() {
jappixmini_addon_start('$server', '$username', '$bosh', '$encrypted_password', $nickname); jappixmini_addon_start('$server', '$username', '$bosh', $encrypt, '$password', $nickname);
jappixmini_manage_roster($contacts_json, $autoapprove, $autosubscribe); jappixmini_manage_roster($contacts_json, $autoapprove, $autosubscribe);
}); });
</script>"; </script>";
@ -329,6 +413,10 @@ function jappixmini_script(&$a,&$s) {
} }
function jappixmini_login(&$a, &$o) { 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 // for setDB, needed by jappixmini_addon_set_client_secret
$a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=datastore.js"></script>'."\r\n"; $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=datastore.js"></script>'."\r\n";
@ -345,6 +433,8 @@ function jappixmini_login(&$a, &$o) {
function jappixmini_cron(&$a, $d) { function jappixmini_cron(&$a, $d) {
// For autosubscribe/autoapprove, we need to maintain a list of jabber addresses of our contacts. // For autosubscribe/autoapprove, we need to maintain a list of jabber addresses of our contacts.
if (!file_exists("addon/jappixmini/jappix")) return;
// go through list of users with jabber enabled // go through list of users with jabber enabled
$users = q("SELECT `uid` FROM `pconfig` WHERE `cat`='jappixmini' AND (`k`='autosubscribe' OR `k`='autoapprove') AND `v`='1'"); $users = q("SELECT `uid` FROM `pconfig` WHERE `cat`='jappixmini' AND (`k`='autosubscribe' OR `k`='autoapprove') AND `v`='1'");
@ -437,6 +527,8 @@ function jappixmini_cron(&$a, $d) {
function jappixmini_download_source(&$a,&$b) { function jappixmini_download_source(&$a,&$b) {
// Jappix Mini source download link on About page // Jappix Mini source download link on About page
if (!file_exists("addon/jappixmini/jappix")) return;
$b .= '<h1>Jappix Mini</h1>'; $b .= '<h1>Jappix Mini</h1>';
$b .= '<p>This site uses Jappix Mini by the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix/AUTHORS">Jappix authors</a>, which is distributed under the terms of the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix/COPYING">GNU Affero General Public License</a>.</p>'; $b .= '<p>This site uses Jappix Mini by the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix/AUTHORS">Jappix authors</a>, which is distributed under the terms of the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix/COPYING">GNU Affero General Public License</a>.</p>';
$b .= '<p>You can download the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix.zip">source code</a>.</p>'; $b .= '<p>You can download the <a href="'.$a->get_baseurl().'/addon/jappixmini/jappix.zip">source code</a>.</p>';

View file

@ -108,12 +108,26 @@ function jappixmini_manage_roster(contacts, autoapprove, autosubscribe) {
} }
} }
function jappixmini_addon_start(server, username, bosh, encrypted_password, nickname) { function jappixmini_addon_subscribe() {
if (!window.con) {
alert("Not connected.");
return;
}
xid = prompt("Jabber address");
sendSubscribe(xid, "subscribe");
}
function jappixmini_addon_start(server, username, bosh, encrypted, password, nickname) {
// decrypt password
if (encrypted)
password = jappixmini_addon_decrypt_password(password);
// check if settings have changed, reinitialize jappix mini if this is the case // check if settings have changed, reinitialize jappix mini if this is the case
settings_identifier = str_sha1(server); settings_identifier = str_sha1(server);
settings_identifier += str_sha1(username); settings_identifier += str_sha1(username);
settings_identifier += str_sha1(bosh); settings_identifier += str_sha1(bosh);
settings_identifier += str_sha1(encrypted_password); settings_identifier += str_sha1(password);
settings_identifier += str_sha1(nickname); settings_identifier += str_sha1(nickname);
saved_identifier = getDB("jappix-mini", "settings_identifier"); saved_identifier = getDB("jappix-mini", "settings_identifier");
@ -121,10 +135,8 @@ function jappixmini_addon_start(server, username, bosh, encrypted_password, nick
setDB("jappix-mini", "settings_identifier", settings_identifier); setDB("jappix-mini", "settings_identifier", settings_identifier);
// set bosh host // set bosh host
HOST_BOSH = HOST_BOSH+"?host_bosh="+encodeURI(bosh); if (bosh)
HOST_BOSH = HOST_BOSH+"?host_bosh="+encodeURI(bosh);
// decrypt password
password = jappixmini_addon_decrypt_password(encrypted_password);
// start jappix mini // start jappix mini
MINI_NICKNAME = nickname; MINI_NICKNAME = nickname;