-
-
Notifications
You must be signed in to change notification settings - Fork 185
/
Copy pathDevelopmentInMemoryStore.cs
76 lines (64 loc) · 2.8 KB
/
DevelopmentInMemoryStore.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Fido2NetLib.Objects;
namespace Fido2NetLib.Development
{
public class DevelopmentInMemoryStore
{
private readonly ConcurrentDictionary<string, Fido2User> _storedUsers = new ConcurrentDictionary<string, Fido2User>();
private readonly List<StoredCredential> _storedCredentials = new List<StoredCredential>();
public Fido2User GetOrAddUser(string username, Func<Fido2User> addCallback)
{
return _storedUsers.GetOrAdd(username, addCallback());
}
public Fido2User GetUser(string username)
{
_storedUsers.TryGetValue(username, out var user);
return user;
}
public List<StoredCredential> GetCredentialsByUser(Fido2User user)
{
return _storedCredentials.Where(c => c.UserId.SequenceEqual(user.Id)).ToList();
}
public StoredCredential GetCredentialById(byte[] id)
{
return _storedCredentials.Where(c => c.Descriptor.Id.SequenceEqual(id)).FirstOrDefault();
}
public Task<List<StoredCredential>> GetCredentialsByUserHandleAsync(byte[] userHandle)
{
return Task.FromResult(_storedCredentials.Where(c => c.UserHandle.SequenceEqual(userHandle)).ToList());
}
public void UpdateCounter(byte[] credentialId, uint counter)
{
var cred = _storedCredentials.Where(c => c.Descriptor.Id.SequenceEqual(credentialId)).FirstOrDefault();
cred.SignatureCounter = counter;
}
public void AddCredentialToUser(Fido2User user, StoredCredential credential)
{
credential.UserId = user.Id;
_storedCredentials.Add(credential);
}
public Task<List<Fido2User>> GetUsersByCredentialIdAsync(byte[] credentialId)
{
// our in-mem storage does not allow storing multiple users for a given credentialId. Yours shouldn't either.
var cred = _storedCredentials.Where(c => c.Descriptor.Id.SequenceEqual(credentialId)).FirstOrDefault();
if (cred == null)
return Task.FromResult(new List<Fido2User>());
return Task.FromResult(_storedUsers.Where(u => u.Value.Id.SequenceEqual(cred.UserId)).Select(u => u.Value).ToList());
}
}
public class StoredCredential
{
public byte[] UserId { get; set; }
public PublicKeyCredentialDescriptor Descriptor { get; set; }
public byte[] PublicKey { get; set; }
public byte[] UserHandle { get; set; }
public uint SignatureCounter { get; set; }
public string CredType { get; set; }
public DateTime RegDate { get; set; }
public Guid AaGuid { get; set; }
}
}