@ -769,10 +769,6 @@ define([
pad . onErrorEvent = Util . mkEvent ( ) ;
pad . onMetadataEvent = Util . mkEvent ( ) ;
pad . getPadMetadata = function ( data , cb ) {
postMessage ( 'GET_PAD_METADATA' , data , cb ) ;
} ;
pad . requestAccess = function ( data , cb ) {
postMessage ( "REQUEST_PAD_ACCESS" , data , cb ) ;
} ;
@ -784,14 +780,11 @@ define([
postMessage ( 'SET_PAD_METADATA' , data , cb ) ;
} ;
common . getPadMetadata = function ( data , cb ) {
common . anonRpcMsg ( 'GET_METADATA' , data . channel , function ( err , obj ) {
if ( err ) { return void cb ( { error : err } ) ; }
cb ( obj && obj [ 0 ] ) ;
} ) ;
postMessage ( 'GET_PAD_METADATA' , data , cb ) ;
} ;
// XXX Teams: change the password of a pad owned by the team
common . changePadPassword = function ( Crypt , href, newPassword , edPublic , cb ) {
common . changePadPassword = function ( Crypt , Crypto, href, newPassword , edPublic , cb ) {
if ( ! href ) { return void cb ( { error : 'EINVAL_HREF' } ) ; }
var parsed = Hash . parsePadUrl ( href ) ;
if ( ! parsed . hash ) { return void cb ( { error : 'EINVAL_HREF' } ) ; }
@ -799,6 +792,8 @@ define([
var warning = false ;
var newHash , newRoHref ;
var oldChannel ;
var oldSecret ;
var oldMetadata ;
var newSecret ;
if ( parsed . hashData . version >= 2 ) {
@ -815,27 +810,61 @@ define([
var optsGet = { } ;
var optsPut = {
password : newPassword
password : newPassword ,
metadata : { }
} ;
Nthen ( function ( waitFor ) {
if ( parsed . hashData && parsed . hashData . password ) {
common . getPadAttribute ( 'password' , waitFor ( function ( err , password ) {
optsGet . password = password ;
} ) , href ) ;
}
common . getPadAttribute ( 'owners' , waitFor ( function ( err , owners ) {
if ( ! Array . isArray ( owners ) || owners . indexOf ( edPublic ) === - 1 ) {
// We're not an owner, we shouldn't be able to change the password!
waitFor . abort ( ) ;
return void cb ( { error : 'EPERM' } ) ;
} ) . nThen ( function ( waitFor ) {
oldSecret = Hash . getSecrets ( parsed . type , parsed . hash , optsGet . password ) ;
oldChannel = oldSecret . channel ;
common . getPadMetadata ( { channel : oldChannel } , waitFor ( function ( metadata ) {
oldMetadata = metadata ;
} ) ) ;
} ) . nThen ( function ( waitFor ) {
// Get owners, mailbox and expiration time
var owners = oldMetadata . owners ;
if ( ! Array . isArray ( owners ) || owners . indexOf ( edPublic ) === - 1 ) {
// We're not an owner, we shouldn't be able to change the password!
waitFor . abort ( ) ;
return void cb ( { error : 'EPERM' } ) ;
}
optsPut . metadata . owners = owners ;
var mailbox = oldMetadata . mailbox ;
if ( mailbox ) {
// Create the encryptors to be able to decrypt and re-encrypt the mailboxes
var oldCrypto = Crypto . createEncryptor ( oldSecret . keys ) ;
var newCrypto = Crypto . createEncryptor ( newSecret . keys ) ;
var m ;
if ( typeof ( mailbox ) === "string" ) {
try {
m = newCrypto . encrypt ( oldCrypto . decrypt ( mailbox , true , true ) ) ;
} catch ( e ) { }
} else if ( mailbox && typeof ( mailbox ) === "object" ) {
m = { } ;
Object . keys ( mailbox ) . forEach ( function ( ed ) {
console . log ( mailbox [ ed ] ) ;
try {
m [ ed ] = newCrypto . encrypt ( oldCrypto . decrypt ( mailbox [ ed ] , true , true ) ) ;
} catch ( e ) {
console . error ( e ) ;
}
} ) ;
}
optsPut . owners = owners ;
} ) , href ) ;
// XXX get the mailbox fields, decrypt all the mailboxes, reencrypt them, and put them in the metadata
// XXX also use optsPut.metadata (and fix it in cryptget) instead of optsPut.owners
common . getPadAttribute ( 'expire' , waitFor ( function ( err , expire ) {
optsPut . expire = ( expire - ( + new Date ( ) ) ) / 1000 ; // Lifetime in seconds
} ) , href ) ;
optsPut . metadata . mailbox = m ;
}
var expire = oldMetadata . expire ;
optsPut . metadata . expire = ( expire - ( + new Date ( ) ) ) / 1000 ; // Lifetime in seconds
} ) . nThen ( function ( waitFor ) {
Crypt . get ( parsed . hash , waitFor ( function ( err , val ) {
if ( err ) {
@ -850,8 +879,6 @@ define([
} ) , optsPut ) ;
} ) , optsGet ) ;
} ) . nThen ( function ( waitFor ) {
var secret = Hash . getSecrets ( parsed . type , parsed . hash , optsGet . password ) ;
oldChannel = secret . channel ;
pad . leavePad ( {
channel : oldChannel
} , waitFor ( ) ) ;