mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
Allow passwords with column
Before this patch, an `authfile` with multiple column symbols was not valid. After this patch, all characters after the first `:` constitute the password, until EOL.
This commit is contained in:
parent
c1bcc0c517
commit
c9dd977600
14
src/main.go
14
src/main.go
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
@ -94,16 +93,9 @@ func main() {
|
|||||||
log.Fatal("Failed to open auth file: ", err)
|
log.Fatal("Failed to open auth file: ", err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
scanner := bufio.NewScanner(f)
|
username, password, err = parseAuthfile(f)
|
||||||
for scanner.Scan() {
|
if err != nil {
|
||||||
line := scanner.Text()
|
log.Fatal("Failed to parse auth file: ", err)
|
||||||
parts := strings.Split(line, ":")
|
|
||||||
if len(parts) != 2 {
|
|
||||||
log.Fatalf("Invalid auth: %v (expected `username:password`)", line)
|
|
||||||
}
|
|
||||||
username = parts[0]
|
|
||||||
password = parts[1]
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
src/password.go
Normal file
23
src/password.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseAuthfile(authfile io.Reader) (username, password string, err error) {
|
||||||
|
scanner := bufio.NewScanner(authfile)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
parts := strings.SplitN(line, ":", 2)
|
||||||
|
if len(parts) != 2 {
|
||||||
|
return "", "", fmt.Errorf("wrong syntax (expected `username:password`)")
|
||||||
|
}
|
||||||
|
username = parts[0]
|
||||||
|
password = parts[1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return username, password, nil
|
||||||
|
}
|
47
src/password_test.go
Normal file
47
src/password_test.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPasswordFromAuthfile(t *testing.T) {
|
||||||
|
for _, tc := range [...]struct {
|
||||||
|
authfile string
|
||||||
|
expectedUsername string
|
||||||
|
expectedPassword string
|
||||||
|
expectedError bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
authfile: "username:password",
|
||||||
|
expectedUsername: "username",
|
||||||
|
expectedPassword: "password",
|
||||||
|
expectedError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
authfile: "username-and-no-password",
|
||||||
|
expectedError: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
authfile: "username:password:with:columns",
|
||||||
|
expectedUsername: "username",
|
||||||
|
expectedPassword: "password:with:columns",
|
||||||
|
expectedError: false,
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(tc.authfile, func(t *testing.T) {
|
||||||
|
username, password, err := parseAuthfile(strings.NewReader(tc.authfile))
|
||||||
|
if tc.expectedUsername != username {
|
||||||
|
t.Errorf("expected username %q, got %q", tc.expectedUsername, username)
|
||||||
|
}
|
||||||
|
if tc.expectedPassword != password {
|
||||||
|
t.Errorf("expected password %q, got %q", tc.expectedPassword, password)
|
||||||
|
}
|
||||||
|
if tc.expectedError && err == nil {
|
||||||
|
t.Errorf("expected error, got nil")
|
||||||
|
} else if !tc.expectedError && err != nil {
|
||||||
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user