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