-
Notifications
You must be signed in to change notification settings - Fork 9
/
meteor-model.js
152 lines (129 loc) · 3.96 KB
/
meteor-model.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import { Random } from 'meteor/random'
import { bind } from '../utils/bind'
export const collections = {
AccessTokens: undefined,
RefreshTokens: undefined,
Clients: undefined,
AuthCodes: undefined
}
/**
* @private used by OAuthMeteorModel.prototype.getAccessToken
*/
export const getAccessToken = bind(function (bearerToken) {
return collections.AccessTokens.findOne({ accessToken: bearerToken })
})
/**
* @private used by OAuthMeteorModel.prototype.createClient
*/
export const createClient = bind(function ({ title, homepage, description, privacyLink, redirectUris, grants, clientId, secret }) {
const existingClient = collections.Clients.findOne({ title })
if (existingClient) {
const updateValues = { description, privacyLink, redirectUris, grants }
if (clientId) updateValues.clientId = clientId
if (secret) updateValues.secret = secret
return collections.Clients.update(existingClient._id, {
$set: updateValues
})
}
const clientDocId = collections.Clients.insert({
title,
homepage,
description,
privacyLink,
redirectUris,
clientId: clientId || Random.id(16),
secret: secret || Random.id(32),
grants
})
return collections.Clients.findOne(clientDocId)
})
/**
* @private used by OAuthMeteorModel.prototype.getClient
*/
export const getClient = bind(function (clientId, secret) {
const clientDoc = collections.Clients.findOne({
clientId,
secret: secret || undefined // secret can be undefined or null but should act as the same
})
return clientDoc || false
})
/**
* @private used by OAuthMeteorModel.prototype.saveToken
*/
export const saveToken = bind(function (tokenDoc, clientDoc, userDoc) {
const tokenDocId = collections.AccessTokens.insert({
accessToken: tokenDoc.accessToken,
accessTokenExpiresAt: tokenDoc.accessTokenExpiresAt,
refreshToken: tokenDoc.refreshToken,
refreshTokenExpiresAt: tokenDoc.refreshTokenExpiresAt,
scope: tokenDoc.scope,
client: {
id: clientDoc.clientId
},
user: {
id: userDoc.id
}
})
return collections.AccessTokens.findOne(tokenDocId)
})
/**
* @private used by OAuthMeteorModel.prototype.getAuthorizationCode
*/
export const getAuthorizationCode = bind(function (authorizationCode) {
return collections.AuthCodes.findOne({ authorizationCode })
})
/**
* @private used by OAuthMeteorModel.prototype.saveAuthorizationCode
*/
export const saveAuthorizationCode = bind(function saveAuthCode (code, client, user) {
const { authorizationCode } = code
const { expiresAt } = code
const { redirectUri } = code
collections.AuthCodes.upsert({ authorizationCode }, {
authorizationCode,
expiresAt,
redirectUri,
scope: code.scope,
client: {
id: client.clientId
},
user: {
id: user.id
}
})
return collections.AuthCodes.findOne({ authorizationCode })
})
/**
* @private used by OAuthMeteorModel.prototype.revokeAuthorizationCode
*/
export const revokeAuthorizationCode = bind(function revokeAuthorizationCode ({ authorizationCode }) {
const docCount = collections.AuthCodes.find({ authorizationCode }).count()
if (docCount === 0) {
return true
}
return collections.AuthCodes.remove({ authorizationCode }) === docCount
})
/**
* @private used by OAuthMeteorModel.prototype.saveRefreshToken
*/
export const saveRefreshToken = bind(function (token, clientId, expires, user) {
return collections.RefreshTokens.insert({
refreshToken: token,
clientId,
userId: user.id,
expires
})
})
/**
* @private used by OAuthMeteorModel.prototype.getRefreshToken
*/
export const getRefreshToken = bind(function (refreshToken) {
return collections.AccessTokens.findOne({ refreshToken })
})
export const revokeToken = bind(function (token) {
const docCount = collections.AccessTokens.find({ refreshToken: token.refreshToken }).count()
if (docCount === 0) {
return true
}
return collections.AccessTokens.remove({ refreshToken: token.refreshToken }) === docCount
})