-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtwilio.js
160 lines (128 loc) · 4.75 KB
/
twilio.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
153
154
155
156
157
158
159
160
var TwilioClient = require('./node-twilio').RestClient;
var config = require("./config");
var client = new TwilioClient(config.twilio.sid, config.twilio.authToken);
var base64urlencode = function(str) {
var newStr = new Buffer(str).toString("base64");
newStr = newStr.replace(/\+/gi, "-");
newStr = newStr.replace(/\//gi, "_");
newStr = newStr.replace(/=/gi, "");
return newStr;
};
function randomString(string_length, chars) {
var chars;
var randomstring = '';
for(var i = 0; i < string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum, rnum + 1);
}
return randomstring;
};
var twilioAccount = {};
module.exports = {
createApp : function(projId, appUrl, cb) {
function errHandler(err) {
cb(null)
};
function successHandler(data) {
cb({
appId : data.sid
});
};
client.apiCall("POST", "/Applications", {
params : "FriendlyName=" + projId + "&VoiceUrl=http://" + appUrl + "/additional.php"
}, successHandler, errHandler);
},
addAccount : function(cb) {
client.apiCall("POST", "/2010-04-01/Accounts.json", {
params : ""
}, function(response) {
console.log(response);
cb({
"sid" : response.sid,
"token" : response.auth_token
});
}, function(err) {
cb(null);
}, true);
},
checkCallerId : function(callerId, cb) {
function errHandler(err) {
cb(false)
};
function successHandler(data) {
if(data && data.outgoing_caller_ids && typeof (data.outgoing_caller_ids.length) === "number") {
for(var i = 0; i < data.outgoing_caller_ids.length; i++) {
if(data.outgoing_caller_ids[i].phone_number === callerId) {
cb(true);
return;
}
}
cb(false);
} else {
cb(false);
}
};
client.apiCall("GET", "/OutgoingCallerIds", null, successHandler, errHandler);
},
deleteApp : function(AppId) {
function resHandler(data) {
};
client.apiCall("DELETE", "/Applications/" + AppId, {}, resHandler, resHandler);
},
allApps : function(cb) {
function errHandler(err) {
cb(null)
};
function successHandler(data) {
cb(data.applications || []);
//may only return first page
};
client.apiCall("GET", "/Applications", null, successHandler, errHandler);
},
verifyPhone : function(twilioAccount, phoneNumber, cb) {
var client = new TwilioClient(twilioAccount.sid, twilioAccount.token);
client.addOutgoingCallerId("+1" + phoneNumber, {"FriendlyName": "user"}, function(callerResponse) {
cb(callerResponse.validation_code);
}, function() {
cb(null);
});
},
handleRequest : function(req, res, next) {
if(!req.project) {
console.log("Project not loaded for Twilio Token Request");
res.send(500);
return;
}
var twilioAccountSid = req.param("token");
req.project.getTwilioAccount(twilioAccountSid, function(account) {
if(!account) {
console.log("AccountSid not passed for Twilio Token Request");
res.send(500);
return;
}
var twilioAccountToken = account.token;
console.log(twilioAccountSid + " + " + twilioAccountToken);
var replaceTokens = function(str) {
return str.replace(/initme_twilio_appSid/ig, req.project.twilioSid).replace(/initme_twilio_accountSid/ig, twilioAccountSid || "");
};
var payload = {
scope : replaceTokens(req.body['scope']),
iss : replaceTokens(req.body['iss']),
exp : parseInt(req.body['exp'])
};
console.log(payload);
var crypto = require("crypto");
var hmac = crypto.createHmac("sha256", twilioAccountToken)
var algBytes = base64urlencode(JSON.stringify({
typ : 'JWT',
alg : 'HS256'
}));
var jsonBytes = base64urlencode(JSON.stringify(payload));
var stringToSign = algBytes + "." + jsonBytes;
hmac.update(stringToSign);
var signatureValue = hmac.digest("base64").replace(/\//gi, "_").replace(/\+/gi, "-").replace(/=/gi, "");
var token = algBytes + "." + jsonBytes + "." + signatureValue;
res.send(token);
});
}
}