taldir

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

commit f5099df82d8053e276df4f857230b27acb884f0b
parent 04281a18fe4b49e4188bf516d6e40b28497c705f
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 12 Jul 2022 09:11:21 +0200

modify payment processing logic; still unclear

Diffstat:
Mcmd/taldir-server/main_test.go | 4++--
Mpkg/rest/taldir.go | 78++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mpkg/taler/merchant.go | 4++--
Mpkg/util/helper.go | 30++++++++++++++++++------------
4 files changed, 66 insertions(+), 50 deletions(-)

diff --git a/cmd/taldir-server/main_test.go b/cmd/taldir-server/main_test.go @@ -42,7 +42,7 @@ var validRegisterRequest = []byte(` "address": "abc@test", "public_key": "000G006XE97PTWV3B7AJNCRQZA6BF26HPV3XZ07293FMY7KD4181946A90", "inbox_url": "myinbox@xyz", - "duration": 23000000 + "duration": 51840000000000 } `) @@ -51,7 +51,7 @@ var validRegisterRequestShort = []byte(` "address": "abc@test", "public_key": "000G006XE97PTWV3B7AJNCRQZA6BF26HPV3XZ07293FMY7KD4181946A90", "inbox_url": "myinbox@xyz", - "duration": 10000000 + "duration": 23328000000000 } `) diff --git a/pkg/rest/taldir.go b/pkg/rest/taldir.go @@ -211,9 +211,6 @@ type Validation struct { // The beginning of the last solution timeframe LastSolutionTimeframeStart time.Time - - // The Taler Merchant Order ID - OrderId string } type ErrorDetail struct { @@ -341,7 +338,7 @@ func (t *Taldir) validationRequest(w http.ResponseWriter, r *http.Request){ } entry.HsAddress = saltHAddress(validation.HAddress, t.Salt) entry.Inbox = validation.Inbox - entry.Duration = time.Duration(validation.Duration) + entry.Duration = time.Duration(entry.Duration.Microseconds() + validation.Duration) entry.RegisteredAt = time.Now().UnixMicro() entry.PublicKey = validation.PublicKey err = t.Db.First(&entry, "hs_address = ?", entry.HsAddress).Error @@ -398,53 +395,28 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r *http.Request){ validation.HAddress = h_address hs_address := saltHAddress(validation.HAddress, t.Salt) err = t.Db.First(&entry, "hs_address = ?", hs_address).Error + validation.Duration = req.Duration if err == nil { log.Println("Entry for this address already exists..") regAt := time.UnixMicro(entry.RegisteredAt) entryValidity := regAt.Add(entry.Duration) + requestedValidity := time.Now().Add(time.Duration(req.Duration)) log.Printf("Entry valid until: %s , requested until: %s\n", entryValidity, time.Now().Add(time.Duration(req.Duration))) - if time.Now().Add(time.Duration(req.Duration)).Before(entryValidity) { + if requestedValidity.Before(entryValidity) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") w.Write([]byte("{\"valid_until\": " + entryValidity.String() + "}")) return + } else { + validation.Duration = entryValidity.Sub(requestedValidity).Microseconds() } } err = t.Db.First(&validation, "h_address = ?", h_address).Error validation.Challenge = util.GenerateChallenge(t.ChallengeBytes) validation.Inbox = req.Inbox - validation.Duration = req.Duration validation.PublicKey = req.PublicKey validation.SolutionAttemptCount = 0 validation.LastSolutionTimeframeStart = time.Now() - amountSum, amountSumStr, _ := util.AmountSum(t.Cfg.Section("taldir-" + vars["method"]).Key("challenge_fee").MustString("KUDOS:0"), - t.Cfg.Section("taldir").Key("monthly_fee").MustString("KUDOS:0")) - if amountSum > 0 { - // FIXME what if provided order ID and validation order ID differ??? - if len(validation.OrderId) == 0 { - // Add new order for new validations - orderId, newOrderErr := t.Merchant.AddNewOrder(amountSumStr) - if newOrderErr != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - validation.OrderId = orderId - } - // Check if order paid - payto, paytoErr := t.Merchant.IsOrderPaid(validation.OrderId) - if paytoErr != nil { - w.WriteHeader(http.StatusInternalServerError) - log.Println(paytoErr) - return - } - if len(payto) != 0 { - w.WriteHeader(http.StatusPaymentRequired) - w.Header().Set("Location", payto) // FIXME no idea what to do with this. - return - } - // In this case, this order was paid - } - if err == nil { // Limit re-initiation attempts validation.InitiationCount++ @@ -476,6 +448,44 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r *http.Request){ w.WriteHeader(http.StatusInternalServerError) return } + + cost, currency, err := util.CalculateCost(t.Cfg.Section("taldir-" + vars["method"]).Key("challenge_fee").MustString("KUDOS:0"), + t.Cfg.Section("taldir").Key("monthly_fee").MustString("KUDOS:0"), + time.Duration(validation.Duration), + time.Duration(2592000000000)) //Fixme 1 Month in us + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + + log.Printf("The calculated cost for this registration is: %s:%f", currency, cost) + if cost > 0 { + // FIXME what if provided order ID and validation order ID differ??? + if len(order.Id) == 0 { + // Add new order for new validations + orderId, newOrderErr := t.Merchant.AddNewOrder(cost, currency) + if newOrderErr != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + order.Id = orderId + } + // Check if order paid. FIXME: How to check if this the a correct order?? + payto, paytoErr := t.Merchant.IsOrderPaid(order.Id) + if paytoErr != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Println(paytoErr) + return + } + if len(payto) != 0 { + w.WriteHeader(http.StatusPaymentRequired) + w.Header().Set("Location", payto) // FIXME no idea what to do with this. + return + } + // In this case, this order was paid + } + + log.Println("Address registration request created:", validation) if !t.Cfg.Section("taldir-" + vars["method"]).HasKey("command") { log.Fatal(err) diff --git a/pkg/taler/merchant.go b/pkg/taler/merchant.go @@ -135,11 +135,11 @@ func (m *Merchant) IsOrderPaid(orderId string) (string, error) { return "", nil } -func (m *Merchant) AddNewOrder(amount string) (string, error) { +func (m *Merchant) AddNewOrder(cost float64, currency string) (string, error) { var newOrder PostOrderRequest var orderDetail MinimalOrderDetail var orderResponse PostOrderResponse - orderDetail.Amount = amount + orderDetail.Amount = fmt.Sprintf("%s:%f", currency, cost) // FIXME get from cfg orderDetail.Summary = "This is an order to a TalDir registration" newOrder.order = orderDetail diff --git a/pkg/util/helper.go b/pkg/util/helper.go @@ -26,6 +26,7 @@ import ( "errors" "strings" "strconv" + "time" ) @@ -79,26 +80,31 @@ func AmountToFloat(amount string) (float64, error) { return amountFloat, nil } +func ParseAmount(amount string) (float64, string, error) { + cur, err := AmountCurrency(amount) + if nil != err { + return 0.0, "", errors.New("Currency in amount malformed") + } + val, err := AmountToFloat(amount) + if err != nil { + return 0.0, "", err + } + return val, cur, nil +} + // Check if this is a non-zero, positive amount -func AmountSum(amountA string, amountB string) (float64, string, error) { - curA, err := AmountCurrency(amountA) +func CalculateCost(sliceCostAmount string, fixedCostAmount string, howLong time.Duration, sliceDuration time.Duration) (float64, string, error) { + sliceCount := howLong.Microseconds() / sliceDuration.Microseconds() + sliceCost, curA, err := ParseAmount(sliceCostAmount) if nil != err { return 0.0, "", errors.New("Currency in amount malformed") } - curB, err := AmountCurrency(amountB) + fixedCost, curB, err := ParseAmount(fixedCostAmount) if nil != err { return 0.0, "", errors.New("Currency in amount malformed") } if curA != curB { return 0.0, "", errors.New("Currency in amounts different") } - valA, err := AmountToFloat(amountA) - if err != nil { - return 0.0, "", err - } - valB, err := AmountToFloat(amountB) - if err != nil { - return 0.0, "", err - } - return valA + valB, curA, nil + return (float64(sliceCount) * sliceCost) + fixedCost, curA, nil }