forked from mystiq/hydrogen-web
fetch single device key in DeviceTracker
This commit is contained in:
parent
9384fdc885
commit
6f0ebeacb7
1 changed files with 52 additions and 0 deletions
|
@ -309,6 +309,7 @@ export class DeviceTracker {
|
||||||
return await this._devicesForUserIds(roomId, userIds, txn, hsApi, log);
|
return await this._devicesForUserIds(roomId, userIds, txn, hsApi, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** gets devices for the given user ids that are in the given room */
|
||||||
async devicesForRoomMembers(roomId, userIds, hsApi, log) {
|
async devicesForRoomMembers(roomId, userIds, hsApi, log) {
|
||||||
const txn = await this._storage.readTxn([
|
const txn = await this._storage.readTxn([
|
||||||
this._storage.storeNames.userIdentities,
|
this._storage.storeNames.userIdentities,
|
||||||
|
@ -316,6 +317,57 @@ export class DeviceTracker {
|
||||||
return await this._devicesForUserIds(roomId, userIds, txn, hsApi, log);
|
return await this._devicesForUserIds(roomId, userIds, txn, hsApi, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** gets a single device */
|
||||||
|
async deviceForId(userId, deviceId, hsApi, log) {
|
||||||
|
const txn = await this._storage.readTxn([
|
||||||
|
this._storage.storeNames.deviceIdentities,
|
||||||
|
]);
|
||||||
|
let device = await txn.deviceIdentities.get(userId, deviceId);
|
||||||
|
if (device) {
|
||||||
|
log.set("existingDevice", true);
|
||||||
|
} else {
|
||||||
|
//// BEGIN EXTRACT (deviceKeysMap)
|
||||||
|
const deviceKeyResponse = await hsApi.queryKeys({
|
||||||
|
"timeout": 10000,
|
||||||
|
"device_keys": {
|
||||||
|
[userId]: [deviceId]
|
||||||
|
},
|
||||||
|
"token": this._getSyncToken()
|
||||||
|
}, {log}).response();
|
||||||
|
// verify signature
|
||||||
|
const verifiedKeysPerUser = log.wrap("verify", log => this._filterVerifiedDeviceKeys(deviceKeyResponse["device_keys"], log));
|
||||||
|
//// END EXTRACT
|
||||||
|
|
||||||
|
// there should only be one device in here, but still check the HS sends us the right one
|
||||||
|
const verifiedKeys = verifiedKeysPerUser
|
||||||
|
.find(vkpu => vkpu.userId === userId).verifiedKeys
|
||||||
|
.find(vk => vk["device_id"] === deviceId);
|
||||||
|
device = deviceKeysAsDeviceIdentity(verifiedKeys);
|
||||||
|
const txn = await this._storage.readWriteTxn([
|
||||||
|
this._storage.storeNames.deviceIdentities,
|
||||||
|
]);
|
||||||
|
// check again we don't have the device already.
|
||||||
|
// when updating all keys for a user we allow updating the
|
||||||
|
// device when the key hasn't changed so the device display name
|
||||||
|
// can be updated, but here we don't.
|
||||||
|
const existingDevice = await txn.deviceIdentities.get(userId, deviceId);
|
||||||
|
if (existingDevice) {
|
||||||
|
device = existingDevice;
|
||||||
|
log.set("existingDeviceAfterFetch", true);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
txn.deviceIdentities.set(device);
|
||||||
|
log.set("newDevice", true);
|
||||||
|
} catch (err) {
|
||||||
|
txn.abort();
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
await txn.complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} roomId [description]
|
* @param {string} roomId [description]
|
||||||
* @param {Array<string>} userIds a set of user ids to try and find the identity for. Will be check to belong to roomId.
|
* @param {Array<string>} userIds a set of user ids to try and find the identity for. Will be check to belong to roomId.
|
||||||
|
|
Loading…
Reference in a new issue