Fix ScalarAuthClient to refresh tokens if they fail
Also add a test to make sure it does it
This commit is contained in:
parent
99d1ed5efe
commit
69fa34d71f
2 changed files with 63 additions and 2 deletions
|
@ -51,7 +51,7 @@ class ScalarAuthClient {
|
||||||
return this.scalarToken != null; // undef or null
|
return this.scalarToken != null; // undef or null
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns a scalar_token string
|
// Returns a promise that resolves to a scalar_token string
|
||||||
getScalarToken() {
|
getScalarToken() {
|
||||||
let token = this.scalarToken;
|
let token = this.scalarToken;
|
||||||
if (!token) token = window.localStorage.getItem("mx_scalar_token");
|
if (!token) token = window.localStorage.getItem("mx_scalar_token");
|
||||||
|
@ -59,7 +59,9 @@ class ScalarAuthClient {
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return this.registerForToken();
|
return this.registerForToken();
|
||||||
} else {
|
} else {
|
||||||
return this._checkToken(token);
|
return this._checkToken(token).catch(() => {
|
||||||
|
return this.registerForToken();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +107,8 @@ class ScalarAuthClient {
|
||||||
)]).then(() => {
|
)]).then(() => {
|
||||||
return token;
|
return token;
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
57
test/ScalarAuthClient-test.js
Normal file
57
test/ScalarAuthClient-test.js
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import expect from 'expect';
|
||||||
|
|
||||||
|
import sinon from 'sinon';
|
||||||
|
|
||||||
|
import ScalarAuthClient from '../src/ScalarAuthClient';
|
||||||
|
import MatrixClientPeg from '../src/MatrixClientPeg';
|
||||||
|
import { stubClient } from './test-utils';
|
||||||
|
|
||||||
|
describe('ScalarAuthClient', function() {
|
||||||
|
let clientSandbox;
|
||||||
|
let sac;
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
sinon.stub(window.localStorage, 'getItem').withArgs('mx_scalar_token').returns('brokentoken');
|
||||||
|
clientSandbox = stubClient();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
clientSandbox.restore();
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should request a new token if the old one fails', async function() {
|
||||||
|
const sac = new ScalarAuthClient();
|
||||||
|
|
||||||
|
sac._getAccountName = sinon.stub();
|
||||||
|
sac._getAccountName.withArgs('brokentoken').rejects({
|
||||||
|
message: "Invalid token",
|
||||||
|
});
|
||||||
|
sac._getAccountName.withArgs('wokentoken').resolves(MatrixClientPeg.get().getUserId());
|
||||||
|
|
||||||
|
MatrixClientPeg.get().getOpenIdToken = sinon.stub().resolves('this is your openid token');
|
||||||
|
|
||||||
|
sac.exchangeForScalarToken = sinon.stub().withArgs('this is your openid token').resolves('wokentoken');
|
||||||
|
|
||||||
|
await sac.connect();
|
||||||
|
|
||||||
|
expect(sac.exchangeForScalarToken.calledWith('this is your openid token')).toBeTruthy();
|
||||||
|
expect(sac.scalarToken).toEqual('wokentoken');
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue