You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.9 KiB

3 years ago
var jwt = require('jsonwebtoken'),
qs = require('querystring'),
utils = require('./utils');
function Capability(sid, tkn) {
if(!(this instanceof Capability)) {
return new Capability(sid, tkn);
}
utils.initializeTokens(this, 'Capability', sid, tkn);
this.capabilities = [];
}
function scopeUriFor(service, privilege, params) {
var scopeUri = 'scope:'+service+':'+privilege;
if (params) {
scopeUri = scopeUri+'?'+qs.stringify(params);
}
return scopeUri;
}
Capability.prototype.allowClientIncoming = function(clientName) {
this.clientName = clientName;
this.capabilities.push(scopeUriFor('client', 'incoming', {
clientName:clientName
}));
return this;
};
Capability.prototype.allowClientOutgoing = function(appSid, params) {
this.outgoingScopeParams = {
appSid:appSid
};
if (params) {
this.outgoingScopeParams.appParams = qs.stringify(params);
}
return this;
};
Capability.prototype.allowEventStream = function(filters) {
var scopeParams = {
path:'/2010-04-01/Events'
};
if (filters) {
scopeParams.params = filters;
}
this.capabilities.push(scopeUriFor('stream', 'subscribe', scopeParams));
return this;
};
Capability.prototype.generate = function(timeout) {
var capabilities = this.capabilities.slice(0),
expires = timeout||3600;
//Build outgoing scope params lazily to use clientName (if it exists)
if (this.outgoingScopeParams) {
if (this.clientName) {
this.outgoingScopeParams.clientName = this.clientName;
}
capabilities.push(scopeUriFor('client', 'outgoing', this.outgoingScopeParams));
}
var payload = {
scope: capabilities.join(' '),
iss: this.accountSid,
exp: Math.floor(new Date() / 1000) + expires
};
return jwt.sign(payload, this.authToken);
};
module.exports = Capability;