Skip to content

Commit a9e45ed

Browse files
author
Rob Archibald
committed
close session that is being created
1 parent 4d17a4c commit a9e45ed

File tree

1 file changed

+74
-33
lines changed

1 file changed

+74
-33
lines changed

backendMongo.go

Lines changed: 74 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3741
func (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

4753
func (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

6674
func (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

7484
func (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

8799
func (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

95109
func (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

103119
func (b *backendMongo) Close() error {
@@ -106,7 +122,9 @@ func (b *backendMongo) Close() error {
106122
}
107123

108124
func (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

132150
func (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

141160
func (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

146167
func (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
}
149172
func (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
}
152177
func (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

157184
func (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

162191
func (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

167198
func (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

171204
func (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
}
174209
func (b *backendMongo) InvalidateSessions(email string) error {
175210
return nil
176211
}
177212
func (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
}
181218
func (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
}
184223
func (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

Comments
 (0)