2012-04-13 17:05:16 +02:00
function jappixmini _addon _xor ( str1 , str2 ) {
if ( str1 . length != str2 . length ) throw "not same length" ;
encoded = "" ;
for ( i = 0 ; i < str1 . length ; i ++ ) {
var a = str1 . charCodeAt ( i ) ;
var b = str2 . charCodeAt ( i ) ;
var c = a ^ b ;
encoded += String . fromCharCode ( c ) ;
}
return encoded ;
}
function jappixmini _addon _set _client _secret ( password ) {
2012-04-14 18:23:42 +02:00
if ( ! password ) return ;
salt1 = "h8doCRekWto0njyQohKpdx6BN0UTyC6N" ;
salt2 = "jdX8OwFC1kWAq3s9uOyAcE8g3UNNO5t3" ;
client _secret1 = str _sha1 ( salt1 + password ) ;
client _secret2 = str _sha1 ( salt2 + password ) ;
client _secret = client _secret1 + client _secret2 ;
2012-04-13 17:05:16 +02:00
setDB ( 'jappix-mini' , 'client_secret' , client _secret ) ;
2012-04-14 18:23:42 +02:00
console . log ( "client secret set" ) ;
2012-04-13 17:05:16 +02:00
}
function jappixmini _addon _get _client _secret ( ) {
client _secret = getDB ( 'jappix-mini' , 'client_secret' ) ;
if ( client _secret === null ) {
2012-04-14 18:23:42 +02:00
div = $ ( '<div style="position:fixed;padding:1em;background-color:#F00;color:#fff;top:50px;left:50px;">Retype your Friendica password for chatting:</div>' ) ;
2012-04-13 17:05:16 +02:00
div . append ( $ ( "<br>" ) ) ;
input = $ ( '<input type="password">' )
div . append ( input ) ;
button = $ ( '<input type="button" value="OK">' ) ;
button . click ( function ( ) {
password = input . val ( ) ;
jappixmini _addon _set _client _secret ( password ) ;
div . remove ( ) ;
} ) ;
div . append ( button ) ;
$ ( "body" ) . append ( div ) ;
}
return client _secret ;
}
function jappixmini _addon _encrypt _password ( password ) {
client _secret = jappixmini _addon _get _client _secret ( ) ;
// add \0 to password until it has the same length as secret
2012-04-14 18:23:42 +02:00
if ( password . length > client _secret . length - 1 ) throw "password too long" ;
2012-04-13 17:05:16 +02:00
while ( password . length < client _secret . length ) {
password += "\0" ;
}
// xor password with secret
encrypted _password = jappixmini _addon _xor ( client _secret , password ) ;
encrypted _password = encodeURI ( encrypted _password )
return encrypted _password ;
}
function jappixmini _addon _decrypt _password ( encrypted _password ) {
encrypted _password = decodeURI ( encrypted _password ) ;
client _secret = jappixmini _addon _get _client _secret ( ) ;
2012-04-14 18:23:42 +02:00
// xor password with secret
2012-04-13 17:05:16 +02:00
password = jappixmini _addon _xor ( client _secret , encrypted _password ) ;
// remove \0
first _null = password . indexOf ( "\0" )
password = password . substr ( 0 , first _null ) ;
return password ;
}
function jappixmini _manage _roster ( contacts , autoapprove , autosubscribe ) {
// listen for subscriptions
con . registerHandler ( 'presence' , function ( presence ) {
var type = presence . getType ( ) ;
if ( type != "subscribe" ) return ;
var from = fullXID ( getStanzaFrom ( presence ) ) ;
var xid = bareXID ( from ) ;
approve = true ;
2012-04-14 18:23:42 +02:00
if ( ( ! autoapprove ) || contacts [ xid ] === undefined )
2012-04-13 17:05:16 +02:00
approve = confirm ( "Accept " + xid + " for chat?" ) ;
if ( approve ) {
2012-04-14 18:23:42 +02:00
acceptSubscribe ( xid , contacts [ xid ] ) ;
console . log ( "Accepted " + xid + " for chat." ) ;
2012-04-13 17:05:16 +02:00
}
} ) ;
// autosubscribe
if ( autosubscribe ) {
for ( i = 0 ; i < contacts . length ; i ++ ) {
xid = contacts [ i ] ;
sendSubscribe ( xid , "subscribe" ) ;
2012-04-14 18:23:42 +02:00
console . log ( "Subscribed to " + xid ) ;
2012-04-13 17:05:16 +02:00
}
}
}
2012-04-15 12:20:53 +02:00
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 ) ;
2012-04-13 17:05:16 +02:00
// 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 ) ;
2012-04-15 12:20:53 +02:00
settings _identifier += str _sha1 ( password ) ;
2012-04-14 18:23:42 +02:00
settings _identifier += str _sha1 ( nickname ) ;
2012-04-13 17:05:16 +02:00
saved _identifier = getDB ( "jappix-mini" , "settings_identifier" ) ;
if ( saved _identifier != settings _identifier ) removeDB ( 'jappix-mini' , 'dom' ) ;
setDB ( "jappix-mini" , "settings_identifier" , settings _identifier ) ;
// set bosh host
2012-04-15 12:20:53 +02:00
if ( bosh )
HOST _BOSH = HOST _BOSH + "?host_bosh=" + encodeURI ( bosh ) ;
2012-04-13 17:05:16 +02:00
// start jappix mini
2012-04-14 18:23:42 +02:00
MINI _NICKNAME = nickname ;
2012-04-13 17:05:16 +02:00
launchMini ( true , false , server , username , password ) ;
}