Skip to content

Commit d0ff5ca

Browse files
authored
Merge pull request #79 from NicolasHaas/fix/token-expiry-ui
fix(ui): enter invite expiry in days
2 parents 4252331 + 4e69d48 commit d0ff5ca

2 files changed

Lines changed: 48 additions & 7 deletions

File tree

‎ui/app.go‎

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"net"
1111
"runtime"
1212
"sort"
13+
"strconv"
1314
"strings"
1415
"time"
1516

@@ -1092,6 +1093,18 @@ func (a *App) confirmServerTrust(controlAddr, received, expected string, connect
10921093

10931094
// ----- Admin / Settings dialogs -----
10941095

1096+
func parseTokenSettings(usesText, daysText string) (int, int64, error) {
1097+
uses, err := strconv.ParseInt(strings.TrimSpace(usesText), 10, 32)
1098+
if err != nil || uses < 0 {
1099+
return 0, 0, fmt.Errorf("max uses must be a non-negative whole number")
1100+
}
1101+
days, err := strconv.ParseInt(strings.TrimSpace(daysText), 10, 64)
1102+
if err != nil || days < 0 || days > 3650 {
1103+
return 0, 0, fmt.Errorf("expiry must be 0 to 3650 days (0 means never)")
1104+
}
1105+
return int(uses), days * 86400, nil
1106+
}
1107+
10951108
func (a *App) showServerSettings() {
10961109
role := a.engine.GetRole()
10971110
var sections []fyne.CanvasObject
@@ -1103,13 +1116,14 @@ func (a *App) showServerSettings() {
11031116
maxUsesEntry := widget.NewEntry()
11041117
maxUsesEntry.SetText("10")
11051118
expiresEntry := widget.NewEntry()
1106-
expiresEntry.SetText("86400")
1119+
expiresEntry.SetText("1")
11071120

11081121
createTokenBtn := widget.NewButton("Create Token", func() {
1109-
var maxUses int
1110-
_, _ = fmt.Sscanf(maxUsesEntry.Text, "%d", &maxUses)
1111-
var expires int64
1112-
_, _ = fmt.Sscanf(expiresEntry.Text, "%d", &expires)
1122+
maxUses, expires, err := parseTokenSettings(maxUsesEntry.Text, expiresEntry.Text)
1123+
if err != nil {
1124+
dialog.ShowError(err, a.window)
1125+
return
1126+
}
11131127
if err := a.engine.CreateToken(roleSelect.Selected, maxUses, expires); err != nil {
11141128
dialog.ShowError(err, a.window)
11151129
}
@@ -1118,8 +1132,8 @@ func (a *App) showServerSettings() {
11181132
sections = append(sections,
11191133
widget.NewLabelWithStyle("Create Invite Token", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
11201134
container.NewHBox(widget.NewLabel("Role:"), roleSelect),
1121-
container.NewHBox(widget.NewLabel("Max Uses:"), maxUsesEntry),
1122-
container.NewHBox(widget.NewLabel("Expires (sec):"), expiresEntry),
1135+
container.NewHBox(widget.NewLabel("Uses (0 = unlimited):"), maxUsesEntry),
1136+
container.NewHBox(widget.NewLabel("Expires (days, 0 = never):"), expiresEntry),
11231137
createTokenBtn,
11241138
widget.NewSeparator(),
11251139
)

‎ui/token_settings_test.go‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ui
2+
3+
import "testing"
4+
5+
func TestParseTokenSettings(t *testing.T) {
6+
for _, tc := range []struct {
7+
uses, days string
8+
wantUses int
9+
wantSeconds int64
10+
valid bool
11+
}{
12+
{"10", "1", 10, 86400, true},
13+
{"0", "0", 0, 0, true},
14+
{"1", "3650", 1, 315360000, true},
15+
{"oops", "1", 0, 0, false},
16+
{"-1", "1", 0, 0, false},
17+
{"2147483648", "1", 0, 0, false},
18+
{"1", "bad", 0, 0, false},
19+
{"1", "-1", 0, 0, false},
20+
{"1", "3651", 0, 0, false},
21+
} {
22+
uses, seconds, err := parseTokenSettings(tc.uses, tc.days)
23+
if (err == nil) != tc.valid || (tc.valid && (uses != tc.wantUses || seconds != tc.wantSeconds)) {
24+
t.Errorf("parseTokenSettings(%q, %q) = %d, %d, %v", tc.uses, tc.days, uses, seconds, err)
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)