steamcommunity 3.44.4 → 3.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,159 +1,152 @@
1
- var SteamTotp = require('steam-totp');
2
- var SteamCommunity = require('../index.js');
3
-
4
- var ETwoFactorTokenType = {
5
- "None": 0, // No token-based two-factor authentication
6
- "ValveMobileApp": 1, // Tokens generated using Valve's special charset (5 digits, alphanumeric)
7
- "ThirdParty": 2 // Tokens generated using literally everyone else's standard charset (6 digits, numeric). This is disabled.
8
- };
9
-
10
- SteamCommunity.prototype.enableTwoFactor = function(callback) {
11
- var self = this;
12
-
13
- this.getWebApiOauthToken(function(err, token) {
14
- if(err) {
15
- callback(err);
16
- return;
17
- }
18
-
19
- self.httpRequestPost({
20
- "uri": "https://api.steampowered.com/ITwoFactorService/AddAuthenticator/v1/",
21
- "form": {
22
- "steamid": self.steamID.getSteamID64(),
23
- "access_token": token,
24
- "authenticator_time": Math.floor(Date.now() / 1000),
25
- "authenticator_type": ETwoFactorTokenType.ValveMobileApp,
26
- "device_identifier": SteamTotp.getDeviceID(self.steamID),
27
- "sms_phone_id": "1"
28
- },
29
- "json": true
30
- }, function(err, response, body) {
31
- if (err) {
32
- callback(err);
33
- return;
34
- }
35
-
36
- if(!body.response) {
37
- callback(new Error("Malformed response"));
38
- return;
39
- }
40
-
41
- if(body.response.status != 1) {
42
- var error = new Error("Error " + body.response.status);
43
- error.eresult = body.response.status;
44
- callback(error);
45
- return;
46
- }
47
-
48
- callback(null, body.response);
49
- }, "steamcommunity");
50
- });
51
- };
52
-
53
- SteamCommunity.prototype.finalizeTwoFactor = function(secret, activationCode, callback) {
54
- var attemptsLeft = 30;
55
- var diff = 0;
56
-
57
- var self = this;
58
- this.getWebApiOauthToken(function(err, token) {
59
- if(err) {
60
- callback(err);
61
- return;
62
- }
63
-
64
- SteamTotp.getTimeOffset(function(err, offset, latency) {
65
- if (err) {
66
- callback(err);
67
- return;
68
- }
69
-
70
- diff = offset;
71
- finalize(token);
72
- });
73
- });
74
-
75
- function finalize(token) {
76
- var code = SteamTotp.generateAuthCode(secret, diff);
77
-
78
- self.httpRequestPost({
79
- "uri": "https://api.steampowered.com/ITwoFactorService/FinalizeAddAuthenticator/v1/",
80
- "form": {
81
- "steamid": self.steamID.getSteamID64(),
82
- "access_token": token,
83
- "authenticator_code": code,
84
- "authenticator_time": Math.floor(Date.now() / 1000),
85
- "activation_code": activationCode
86
- },
87
- "json": true
88
- }, function(err, response, body) {
89
- if (err) {
90
- callback(err);
91
- return;
92
- }
93
-
94
- if(!body.response) {
95
- callback(new Error("Malformed response"));
96
- return;
97
- }
98
-
99
- body = body.response;
100
-
101
- if(body.server_time) {
102
- diff = body.server_time - Math.floor(Date.now() / 1000);
103
- }
104
-
105
- if(body.status == 89) {
106
- callback(new Error("Invalid activation code"));
107
- } else if(body.want_more) {
108
- attemptsLeft--;
109
- diff += 30;
110
-
111
- finalize(token);
112
- } else if(!body.success) {
113
- callback(new Error("Error " + body.status));
114
- } else {
115
- callback(null);
116
- }
117
- }, "steamcommunity");
118
- }
119
- };
120
-
121
- SteamCommunity.prototype.disableTwoFactor = function(revocationCode, callback) {
122
- var self = this;
123
-
124
- this.getWebApiOauthToken(function(err, token) {
125
- if(err) {
126
- callback(err);
127
- return;
128
- }
129
-
130
- self.httpRequestPost({
131
- "uri": "https://api.steampowered.com/ITwoFactorService/RemoveAuthenticator/v1/",
132
- "form": {
133
- "steamid": self.steamID.getSteamID64(),
134
- "access_token": token,
135
- "revocation_code": revocationCode,
136
- "steamguard_scheme": 1
137
- },
138
- "json": true
139
- }, function(err, response, body) {
140
- if (err) {
141
- callback(err);
142
- return;
143
- }
144
-
145
- if(!body.response) {
146
- callback(new Error("Malformed response"));
147
- return;
148
- }
149
-
150
- if(!body.response.success) {
151
- callback(new Error("Request failed"));
152
- return;
153
- }
154
-
155
- // success = true means it worked
156
- callback(null);
157
- }, "steamcommunity");
158
- });
159
- };
1
+ var SteamTotp = require('steam-totp');
2
+ var SteamCommunity = require('../index.js');
3
+
4
+ var ETwoFactorTokenType = {
5
+ None: 0, // No token-based two-factor authentication
6
+ ValveMobileApp: 1, // Tokens generated using Valve's special charset (5 digits, alphanumeric)
7
+ ThirdParty: 2 // Tokens generated using literally everyone else's standard charset (6 digits, numeric). This is disabled.
8
+ };
9
+
10
+ SteamCommunity.prototype.enableTwoFactor = function(callback) {
11
+ this._verifyMobileAccessToken();
12
+
13
+ if (!this.mobileAccessToken) {
14
+ callback(new Error('No mobile access token available. Provide one by calling setMobileAppAccessToken()'));
15
+ return;
16
+ }
17
+
18
+ this.httpRequestPost({
19
+ uri: "https://api.steampowered.com/ITwoFactorService/AddAuthenticator/v1/?access_token=" + this.mobileAccessToken,
20
+ // TODO: Send this as protobuf to more closely mimic official app behavior
21
+ form: {
22
+ steamid: this.steamID.getSteamID64(),
23
+ authenticator_time: Math.floor(Date.now() / 1000),
24
+ authenticator_type: ETwoFactorTokenType.ValveMobileApp,
25
+ device_identifier: SteamTotp.getDeviceID(this.steamID),
26
+ sms_phone_id: '1'
27
+ },
28
+ json: true
29
+ }, (err, response, body) => {
30
+ if (err) {
31
+ callback(err);
32
+ return;
33
+ }
34
+
35
+ if (!body.response) {
36
+ callback(new Error('Malformed response'));
37
+ return;
38
+ }
39
+
40
+ if (body.response.status != 1) {
41
+ var error = new Error('Error ' + body.response.status);
42
+ error.eresult = body.response.status;
43
+ callback(error);
44
+ return;
45
+ }
46
+
47
+ callback(null, body.response);
48
+ }, 'steamcommunity');
49
+ };
50
+
51
+ SteamCommunity.prototype.finalizeTwoFactor = function(secret, activationCode, callback) {
52
+ this._verifyMobileAccessToken();
53
+
54
+ if (!this.mobileAccessToken) {
55
+ callback(new Error('No mobile access token available. Provide one by calling setMobileAppAccessToken()'));
56
+ return;
57
+ }
58
+
59
+ let attemptsLeft = 30;
60
+ let diff = 0;
61
+
62
+ let finalize = () => {
63
+ let code = SteamTotp.generateAuthCode(secret, diff);
64
+
65
+ this.httpRequestPost({
66
+ uri: 'https://api.steampowered.com/ITwoFactorService/FinalizeAddAuthenticator/v1/?access_token=' + this.mobileAccessToken,
67
+ form: {
68
+ steamid: this.steamID.getSteamID64(),
69
+ authenticator_code: code,
70
+ authenticator_time: Math.floor(Date.now() / 1000),
71
+ activation_code: activationCode
72
+ },
73
+ json: true
74
+ }, function(err, response, body) {
75
+ if (err) {
76
+ callback(err);
77
+ return;
78
+ }
79
+
80
+ if (!body.response) {
81
+ callback(new Error('Malformed response'));
82
+ return;
83
+ }
84
+
85
+ body = body.response;
86
+
87
+ if (body.server_time) {
88
+ diff = body.server_time - Math.floor(Date.now() / 1000);
89
+ }
90
+
91
+ if (body.status == 89) {
92
+ callback(new Error('Invalid activation code'));
93
+ } else if(body.want_more) {
94
+ attemptsLeft--;
95
+ diff += 30;
96
+
97
+ finalize();
98
+ } else if(!body.success) {
99
+ callback(new Error('Error ' + body.status));
100
+ } else {
101
+ callback(null);
102
+ }
103
+ }, 'steamcommunity');
104
+ }
105
+
106
+ SteamTotp.getTimeOffset(function(err, offset, latency) {
107
+ if (err) {
108
+ callback(err);
109
+ return;
110
+ }
111
+
112
+ diff = offset;
113
+ finalize();
114
+ });
115
+ };
116
+
117
+ SteamCommunity.prototype.disableTwoFactor = function(revocationCode, callback) {
118
+ this._verifyMobileAccessToken();
119
+
120
+ if (!this.mobileAccessToken) {
121
+ callback(new Error('No mobile access token available. Provide one by calling setMobileAppAccessToken()'));
122
+ return;
123
+ }
124
+
125
+ this.httpRequestPost({
126
+ uri: 'https://api.steampowered.com/ITwoFactorService/RemoveAuthenticator/v1/?access_token=' + this.mobileAccessToken,
127
+ form: {
128
+ steamid: this.steamID.getSteamID64(),
129
+ revocation_code: revocationCode,
130
+ steamguard_scheme: 1
131
+ },
132
+ json: true
133
+ }, function(err, response, body) {
134
+ if (err) {
135
+ callback(err);
136
+ return;
137
+ }
138
+
139
+ if (!body.response) {
140
+ callback(new Error('Malformed response'));
141
+ return;
142
+ }
143
+
144
+ if (!body.response.success) {
145
+ callback(new Error('Request failed'));
146
+ return;
147
+ }
148
+
149
+ // success = true means it worked
150
+ callback(null);
151
+ }, 'steamcommunity');
152
+ };
@@ -1,5 +1,7 @@
1
1
  var SteamCommunity = require('../index.js');
