[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taldir] 01/02: simplify limitations for registrations
From: |
gnunet |
Subject: |
[taler-taldir] 01/02: simplify limitations for registrations |
Date: |
Sun, 17 Jul 2022 17:37:26 +0200 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository taldir.
commit 23941641905b99d4980e13ce00f94e6df872f5b8
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Sun Jul 17 17:34:36 2022 +0200
simplify limitations for registrations
---
pkg/rest/taldir.go | 57 ++++++++++--------------------------------------------
1 file changed, 10 insertions(+), 47 deletions(-)
diff --git a/pkg/rest/taldir.go b/pkg/rest/taldir.go
index 028fe3b..dc692b0 100644
--- a/pkg/rest/taldir.go
+++ b/pkg/rest/taldir.go
@@ -22,8 +22,6 @@ package taldir
- ToS API (terms, privacy) with localizions
- ToS compression
- ToS etag
- - Base32: Use gnunet-go module? (currently copied)
- - OrderId processing (WIP)
- Maintenance of database: When to delete expired validations?
Currently, we expire on startup 1 day old validations
*/
@@ -80,7 +78,7 @@ type Taldir struct {
ValidationTimeframe time.Duration
// How often may a challenge be requested
- ValidationInitiationMax int
+ ValidationInitiationMax int64
// How often may a solution be attempted (in the given timeframe)
SolutionAttemptsMax int
@@ -157,13 +155,6 @@ type RegisterMessage struct {
Duration int64 `json:"duration"`
}
-// Order is part of the RegisterMessage payload but optional and as such
-// processed separately
-type Order struct {
- // Order ID, if the client recently paid for this registration
- ID string `json:"order_id"`
-}
-
// Entry is a mapping from the identity key hash to a wallet key
// The identity key hash is sha512(sha512(address)|salt) where identity is
// one of the identity key types supported (e.g. an email address)
@@ -360,7 +351,6 @@ func (t *Taldir) validationRequest(w http.ResponseWriter, r
*http.Request){
w.WriteHeader(http.StatusForbidden)
return
}
- // FIXME: Expire validations somewhere?
err = t.Db.Delete(&validation).Error
if err != nil {
log.Fatalf("Error deleting validation")
@@ -386,31 +376,13 @@ func (t *Taldir) validationRequest(w http.ResponseWriter,
r *http.Request){
}
func (t *Taldir) isRateLimited(hAddress string) (bool, error) {
- var validationMetadata validationMetadata
- err := t.Db.First(&validationMetadata, "h_address = ?", hAddress).Error
+ var validations []validation
+ res := t.Db.Where("h_address = ?", hAddress).Find(&validations)
// NOTE: Check rate limit
- if err == nil {
- // Limit re-initiation attempts
- // FIXME: Do not limit tries. Very unlikely.
- validationMetadata.InitiationCount++
- if
time.Now().Before(validationMetadata.TimeframeStart.Add(t.ValidationTimeframe))
{
- if validationMetadata.InitiationCount > t.ValidationInitiationMax {
- return true, nil
- }
- } else {
- log.Println("Validation stale, resetting retry counter")
- validationMetadata.TimeframeStart = time.Now()
- validationMetadata.InitiationCount = 1
- }
- err = t.Db.Save(&validationMetadata).Error
- } else {
- validationMetadata.HAddress = hAddress
- validationMetadata.InitiationCount = 1
- validationMetadata.TimeframeStart = time.Now()
- err = t.Db.Create(&validationMetadata).Error
- }
- if err != nil {
- return false, err
+ if res.Error == nil {
+ // Limit re-initiation attempts to ValidationInitiationMax times
+ // within the expiration timeframe of a validation.
+ return res.RowsAffected >= t.ValidationInitiationMax, nil
}
return false, nil
}
@@ -421,7 +393,6 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r
*http.Request){
var errDetail ErrorDetail
var validation validation
var entry entry
- var order Order
// Check if this validation method is supported or not.
if !t.Validators[vars["method"]] {
errDetail.Code = gana.TALDIR_METHOD_NOT_SUPPORTED
@@ -445,7 +416,6 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r
*http.Request){
w.Write(resp)
return
}
- json.NewDecoder(r.Body).Decode(&order)
// Setup validation object. Retrieve object from DB if it already
// exists.
@@ -481,7 +451,7 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r
*http.Request){
w.WriteHeader(http.StatusTooManyRequests)
rlResponse := RateLimitedResponse{
Code: gana.TALDIR_REGISTER_RATE_LIMITED,
- RequestFrequency: t.ValidationTimeframe.Microseconds() /
int64(t.ValidationInitiationMax),
+ RequestFrequency: t.ValidationTimeframe.Microseconds() /
t.ValidationInitiationMax,
Hint: "Registration rate limit reached",
}
jsonResp, _ := json.Marshal(rlResponse)
@@ -516,12 +486,6 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r
*http.Request){
return
}
if !cost.IsZero() {
- if validationExists {
- if order.ID != validation.OrderID {
- w.WriteHeader(http.StatusConflict)
- return
- }
- }
if len(validation.OrderID) == 0 {
// Add new order for new validations
orderID, newOrderErr := t.Merchant.AddNewOrder(*cost)
@@ -533,8 +497,7 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r
*http.Request){
validation.OrderID = orderID
}
- // FIXME what if provided order ID and validation order ID differ???
- // Check if order paid. FIXME: How to check if this the a correct order??
+ // Check if order paid.
// FIXME: Remember that it was activated and paid
payto, paytoErr := t.Merchant.IsOrderPaid(validation.OrderID)
if paytoErr != nil {
@@ -772,7 +735,7 @@ func (t *Taldir) Initialize(cfgfile string) {
t.Validators[a] = true
}
t.ChallengeBytes = t.Cfg.Section("taldir").Key("challenge_bytes").MustInt(16)
- t.ValidationInitiationMax =
t.Cfg.Section("taldir").Key("validation_initiation_max").MustInt(3)
+ t.ValidationInitiationMax =
t.Cfg.Section("taldir").Key("validation_initiation_max").MustInt64(3)
t.SolutionAttemptsMax =
t.Cfg.Section("taldir").Key("solution_attempt_max").MustInt(3)
validationTTLStr :=
t.Cfg.Section("taldir").Key("validation_timeframe").MustString("5m")
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.