Rev 29: Have the services generate random tokens when adding the user. in http://bazaar.launchpad.net/+branch/goose
John Arbash Meinel
john at arbash-meinel.com
Sun Nov 11 15:30:00 UTC 2012
At http://bazaar.launchpad.net/+branch/goose
------------------------------------------------------------
revno: 29
revision-id: john at arbash-meinel.com-20121111152952-fu87gids8gw5gphu
parent: john at arbash-meinel.com-20121111111352-7j0ilcvxf8v5y03n
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: goose
timestamp: Sun 2012-11-11 15:29:52 +0000
message:
Have the services generate random tokens when adding the user.
-------------- next part --------------
=== modified file 'testservices/identityservice/legacy.go'
--- a/testservices/identityservice/legacy.go 2012-11-11 11:13:52 +0000
+++ b/testservices/identityservice/legacy.go 2012-11-11 15:29:52 +0000
@@ -4,11 +4,6 @@
"net/http"
)
-type UserInfo struct {
- secret string
- token string
-}
-
type Legacy struct {
tokens map[string]UserInfo
managementURL string
@@ -25,7 +20,7 @@
}
func (lis *Legacy) AddUser(user, secret string) string {
- token := "new-secret-token"
+ token := randomHexToken()
lis.tokens[user] = UserInfo{secret: secret, token: token}
return token
}
=== added file 'testservices/identityservice/service_test.go'
--- a/testservices/identityservice/service_test.go 1970-01-01 00:00:00 +0000
+++ b/testservices/identityservice/service_test.go 2012-11-11 15:29:52 +0000
@@ -0,0 +1,23 @@
+package identityservice
+
+import (
+ . "launchpad.net/gocheck"
+ "launchpad.net/goose/testing/httpsuite"
+)
+
+// All tests in the IdentityServiceSuite run against each IdentityService
+// implementation.
+
+type IdentityServiceSuite struct {
+ httpsuite.HTTPSuite
+ service IdentityService
+}
+
+var _ = Suite(&IdentityServiceSuite{service: NewUserPass()})
+var _ = Suite(&IdentityServiceSuite{service: NewLegacy()})
+
+func (s *IdentityServiceSuite) TestAddUserGivesNewToken(c *C) {
+ token1 := s.service.AddUser("user-1", "password-1")
+ token2 := s.service.AddUser("user-2", "password-2")
+ c.Assert(token1, Not(Equals), token2)
+}
=== modified file 'testservices/identityservice/userpass.go'
--- a/testservices/identityservice/userpass.go 2012-11-11 11:13:52 +0000
+++ b/testservices/identityservice/userpass.go 2012-11-11 15:29:52 +0000
@@ -144,7 +144,7 @@
}
func (u *UserPass) AddUser(user, secret string) string {
- token := "new-secret-token"
+ token := randomHexToken()
u.users[user] = UserInfo{secret: secret, token: token}
return token
}
=== added file 'testservices/identityservice/util.go'
--- a/testservices/identityservice/util.go 1970-01-01 00:00:00 +0000
+++ b/testservices/identityservice/util.go 2012-11-11 15:29:52 +0000
@@ -0,0 +1,31 @@
+package identityservice
+
+import (
+ "crypto/rand"
+ "encoding/hex"
+ "fmt"
+)
+
+type UserInfo struct {
+ secret string
+ token string
+}
+
+// Generate a bit of random hex data for
+func randomHexToken() string {
+ raw_bytes := make([]byte, 16)
+ n, err := rand.Read(raw_bytes)
+ if n != 16 || err != nil {
+ panic(fmt.Sprintf(
+ "Could not read 16 random bytes safely: %d %s",
+ n, err.Error()))
+ }
+ hex_bytes := make([]byte, 32)
+ n = hex.Encode(hex_bytes, raw_bytes)
+ if n != 32 || err != nil {
+ panic(fmt.Sprintf(
+ "Failed to Encode 32 bytes: %d %s",
+ n, err.Error()))
+ }
+ return string(hex_bytes)
+}
=== added file 'testservices/identityservice/util_test.go'
--- a/testservices/identityservice/util_test.go 1970-01-01 00:00:00 +0000
+++ b/testservices/identityservice/util_test.go 2012-11-11 15:29:52 +0000
@@ -0,0 +1,28 @@
+package identityservice
+
+import (
+ . "launchpad.net/gocheck"
+)
+
+type UtilSuite struct{}
+
+var _ = Suite(&UtilSuite{})
+
+func (s *UtilSuite) TestRandomHexTokenHasLength(c *C) {
+ val := randomHexToken()
+ c.Assert(val, HasLen, 32)
+}
+
+func (s *UtilSuite) TestRandomHexTokenIsHex(c *C) {
+ val := randomHexToken()
+ for i, b := range val {
+ switch {
+ case (b >= 'a' && b <= 'f') || (b >= '0' && b <= '9'):
+ continue
+ default:
+ c.Logf("char %d was not in the right range: '%c'",
+ i, b)
+ c.Fail()
+ }
+ }
+}
More information about the bazaar-commits
mailing list