@ -1,5 +1,6 @@
var password = null ;
var password = null ; // password, only stored temporary, until reload
var username = null ;
var username = null ; // username, only used during registration
var filecontent = new Array ( ) ; // temporary storage for attachments
function error ( data , stay ) {
function error ( data , stay ) {
$ ( "#status" ) . fadeOut ( "slow" , function ( ) {
$ ( "#status" ) . fadeOut ( "slow" , function ( ) {
@ -11,7 +12,7 @@ function error(data, stay) {
$ ( "#status" ) . html ( data ) ;
$ ( "#status" ) . html ( data ) ;
console . log ( "error: " + data ) ;
console . log ( "error: " + data ) ;
} else {
} else {
$ ( "#status" ) . html ( '<pre>' + JSON . stringify ( data ) + '</pre> ' ) ;
$ ( "#status" ) . html ( 'error ' ) ;
console . log ( "error: " + JSON . stringify ( data ) ) ;
console . log ( "error: " + JSON . stringify ( data ) ) ;
}
}
} else {
} else {
@ -151,18 +152,46 @@ function userid() {
return publicKey ( ) . keys [ 0 ] . getUserIds ( ) [ 0 ] ;
return publicKey ( ) . keys [ 0 ] . getUserIds ( ) [ 0 ] ;
}
}
function clearmessage ( ) {
filecontent = new Array ( ) ;
$ ( '#preview' ) . empty ( ) ;
$ ( "#msg" ) . val ( "" ) ;
notice ( "message cleared" ) ;
}
function attachments ( files , id ) {
if ( files ) files . forEach ( function ( file ) {
//if (file.content.length<1000000) {
var img = document . createElement ( 'img' ) ;
img . src = 'data:' + file . type + ';base64,' + file . content ;
$ ( id ) . append ( img ) ;
//}
} ) ;
}
function fileupload ( evt ) {
function fileupload ( evt ) {
if ( ! window . FileReader )
if ( ! window . FileReader )
return error ( "your browser dows not support file upload" , true ) ;
return error ( "your browser dows not support file upload" , true ) ;
for ( var i = 0 , f ; f = evt . target . files [ i ] ; ++ i ) {
var file = f ;
var reader = new FileReader ( ) ;
var reader = new FileReader ( ) ;
reader . onload = function ( evt ) {
reader . onload = function ( evt ) {
if ( evt . target . readyState != 2 )
return notice ( "ReadyState=" + evt . target . readyState ) ;
if ( evt . target . error ) return error ( "error reading file" , true ) ;
if ( evt . target . error ) return error ( "error reading file" , true ) ;
filecontent = evt . target . result ;
if ( evt . target . readyState == 0 ) return notice ( "waiting for data ..." ) ;
success ( filecontent ) ;
if ( evt . target . readyState == 1 ) return notice ( "loading data ..." ) ;
var base64 = btoa ( evt . target . result ) ;
filecontent . push ( { type : file . type , content : base64 } ) ;
if ( file . type . match ( '^image/' ) ) {
var img = document . createElement ( 'img' ) ;
img . src = 'data:' + file . type + ';base64,' + base64 ;
$ ( "#preview" ) . append ( img ) ;
success ( 'image of type ' + file . type + ' is ready to be sent' ) ;
} else {
success ( 'file of type ' + file . type + ' is ready to be sent' ) ;
}
}
reader . readAsBinaryString ( file ) ;
}
}
reader . readAsText ( evt . target . files [ 0 ] ) ;
}
}
function setreceiver ( name ) {
function setreceiver ( name ) {
@ -171,83 +200,101 @@ function setreceiver(name) {
$ ( "#msg" ) . focus ( ) ;
$ ( "#msg" ) . focus ( ) ;
}
}
var startmsg = 0 ;
var startmsg = 0 ; // number of last downloaded message
function get ( ) {
function get ( ) {
var beeped = false ;
var beeped = false ;
$ . post ( "get.php" , { start : startmsg } ) . done ( function ( res ) {
$ . post ( "get.php" , { start : startmsg } ) . done ( function ( res ) {
var msgs = JSON . parse ( res ) ;
var msgs = JSON . parse ( res ) ;
if ( msgs ) {
if ( msgs ) {
msgs . forEach ( function ( e ) {
msgs . forEach ( function ( e ) {
if ( startmsg < Number ( e [ "id" ] ) ) startmsg = Number ( e [ "id" ] ) ;
if ( startmsg < Number ( e . id ) ) startmsg = Number ( e . id ) ;
$ . post ( "pubkey.php" , { user : e [ "user" ] } ) . done ( function ( pk ) {
$ . post ( "pubkey.php" , { user : e . user } ) . done ( function ( pk ) {
var res = JSON . parse ( pk ) ;
var res = JSON . parse ( pk ) ;
var key = openpgp . key . readArmored ( res ) ;
var key = openpgp . key . readArmored ( res ) ;
if ( ! res || key . err ) {
if ( ! res || key . err ) {
error ( "key of receiver not found" , true ) ;
setTimeout ( get , 10000 ) ;
} else {
return error ( "key of receiver not found" , true ) ;
var message = openpgp . message . readArmored ( e [ "msg" ] ) ;
}
var message = openpgp . message . readArmored ( e . msg ) ;
var privkey = privateKey ( ) . keys [ 0 ] ;
var privkey = privateKey ( ) . keys [ 0 ] ;
if ( privkey . decrypt ( password ) )
if ( privkey . decrypt ( password ) )
openpgp . decryptAndVerifyMessage ( privkey , key . keys , message )
openpgp . decryptAndVerifyMessage ( privkey , key . keys , message )
. then ( function ( msg ) {
. then ( function ( msg ) {
var message = JSON . parse ( msg . text ) ;
$ ( "#msgs" ) // todo: check msg.signatures[0].valid
$ ( "#msgs" ) // todo: check msg.signatures[0].valid
. prepend ( '<div id="id' + ( e [ "id" ] ) + '" class="msg ' +
. prepend ( '<div id="id' + ( e . id ) + '" class="msg ' +
( e [ "user" ] == userid ( ) ? "me" : "other" ) +
( e . user == userid ( ) ? "me" : "other" ) +
'"><div class="header">' +
'"><div class="header">' +
'<span class="date">' +
'<span class="date">' +
( new Date ( 1000 * Number ( e [ "time" ] ) ) ) . toLocaleString ( ) +
( new Date ( 1000 * Number ( e . time ) ) ) . toLocaleString ( ) +
'</span><span class="sender">' +
'</span><span class="sender">' +
'<a href="javascript:void(0)" onclick="setreceiver(this.innerHTML)">' +
'<a href="javascript:void(0)" onclick="setreceiver(this.innerHTML)">' +
e [ "user" ] +
e . user +
'</a></span></div><div class="text">' +
'</a></span></div>' +
msg . text +
'<div class="text">' +
message . text +
'</div></div><div class="clear"/>' ) ;
'</div></div><div class="clear"/>' ) ;
$ ( '#id' + ( e [ "id" ] ) ) . emoticonize ( ) ;
attachments ( message . files , '#id' + e . id + ' .text' ) ;
$ ( '#id' + e . id ) . emoticonize ( ) ;
if ( ! beeped )
if ( ! beeped )
( new Audio ( "A-Tone-His_Self-1266414414.mp3" ) )
( new Audio ( "A-Tone-His_Self-1266414414.mp3" ) )
. play ( ) ;
. play ( ) ;
beeped = true ;
beeped = true ;
} )
. catch ( function ( e ) {
// not for me
} ) ;
} ) ;
// .catch(function(e) {
// error("decryption of message failed", true);
// });
}
} ) . fail ( function ( e ) {
} ) . fail ( function ( e ) {
error ( "get sender's key from server failed" , true ) ;
error ( "get sender's key from server failed" , true ) ;
} ) ;
} ) ;
} ) ;
} ) ;
}
}
} ) . fail ( function ( e ) {
error ( "get messages failed" )
} ) ;
setTimeout ( get , 10000 ) ;
setTimeout ( get , 10000 ) ;
} ) . fail ( error ) ;
}
}
function sendmessage ( recv , txt ) {
function sendmessage ( recv , txt ) {
notice ( "1/3 preparing message ..." ) ;
$ ( "#message" ) . fadeOut ( "slow" ) ;
$ . post ( "pubkey.php" , { user : recv } ) . done ( function ( pk ) {
$ . post ( "pubkey.php" , { user : recv } ) . done ( function ( pk ) {
var res = JSON . parse ( pk ) ;
var res = JSON . parse ( pk ) ;
var key = openpgp . key . readArmored ( res ) ;
var key = openpgp . key . readArmored ( res ) ;
if ( ! res || key . err ) {
if ( ! res || key . err ) {
$ ( "#message" ) . fadeIn ( "slow" ) ;
error ( "key of receiver not found" , true ) ;
error ( "key of receiver not found" , true ) ;
return ;
return ;
}
}
var privkey = privateKey ( ) . keys [ 0 ] ;
var privkey = privateKey ( ) . keys [ 0 ] ;
privkey . decrypt ( password ) ;
privkey . decrypt ( password ) ;
openpgp . signAndEncryptMessage ( key . keys . concat ( publicKey ( ) . keys ) , privkey , txt )
var message = JSON . stringify ( { text : txt , files : filecontent } ) ;
notice ( "2/3 encrypting message ..." ) ;
openpgp . signAndEncryptMessage ( key . keys . concat ( publicKey ( ) . keys ) , privkey , message )
. then ( function ( msg ) {
. then ( function ( msg ) {
notice ( "3/3 sending message ..." ) ;
$ . post ( "send.php" , { user : userid ( ) , msg : msg } )
$ . post ( "send.php" , { user : userid ( ) , msg : msg } )
. done ( function ( res ) {
. done ( function ( res ) {
if ( JSON . parse ( res ) ) {
if ( JSON . parse ( res ) ) {
$ ( "#msg" ) . val ( "" ) ;
$ ( "#message" ) . fadeIn ( "slow" ) ;
clearmessage ( ) ;
success ( "message sent" ) ;
success ( "message sent" ) ;
} else error ( "error sending message" , true ) ;
} else {
$ ( "#message" ) . fadeIn ( "slow" ) ;
error ( "error sending message" , true ) ;
}
} )
} )
. fail ( error ) ;
. fail ( error ) ;
} )
} )
. catch ( function ( e ) {
. catch ( function ( e ) {
$ ( "#message" ) . fadeIn ( "slow" ) ;
error ( "encryption of message failed" , true ) ;
error ( "encryption of message failed" , true ) ;
} ) ;
} ) ;
} ) . fail ( function ( e ) {
} ) . fail ( function ( e ) {
$ ( "#message" ) . fadeIn ( "slow" ) ;
error ( "get receiver's key from server failed" , true ) ;
error ( "get receiver's key from server failed" , true ) ;
} ) ;
} ) ;
$ ( "#message" ) . fadeIn ( "slow" ) ;
}
}
function setpw ( pwd ) {
function setpw ( pwd ) {