Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug/1893 #2071

Closed
wants to merge 12 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74,168 changes: 37,084 additions & 37,084 deletions packages/backend/package-lock.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Logger from '../common/logger'
import { load } from 'mock-fs'

const logger = Logger('registration.functions')
class UserCsrData {
export class UserCsrData {
@IsNotEmpty()
@IsBase64()
@IsCsr()
Expand Down
93 changes: 93 additions & 0 deletions packages/backend/src/nest/storage/certificatesRequestStore.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
describe('CertificatesRequestsStore csr validation methods', () => {
it('validateUserCsr')
it('validateCsrFormat')
})

// it('getCsrs - remove old csrs and replace with new for each pubkey', async () => {
// await storageService.init(peerId)
// const allCsrs = [
// 'MIIDITCCAsYCAQAwSTFHMEUGA1UEAxM+anR3c3hxMnZ1dWthY3JodWhvdnAzd2JxbzRxNXc0d2s3Nm1qbWJ3cXk3eGNma2FsdmRxb3hhYWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQE2q6iS+WCmIVCSFI2AjHrW6ujUdrceD5T2xkcTJBTn0y50WphcupUajCRgkXaTBkTsGNJ3qWRZAKX7CiuehBJoIICGTAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBQuE5JgPY/BYBpgG5pnjMkEEIkrGjCCAUcGCSqGSIb3DQEJDDGCATgEggE0BDlx84glBl72q82F2a+y8iTVKM8IMiXYYrmNyhFPj6XsfVQpvLhNviZ5zHdMBWbFj44vTSUIasNP9I9eCWSEAaEJqjngEh18WCRS/XbvQxI/8qB5pzcfghvM8BCgSLbSEjK2GMYVhCXmRH1YGHIZu0+Ii9pe5nwG154JlPUsmIRgu6ruY6PQk65Aoo4OyhPn5CCUFInptHcz1JpAiCRe0Z6wuQHud03VY50fx4ETdmUNJBEIPOyd/Xn6lMOi6SaWGHbCWiufeJRm+mRdoHJAEt6kPLhGIYGyduNT/8cGoe2xKyQDvNoTr4dqqRZ2HgZ18nicsTHswpGqAlUnZXaA3V85Qu1cvaMAqEoPOUlGP9AriIVwtIZM0hdWHqKHgBCZrKfHb5oLxt6ourQ3+q19tvx+u6UwFAYKKwYBBAGDjBsCATEGEwRlbGxvMD0GCSsGAQIBDwMBATEwEy5RbVVvNXN0NXNqR3RFMUtQeXhOVW5pTWhnQXduV0JVNXk3TnpoMlpRRkdacVdiMEcGA1UdETFAEz5qdHdzeHEydnV1a2Fjcmh1aG92cDN3YnFvNHE1dzR3azc2bWptYndxeTd4Y2ZrYWx2ZHFveGFhZC5vbmlvbjAKBggqhkjOPQQDAgNJADBGAiEAt9udw7B7vnjJyWvkkRLb7DImFXwsrSxirqbmhIH+1rUCIQD86GWyfAE2d8gCNAn4h1t9B+mAx33ZdPLgFssHl1i3pA==',

// 'MIIDIjCCAsgCAQAwSTFHMEUGA1UEAxM+ZDczejJmemt6Nm9zZ3Q0aGxiYXVoY2dlejVtcm9uNXp1djVvc242aDJteXZxb2NjeWQ2MjNnaWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAReJrJSBfMmV2t3LPzI3CzPaCaczslnE5LgdptV8HcWhwTzaE+z9bUqA28xc9SaWNWvZ5v9xURKMKc6aMv0tySJoIICGzAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBR6gB8ZoO1xPEX+bej0/a0fffXDajCCAUcGCSqGSIb3DQEJDDGCATgEggE0IfNRueluz1lwKCPyiU8i/d2uyVgC351lK7LHr9n/1u1Ln00g7HKCDSZl2vinu1YaxhBdjlgDl8NjST3+5NTBZAn5liQM53WImqzY8yUJgm1+hms96qb30pK73owxkHHeS1fmbz/gTlH4KvDGLQLQl2QuHuXJ9PJDg4B07/EcM61UE+mMp1B4zkuXBTihrLLT2PQNfeaFzK0FX8tkvTJ8ym53xfb30YfeQnEOkxREJksWxMtxBKki7pCOzzTyUCcsSVNBic59sKpwkiQ4aeQMtJF2eKQUqnlkyP4r0e6KV9EivxB7FLNrHNb/2slgeLRFLbGUf0csZiaFgFt1Ps2ZW3wakpl5Fe+ZQh+89hZfi1flSne/mLr/J9TF4IN+XXiNtGJp18f6xXLv54Cg8cde432U3iQwFgYKKwYBBAGDjBsCATEIEwZrYWNwZXIwPQYJKwYBAgEPAwEBMTATLlFtV1gxck5WVXhDaGQ4Y3o2aHdUNGp2N1dLcmh0aXV2R0I3Mlk3ellYQVNUYlEwRwYDVR0RMUATPmQ3M3oyZnprejZvc2d0NGhsYmF1aGNnZXo1bXJvbjV6dXY1b3NuNmgybXl2cW9jY3lkNjIzZ2lkLm9uaW9uMAoGCCqGSM49BAMCA0gAMEUCIQDyCqINFdedoNTRUWYvmqkgc7wV7o+kZ2RqBOv63478sAIgXHNyDFeluMpD3oNUXN/jcFgzyMRUZwG8f7FQTN02sbg=',

// 'MIIDITCCAscCAQAwSTFHMEUGA1UEAxM+Z3hscHR5ZWs0eG12NGl2cTRxZGkzNXRzbDJwaXkzc2Ruc256dGN5dHA2NWZ3Nm93djdjc252aWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQpn3SvkJv5Py+q+PVQcHpMEI4r6WGmUELj6PSv9HlNzup6AbgTF+fkGJ5Ei75XSiF9hNsL2RqjzD6cvqANAhvSoIICGjAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBQyCApwbL2Z81491MXLwgSLAb8yVTCCAUcGCSqGSIb3DQEJDDGCATgEggE0IlA9j/+4ffYhOyzM2DKwBPjqB5MD1mVLtOkYYmOaI16f+DEIZRU8+SjzbaXqBoG9EvkzCP8I7afJTG37/zEcE5SbLVRXGZalqzFb7NCOrXsZViUlaCOoikRkbiGj4j6o3af/STSQUCfeBiTSNfmEJX/pBoaBNsqqjfm0OACvLsAVg/Hka+/97DPYgk1pHgErt1NL5I6nFltHJxKlYxxMkvVTJSJLfZcGf+/73Oz+MoyxcyRJq3u8d23rxqRXhl3CvtH7GafzM2T7fNIgpbjMI9nYHCJvqbvCArua4dviKi4X9j54m4rYA4wwPPWYgV55NoN4AfJN5p7NTLhcyrzkcXIm3CNgh3NzzyvE8B+pJ67oVo/eGFecGtQE7tfgx9DjpLd+NfF9dnR7vx9WioJgCTnXvF0wFQYKKwYBBAGDjBsCATEHEwVvd25lcjA9BgkrBgECAQ8DAQExMBMuUW1ZaUN3bTNRV3NHMlpEQnBCeGNvaEVtWFpVZXo3d213b3lQNFdnTHhiUEYzSDBHBgNVHRExQBM+Z3hscHR5ZWs0eG12NGl2cTRxZGkzNXRzbDJwaXkzc2Ruc256dGN5dHA2NWZ3Nm93djdjc252aWQub25pb24wCgYIKoZIzj0EAwIDSAAwRQIhANGQ+7FGYrUksCVQOYa56FUy6nhJCmOn01r+mZ1CiXKiAiBSBjDGPueE9jzP1b8GHCYRDo7y31XQLoPb5PgvWbCfhA==',

// 'MIIDIjCCAskCAQAwSTFHMEUGA1UEAxM+ZDczejJmemt6Nm9zZ3Q0aGxiYXVoY2dlejVtcm9uNXp1djVvc242aDJteXZxb2NjeWQ2MjNnaWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAReJrJSBfMmV2t3LPzI3CzPaCaczslnE5LgdptV8HcWhwTzaE+z9bUqA28xc9SaWNWvZ5v9xURKMKc6aMv0tySJoIICHDAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBR6gB8ZoO1xPEX+bej0/a0fffXDajCCAUcGCSqGSIb3DQEJDDGCATgEggE0IfNRueluz1lwKCPyiU8i/d2uyVgC351lK7LHr9n/1u1Ln00g7HKCDSZl2vinu1YaxhBdjlgDl8NjST3+5NTBZAn5liQM53WImqzY8yUJgm1+hms96qb30pK73owxkHHeS1fmbz/gTlH4KvDGLQLQl2QuHuXJ9PJDg4B07/EcM61UE+mMp1B4zkuXBTihrLLT2PQNfeaFzK0FX8tkvTJ8ym53xfb30YfeQnEOkxREJksWxMtxBKki7pCOzzTyUCcsSVNBic59sKpwkiQ4aeQMtJF2eKQUqnlkyP4r0e6KV9EivxB7FLNrHNb/2slgeLRFLbGUf0csZiaFgFt1Ps2ZW3wakpl5Fe+ZQh+89hZfi1flSne/mLr/J9TF4IN+XXiNtGJp18f6xXLv54Cg8cde432U3iQwFwYKKwYBBAGDjBsCATEJEwdrYWNwZXIyMD0GCSsGAQIBDwMBATEwEy5RbVdYMXJOVlV4Q2hkOGN6Nmh3VDRqdjdXS3JodGl1dkdCNzJZN3pZWEFTVGJRMEcGA1UdETFAEz5kNzN6MmZ6a3o2b3NndDRobGJhdWhjZ2V6NW1yb241enV2NW9zbjZoMm15dnFvY2N5ZDYyM2dpZC5vbmlvbjAKBggqhkjOPQQDAgNHADBEAiBjivWf9a+YwInRNQ5W0zm7VmsjZLOlQXhf922JzP3XEgIgAYW6vm0PNfXMxPss24gbe3UK9/uPjSDEb26lu2bvgzY=',

// 'MIIDIjCCAsgCAQAwSTFHMEUGA1UEAxM+dTdua2gyNHBvbXRsNzVvYWFibXd5dGt0dTNjNmx4aW9uZ2IzYm1jamtuZXBmZWF3Mmk2ZHdkYWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASKexp/LUMwIEJElHaKzlAjXGvLl/vFiOugGa7pUACVYc/xINEPnbQTy0kHjb47vBPl0NXryCx/ncGxqnEBZat+oIICGzAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBTrrHm/uv3ViamQqQsImfE+Nd0R1jCCAUcGCSqGSIb3DQEJDDGCATgEggE0EEQQfvnnjicwQYHZLzsPiRaoQtS8rP4q4cqjLBA6zJcibd88zpWKFH5oNkUaVaZi64iiX0bCCEmJFX+nQWJdtuhMd4/ut+6vW5cj/DWMAak5q3fi7gQ2lSsDfd702Ter0uNJToSbm7X1NlYm/WXCtLeUEsXOV1G0kOcv2uthpaV7NSlWd4jtRDHidLrd/X/iJWHMsmi4KyLM/p7dCGEqk24aobLfJA9cYN540Q0Sp93tJAXw3Y3Gh5CUwItNolhMk/rVpS3niKIpxjMk2OtLrV0epBKhMVV7jDqKsxZX9I0gDMNTRdixIEXbKHacVY4dSP9iNY+9T26yxGKBM6ah0KHxTY5rODLV29+ll/+wftIGsixYNJoo5HUEmZnWRSPVKri50scOJAI4C6l9HJfNgEBoNFEwFgYKKwYBBAGDjBsCATEIEwZrYWNwZXIwPQYJKwYBAgEPAwEBMTATLlFtY01LdlpWNWJZcEZ4eW9TRFlUcE1RY2VBdnRDa2taZnQ2TlRDVVB0VVAyTXkwRwYDVR0RMUATPnU3bmtoMjRwb210bDc1b2FhYm13eXRrdHUzYzZseGlvbmdiM2JtY2prbmVwZmVhdzJpNmR3ZGFkLm9uaW9uMAoGCCqGSM49BAMCA0gAMEUCIFsTfZsGWX3g44QnEksCh0naujBG60DuNNh83YHcl12FAiEAm9qALhC6ctx9JvakesWQhtDT4WFAGyEkuIB5Xtw68eg=',
// ]

// const mockGetAllEventLogEntries = jest.fn()
// // @ts-ignore - Property 'getAllEventLogEntries' is protected
// storageService.getAllEventLogEntries = mockGetAllEventLogEntries
// mockGetAllEventLogEntries.mockReturnValue(allCsrs)

// const filteredCsrs = await storageService.getCsrs()

// expect(filteredCsrs.length).toEqual(allCsrs.length - 1)

// expect(filteredCsrs).toEqual([
// 'MIIDITCCAsYCAQAwSTFHMEUGA1UEAxM+anR3c3hxMnZ1dWthY3JodWhvdnAzd2JxbzRxNXc0d2s3Nm1qbWJ3cXk3eGNma2FsdmRxb3hhYWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQE2q6iS+WCmIVCSFI2AjHrW6ujUdrceD5T2xkcTJBTn0y50WphcupUajCRgkXaTBkTsGNJ3qWRZAKX7CiuehBJoIICGTAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBQuE5JgPY/BYBpgG5pnjMkEEIkrGjCCAUcGCSqGSIb3DQEJDDGCATgEggE0BDlx84glBl72q82F2a+y8iTVKM8IMiXYYrmNyhFPj6XsfVQpvLhNviZ5zHdMBWbFj44vTSUIasNP9I9eCWSEAaEJqjngEh18WCRS/XbvQxI/8qB5pzcfghvM8BCgSLbSEjK2GMYVhCXmRH1YGHIZu0+Ii9pe5nwG154JlPUsmIRgu6ruY6PQk65Aoo4OyhPn5CCUFInptHcz1JpAiCRe0Z6wuQHud03VY50fx4ETdmUNJBEIPOyd/Xn6lMOi6SaWGHbCWiufeJRm+mRdoHJAEt6kPLhGIYGyduNT/8cGoe2xKyQDvNoTr4dqqRZ2HgZ18nicsTHswpGqAlUnZXaA3V85Qu1cvaMAqEoPOUlGP9AriIVwtIZM0hdWHqKHgBCZrKfHb5oLxt6ourQ3+q19tvx+u6UwFAYKKwYBBAGDjBsCATEGEwRlbGxvMD0GCSsGAQIBDwMBATEwEy5RbVVvNXN0NXNqR3RFMUtQeXhOVW5pTWhnQXduV0JVNXk3TnpoMlpRRkdacVdiMEcGA1UdETFAEz5qdHdzeHEydnV1a2Fjcmh1aG92cDN3YnFvNHE1dzR3azc2bWptYndxeTd4Y2ZrYWx2ZHFveGFhZC5vbmlvbjAKBggqhkjOPQQDAgNJADBGAiEAt9udw7B7vnjJyWvkkRLb7DImFXwsrSxirqbmhIH+1rUCIQD86GWyfAE2d8gCNAn4h1t9B+mAx33ZdPLgFssHl1i3pA==',
// 'MIIDITCCAscCAQAwSTFHMEUGA1UEAxM+Z3hscHR5ZWs0eG12NGl2cTRxZGkzNXRzbDJwaXkzc2Ruc256dGN5dHA2NWZ3Nm93djdjc252aWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQpn3SvkJv5Py+q+PVQcHpMEI4r6WGmUELj6PSv9HlNzup6AbgTF+fkGJ5Ei75XSiF9hNsL2RqjzD6cvqANAhvSoIICGjAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBQyCApwbL2Z81491MXLwgSLAb8yVTCCAUcGCSqGSIb3DQEJDDGCATgEggE0IlA9j/+4ffYhOyzM2DKwBPjqB5MD1mVLtOkYYmOaI16f+DEIZRU8+SjzbaXqBoG9EvkzCP8I7afJTG37/zEcE5SbLVRXGZalqzFb7NCOrXsZViUlaCOoikRkbiGj4j6o3af/STSQUCfeBiTSNfmEJX/pBoaBNsqqjfm0OACvLsAVg/Hka+/97DPYgk1pHgErt1NL5I6nFltHJxKlYxxMkvVTJSJLfZcGf+/73Oz+MoyxcyRJq3u8d23rxqRXhl3CvtH7GafzM2T7fNIgpbjMI9nYHCJvqbvCArua4dviKi4X9j54m4rYA4wwPPWYgV55NoN4AfJN5p7NTLhcyrzkcXIm3CNgh3NzzyvE8B+pJ67oVo/eGFecGtQE7tfgx9DjpLd+NfF9dnR7vx9WioJgCTnXvF0wFQYKKwYBBAGDjBsCATEHEwVvd25lcjA9BgkrBgECAQ8DAQExMBMuUW1ZaUN3bTNRV3NHMlpEQnBCeGNvaEVtWFpVZXo3d213b3lQNFdnTHhiUEYzSDBHBgNVHRExQBM+Z3hscHR5ZWs0eG12NGl2cTRxZGkzNXRzbDJwaXkzc2Ruc256dGN5dHA2NWZ3Nm93djdjc252aWQub25pb24wCgYIKoZIzj0EAwIDSAAwRQIhANGQ+7FGYrUksCVQOYa56FUy6nhJCmOn01r+mZ1CiXKiAiBSBjDGPueE9jzP1b8GHCYRDo7y31XQLoPb5PgvWbCfhA==',
// 'MIIDIjCCAskCAQAwSTFHMEUGA1UEAxM+ZDczejJmemt6Nm9zZ3Q0aGxiYXVoY2dlejVtcm9uNXp1djVvc242aDJteXZxb2NjeWQ2MjNnaWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAReJrJSBfMmV2t3LPzI3CzPaCaczslnE5LgdptV8HcWhwTzaE+z9bUqA28xc9SaWNWvZ5v9xURKMKc6aMv0tySJoIICHDAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBR6gB8ZoO1xPEX+bej0/a0fffXDajCCAUcGCSqGSIb3DQEJDDGCATgEggE0IfNRueluz1lwKCPyiU8i/d2uyVgC351lK7LHr9n/1u1Ln00g7HKCDSZl2vinu1YaxhBdjlgDl8NjST3+5NTBZAn5liQM53WImqzY8yUJgm1+hms96qb30pK73owxkHHeS1fmbz/gTlH4KvDGLQLQl2QuHuXJ9PJDg4B07/EcM61UE+mMp1B4zkuXBTihrLLT2PQNfeaFzK0FX8tkvTJ8ym53xfb30YfeQnEOkxREJksWxMtxBKki7pCOzzTyUCcsSVNBic59sKpwkiQ4aeQMtJF2eKQUqnlkyP4r0e6KV9EivxB7FLNrHNb/2slgeLRFLbGUf0csZiaFgFt1Ps2ZW3wakpl5Fe+ZQh+89hZfi1flSne/mLr/J9TF4IN+XXiNtGJp18f6xXLv54Cg8cde432U3iQwFwYKKwYBBAGDjBsCATEJEwdrYWNwZXIyMD0GCSsGAQIBDwMBATEwEy5RbVdYMXJOVlV4Q2hkOGN6Nmh3VDRqdjdXS3JodGl1dkdCNzJZN3pZWEFTVGJRMEcGA1UdETFAEz5kNzN6MmZ6a3o2b3NndDRobGJhdWhjZ2V6NW1yb241enV2NW9zbjZoMm15dnFvY2N5ZDYyM2dpZC5vbmlvbjAKBggqhkjOPQQDAgNHADBEAiBjivWf9a+YwInRNQ5W0zm7VmsjZLOlQXhf922JzP3XEgIgAYW6vm0PNfXMxPss24gbe3UK9/uPjSDEb26lu2bvgzY=',
// 'MIIDIjCCAsgCAQAwSTFHMEUGA1UEAxM+dTdua2gyNHBvbXRsNzVvYWFibXd5dGt0dTNjNmx4aW9uZ2IzYm1jamtuZXBmZWF3Mmk2ZHdkYWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASKexp/LUMwIEJElHaKzlAjXGvLl/vFiOugGa7pUACVYc/xINEPnbQTy0kHjb47vBPl0NXryCx/ncGxqnEBZat+oIICGzAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBTrrHm/uv3ViamQqQsImfE+Nd0R1jCCAUcGCSqGSIb3DQEJDDGCATgEggE0EEQQfvnnjicwQYHZLzsPiRaoQtS8rP4q4cqjLBA6zJcibd88zpWKFH5oNkUaVaZi64iiX0bCCEmJFX+nQWJdtuhMd4/ut+6vW5cj/DWMAak5q3fi7gQ2lSsDfd702Ter0uNJToSbm7X1NlYm/WXCtLeUEsXOV1G0kOcv2uthpaV7NSlWd4jtRDHidLrd/X/iJWHMsmi4KyLM/p7dCGEqk24aobLfJA9cYN540Q0Sp93tJAXw3Y3Gh5CUwItNolhMk/rVpS3niKIpxjMk2OtLrV0epBKhMVV7jDqKsxZX9I0gDMNTRdixIEXbKHacVY4dSP9iNY+9T26yxGKBM6ah0KHxTY5rODLV29+ll/+wftIGsixYNJoo5HUEmZnWRSPVKri50scOJAI4C6l9HJfNgEBoNFEwFgYKKwYBBAGDjBsCATEIEwZrYWNwZXIwPQYJKwYBAgEPAwEBMTATLlFtY01LdlpWNWJZcEZ4eW9TRFlUcE1RY2VBdnRDa2taZnQ2TlRDVVB0VVAyTXkwRwYDVR0RMUATPnU3bmtoMjRwb210bDc1b2FhYm13eXRrdHUzYzZseGlvbmdiM2JtY2prbmVwZmVhdzJpNmR3ZGFkLm9uaW9uMAoGCCqGSM49BAMCA0gAMEUCIFsTfZsGWX3g44QnEksCh0naujBG60DuNNh83YHcl12FAiEAm9qALhC6ctx9JvakesWQhtDT4WFAGyEkuIB5Xtw68eg=',
// ])
// })

// describe('replicate certificatesRequests event', () => {
// const replicatedEvent = async () => {
// certificatesRequestsStore.events.emit('replicated')
// await new Promise<void>(resolve => setTimeout(() => resolve(), 2000))
// }

// it('replicated event ', async () => {
// await storageService.init(peerId)
// const spyOnUpdatePeersList = jest.spyOn(storageService, 'updatePeersList')
// await replicatedEvent()
// expect(spyOnUpdatePeersList).toBeCalledTimes(1)
// })

// it('2 replicated events - first not resolved ', async () => {
// await storageService.init(peerId)
// const spyOnUpdatePeersList = jest.spyOn(storageService, 'updatePeersList')
// await replicatedEvent()
// await replicatedEvent()
// expect(spyOnUpdatePeersList).toBeCalledTimes(1)
// })

// it('2 replicated events - first resolved ', async () => {
// await storageService.init(peerId)
// const spyOnUpdatePeersList = jest.spyOn(storageService, 'updatePeersList')
// await replicatedEvent()
// await replicatedEvent()
// storageService.resolveCsrReplicatedPromise(1)
// await new Promise<void>(resolve => setTimeout(() => resolve(), 500))
// expect(spyOnUpdatePeersList).toBeCalledTimes(2)
// })

// it('3 replicated events - no resolved promises', async () => {
// await storageService.init(peerId)
// const spyOnUpdatePeersList = jest.spyOn(storageService, 'updatePeersList')

// await replicatedEvent()
// await replicatedEvent()
// await replicatedEvent()

// expect(spyOnUpdatePeersList).toBeCalledTimes(1)
// })

// it('3 replicated events - two resolved promises ', async () => {
// await storageService.init(peerId)
// const spyOnUpdatePeersList = jest.spyOn(storageService, 'updatePeersList')

// await replicatedEvent()
// await replicatedEvent()
// storageService.resolveCsrReplicatedPromise(1)
// await new Promise<void>(resolve => setTimeout(() => resolve(), 500))
// await replicatedEvent()
// storageService.resolveCsrReplicatedPromise(2)
// await new Promise<void>(resolve => setTimeout(() => resolve(), 500))

// expect(spyOnUpdatePeersList).toBeCalledTimes(3)
// })
// })
169 changes: 169 additions & 0 deletions packages/backend/src/nest/storage/certificatesRequestsStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
import { getCrypto } from 'pkijs'
import { EventEmitter } from 'events'
import EventStore from 'orbit-db-eventstore'
import OrbitDB from 'orbit-db'

import { NoCryptoEngineError } from '@quiet/types'
import { loadCSR, keyFromCertificate } from '@quiet/identity'

import { StorageEvents } from './storage.types'
import createLogger from '../common/logger'

import { validate } from 'class-validator'
import { UserCsrData } from '../registration/registration.functions'

const logger = createLogger('CertificatesRequestsStore')

interface CsrReplicatedPromiseValues {
promise: Promise<unknown>
resolveFunction: any
}

export class CertificatesRequestsStore {
public orbitDb: OrbitDB
public store: EventStore<string>
public csrReplicatedPromiseMap: Map<number, CsrReplicatedPromiseValues> = new Map()
private csrReplicatedPromiseId: number = 0

constructor(orbitDb: OrbitDB) {
this.orbitDb = orbitDb
}

public async init(emitter: EventEmitter) {
logger('Initializing...')
this.store = await this.orbitDb.log<string>('csrs', {
replicate: false,
accessController: {
write: ['*'],
},
})

this.store.events.on('write', async (_address, entry) => {
logger('Added CSR to database')
emitter.emit(StorageEvents.LOADED_USER_CSRS, {
csrs: await this.getCsrs(),
id: this.csrReplicatedPromiseId,
})
})

this.store.events.on('replicated', async () => {
logger('Replicated CSRS')
// @ts-expect-error - OrbitDB's type declaration of `load` lacks 'options'
await this.store.load({ fetchEntryTimeout: 15000 })

this.csrReplicatedPromiseId++
const filteredCsrs = await this.getCsrs()
this.createCsrReplicatedPromise(this.csrReplicatedPromiseId)

// Lock replicated event until previous event is processed by registration service
if (this.csrReplicatedPromiseId > 1) {
const csrReplicatedPromiseMapId = this.csrReplicatedPromiseMap.get(this.csrReplicatedPromiseId - 1)

if (csrReplicatedPromiseMapId?.promise) {
await csrReplicatedPromiseMapId.promise
}
}

emitter.emit(StorageEvents.LOADED_USER_CSRS, {
csrs: filteredCsrs,
id: this.csrReplicatedPromiseId,
})
})

// @ts-expect-error - OrbitDB's type declaration of `load` lacks 'options'
await this.store.load({ fetchEntryTimeout: 15000 })
emitter.emit(StorageEvents.LOADED_USER_CSRS, {
csrs: await this.getCsrs(),
id: this.csrReplicatedPromiseId,
})
logger('Initialized')
}

public async close() {
logger('Closing...')
await this.store?.close()
logger('Closed')
}

public getAddress() {
return this.store?.address
}

public resetCsrReplicatedMapAndId() {
this.csrReplicatedPromiseMap = new Map()
this.csrReplicatedPromiseId = 0
}

private createCsrReplicatedPromise(id: number) {
let resolveFunction
const promise = new Promise(resolve => {
resolveFunction = resolve
})
this.csrReplicatedPromiseMap.set(id, { promise, resolveFunction })
}

public resolveCsrReplicatedPromise(id: number) {
const csrReplicatedPromiseMapId = this.csrReplicatedPromiseMap.get(id)
if (csrReplicatedPromiseMapId) {
csrReplicatedPromiseMapId?.resolveFunction(id)
this.csrReplicatedPromiseMap.delete(id)
} else {
logger.error(`No promise with ID ${id} found.`)
return
}
}

public async addUserCsr(csr: string) {
await this.store.add(csr)
return true
}

public static async validateUserCsr(csr: string) {
try {
const crypto = getCrypto()
if (!crypto) {
throw new NoCryptoEngineError()
}
const parsedCsr = await loadCSR(csr)
await parsedCsr.verify()
await this.validateCsrFormat(csr)
} catch (err) {
logger.error('Failed to validate user csr:', csr, err?.message)
return false
}
return true
}

public static async validateCsrFormat(csr: string) {
const userData = new UserCsrData()
userData.csr = csr
const validationErrors = await validate(userData)
return validationErrors
}

protected async getCsrs() {
const filteredCsrsMap: Map<string, string> = new Map()

const allCsrs = this.store
.iterator({ limit: -1 })
.collect()
.map(e => e.payload.value)
await Promise.all(
allCsrs.filter(async csr => {
// const parsedCsr = await loadCSR(csr)
const validation = await CertificatesRequestsStore.validateUserCsr(csr)
if (validation) return true
return false
}).map(async csr => {
const parsedCsr = await loadCSR(csr)
const pubKey = keyFromCertificate(parsedCsr)

if (filteredCsrsMap.has(pubKey)) {
filteredCsrsMap.delete(pubKey)
}
filteredCsrsMap.set(pubKey, csr)
})
)
return [...filteredCsrsMap.values()]
}
}
Loading
Loading