Skip to content

Commit 3c5a5a4

Browse files
authored
🎨 use long term keypairs in invitation token creation (#184)
* 🎨 fix: use longTerm keypairs in invitation token creation * 🎨 feat: handle long term key rotation properly * πŸ§ͺ chore: handle unique constraint key failing tests
1 parent 242e4b5 commit 3c5a5a4

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

β€Žpackages/matrix-identity-server/src/db/index.ts

+31-2
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ class IdentityServerDb<T extends string = never>
686686
return new Promise((resolve, reject) => {
687687
const _type = type === 'current' ? 'currentKey' : 'previousKey'
688688
this.db
689-
.getAll('shortTermKeypairs', ['keyID', 'public', 'private'])
689+
.getAll('longTermKeypairs', ['keyID', 'public', 'private'])
690690
.then((rows) => {
691691
if (rows.length === 0) {
692692
reject(new Error(`No ${_type} found`))
@@ -708,7 +708,7 @@ class IdentityServerDb<T extends string = never>
708708
* @param {'longTerm' | 'shortTerm'} type
709709
* @param {'ed25519' | 'curve25519'} algorithm
710710
*/
711-
createKeypair(
711+
async createKeypair(
712712
type: 'longTerm' | 'shortTerm',
713713
algorithm: 'ed25519' | 'curve25519'
714714
): Promise<keyPair> {
@@ -719,6 +719,34 @@ class IdentityServerDb<T extends string = never>
719719

720720
const keyPair = generateKeyPair(algorithm)
721721

722+
try {
723+
if (type === 'longTerm') {
724+
const currentKey = await this.db.get('longTermKeypairs', ['name'], {
725+
name: 'currentKey'
726+
})
727+
728+
if (currentKey.length > 0) {
729+
const previousKey = await this.db.get('longTermKeypairs', ['name'], {
730+
name: 'previousKey'
731+
})
732+
733+
if (previousKey.length > 0) {
734+
await this.db.deleteEqual('longTermKeypairs', 'name', 'previousKey')
735+
}
736+
737+
await this.db.update(
738+
'longTermKeypairs',
739+
{ name: 'previousKey' },
740+
'name',
741+
'currentKey'
742+
)
743+
}
744+
}
745+
} catch (error) {
746+
console.error({ error })
747+
this.logger.error(`Failed to update ${type} Key Pair`, error)
748+
}
749+
722750
return new Promise((resolve) => {
723751
this.db
724752
.insert(
@@ -734,6 +762,7 @@ class IdentityServerDb<T extends string = never>
734762
resolve(keyPair)
735763
})
736764
.catch((err) => {
765+
console.error({ err })
737766
/* istanbul ignore next */
738767
this.logger.error(`Failed to insert ${type} Key Pair`, err)
739768
})

β€Žpackages/matrix-identity-server/src/index.test.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -1451,12 +1451,21 @@ describe('Use configuration file', () => {
14511451
beforeAll(async () => {
14521452
keyPair = generateKeyPair('ed25519')
14531453
longKeyPair = generateKeyPair('ed25519')
1454-
await idServer.db.insert('longTermKeypairs', {
1455-
name: 'currentKey',
1456-
keyID: longKeyPair.keyId,
1457-
public: longKeyPair.publicKey,
1458-
private: longKeyPair.privateKey
1459-
})
1454+
try {
1455+
await idServer.db.deleteEqual(
1456+
'longTermKeypairs',
1457+
'name',
1458+
'currentKey'
1459+
)
1460+
await idServer.db.insert('longTermKeypairs', {
1461+
name: 'currentKey',
1462+
keyID: longKeyPair.keyId,
1463+
public: longKeyPair.publicKey,
1464+
private: longKeyPair.privateKey
1465+
})
1466+
} catch (error) {
1467+
console.log({ error })
1468+
}
14601469
})
14611470

14621471
beforeEach(async () => {

β€Žpackages/matrix-identity-server/src/invitation/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ const StoreInvit = <T extends string = never>(
269269
} else if (response.status === 200 && !foundMappings) {
270270
// Create invitation token
271271
const ephemeralKey = await idServer.db.createKeypair(
272-
'shortTerm',
272+
'longTerm',
273273
'curve25519'
274274
)
275275
const objWithKey = {

0 commit comments

Comments
Β (0)