taldir

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

commit 820f168bebb3c112782ecd086022fb2d8f1df3b7
parent f01dddf4da0689dc612b6a8b7cda332e0d2a3568
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Wed,  6 Jul 2022 16:14:48 +0200

add stub twitter validator

Diffstat:
Rvalidate_test.sh -> taldir-validate-test.sh | 0
Ataldir-validate-twitter.sh | 12++++++++++++
Mtaldir.conf | 6+++++-
Mtaldir.go | 66+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
4 files changed, 76 insertions(+), 8 deletions(-)

diff --git a/validate_test.sh b/taldir-validate-test.sh diff --git a/taldir-validate-twitter.sh b/taldir-validate-twitter.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# +# IMPORTANT: Before this can be used, as the taldir service user +# you need to authorize this CLI app for the taldir twitter account. +# e.g.: +# $ t authorize +# +TWITTER_USER=$1 +CODE=$2 +LINK=$(./taldir -l -a $1 -c $2) +MESSAGE="Follow this link to complete your Taldir registration: $LINK" +t dm $TWITTER_USER $MESSAGE diff --git a/taldir.conf b/taldir.conf @@ -18,7 +18,11 @@ command = validate_phone.sh [taldir-test] challenge_fee = 23 Kudos -command = ./validate_test.sh +command = ./taldir-validate-test.sh + +[taldir-twitter] +challenge_fee = 2 Kudos +command = ./taldir-validate-twitter.sh [taldir-pq] host = "localhost" diff --git a/taldir.go b/taldir.go @@ -1,5 +1,13 @@ package main +/* TODO + - ToS API (terms, privacy) with localizations + - Prettify QR code landing page + - Base32: Use gnunet-go module? (currently copied) + - OrderId processing + - Maintenance of database: When to delete expired validations? +*/ + import ( "os" "os/exec" @@ -41,6 +49,7 @@ type VersionResponse struct { } type Method struct { + // Name of the method, e.g. "email" or "sms". Name string `json:"name"` @@ -54,7 +63,7 @@ type RateLimitedResponse struct { // Taler error code, TALER_EC_TALDIR_REGISTER_RATE_LIMITED. Code int `json:"code"` - // At what frequency are new registrations allowed. FIXME: In what? + // At what frequency are new registrations allowed. FIXME: In what? Currently: In microseconds RequestFrequency int64 `json:"request_frequency"` // The human readable error message. @@ -85,11 +94,23 @@ type RegisterMessage struct { // The identity key hash is sha256(sha256(identity)|salt) where identity is // one of the identity key types supported (e.g. email) type Entry struct { + + // ORM gorm.Model `json:"-"` + + // The salted hash (SHA512) of the hashed address (h_address) HsAddress string `json:"-"` + + // (HTTPS) endpoint URL for the inbox service for this address Inbox string `json:"inbox_url"` + + // Public key of the user to register in base32 PublicKey string `json:"public_key"` + + // Time of (re)registration. In Unix epoch microseconds) RegisteredAt int64 `json:"-"` + + // How long the registration lasts in microseconds Duration int64 `json:"-"` } @@ -98,12 +119,23 @@ type Entry struct { // validation reference. The validation reference is sent to the identity // depending on the out-of-band chennel defined through the identity key type. type Validation struct { + + // ORM gorm.Model `json:"-"` + + // The hash (SHA512) of the address HAddress string `json:"h_address"` - Method string `json:"method"` + + // For how long should the registration last Duration int64 `json:"duration"` + + // (HTTPS) endpoint URL for the inbox service for this address Inbox string `json:"inbox_url"` + + // The activation code sent to the client Code string `json:"activation_code"` + + // Public key of the user to register PublicKey string `json:"public_key"` } @@ -230,7 +262,6 @@ func validationRequest(w http.ResponseWriter, r *http.Request){ w.WriteHeader(http.StatusInternalServerError) return } - // FIXME are we still doing this?? entry.HsAddress = saltHAddress(validation.HAddress) entry.Inbox = validation.Inbox entry.Duration = validation.Duration @@ -321,8 +352,8 @@ func registerRequest(w http.ResponseWriter, r *http.Request){ } err = db.First(&validation, "h_address = ?", validation.HAddress).Error if err == nil { - // Validation already pending for this address - db.Delete(&validation) // FIXME for debugging only + // FIXME: Validation already pending for this address + // How should we proceed here? Expire old validations? w.WriteHeader(202) return } else { @@ -338,8 +369,6 @@ func registerRequest(w http.ResponseWriter, r *http.Request){ } fmt.Println("Address registration request created:", validation) } - // FIXME: Here we should call the validator shell script with the - // parsed parameters to initiate the validation. if !cfg.Section("taldir-" + vars["method"]).HasKey("command") { log.Fatal(err) db.Delete(&validation) @@ -404,6 +433,14 @@ func validationPage(w http.ResponseWriter, r *http.Request) { return } +// Generates a link from a code and address +func generateLink(addr string, code string) string { + h := sha512.New() + h.Write([]byte(addr)) + h_addr := util.EncodeBinaryToString(h.Sum(nil)) + return "taler://taldir/" + h_addr + "/" + code + "-wallet" +} + // Generates a solution from a code and pubkey func generateSolution(pubkeyEncoded string, code string) string { pubkey, err := util.DecodeStringToBinary(pubkeyEncoded, 36) @@ -451,8 +488,10 @@ func main() { fmt.Println("Production mode enabled") } var solveFlag = flag.Bool("s", false, "Provide a solution for the code/pubkey") + var linkFlag = flag.Bool("l", false, "Provide a link for activation") var codeFlag = flag.String("c", "", "Activation code") var pubkeyFlag = flag.String("p", "", "Public key") + var addressFlag = flag.String("a", "", "Address") var dropFlag = flag.Bool("D", false, "Drop all data in table (DANGEROUS!)") flag.Parse() if *solveFlag { @@ -467,6 +506,19 @@ func main() { for _, a := range strings.Split(cfg.Section("taldir").Key("validators").String(), " ") { validators[a] = true } + if *linkFlag { + if len(*codeFlag) == 0 || len(*addressFlag) == 0 { + fmt.Println("You need to provide an activation code and an address to generate a link") + os.Exit(1) + } + fmt.Println(generateLink(*addressFlag, *codeFlag)) + os.Exit(0) + } + validators = make(map[string]bool) + for _, a := range strings.Split(cfg.Section("taldir").Key("validators").String(), " ") { + validators[a] = true + } + psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", cfg.Section("taldir-pq").Key("host").MustString("localhost"), cfg.Section("taldir-pq").Key("port").MustInt64(5432),