From d9e7bf9eef522d8c081fac2000bace6f95518039 Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Fri, 2 Jan 2026 15:48:46 +0100 Subject: [PATCH] fix: remove ambiguous characters from login code --- backend/internal/service/user_service.go | 2 +- backend/internal/utils/string_util.go | 11 +++ backend/internal/utils/string_util_test.go | 72 ++++++++++++++++++ frontend/src/app.css | 6 -- .../lib/components/one-time-link-modal.svelte | 6 +- .../settings/account/login-code-modal.svelte | 6 +- .../static/fonts/GoogleSansCode-SemiBold.ttf | Bin 55288 -> 0 bytes 7 files changed, 90 insertions(+), 13 deletions(-) delete mode 100644 frontend/static/fonts/GoogleSansCode-SemiBold.ttf diff --git a/backend/internal/service/user_service.go b/backend/internal/service/user_service.go index 315de043..1dacffdb 100644 --- a/backend/internal/service/user_service.go +++ b/backend/internal/service/user_service.go @@ -876,7 +876,7 @@ func NewOneTimeAccessToken(userID string, ttl time.Duration, withDeviceToken boo tokenLength = 6 } - token, err := utils.GenerateRandomAlphanumericString(tokenLength) + token, err := utils.GenerateRandomUnambiguousString(tokenLength) if err != nil { return nil, err } diff --git a/backend/internal/utils/string_util.go b/backend/internal/utils/string_util.go index 1f7ee7a1..b20f083f 100644 --- a/backend/internal/utils/string_util.go +++ b/backend/internal/utils/string_util.go @@ -14,6 +14,17 @@ import ( // GenerateRandomAlphanumericString generates a random alphanumeric string of the given length func GenerateRandomAlphanumericString(length int) (string, error) { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + return GenerateRandomString(length, charset) +} + +// GenerateRandomUnambiguousString generates a random string of the given length using unambiguous characters +func GenerateRandomUnambiguousString(length int) (string, error) { + const charset = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789" + return GenerateRandomString(length, charset) +} + +// GenerateRandomString generates a random string of the given length using the provided character set +func GenerateRandomString(length int, charset string) (string, error) { if length <= 0 { return "", errors.New("length must be a positive integer") diff --git a/backend/internal/utils/string_util_test.go b/backend/internal/utils/string_util_test.go index d6faab04..38251d5d 100644 --- a/backend/internal/utils/string_util_test.go +++ b/backend/internal/utils/string_util_test.go @@ -2,6 +2,7 @@ package utils import ( "regexp" + "strings" "testing" ) @@ -49,6 +50,77 @@ func TestGenerateRandomAlphanumericString(t *testing.T) { }) } +func TestGenerateRandomUnambiguousString(t *testing.T) { + t.Run("valid length returns correct string", func(t *testing.T) { + const length = 10 + str, err := GenerateRandomUnambiguousString(length) + + if err != nil { + t.Errorf("Expected no error, got %v", err) + } + if len(str) != length { + t.Errorf("Expected length %d, got %d", length, len(str)) + } + + matched, err := regexp.MatchString(`^[abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789]+$`, str) + if err != nil { + t.Errorf("Regex match failed: %v", err) + } + if !matched { + t.Errorf("String contains ambiguous characters: %s", str) + } + }) + + t.Run("zero length returns error", func(t *testing.T) { + _, err := GenerateRandomUnambiguousString(0) + if err == nil { + t.Error("Expected error for zero length, got nil") + } + }) + + t.Run("negative length returns error", func(t *testing.T) { + _, err := GenerateRandomUnambiguousString(-1) + if err == nil { + t.Error("Expected error for negative length, got nil") + } + }) +} + +func TestGenerateRandomString(t *testing.T) { + t.Run("valid length returns characters from charset", func(t *testing.T) { + const length = 20 + const charset = "abc" + str, err := GenerateRandomString(length, charset) + + if err != nil { + t.Errorf("Expected no error, got %v", err) + } + if len(str) != length { + t.Errorf("Expected length %d, got %d", length, len(str)) + } + + for _, r := range str { + if !strings.ContainsRune(charset, r) { + t.Fatalf("String contains character outside charset: %q", r) + } + } + }) + + t.Run("zero length returns error", func(t *testing.T) { + _, err := GenerateRandomString(0, "abc") + if err == nil { + t.Error("Expected error for zero length, got nil") + } + }) + + t.Run("negative length returns error", func(t *testing.T) { + _, err := GenerateRandomString(-1, "abc") + if err == nil { + t.Error("Expected error for negative length, got nil") + } + }) +} + func TestCapitalizeFirstLetter(t *testing.T) { tests := []struct { name string diff --git a/frontend/src/app.css b/frontend/src/app.css index 361a0230..a29105f9 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -140,7 +140,6 @@ /* Font */ --font-playfair: 'Playfair Display', serif; - --font-code: 'Google Sans', sans-serif; } @layer base { @@ -176,11 +175,6 @@ font-weight: 700; src: url('/fonts/PlayfairDisplay-Bold.woff') format('woff'); } - @font-face { - font-family: 'Google Sans'; - font-weight: 600; - src: url('/fonts/GoogleSansCode-SemiBold.ttf') format('truetype'); - } } @keyframes accordion-down { diff --git a/frontend/src/lib/components/one-time-link-modal.svelte b/frontend/src/lib/components/one-time-link-modal.svelte index 3fea80df..3920b809 100644 --- a/frontend/src/lib/components/one-time-link-modal.svelte +++ b/frontend/src/lib/components/one-time-link-modal.svelte @@ -112,7 +112,7 @@ {:else}
-

{code}

+

{code}

@@ -124,12 +124,12 @@ -

{oneTimeLink!}

+

{oneTimeLink!}

{/if} diff --git a/frontend/src/routes/settings/account/login-code-modal.svelte b/frontend/src/routes/settings/account/login-code-modal.svelte index a98c004e..709a047a 100644 --- a/frontend/src/routes/settings/account/login-code-modal.svelte +++ b/frontend/src/routes/settings/account/login-code-modal.svelte @@ -51,7 +51,7 @@
-

{code}

+

{code}

@@ -62,12 +62,12 @@ -

{loginCodeLink!}

+

{loginCodeLink!}

diff --git a/frontend/static/fonts/GoogleSansCode-SemiBold.ttf b/frontend/static/fonts/GoogleSansCode-SemiBold.ttf deleted file mode 100644 index d3e7e535afab9dc46d12502133e05edefdb76c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55288 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

THf}->q+Nf%0 z8|}IK9PG5m+oy+=)~qfUhtC^6z;HnVx1a;cT?OrV3=$ZGwUmpVktqw8mx1RJEEhc{ zaoFhb_mH>SH(w-8%s6!Cq7!6S9T(W!_x zudi4T74di+>!k^;>h-X;Fi&`=TeqvCq;^_3L>=m#cX%ptttMe$wsl)Ok77rgWeq7_ zwkV17%W)6X-pvj~_W}=;D%_#$0Z?`|ls$;vj`VfH^_LhpDC;kjhM-PtS^p6hUH6Um zC^}HUiQZeJ6n-gvr( zXcU}JgC+QJ^F(T>tF_t z03B&Yyo10RrWV)TM2`j~R-RSjC5pMS^-*>8zdKid7kI*^EQY_idd2MdHYb9M(x!NrIA5=G2i>q=fSf|n`+Rr9Xn9)jvZKgOoBKzO;ENYzBBI& zGZl|dM>wF-^v*(14KlSxv7p9qJxs^oSk`2*)cMjf-pki{tn=9Xi;ZQ6qTh2#@{Z4S zbD8WvA#kdfsjJthhjweqUDFa09P)UcZP3jNNVl?y@bs>2ToGP&R6cFShZAkG;*$<{ z2Kh#f(PfNA8cvM}e7AF?#Yo2Q1UOJ3J^_4F#w6CmJ6U?$7vhoAxWw3liob61(~;S( zR7uhva1=~`3GqIUu}gXj*(J;nwhrPH-$lb9PI0B;5sp*LjDpx)Uw|0IAo)eyDy|1~ zs6Nb8;T8-;&%iodrAxIeU5wxk7n#0zaFEeq$O4Msi~PKCrLywMEBsAyXTyv2+x)U7 zPtNl5&GPijdi`R<3&!`w`WMgP4?U%yml~FxFD*S^W(dEQZg{aFaB{Y z>&5OOyDU7WX;34|oP3vWpQyTI4%>mp4Z@+Tl%9h@uq#x`sc9 zLUkAkqusz)@m2Nsw>rL(uY|E^54p4{bD0k@om`MU`F^1t9?2hSM>h=Cpiutc8gxUa z9@V1S2E_}-%SAwuQCFvUfm`k_(qTU%IS9324RE0cA-I??DYOF~jI6?~c>pO(gp{NV zwC*4#XgLUZuS3}=y94LQh@2s2r$4*}89-M7BfPr?fjZz@eXt7XrNlmb_3Gh;m0v+R z+rXRW`hRru#TAMDi!1QioY!MHADCMvA}^2%+1)GS5js1VfHMzkm^b10Oh8czhL@!o zlp#17glK(YcHCTuCKT{nNo(e@a%50>Jg_4u%H8+;+SYfWQ8$`SM0WUxxlTXN-&ol= z(`TBe?{8(zNqg>>n5TQW`wX37d89DCWA^pNn#r!VlZ<^FcGMRio#;+ z>dTVD6PAsL^>CeT9A@>w{M0p3AWwTXfH^Ge=JAVI`&r1Q39z|}HW-1c*#H`GkJ8yW>a8PR!Q@jD4E*MZeXgl!UG8WFD(tbU~3=<4p2l-<{MrKIdKkBM0_XAW~c zaa%@KS7KsUR>ro(3-SJeadCnE;5mc1Yo#RWn;5g&8cBhskF|R=7H1| zBRU83a;-xO>nQ=N8yIf|k_|jIbXY;^cZKPmir+vF4S^U$9T0;^^^!ad2LN)Cf(D=( zi1~&e_yRrc4M59HP_QjJ22X;nkf=Cp_0y-l@P&VZ#xW8t<<>xCr3oT;xR)OQQJ)gX zj)aUYc#efdh8+UHv8B8xU}|bWT?Awdn!k@X3a3%-wo+qvMDYUoV%El%(d7^UU((v*azzR2+Ss eFLeyGw-0oD>NeJ5wtLjv#3+m02(gF#