diff --git a/jappixmini/README b/jappixmini/README index 7818d41a..822f4391 100644 --- a/jappixmini/README +++ b/jappixmini/README @@ -4,17 +4,20 @@ 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 BOSH server of +It is necessary to use a BOSH host - so to use this plugin, each users need to +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 provider, but keep in mind that only personal usage is approved according to 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 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 tries to add your Friendica contacts to your roster automatically. 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. Installation diff --git a/jappixmini/jappixmini.php b/jappixmini/jappixmini.php index 08ba248d..3e16a6ab 100644 --- a/jappixmini/jappixmini.php +++ b/jappixmini/jappixmini.php @@ -93,6 +93,9 @@ function jappixmini_plugin_admin(&$a, &$o) { 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.

'; + } } 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 // of local users + if (!file_exists("addon/jappixmini/jappix")) killme(); + $dfrn_id = $_REQUEST["dfrn_id"]; if (!$dfrn_id) killme(); @@ -171,6 +176,8 @@ function jappixmini_init(&$a) { 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"' : ''; @@ -180,11 +187,26 @@ function jappixmini_settings(&$a, &$s) { $server = htmlentities($server); $bosh = get_pconfig(local_user(),'jappixmini','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 = 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"'; + + 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

'; @@ -198,13 +220,25 @@ function jappixmini_settings(&$a, &$s) { $s .= ''; $s .= ' '; $s .= '
'; - $s .= ''; - $s .= ' '; - $s .= '
'; + + $conf = file_get_contents("addon/jappixmini/jappix/store/conf/main.xml"); + preg_match("/(.*)<\/bosh_proxy>/", $conf, $matches); + if ($matches[1]=="on") { + $s .= ''; + $s .= ' '; + $s .= '
'; + } + $s .= ''; - $s .= ' '; - $onchange = "document.getElementById('jappixmini-encrypted-password').value = jappixmini_addon_encrypt_password(document.getElementById('jappixmini-password').value);"; - $s .= ' '; + $s .= ' '; + $s .= ' '; + $s .= '
'; + $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();"; + $s .= ''; + $s .= ' '; + $s .= '
'; + $s .= ''; + $s .= ' '; $s .= '
'; $s .= ''; $s .= ' '; @@ -216,11 +250,34 @@ function jappixmini_settings(&$a, &$s) { $s .= ' '; $s .= '
'; $s .= ''; + $s .= ' '; $s .= '
'; $a->page['htmlhead'] .= ""; } @@ -228,10 +285,26 @@ function jappixmini_settings(&$a, &$s) { 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']); @@ -245,10 +318,11 @@ function jappixmini_settings_post(&$a,&$b) { 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','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','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) { @@ -261,6 +335,7 @@ function jappixmini_settings_post(&$a,&$b) { 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'); @@ -281,14 +356,23 @@ function jappixmini_script(&$a,&$s) { $server = str_replace("'", "\\'", $server); $bosh = get_pconfig(local_user(),'jappixmini','bosh'); $bosh = str_replace("'", "\\'", $bosh); - $encrypted_password = get_pconfig(local_user(),'jappixmini','encrypted-password'); - $encrypted_password = str_replace("'", "\\'", $encrypted_password); + $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); + // deactivate bosh host if proxy is off + $conf = file_get_contents("addon/jappixmini/jappix/store/conf/main.xml"); + preg_match("/(.*)<\/bosh_proxy>/", $conf, $matches); + if ($matches[1]!="on") { + $bosh = ''; + } + // get a list of jabber accounts of the contacts $contacts = Array(); $uid = local_user(); @@ -320,7 +404,7 @@ function jappixmini_script(&$a,&$s) { // add javascript to start Jappix Mini $a->page['htmlhead'] .= ""; @@ -329,6 +413,10 @@ function jappixmini_script(&$a,&$s) { } 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"; @@ -345,6 +433,8 @@ function jappixmini_login(&$a, &$o) { function jappixmini_cron(&$a, $d) { // 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 $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) { // 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.

'; diff --git a/jappixmini/lib.js b/jappixmini/lib.js index 6ab4644d..610a8312 100644 --- a/jappixmini/lib.js +++ b/jappixmini/lib.js @@ -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 settings_identifier = str_sha1(server); settings_identifier += str_sha1(username); settings_identifier += str_sha1(bosh); - settings_identifier += str_sha1(encrypted_password); + settings_identifier += str_sha1(password); settings_identifier += str_sha1(nickname); 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); // set bosh host - HOST_BOSH = HOST_BOSH+"?host_bosh="+encodeURI(bosh); - - // decrypt password - password = jappixmini_addon_decrypt_password(encrypted_password); + if (bosh) + HOST_BOSH = HOST_BOSH+"?host_bosh="+encodeURI(bosh); // start jappix mini MINI_NICKNAME = nickname;