mirror of
https://github.com/luxfi/node.git
synced 2026-10-30 15:24:05 +00:00
The module already called itself github.com/luxfi/node while containing no node in Go: cmd/luxd was twenty-one lines that printed the size of a few types, and the Go column of the matrix measured a VM plugin. A repo that fetches the thing it claims to be has not replaced it, so the Go sources move in — 1515 files, the daemon and everything under it — and the build reaches outside this module for nothing. Rust and C++ sit beside it unchanged and are still measured against it by the differential. That is the point of one repo: the reference implementation and the two ports are the same checkout, so parity is a thing you can run rather than a thing you assert. Verified: builds, and the closure carries no lux-private — checked at build time rather than believed. The daemon starts twelve chains on a local network (P X C Q Z A B G K M F, plus D through its plugin) and reports healthy.
108 lines
2.4 KiB
Go
108 lines
2.4 KiB
Go
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package password
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSufficientlyStrong(t *testing.T) {
|
|
tests := []struct {
|
|
password string
|
|
expected Strength
|
|
}{
|
|
{
|
|
password: "",
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: "a",
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: "password",
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: "thisisareallylongandpresumablyverystrongpassword",
|
|
expected: VeryStrong,
|
|
},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(fmt.Sprintf("%s-%d", test.password, test.expected), func(t *testing.T) {
|
|
require.True(t, SufficientlyStrong(test.password, test.expected))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsValid(t *testing.T) {
|
|
tests := []struct {
|
|
password string
|
|
expected Strength
|
|
expectedErr error
|
|
}{
|
|
{
|
|
password: "",
|
|
expected: VeryWeak,
|
|
expectedErr: ErrEmptyPassword,
|
|
},
|
|
{
|
|
password: "a",
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: "password",
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: "thisisareallylongandpresumablyverystrongpassword",
|
|
expected: VeryStrong,
|
|
},
|
|
{
|
|
password: string(make([]byte, maxPassLen)),
|
|
expected: VeryWeak,
|
|
},
|
|
{
|
|
password: string(make([]byte, maxPassLen+1)),
|
|
expected: VeryWeak,
|
|
expectedErr: ErrPassMaxLength,
|
|
},
|
|
{
|
|
password: "password",
|
|
expected: Weak,
|
|
expectedErr: ErrWeakPassword,
|
|
},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(fmt.Sprintf("%s-%d", test.password, test.expected), func(t *testing.T) {
|
|
err := IsValid(test.password, test.expected)
|
|
require.ErrorIs(t, err, test.expectedErr)
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestIsValidRejectsLongButGuessable pins that strength is scored, not measured
|
|
// in characters. Every password here clears the 20-character bar the length-only
|
|
// fallback applied at OK (Fair), and each is one of the first guesses a cracker
|
|
// makes. The fallback shipped in the default build, so these cleared the bar
|
|
// anywhere a password was set.
|
|
func TestIsValidRejectsLongButGuessable(t *testing.T) {
|
|
for _, pw := range []string{
|
|
"aaaaaaaaaaaaaaaaaaaa",
|
|
"password1234password",
|
|
"11111111111111111111",
|
|
"qwertyuiopqwertyuiop",
|
|
"passwordpasswordpassword",
|
|
} {
|
|
t.Run(pw, func(t *testing.T) {
|
|
require.GreaterOrEqual(t, len(pw), 20)
|
|
require.ErrorIs(t, IsValid(pw, OK), ErrWeakPassword)
|
|
require.False(t, SufficientlyStrong(pw, OK))
|
|
})
|
|
}
|
|
}
|