mirror of https://github.com/movim/movim
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.9 KiB
156 lines
5.9 KiB
function ChatOmemoStorage() {
|
|
this.jid = USER_JID;
|
|
}
|
|
|
|
ChatOmemoStorage.prototype = {
|
|
Direction: {
|
|
SENDING: 1,
|
|
RECEIVING: 2,
|
|
},
|
|
|
|
put: function (key, value) {
|
|
if (key === undefined || value === undefined || key === null || value === null)
|
|
throw new Error("Tried to store undefined/null");
|
|
|
|
localStorage.setObject(key, value);
|
|
},
|
|
get: function (key, defaultValue) {
|
|
if (key === null || key === undefined)
|
|
throw new Error("Tried to get value for undefined/null key");
|
|
if (key in localStorage) {
|
|
return localStorage.getObject(key);
|
|
} else {
|
|
return defaultValue;
|
|
}
|
|
},
|
|
remove: function (key) {
|
|
if (key === null || key === undefined)
|
|
throw new Error("Tried to remove value for undefined/null key");
|
|
|
|
localStorage.removeItem(key);
|
|
},
|
|
|
|
setIdentityKeyPair: function(identityKeyPair) {
|
|
return Promise.resolve(this.put(this.jid + '.identityKey', {
|
|
'privKey': MovimUtils.arrayBufferToBase64(identityKeyPair.privKey),
|
|
'pubKey': MovimUtils.arrayBufferToBase64(identityKeyPair.pubKey)
|
|
}));
|
|
},
|
|
getIdentityKeyPair: function () {
|
|
identityKeyPair = this.get(this.jid + '.identityKey');
|
|
return Promise.resolve({
|
|
'privKey': MovimUtils.base64ToArrayBuffer(identityKeyPair.privKey),
|
|
'pubKey': MovimUtils.base64ToArrayBuffer(identityKeyPair.pubKey)
|
|
});
|
|
},
|
|
|
|
setLocalRegistrationId: function (registrationId) {
|
|
return Promise.resolve(this.put(this.jid + '.registrationId', registrationId));
|
|
},
|
|
getLocalRegistrationId: function () {
|
|
return Promise.resolve(this.get(this.jid + '.registrationId'));
|
|
},
|
|
|
|
isTrustedIdentity: function (identifier, identityKey, direction) {
|
|
if (identifier === null || identifier === undefined) {
|
|
throw new Error("tried to check identity key for undefined/null key");
|
|
}
|
|
if (!(identityKey instanceof ArrayBuffer)) {
|
|
throw new Error("Expected identityKey to be an ArrayBuffer");
|
|
}
|
|
var trusted = this.get(this.jid + '.identityKey' + identifier);
|
|
if (trusted === undefined) {
|
|
return Promise.resolve(true);
|
|
}
|
|
return Promise.resolve(true);
|
|
//return Promise.resolve(libsignal.util.toString(identityKey) === libsignal.util.toString(trusted));
|
|
},
|
|
loadIdentityKey: function (identifier) {
|
|
if (identifier === null || identifier === undefined)
|
|
throw new Error("Tried to get identity key for undefined/null key");
|
|
return Promise.resolve(this.get(this.jid + '.identityKey' + identifier));
|
|
},
|
|
saveIdentity: function (identifier, identityKey) {
|
|
if (identifier === null || identifier === undefined)
|
|
throw new Error("Tried to put identity key for undefined/null key");
|
|
|
|
var address = new libsignal.SignalProtocolAddress.fromString(identifier);
|
|
|
|
var existing = this.get(this.jid + '.identityKey' + address.getName());
|
|
this.put(this.jid + '.identityKey' + address.getName(), identityKey)
|
|
|
|
if (existing && toString(identityKey) !== toString(existing)) {
|
|
return Promise.resolve(true);
|
|
} else {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
},
|
|
|
|
loadPreKey: function (keyId) {
|
|
var res = this.get(this.jid + '.25519KeypreKey' + keyId);
|
|
if (res !== undefined) {
|
|
res = {
|
|
pubKey: MovimUtils.base64ToArrayBuffer(res.pubKey),
|
|
privKey: MovimUtils.base64ToArrayBuffer(res.privKey)
|
|
};
|
|
}
|
|
return Promise.resolve(res);
|
|
},
|
|
storePreKey: function (keyId, keyPair) {
|
|
keyPair.pubKey = MovimUtils.arrayBufferToBase64(keyPair.pubKey);
|
|
keyPair.privKey = MovimUtils.arrayBufferToBase64(keyPair.privKey);
|
|
return Promise.resolve(this.put(this.jid + '.25519KeypreKey' + keyId, keyPair));
|
|
},
|
|
removePreKey: function (keyId) {
|
|
return Promise.resolve(this.remove(this.jid + '.25519KeypreKey' + keyId));
|
|
},
|
|
|
|
loadSignedPreKey: function (keyId) {
|
|
var res = this.get(this.jid + '.25519KeysignedKey' + keyId);
|
|
if (res !== undefined) {
|
|
res = {
|
|
keyPair: {
|
|
pubKey: MovimUtils.base64ToArrayBuffer(res.keyPair.pubKey),
|
|
privKey: MovimUtils.base64ToArrayBuffer(res.keyPair.privKey),
|
|
},
|
|
signature: MovimUtils.base64ToArrayBuffer(res.signature),
|
|
keyId: keyId
|
|
};
|
|
}
|
|
return Promise.resolve(res);
|
|
},
|
|
storeSignedPreKey: function (keyId, key) {
|
|
key.keyPair.pubKey = MovimUtils.arrayBufferToBase64(key.keyPair.pubKey);
|
|
key.keyPair.privKey = MovimUtils.arrayBufferToBase64(key.keyPair.privKey);
|
|
key.signature = MovimUtils.arrayBufferToBase64(key.signature);
|
|
return Promise.resolve(this.put(this.jid + '.25519KeysignedKey' + keyId, key));
|
|
},
|
|
removeSignedPreKey: function (keyId) {
|
|
return Promise.resolve(this.remove(this.jid + '.25519KeysignedKey' + keyId));
|
|
},
|
|
|
|
loadSession: function (identifier) {
|
|
return Promise.resolve(this.get(this.jid + '.session' + identifier));
|
|
},
|
|
storeSession: function (identifier, record) {
|
|
return Promise.resolve(this.put(this.jid + '.session' + identifier, record));
|
|
},
|
|
removeSession: function (identifier) {
|
|
return Promise.resolve(this.remove(this.jid + '.session' + identifier));
|
|
},
|
|
removeAllSessions: function (identifier) {
|
|
for (key in Object.keys(localStorage)
|
|
.filter(key => key.startsWith(this.jid + '.session' + identifier))) {
|
|
this.remove(key);
|
|
}
|
|
|
|
return Promise.resolve();
|
|
},
|
|
toString: function(thing) {
|
|
if (typeof thing == 'string') {
|
|
return thing;
|
|
}
|
|
return new dcodeIO.ByteBuffer.wrap(thing).toString('binary');
|
|
}
|
|
};
|