@@ -34,44 +34,56 @@ func NewBackendMongo(m mgo.Sessioner, c Crypter) Backender {
3434 return & backendMongo {m , c }
3535}
3636
37+ func (b * backendMongo ) Clone () mgo.Sessioner {
38+ return b .m .Clone ()
39+ }
40+
3741func (b * backendMongo ) AddUser (email string , info map [string ]interface {}) (string , error ) {
38- u , err := b .getUser (email )
42+ m := b .Clone ()
43+ defer m .Close ()
44+ u , err := b .getUser (m , email )
3945 if err == nil {
4046 return u .ID .Hex (), errors .New ("user already exists" )
4147 }
4248
4349 id := bson .NewObjectId ()
44- return id .Hex (), b .users ().Insert (mongoUser {ID : id , PrimaryEmail : email , Info : info })
50+ return id .Hex (), b .users (m ).Insert (mongoUser {ID : id , PrimaryEmail : email , Info : info })
4551}
4652
4753func (b * backendMongo ) AddUserFull (email , password string , info map [string ]interface {}) (* User , error ) {
54+ m := b .Clone ()
55+ defer m .Close ()
4856 passwordHash , err := b .c .Hash (password )
4957 if err != nil {
5058 return nil , err
5159 }
52- _ , err = b .getUser (email )
60+ _ , err = b .getUser (m , email )
5361 if err == nil {
5462 return nil , errors .New ("user already exists" )
5563 }
5664
5765 id := bson .NewObjectId ()
58- return & User {id .Hex (), email , info }, b .users ().Insert (mongoUser {ID : id , PrimaryEmail : email , PasswordHash : passwordHash , Info : info })
66+ return & User {id .Hex (), email , info }, b .users (m ).Insert (mongoUser {ID : id , PrimaryEmail : email , PasswordHash : passwordHash , Info : info })
5967}
6068
61- func (b * backendMongo ) getUser (email string ) (* mongoUser , error ) {
69+ func (b * backendMongo ) getUser (m mgo. Sessioner , email string ) (* mongoUser , error ) {
6270 u := & mongoUser {}
63- return u , b .users ().Find (bson.M {"primaryEmail" : email }).One (u )
71+ return u , b .users (m ).Find (bson.M {"primaryEmail" : email }).One (u )
6472}
6573
6674func (b * backendMongo ) GetUser (email string ) (* User , error ) {
67- u , err := b .getUser (email )
75+ m := b .Clone ()
76+ defer m .Close ()
77+ u , err := b .getUser (m , email )
6878 if err != nil {
6979 return nil , err
7080 }
7181 return & User {u .ID .Hex (), u .PrimaryEmail , u .Info }, nil
7282}
7383
7484func (b * backendMongo ) UpdateUser (userID , password string , info map [string ]interface {}) error {
85+ m := b .Clone ()
86+ defer m .Close ()
7587 passwordHash , err := b .c .Hash (password )
7688 if err != nil {
7789 return err
@@ -81,23 +93,27 @@ func (b *backendMongo) UpdateUser(userID, password string, info map[string]inter
8193 set ["info." + key ] = info [key ]
8294 }
8395 set ["passwordHash" ] = passwordHash
84- return b .users ().UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : set })
96+ return b .users (m ).UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : set })
8597}
8698
8799func (b * backendMongo ) UpdatePassword (userID , password string ) error {
100+ m := b .Clone ()
101+ defer m .Close ()
88102 passwordHash , err := b .c .Hash (password )
89103 if err != nil {
90104 return err
91105 }
92- return b .users ().UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : bson.M {"passwordHash" : passwordHash }})
106+ return b .users (m ).UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : bson.M {"passwordHash" : passwordHash }})
93107}
94108
95109func (b * backendMongo ) UpdateInfo (userID string , info map [string ]interface {}) error {
110+ m := b .Clone ()
111+ defer m .Close ()
96112 var set bson.M
97113 for key := range info {
98114 set ["info." + key ] = info [key ]
99115 }
100- return b .users ().UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : set })
116+ return b .users (m ).UpdateId (bson .ObjectIdHex (userID ), bson.M {"$set" : set })
101117}
102118
103119func (b * backendMongo ) Close () error {
@@ -106,7 +122,9 @@ func (b *backendMongo) Close() error {
106122}
107123
108124func (b * backendMongo ) LoginAndGetUser (email , password string ) (* User , error ) {
109- u , err := b .getUser (email )
125+ m := b .Clone ()
126+ defer m .Close ()
127+ u , err := b .getUser (m , email )
110128 if err != nil {
111129 return nil , err
112130 }
@@ -130,70 +148,93 @@ func (b *backendMongo) UpdatePrimaryEmail(userID, secondaryEmail string) error {
130148}
131149
132150func (b * backendMongo ) CreateEmailSession (email string , info map [string ]interface {}, emailVerifyHash , csrfToken string ) error {
133- s := b .emailSessions ()
134- c , _ := s .FindId (emailVerifyHash ).Count ()
151+ m := b .Clone ()
152+ defer m .Close ()
153+ c , _ := b .emailSessions (m ).FindId (emailVerifyHash ).Count ()
135154 if c > 0 {
136155 return errors .New ("invalid emailVerifyHash" )
137156 }
138- return s .Insert (& emailSession {"" , email , info , emailVerifyHash , csrfToken })
157+ return b . emailSessions ( m ) .Insert (& emailSession {"" , email , info , emailVerifyHash , csrfToken })
139158}
140159
141160func (b * backendMongo ) GetEmailSession (verifyHash string ) (* emailSession , error ) {
161+ m := b .Clone ()
162+ defer m .Close ()
142163 session := & emailSession {}
143- return session , b .emailSessions ().FindId (verifyHash ).One (session )
164+ return session , b .emailSessions (m ).FindId (verifyHash ).One (session )
144165}
145166
146167func (b * backendMongo ) UpdateEmailSession (verifyHash , userID string ) error {
147- return b .emailSessions ().UpdateId (verifyHash , bson.M {"$set" : bson.M {"userID" : userID }})
168+ m := b .Clone ()
169+ defer m .Close ()
170+ return b .emailSessions (m ).UpdateId (verifyHash , bson.M {"$set" : bson.M {"userID" : userID }})
148171}
149172func (b * backendMongo ) DeleteEmailSession (verifyHash string ) error {
150- return b .emailSessions ().RemoveId (verifyHash )
173+ m := b .Clone ()
174+ defer m .Close ()
175+ return b .emailSessions (m ).RemoveId (verifyHash )
151176}
152177func (b * backendMongo ) CreateSession (userID , email string , info map [string ]interface {}, sessionHash , csrfToken string , renewTimeUTC , expireTimeUTC time.Time ) (* LoginSession , error ) {
178+ m := b .Clone ()
179+ defer m .Close ()
153180 s := LoginSession {userID , email , info , sessionHash , csrfToken , renewTimeUTC , expireTimeUTC }
154- return & s , b .loginSessions ().Insert (s )
181+ return & s , b .loginSessions (m ).Insert (s )
155182}
156183
157184func (b * backendMongo ) CreateRememberMe (userID , email , selector , tokenHash string , renewTimeUTC , expireTimeUTC time.Time ) (* rememberMeSession , error ) {
185+ m := b .Clone ()
186+ defer m .Close ()
158187 r := rememberMeSession {userID , email , selector , tokenHash , renewTimeUTC , expireTimeUTC }
159- return & r , b .rememberMeSessions ().Insert (& r )
188+ return & r , b .rememberMeSessions (m ).Insert (& r )
160189}
161190
162191func (b * backendMongo ) GetSession (sessionHash string ) (* LoginSession , error ) {
192+ m := b .Clone ()
193+ defer m .Close ()
163194 session := & LoginSession {}
164- return session , b .loginSessions ().FindId (sessionHash ).One (session )
195+ return session , b .loginSessions (m ).FindId (sessionHash ).One (session )
165196}
166197
167198func (b * backendMongo ) UpdateSession (sessionHash string , renewTimeUTC , expireTimeUTC time.Time ) error {
168- return b .loginSessions ().UpdateId (sessionHash , bson.M {"$set" : bson.M {"expireTimeUTC" : expireTimeUTC , "renewTimeUTC" : renewTimeUTC }})
199+ m := b .Clone ()
200+ defer m .Close ()
201+ return b .loginSessions (m ).UpdateId (sessionHash , bson.M {"$set" : bson.M {"expireTimeUTC" : expireTimeUTC , "renewTimeUTC" : renewTimeUTC }})
169202}
170203
171204func (b * backendMongo ) DeleteSession (sessionHash string ) error {
172- return b .loginSessions ().RemoveId (sessionHash )
205+ m := b .Clone ()
206+ defer m .Close ()
207+ return b .loginSessions (m ).RemoveId (sessionHash )
173208}
174209func (b * backendMongo ) InvalidateSessions (email string ) error {
175210 return nil
176211}
177212func (b * backendMongo ) GetRememberMe (selector string ) (* rememberMeSession , error ) {
213+ m := b .Clone ()
214+ defer m .Close ()
178215 rememberMe := & rememberMeSession {}
179- return rememberMe , b .rememberMeSessions ().FindId (selector ).One (rememberMe )
216+ return rememberMe , b .rememberMeSessions (m ).FindId (selector ).One (rememberMe )
180217}
181218func (b * backendMongo ) UpdateRememberMe (selector string , renewTimeUTC time.Time ) error {
182- return b .rememberMeSessions ().UpdateId (selector , bson.M {"$set" : bson.M {"renewTimeUTC" : renewTimeUTC }})
219+ m := b .Clone ()
220+ defer m .Close ()
221+ return b .rememberMeSessions (m ).UpdateId (selector , bson.M {"$set" : bson.M {"renewTimeUTC" : renewTimeUTC }})
183222}
184223func (b * backendMongo ) DeleteRememberMe (selector string ) error {
185- return b .rememberMeSessions ().RemoveId (selector )
224+ m := b .Clone ()
225+ defer m .Close ()
226+ return b .rememberMeSessions (m ).RemoveId (selector )
186227}
187228
188- func (b * backendMongo ) users () mgo.Collectioner {
189- return b . m . Clone () .DB ("users" ).C ("users" )
229+ func (b * backendMongo ) users (s mgo. Sessioner ) mgo.Collectioner {
230+ return s .DB ("users" ).C ("users" )
190231}
191- func (b * backendMongo ) emailSessions () mgo.Collectioner {
192- return b . m . Clone () .DB ("users" ).C ("emailSessions" )
232+ func (b * backendMongo ) emailSessions (s mgo. Sessioner ) mgo.Collectioner {
233+ return s .DB ("users" ).C ("emailSessions" )
193234}
194- func (b * backendMongo ) loginSessions () mgo.Collectioner {
195- return b . m . Clone () .DB ("users" ).C ("loginSessions" )
235+ func (b * backendMongo ) loginSessions (s mgo. Sessioner ) mgo.Collectioner {
236+ return s .DB ("users" ).C ("loginSessions" )
196237}
197- func (b * backendMongo ) rememberMeSessions () mgo.Collectioner {
198- return b . m . Clone () .DB ("users" ).C ("rememberMeSessions" )
238+ func (b * backendMongo ) rememberMeSessions (s mgo. Sessioner ) mgo.Collectioner {
239+ return s .DB ("users" ).C ("rememberMeSessions" )
199240}
0 commit comments