-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbraviaAuth.js
96 lines (83 loc) · 2.23 KB
/
braviaAuth.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
var Request = require('request');
var Q = require('q');
var StringFormat = require('string-format');
const os = require('os');
function BraviaAuth(discovery) {
this.discovery = discovery;
this.clientId = '{hostname}:642a76ca-9102-11e6-ae22-56b6b6499611';
this.nickname = 'node-bravia-androidtv ({hostname})';
}
BraviaAuth.prototype.getCookie = function(code) {
var deferred = Q.defer();
if (this.cookie) {
deferred.resolve(this.cookie);
} else {
var self = this;
this.discovery.getUrl().then(function(url) {
var clientId = self.clientId.format({hostname: hostname()});
var nickname = self.nickname.format({hostname: os.hostname()});
authRequest(url, clientId, nickname, code).then(function(response) {
if (response.statusCode == 200) {
var cookie = parseCookie(response.headers);
self.cookie = cookie;
deferred.resolve(cookie);
} else if (response.statusCode == 401) {
deferred.resolve();
} else {
deferred.reject('Unexpected '+response.statusCode+' response');
}
}, deferred.reject);
}, deferred.reject);
}
return deferred.promise;
};
BraviaAuth.prototype.clearCookie = function() {
this.cookie = null;
};
function hostname() {
os.hostname()
.toLowerCase()
.replace(/\..*$/, '')
.replace(/[^a-z0-9]/g, '');
}
function authRequest(url, clientId, nickname, code) {
var deferred = Q.defer();
var headers = {};
if (code !== undefined) {
headers['Authorization'] = 'Basic ' + new Buffer(':' + code).toString('base64');
}
Request.post({
method: 'POST',
uri: url + '/accessControl',
json: {
id: 1,
method: 'actRegister',
version: '1.0',
params: [
{
clientid: clientId,
nickname: nickname,
level: 'private'
},
[
{
value: 'yes',
function: 'WOL'
}
]
]
},
headers: headers
}, function (error, response, body) {
if (!error) {
deferred.resolve(response);
} else{
deferred.reject(error);
}
});
return deferred.promise;
}
function parseCookie(headers) {
return headers['set-cookie'][0].split(';')[0];
};
module.exports = BraviaAuth;