2
2
 
3
+ const Helpers = require('./helpers.js');
4
+
3
5
  SteamCommunity.prototype.getWebApiKey = function(domain, callback) {
4
6
  var self = this;
5
7
  this.httpRequest({
@@ -45,7 +47,7 @@ SteamCommunity.prototype.getWebApiKey = function(domain, callback) {
45
47
  };
46
48
 
47
49
  /**
48
- * @deprecated No longer works if not logged in via mobile login. Will be removed in a future release.
50
+ * @deprecated No longer works. Will be removed in a future release.
49
51
  * @param {function} callback
50
52
  */
51
53
  SteamCommunity.prototype.getWebApiOauthToken = function(callback) {
@@ -53,5 +55,64 @@ SteamCommunity.prototype.getWebApiOauthToken = function(callback) {
53
55
  return callback(null, this.oAuthToken);
54
56
  }
55
57
 
56
- callback(new Error('This operation requires an OAuth token, which can only be obtained from node-steamcommunity\'s `login` method.'));
58
+ callback(new Error('This operation requires an OAuth token, which is no longer issued by Steam.'));
59
+ };
60
+
61
+ /**
62
+ * Sets an access_token generated by steam-session using EAuthTokenPlatformType.MobileApp.
63
+ * Required for some operations such as 2FA enabling and disabling.
64
+ * This will throw an Error if the provided token is not valid, was not generated for the MobileApp platform, is expired,
65
+ * or does not belong to the logged-in user account.
66
+ *
67
+ * @param {string} token
68
+ */
69
+ SteamCommunity.prototype.setMobileAppAccessToken = function(token) {
70
+ if (!this.steamID) {
71
+ throw new Error('Log on to steamcommunity before setting a mobile app access token');
72
+ }
73
+
74
+ let decodedToken = Helpers.decodeJwt(token);
75
+
76
+ if (!decodedToken.iss || !decodedToken.sub || !decodedToken.aud || !decodedToken.exp) {
77
+ throw new Error('Provided value is not a valid Steam access token');
78
+ }
79
+
80
+ if (decodedToken.iss == 'steam') {
81
+ throw new Error('Provided token is a refresh token, not an access token');
82
+ }
83
+
84
+ if (decodedToken.sub != this.steamID.getSteamID64()) {
85
+ throw new Error(`Provided token belongs to account ${decodedToken.sub}, but we are logged into ${this.steamID.getSteamID64()}`);
86
+ }
87
+
88
+ if (decodedToken.exp < Math.floor(Date.now() / 1000)) {
89
+ throw new Error('Provided token is expired');
90
+ }
91
+
92
+ if ((decodedToken.aud || []).indexOf('mobile') == -1) {
93
+ throw new Error('Provided token is not valid for MobileApp platform type');
94
+ }
95
+
96
+ this.mobileAccessToken = token;
97
+ };
98
+
99
+ /**
100
+ * Verifies that the mobile access token we already have set is still valid for current login.
101
+ *
102
+ * @private
103
+ */
104
+ SteamCommunity.prototype._verifyMobileAccessToken = function() {
105
+ if (!this.mobileAccessToken) {
106
+ // No access token, so nothing to do here.
107
+ return;
108
+ }
109
+
110
+ let decodedToken = Helpers.decodeJwt(this.mobileAccessToken);
111
+
112
+ let isTokenInvalid = decodedToken.sub != this.steamID.getSteamID64() // SteamID doesn't match
113
+ || decodedToken.exp < Math.floor(Date.now() / 1000); // Token is expired
114
+
115
+ if (isTokenInvalid) {
116
+ delete this.mobileAccessToken;
117
+ }
57
118
  };
@@ -1,62 +1,81 @@
1
- // If you aren't running this script inside of the repository, replace the following line with:
2
- // const SteamCommunity = require('steamcommunity');
3
- const SteamCommunity = require('../index.js');
4
- const ReadLine = require('readline');
5
-
6
- let community = new SteamCommunity();
7
- let rl = ReadLine.createInterface({
8
- input: process.stdin,
9
- output: process.stdout
10
- });
11
-
12
- rl.question('Username: ', (accountName) => {
13
- rl.question('Password: ', (password) => {
14
- rl.question('Two-Factor Auth Code: ', (authCode) =>{
15
- rl.question('Revocation Code: R', (rCode) => {
16
- doLogin(accountName, password, authCode, '', rCode);
17
- });
18
- });
19
- });
20
- });
21
-
22
- function doLogin(accountName, password, authCode, captcha, rCode) {
23
- community.login({
24
- accountName: accountName,
25
- password: password,
26
- twoFactorCode: authCode,
27
- captcha: captcha
28
- }, (err, sessionID, cookies, steamguard) => {
29
- if (err) {
30
- if (err.message == 'SteamGuard') {
31
- console.log('This account does not have two-factor authentication enabled.');
32
- process.exit();
33
- return;
34
- }
35
-
36
- if (err.message == 'CAPTCHA') {
37
- console.log(err.captchaurl);
38
- rl.question('CAPTCHA: ', (captchaInput) => {
39
- doLogin(accountName, password, authCode, captchaInput);
40
- });
41
-
42
- return;
43
- }
44
-
45
- console.log(err);
46
- process.exit();
47
- return;
48
- }
49
-
50
- console.log('Logged on!');
51
- community.disableTwoFactor('R' + rCode, (err) => {
52
- if (err) {
53
- console.log(err);
54
- process.exit();
55
- return;
56
- }
57
-
58
- console.log('Two-factor authentication disabled!');
59
- process.exit();
60
- });
61
- });
62
- }
1
+ // If you aren't running this script inside of the repository, replace the following line with:
2
+ // const SteamCommunity = require('steamcommunity');
3
+ const SteamCommunity = require('../index.js');
4
+ const ReadLine = require('readline');
5
+
6
+ let community = new SteamCommunity();
7
+ let rl = ReadLine.createInterface({
8
+ input: process.stdin,
9
+ output: process.stdout
10
+ });
11
+
12
+ rl.question('Username: ', (accountName) => {
13
+ rl.question('Password: ', (password) => {
14
+ rl.question('Two-Factor Auth Code: ', (authCode) =>{
15
+ rl.question('Revocation Code: R', (rCode) => {
16
+ doLogin(accountName, password, authCode, '', rCode);
17
+ });
18
+ });
19
+ });
20
+ });
21
+
22
+ function doLogin(accountName, password, authCode, captcha, rCode) {
23
+ community.login({
24
+ accountName: accountName,
25
+ password: password,
26
+ twoFactorCode: authCode,
27
+ captcha: captcha
28
+ }, (err, sessionID, cookies, steamguard) => {
29
+ if (err) {
30
+ if (err.message == 'SteamGuard') {
31
+ console.log('This account does not have two-factor authentication enabled.');
32
+ process.exit();
33
+ return;
34
+ }
35
+
36
+ if (err.message == 'CAPTCHA') {
37
+ console.log(err.captchaurl);
38
+ rl.question('CAPTCHA: ', (captchaInput) => {
39
+ doLogin(accountName, password, authCode, captchaInput);
40
+ });
41
+
42
+ return;
43
+ }
44
+
45
+ console.log(err);
46
+ process.exit();
47
+ return;
48
+ }
49
+
50
+ console.log('Logged on!');
51
+
52
+ if (community.mobileAccessToken) {
53
+ // If we already have a mobile access token, we don't need to prompt for one.
54
+ doRevoke(rCode);
55
+ return;
56
+ }
57
+
58
+ console.log('You need to provide a mobile app access token to continue.');
59
+ console.log('You can generate one using steam-session (https://www.npmjs.com/package/steam-session).');
60
+ console.log('The access token needs to be generated using EAuthTokenPlatformType.MobileApp.');
61
+ console.log('Make sure you provide an *ACCESS* token, not a refresh token.');
62
+
63
+ rl.question('Access Token: ', (accessToken) => {
64
+ community.setMobileAppAccessToken(accessToken);
65
+ doRevoke(rCode);
66
+ });
67
+ });
68
+ }
69
+
70
+ function doRevoke(rCode) {
71
+ community.disableTwoFactor('R' + rCode, (err) => {
72
+ if (err) {
73
+ console.log(err);
74
+ process.exit();
75
+ return;
76
+ }
77
+
78
+ console.log('Two-factor authentication disabled!');
79
+ process.exit();
80
+ });
81
+ }