gnunet-gns-registrar

GNU Name System registrar
Log | Files | Refs | README

commit aef839d11464e817837a9d596f50f0cb918223e5
parent 70cc2629365b9c4fd2fd948eceeb5c6b3c894bad
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 12 Dec 2023 16:49:22 +0100

Prettify UI

Diffstat:
Mpkg/rest/gnsregistrar.go | 29+++++++++++++++++++++--------
Mweb/templates/buy.html | 27++++++++++++++++++---------
Mweb/templates/edit.html | 31++++++++++++++++++++++---------
Mweb/templates/landing.html | 20++++++--------------
Mweb/templates/name.html | 19++++++++++++-------
5 files changed, 79 insertions(+), 47 deletions(-)

diff --git a/pkg/rest/gnsregistrar.go b/pkg/rest/gnsregistrar.go @@ -113,6 +113,9 @@ type Registrar struct { // Registration expiration (NOT record expiration!) RelativeRegistrationExpiration time.Duration + // Registration expiration days count + RegistrationExpirationDaysCount uint64 + // Payment expiration (time you have to pay for registration) PaymentExpiration time.Duration @@ -415,13 +418,17 @@ func (t *Registrar) editRegistration(w http.ResponseWriter, r *http.Request) { value = record.Value } } - registeredUntil := time.UnixMicro(int64(regMetadata.Expiration)).Format(time.DateTime) - extendedExpiration := time.UnixMicro(int64(regMetadata.Expiration)).Add(t.RelativeRegistrationExpiration).Format(time.DateTime) + registeredUntil := time.UnixMicro(int64(regMetadata.Expiration)) + registeredUntilStr := registeredUntil.Format(time.DateTime) + remainingDays := int64(time.Until(registeredUntil).Hours() / 24) + extendedExpiration := time.UnixMicro(int64(regMetadata.Expiration)).Add(t.RelativeRegistrationExpiration).Format(time.DateTime) fullData := map[string]interface{}{ "label": vars["label"], "zkey": value, "extendedExpiration": extendedExpiration, - "registeredUntil": registeredUntil, + "extensionDaysCount": t.RegistrationExpirationDaysCount, + "remainingDays": remainingDays, + "registeredUntil": registeredUntilStr, "token": r.URL.Query().Get("token"), "error": r.URL.Query().Get("error"), "cost": t.localizedAmountString(), @@ -541,6 +548,7 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { "qrCode": template.URL("data:image/png;base64," + encodedPng), "payto": template.URL(payto), "fulfillmentUrl": template.URL(t.BaseUrl + "/name/" + vars["label"] + "/edit?token=" + regId), + "registrationId": regId, "label": vars["label"], "error": errorMsg, "cost": t.localizedAmountString(), @@ -648,8 +656,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") var value = "" - var registeredUntil = "" + var registeredUntilStr = "" var regMetadata *RegistrationMetadata + var remainingDays int64 var registered = r.URL.Query().Get("registered") == "true" // FIXME redirect back if label empty client := &http.Client{} @@ -694,7 +703,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { } if regMetadata != nil { if time.Now().Before(time.UnixMicro(int64(regMetadata.Expiration))) { - registeredUntil = time.UnixMicro(int64(regMetadata.Expiration)).Format(time.DateTime) + registeredUntil := time.UnixMicro(int64(regMetadata.Expiration)) + registeredUntilStr = registeredUntil.Format(time.DateTime) + remainingDays = int64(time.Until(registeredUntil).Hours() / 24) } } fullData := map[string]interface{}{ @@ -704,7 +715,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { "available": regMetadata == nil, "currentValue": value, "suffixHint": t.SuffixHint, - "registeredUntil": registeredUntil, + "registrationDaysCount": t.RegistrationExpirationDaysCount, + "registeredUntil": registeredUntilStr, + "remainingDays": remainingDays, "registrationSuccess": registered, } t.NameTpl.Execute(w, fullData) @@ -766,8 +779,8 @@ func (t *Registrar) Initialize(cfgfile string) { } paymentExp := t.Cfg.Section("gns-registrar").Key("payment_required_expiration").MustString("1h") recordExp := t.Cfg.Section("gns-registrar").Key("relative_delegation_expiration").MustString("24h") - registrationExpDays := t.Cfg.Section("gns-registrar").Key("registration_duration_days").MustUint64(5) - t.RelativeRegistrationExpiration, _ = time.ParseDuration(fmt.Sprintf("%dh", registrationExpDays * 24)) + t.RegistrationExpirationDaysCount = t.Cfg.Section("gns-registrar").Key("registration_duration_days").MustUint64(5) + t.RelativeRegistrationExpiration, _ = time.ParseDuration(fmt.Sprintf("%dh", t.RegistrationExpirationDaysCount * 24)) t.RelativeDelegationExpiration, _ = time.ParseDuration(recordExp) t.PaymentExpiration, _ = time.ParseDuration(paymentExp) fmt.Println(t.RelativeDelegationExpiration) diff --git a/web/templates/buy.html b/web/templates/buy.html @@ -8,15 +8,24 @@ <title>Buy</title> </head> <body> - <div class ="container text-center mt-5"> - <h1 class="mb-3">To register your name <i class="text-primary">{{.label}}</i>.<i class="text-secondary">{{.suffixHint}}</i> please pay here:</h1> - - <a href="{{.payto}}" class="btn btn-success mb-3">Pay with TALER</a><br/> - Alternatively, you can pay using your mobile wallet by scanning the QR code below:<br/> - <a href="{{.fulfillmentUrl}}"> - <img class="qr" src="{{.qrCode}}"/> - </a><br/> - After you pay with a mobile wallet, please click on the QR code to finalize your registration. + <div class ="container"> + <div class ="text-center mt-5"> + <h1 class="mb-3">To complete the registration of <i class="text-primary">{{.label}}</i>:</h1> + + <a href="{{.payto}}" class="btn btn-success mb-3">Pay {{.cost}} with TALER</a><br/> + Alternatively, you can pay using your mobile wallet by scanning the QR code below:<br/> + <a href="{{.fulfillmentUrl}}"> + <img class="qr" src="{{.qrCode}}"/> + </a><br/> + </div> + <div class="alert alert-warning"> + <h4>Important</h4> + After you pay with a mobile wallet, please click on the QR code to finalize your registration or visit <a href="{{.fulfillmentUrl}}">your registration management page</a>. + <br/> + Your unique registration identifier is <b>{{.registrationId}}</b>. + <br/> + We recommend that you save this identifier, for example by printing this page. + </div> <hr/> <a class="btn btn-secondary" href="/">Back</a> </div> diff --git a/web/templates/edit.html b/web/templates/edit.html @@ -17,33 +17,46 @@ </div> </div> {{end}} + {{if eq .remainingDays 0}} + <div class="container pt-5"> + <div class="alert alert-danger" role="alert"> + <h4 class="alert-heading">Registration inactive!</h4> + <hr> + <p class="mb-0">Your registration is not yet active. Have you completed the payment yet?</p> + </div> + </div> + {{end}} <div class="container pt-5"> <h1 class="mb-5">Manage registration for <i class="text-primary">{{.label}}</i></h1> <form action="/name/{{.label}}/edit" method="post" class="align-items-center mb-5"> <div class="row"> - <div class="col-lg-12"> + <div class="col-md-12 alert alert-light"> + <h4>Zone information</h4> <input type="hidden" value="{{.token}}" name="token"> <div class="form-floating mb-3"> - <input name="zkey" id="zkeyInput" class="form-control" value="{{.zkey}}" maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus> - <label for="zkeyInput">Zone key</label> + <input name="zkey" id="zkeyInput" class="form-control" value="{{.zkey}}" disabled={{eq .remainingDays 0}} maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus> + <label for="zkeyInput">Enter your PKEY or EDKEY here</label> </div> - <input class="btn btn-primary" type="submit" value="Update zone key"> + <input class="btn btn-primary" type="submit" disabled={{eq .remainingDays 0}} value="Update zone key"> </div> </div> </form> + {{if ne .remainingDays 0}} <div class="row mt-1"> - <div class="col-md-12"> + <div class="col-md-12 alert alert-light"> + <h4>Extension and cancellation</h4> <div class="form-floating mb-3"> <input disabled="true" id="expInput" class="form-control" value="{{.registeredUntil}}" type="text" required autofocus> - <label for="expInput">Registration expires</label> + <label for="expInput">Registration expires in {{.remainingDays}} days:</label> </div> - </div> - <div class="col-md-12"> - <a class="btn btn-primary" href="/name/{{.label}}/buy">Extend registration until <b>{{.extendedExpiration}}</b> for <b>{{.cost}}</b></a> + <a class="btn btn-primary" href="/name/{{.label}}/buy">Extend registration for {{.extensionDaysCount}} days until <b>{{.extendedExpiration}}</b> for <b>{{.cost}}</b></a> + <br/> + <a class="btn btn-danger mt-2 disabled" href="/name/{{.label}}/refund">Cancel registration and refund remaining {{.remainingDays}} days for <b>{{.cost}}</b></a> </div> </div> <hr/> <a class="btn btn-secondary" href="/">Back</a> </div> + {{end}} </body> </html> diff --git a/web/templates/landing.html b/web/templates/landing.html @@ -21,25 +21,17 @@ </div> </div> {{end}} - <form action="/search" method="get" class="row"> + <form action="/search" method="get"> <div class="row"> - <div class="col-lg-6 offset-lg-3"> - <label for="label" class="form-label">Check name availability:</label> - <div class="input-group mb-2"> - <input id="label" name="label" class="form-control text-center" maxlength="63" type="text" aria-describedby="reg-suffix" required autofocus> - <input class="btn btn-primary" type="submit" value="Check!"> + <div class="col-lg-6 offset-lg-3 text-center"> + <div class="form-floating mb-3"> + <input id="labelInput" name="label" class="form-control text-center" placeholder="" maxlength="63" type="text" aria-describedby="reg-suffix" required autofocus> + <label for="labelInput">Your name. e.g. alice</label> </div> + <input class="btn btn-primary" type="submit" value="Check availability!"> </div> </div> </form> </div> - <div class="container pt-5"> - <div class="alert alert-light" role="alert"> - <h4 class="alert-heading">The .{{.suffixHint}} Zone!</h4> - <p>If you do not have our zone configured in your <i>Start Zones</i>, we suggest to do it as:</p> - <hr> - <p class="mb-0">.{{.suffixHint}} = {{.zoneKey}}</p> - </div> - </div> </body> </html> diff --git a/web/templates/name.html b/web/templates/name.html @@ -31,38 +31,43 @@ <h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-success">available</span> for registration.</h1> <form action="/name/{{.label}}/buy" method="get" class="align-items-center"> <div class="row"> - <div class="col-lg-12"> + <div class="col-md-12 alert alert-light"> + <h4>Zone information</h4> <div class="form-floating mb-3"> <input name="zkey" id="zkeyInput" class="form-control" maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus> - <label for="zkeyInput">Zone key</label> + <label for="zkeyInput">Enter your PKEY or EDKEY here</label> </div> - <input class="btn btn-primary" type="submit" value="Register for {{.cost}}"> + <input class="btn btn-primary" type="submit" value="Register for a duration of {{.registrationDaysCount}} days for {{.cost}}"> </div> </div> </form> {{else}} - {{if eq .registeredUntil ""}} + {{if eq .remainingDays 0}} <h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-secondary">reserved</span>!</h1> {{else}} <h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-danger">taken</span>!</h1> {{end}} <div class="row"> - <div class="col-lg-12"> + <div class="col-md-12 alert alert-light"> + <h4>Zone information</h4> <div class="form-floating mb-3"> <input name="zkey" id="zkeyInput" class="form-control" maxlength="63" type="text" value="{{.currentValue}}" disabled="true" required autofocus> <label for="zkeyInput">Zone key</label> </div> </div> </div> + {{if ne .remainingDays 0}} <div class="row"> - <div class="col-lg-12"> + <div class="col-md-12 alert alert-light"> + <h4>Registration info</h4> <div class="form-floating mb-3"> <input name="reg" id="regInput" class="form-control" type="text" value="{{.registeredUntil}}" disabled="true" required autofocus> - <label for="regInput">Registration expires</label> + <label for="regInput">Registration expires in {{.remainingDays}} days:</label> </div> </div> </div> {{end}} + {{end}} <hr/> <a class="btn btn-secondary" href="/">Back</a> </div>