feature: increase key usage after successful peer registration (#93)

This commit is contained in:
Mikhail Bragin 2021-08-22 11:29:25 +02:00 committed by GitHub
parent 90ef1e939b
commit 6869b48905
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 14 deletions

View File

@ -277,6 +277,7 @@ func (manager *AccountManager) AddPeer(setupKey string, peerKey string) (*Peer,
} }
account.Peers[newPeer.Key] = newPeer account.Peers[newPeer.Key] = newPeer
account.SetupKeys[sk.Key] = sk.IncrementUsage()
err = manager.Store.SaveAccount(account) err = manager.Store.SaveAccount(account)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed adding peer") return nil, status.Errorf(codes.Internal, "failed adding peer")

View File

@ -18,13 +18,15 @@ type SetupKeys struct {
// SetupKeyResponse is a response sent to the client // SetupKeyResponse is a response sent to the client
type SetupKeyResponse struct { type SetupKeyResponse struct {
Id string Id string
Key string Key string
Name string Name string
Expires time.Time Expires time.Time
Type server.SetupKeyType Type server.SetupKeyType
Valid bool Valid bool
Revoked bool Revoked bool
UsedTimes int
LastUsed time.Time
} }
// SetupKeyRequest is a request sent by client. This object contains fields that can be modified // SetupKeyRequest is a request sent by client. This object contains fields that can be modified
@ -50,6 +52,11 @@ func (h *SetupKeys) CreateKey(w http.ResponseWriter, r *http.Request) {
return return
} }
if !(req.Type == server.SetupKeyReusable || req.Type == server.SetupKeyOneOff) {
http.Error(w, "unknown setup key type "+string(req.Type), http.StatusBadRequest)
return
}
setupKey, err := h.accountManager.AddSetupKey(accountId, req.Name, req.Type, req.ExpiresIn.Duration) setupKey, err := h.accountManager.AddSetupKey(accountId, req.Name, req.Type, req.ExpiresIn.Duration)
if err != nil { if err != nil {
errStatus, ok := status.FromError(err) errStatus, ok := status.FromError(err)
@ -166,12 +173,14 @@ func writeSuccess(w http.ResponseWriter, key *server.SetupKey) {
func toResponseBody(key *server.SetupKey) *SetupKeyResponse { func toResponseBody(key *server.SetupKey) *SetupKeyResponse {
return &SetupKeyResponse{ return &SetupKeyResponse{
Id: key.Id, Id: key.Id,
Key: key.Key, Key: key.Key,
Name: key.Name, Name: key.Name,
Expires: key.ExpiresAt, Expires: key.ExpiresAt,
Type: key.Type, Type: key.Type,
Valid: key.IsValid(), Valid: key.IsValid(),
Revoked: key.Revoked, Revoked: key.Revoked,
UsedTimes: key.UsedTimes,
LastUsed: key.LastUsed,
} }
} }

View File

@ -35,6 +35,8 @@ type SetupKey struct {
Revoked bool Revoked bool
// UsedTimes indicates how many times the key was used // UsedTimes indicates how many times the key was used
UsedTimes int UsedTimes int
// LastUsed last time the key was used for peer registration
LastUsed time.Time
} }
//Copy copies SetupKey to a new object //Copy copies SetupKey to a new object
@ -51,6 +53,14 @@ func (key *SetupKey) Copy() *SetupKey {
} }
} }
//IncrementUsage makes a copy of a key, increments the UsedTimes by 1 and sets LastUsed to now
func (key *SetupKey) IncrementUsage() *SetupKey {
c := key.Copy()
c.UsedTimes = c.UsedTimes + 1
c.LastUsed = time.Now()
return c
}
// IsValid is true if the key was not revoked, is not expired and used not more than it was supposed to // IsValid is true if the key was not revoked, is not expired and used not more than it was supposed to
func (key *SetupKey) IsValid() bool { func (key *SetupKey) IsValid() bool {
expired := time.Now().After(key.ExpiresAt) expired := time.Now().After(key.ExpiresAt)