Skip to content

Commit 4d312d6

Browse files
committed
Merge pull request #72 from sdjcw/0.x
fix: 云函数的 user 对象固定从 header 中获取
2 parents d870875 + 21278e0 commit 4d312d6

5 files changed

Lines changed: 48 additions & 12 deletions

File tree

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
language: node_js
22
node_js:
33
- "0.12"
4+
- "4"

lib/av-extra.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,7 @@ AV.Object.prototype.disableAfterHook = function() {
294294
};
295295

296296
var signDisableHook = function(hookName, ts) {
297-
var masterKey = process.env.LC_APP_MASTER_KEY;
298-
var sign = crypto.createHmac('sha1', masterKey)
297+
var sign = crypto.createHmac('sha1', AV.masterKey)
299298
.update(hookName + ':' + ts)
300299
.digest('hex');
301300
return ts + ',' + sign;

lib/leanengine.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ Cloud.use('/__engine/1/ping', function(req, res) {
195195

196196
// parseUserInfo
197197
Cloud.use(route, function(req, res, next) {
198-
if (req.AV.sessionToken && req.AV.sessionToken !== '') {
198+
var functionType = getFunctionType(req);
199+
if (functionType === 'cloudFunction' && req.AV.sessionToken && req.AV.sessionToken !== '') {
199200
AV.User.become(req.AV.sessionToken, {
200201
success: function(user) {
201202
req.AV.user = user;
@@ -205,7 +206,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
205206
next(err);
206207
}
207208
});
208-
} else if (req.body.user) {
209+
} else if (functionType === 'hook' && req.body.user) {
209210
var userObj = new AV.User();
210211
userObj._finishFetch(req.body.user, true);
211212
AV.User._saveCurrentUser(userObj);
@@ -235,14 +236,15 @@ Cloud.use('/__engine/1/ping', function(req, res) {
235236
var meta = {
236237
remoteAddress: req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress,
237238
};
239+
var functionType = getFunctionType(req);
238240
var split = req.url.split('/');
239-
if (split.length == 2) { // cloud function
241+
if (functionType === 'cloudFunction') {
240242
call(split[1], req.body, req.AV.user, meta, {
241243
decodeAVObject: urlEndpoint == 'call'
242244
}, function(err, data) {
243245
cb(err, data);
244246
});
245-
} else if (split.length == 3) { // class hook
247+
} else if (functionType === 'hook') {
246248
var userObj = new AV.User();
247249
if (split[1] === 'onVerified') {
248250
userObj._finishFetch(req.body.object, true);
@@ -276,6 +278,15 @@ Cloud.use('/__engine/1/ping', function(req, res) {
276278
});
277279
});
278280

281+
var getFunctionType = function(req) {
282+
var split = req.url.split('/');
283+
if (split.length == 2) {
284+
return 'cloudFunction';
285+
} else if (split.length == 3) {
286+
return 'hook';
287+
}
288+
}
289+
279290
var resp = function(res, data) {
280291
res.setHeader('Content-Type', 'application/json; charset=UTF-8');
281292
res.statusCode = 200;

test/av-extra_test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe('av-extra', function() {
5858
});
5959

6060
it('signDisableHook', function() {
61-
AV.__get__('signDisableHook')('__before_for_TestClass', 1453711871302).should.equal('1453711871302,177cbac6495f52e462aae2d054529e08a1725276');
61+
AV.__get__('signDisableHook')('__before_for_TestClass', 1453711871302).should.equal('1453711871302,a9611dbc226eed1a5f4aa0e4fa20e2d014aeaeb8');
6262
});
6363

6464
});

test/function_test.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,15 @@ AV.Cloud.define('testAVObjectsArrayParams', function(request, response) {
108108
});
109109

110110
AV.Cloud.define('testUser', function(request, response) {
111-
assert.equal(request.user.className, '_User');
112-
assert.equal(request.user.id, '54fd6a03e4b06c41e00b1f40');
113-
assert.equal(request.user.get('username'), 'admin');
114-
assert.equal(request.user, AV.User.current());
111+
if (request.params.expectedUserId) {
112+
assert.equal(request.user.className, '_User');
113+
assert.equal(request.user.id, '54fd6a03e4b06c41e00b1f40');
114+
assert.equal(request.user.id, request.params.expectedUserId);
115+
assert.equal(request.user.get('username'), 'admin');
116+
assert.equal(request.user, AV.User.current());
117+
} else {
118+
assert.equal(request.user, undefined);
119+
}
115120
response.success("ok");
116121
});
117122

@@ -160,7 +165,7 @@ AV.Cloud.define('testRun_promise', function(request, response) {
160165
});
161166

162167
AV.Cloud.define('testRunWithUser', function(request, response) {
163-
AV.Cloud.run('testUser', {}, {
168+
AV.Cloud.run('testUser', {expectedUserId: '54fd6a03e4b06c41e00b1f40'}, {
164169
success: function(data) {
165170
assert.equal('ok', data);
166171
response.success();
@@ -268,6 +273,7 @@ describe('functions', function() {
268273

269274
// 测试返回包含 AVObject 的复杂对象
270275
it('return_complexObject', function(done) {
276+
this.timeout(20000);
271277
request(AV.Cloud)
272278
.post('/1.1/call/complexObject')
273279
.set('X-AVOSCloud-Application-Id', appId)
@@ -325,6 +331,7 @@ describe('functions', function() {
325331

326332
// 返回单个 AVObject
327333
it('return_bareAVObject', function(done) {
334+
this.timeout(20000);
328335
request(AV.Cloud)
329336
.post('/1.1/call/bareAVObject')
330337
.set('X-AVOSCloud-Application-Id', appId)
@@ -339,6 +346,7 @@ describe('functions', function() {
339346

340347
// 返回 AVObject 数组
341348
it('return_AVObjectsArray', function(done) {
349+
this.timeout(20000);
342350
request(AV.Cloud)
343351
.post('/1.1/call/AVObjects')
344352
.set('X-AVOSCloud-Application-Id', appId)
@@ -483,6 +491,9 @@ describe('functions', function() {
483491
.set('X-AVOSCloud-Application-Id', appId)
484492
.set('X-AVOSCloud-Application-Key', appKey)
485493
.set('x-avoscloud-session-token', sessionToken_admin)
494+
.send({
495+
expectedUserId: '54fd6a03e4b06c41e00b1f40'
496+
})
486497
.expect(200, done);
487498
});
488499

@@ -500,6 +511,20 @@ describe('functions', function() {
500511
});
501512
});
502513

514+
it('testUser_invalid_body_user', function(done) {
515+
request(AV.Cloud)
516+
.post('/1/functions/testUser')
517+
.set('X-AVOSCloud-Application-Id', appId)
518+
.set('X-AVOSCloud-Application-Key', appKey)
519+
.send({
520+
"user": {
521+
"username": "admin",
522+
"objectId": "52aebbdee4b0c8b6fa455aa7"
523+
}
524+
})
525+
.expect(200, done);
526+
});
527+
503528
// 测试调用 run 方法时,传递 user 对象的有效性
504529
it('testRunWithUser', function(done) {
505530
request(AV.Cloud)

0 commit comments

Comments
 (0)