taldir

Directory service to resolve wallet mailboxes by messenger addresses
Log | Files | Refs | Submodules | README | LICENSE

commit 2dc276e4114538d41399da9105cc60f30db56de6
parent f5e140b41c1697f4b013dda1f1c1f7a3caec17fa
Author: Martin Schanzenbach <mschanzenbach@posteo.de>
Date:   Tue, 19 Apr 2022 15:03:47 +0200

Add comments and minor fixes

Diffstat:
Mtaldir.go | 26+++++++++++++++++++-------
1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/taldir.go b/taldir.go @@ -77,6 +77,9 @@ func sendEmail(recipient string, ref Validation) { fmt.Println("Email Sent Successfully!") } +// Primary lookup function. +// Allows the caller to query a wallet key using the hash(!) of the +// identity, e.g. sha256(<email address>) func returnSingleEntry(w http.ResponseWriter, r *http.Request){ vars := mux.Vars(r) var entry Entry @@ -90,16 +93,19 @@ func returnSingleEntry(w http.ResponseWriter, r *http.Request){ w.WriteHeader(http.StatusNotFound) } +// Hashes an identity key (e.g. sha256(<email address>)) with a salt for +// Lookup and storage. func hashIdentityKey(idkey string) string { salt := make([]byte, len(config.Salt)) return base32.StdEncoding.EncodeToString(argon2.IDKey([]byte(idkey), salt, 1, 64*1024, 4, 32)) } +// Called by the registrant to validate the registration request. The reference ID was +// provided "out of band" using a validation method such as email or SMS func validateSingleEntry(w http.ResponseWriter, r *http.Request){ vars := mux.Vars(r) var entry Entry var validation Validation - //TODO actually validate var err = db.First(&validation, "validation_reference = ?", vars["reference"]).Error if err != nil { w.WriteHeader(http.StatusNotFound) @@ -127,6 +133,8 @@ func validateSingleEntry(w http.ResponseWriter, r *http.Request){ w.WriteHeader(http.StatusCreated) } + +// Generates random reference token used in the validation flow. func generateToken() string { randBytes := make([]byte, 32) _, err := rand.Read(randBytes) @@ -136,6 +144,7 @@ func generateToken() string { return base32.StdEncoding.EncodeToString(randBytes) } +// Initiate a registration request for an identity func addPendingValidation(w http.ResponseWriter, r *http.Request){ vars := mux.Vars(r) var validation Validation @@ -154,17 +163,20 @@ func addPendingValidation(w http.ResponseWriter, r *http.Request){ http.Error(w, "Identity key type not supported.", 400) return } - // TODO make sure sha256(vars["identity"]) == validation.IdentityKey + // TODO make sure sha256(vars["identity"]) == validation.IdentityKey or simply set it? h := sha256.New() h.Write([]byte(vars["identity"])) identityKey := base32.StdEncoding.EncodeToString(h.Sum(nil)) - if (identityKey != validation.IdentityKey) { - fmt.Printf("Identity key hash %s does not match identity %s\n", identityKey, validation.IdentityKey) - w.WriteHeader(http.StatusBadRequest) - return + if "" != validation.IdentityKey { + if (identityKey != validation.IdentityKey) { + fmt.Printf("Identity key hash %s does not match identity %s\n", identityKey, validation.IdentityKey) + w.WriteHeader(http.StatusBadRequest) + return + } + } else { + validation.IdentityKey = identityKey } validation.ValidationReference = generateToken() - fmt.Println("Got ID key:", validation.IdentityKey) err = db.First(&validation, "identity_key = ?", validation.IdentityKey).Error if err == nil { w.WriteHeader(http.StatusConflict)