Skip to content

Commit

Permalink
fix(EntityManager): share user state between EntityManagers with shar…
Browse files Browse the repository at this point in the history
…ed credentials
  • Loading branch information
fbuecklers committed Apr 24, 2022
1 parent 643e73a commit a004f48
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 47 deletions.
38 changes: 25 additions & 13 deletions lib/EntityManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,12 @@ export class EntityManager extends Lockable {
*/
public File: FileFactory = null as any; // is never null after the em is ready

/**
* the shared connection data if this EntityManager shares the credentials with the EntityManagerFactory
* @private
*/
private connectData : ConnectData | null = null;

/**
* @param entityManagerFactory The factory which of this entityManager instance
*/
Expand All @@ -239,30 +245,30 @@ export class EntityManager extends Lockable {

/**
* Connects this entityManager, used for synchronous and asynchronous initialization
* @param connector
* @param connectData
* @param tokenStorage The used tokenStorage for token persistence
* @param useSharedTokenStorage Indicates if the shared credentials should be used
*/
connected(connector: Connector, connectData: ConnectData, tokenStorage: TokenStorage) {
this.connection = connector;
this.tokenStorage = tokenStorage;
connected(useSharedTokenStorage?: boolean) {
this.connection = this.entityManagerFactory.connection;
this.bloomFilterRefresh = this.entityManagerFactory.staleness!;
this.tokenStorage = useSharedTokenStorage
? this.entityManagerFactory.tokenStorage! : new TokenStorage(this.connection!.origin);
this.connectData = useSharedTokenStorage ? this.entityManagerFactory.connectData : null;

this.File = FileFactory.create(this);
this._createObjectFactory(this.metamodel.embeddables);
this._createObjectFactory(this.metamodel.entities);

if (connectData) {
if (connectData.device) {
this._updateDevice(connectData.device);
if (this.connectData) {
if (this.connectData.device) {
this._updateDevice(this.connectData.device);
}

if (connectData.user && tokenStorage.token) {
this._updateUser(connectData.user, true);
if (this.connectData.user) {
this._updateUser(this.connectData.user, true);
}

if (this.bloomFilterRefresh > 0 && connectData.bloomFilter && atob && !isNode) {
this._updateBloomFilter(connectData.bloomFilter);
if (this.bloomFilterRefresh > 0 && this.connectData.bloomFilter && atob && !isNode) {
this._updateBloomFilter(this.connectData.bloomFilter);
}
}
}
Expand Down Expand Up @@ -1060,6 +1066,9 @@ export class EntityManager extends Lockable {

if (updateMe) {
this.me = user;
if (this.connectData) {
this.connectData.user = obj;
}
}

return user;
Expand All @@ -1068,6 +1077,9 @@ export class EntityManager extends Lockable {
private _logout() {
this.me = null;
this.token = null;
if (this.connectData) {
delete this.connectData.user;
}
}

private _userRequest(msg: Message, loginOption?: LoginOption | boolean) {
Expand Down
14 changes: 3 additions & 11 deletions lib/EntityManagerFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class EntityManagerFactory extends Lockable {

public staleness: number | null = null;

public connectData?: ConnectData;
public connectData: ConnectData | null = null;

private [WS]?: WebSocketConnector;

Expand Down Expand Up @@ -230,18 +230,10 @@ export class EntityManagerFactory extends Lockable {
const em = new EntityManager(this);

if (this.isReady) {
em.connected(
this.connection!,
this.connectData!,
useSharedTokenStorage ? this.tokenStorage! : new TokenStorage(this.connection!.origin),
);
em.connected(useSharedTokenStorage);
} else {
em.withLock(() => this.ready().then(() => {
em.connected(
this.connection!,
this.connectData!,
useSharedTokenStorage ? this.tokenStorage! : new TokenStorage(this.connection!.origin),
);
em.connected(useSharedTokenStorage);
}), true);
}

Expand Down
7 changes: 0 additions & 7 deletions spec/connect.spec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
'use strict';

if (typeof module !== 'undefined') {
require('./node');
}
Expand Down Expand Up @@ -57,9 +55,4 @@ describe('Test Connect', function () {
expect(db.token).be.ok;
});
});

it('should set gzip flag', function () {
var connector = DB.connector.Connector.create(env.TEST_SERVER);
expect(connector.gzip).eql(typeof global === 'undefined');
});
});
60 changes: 44 additions & 16 deletions spec/user.spec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
'use strict';

if (typeof module !== 'undefined') {
require('./node');
}
Expand Down Expand Up @@ -414,7 +412,7 @@ describe('Test user and roles', function () {
it('should remove token if token is invalid', function () {
var login = helper.makeLogin();
return DB.User.register(login, 'secret').then(function () {
var token = DB.tokenStorage.token;
var { token } = DB.tokenStorage;
expect(token).be.ok;
DB.tokenStorage.update(token.substring(0, token.length - 1) + (token.substr(token.length - 1, token.length) === '0' ? '1' : '0'));
return DB.renew();
Expand Down Expand Up @@ -464,17 +462,47 @@ describe('Test user and roles', function () {
});
});

it('should autologin on when tokenStorage is true', function () {
it('should autologin on new EntityManager instance', function () {
var login = helper.makeLogin();
return DB.User.register(login, 'secret').then(function () {
var db = new DB.EntityManagerFactory(env.TEST_SERVER).createEntityManager(true);
var userId = DB.User.me.id;
expect(userId).be.ok;
expect(DB.entityManagerFactory.connectData.user).be.ok;
var db = DB.entityManagerFactory.createEntityManager(true);
return db.ready().then(function () {
expect(db.me).be.ok;
expect(db.me.id).eq(userId);
expect(db.token).be.ok;
});
});
});

it('should not login if sharedTokenStorage is logged out', function () {
var login = helper.makeLogin();
return DB.User.register(login, 'secret').then(function () {
expect(DB.entityManagerFactory.connectData.user).be.ok;
return DB.User.logout();
}).then(function () {
expect(DB.entityManagerFactory.connectData.user).be.not.ok;
var localDB = DB.entityManagerFactory.createEntityManager(true);
return localDB.ready().then(function () {
expect(localDB.me).be.not.ok;
expect(localDB.token).be.not.ok;
});
});
});

it('should autologin on when tokenStorage is true', function () {
var login = helper.makeLogin();
return DB.User.register(login, 'secret').then(function () {
var localDB = new DB.EntityManagerFactory(env.TEST_SERVER).createEntityManager(true);
return localDB.ready().then(function () {
expect(localDB.me).be.ok;
expect(localDB.token).be.ok;
});
});
});

it('should not autologin when tokenStorage is false', function () {
var login = helper.makeLogin();
return DB.User.register(login, 'secret').then(function () {
Expand All @@ -491,17 +519,17 @@ describe('Test user and roles', function () {
var user = new DB.User({ username: helper.makeLogin() });
return DB.User.register(user, 'secret', false).then(function (u) {
expect(u.username).eqls(user.username);
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
expect(sessionStorage.getItem(`BAT:${db.connection.origin}`)).be.ok;
});
});

it('should save token in local storage when register loginOption is true', function () {
var user = new DB.User({ username: helper.makeLogin() });
return DB.User.register(user, 'secret', true).then(function (u) {
expect(u.username).eqls(user.username);
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok;
expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.ok;
expect(sessionStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
});
});

Expand All @@ -512,8 +540,8 @@ describe('Test user and roles', function () {
return DB.User.login(username, 'secret', false);
}).then(function (u) {
expect(u.username).eqls(user.username);
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
expect(sessionStorage.getItem(`BAT:${db.connection.origin}`)).be.ok;
});
});

Expand All @@ -524,8 +552,8 @@ describe('Test user and roles', function () {
return DB.User.login(username, 'secret', true);
}).then(function (u) {
expect(u.username).eqls(user.username);
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok;
expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.ok;
expect(sessionStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
});
});

Expand All @@ -534,13 +562,13 @@ describe('Test user and roles', function () {
var user = new DB.User({ username: username });
return DB.User.register(user, 'secret').then(function () {
expect(DB.User.me).be.ok;
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.ok;
return DB.User.logout();
}).then(function () {
expect(DB.User.me).be.null;
expect(DB.token).be.null;
expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok;
expect(localStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
expect(sessionStorage.getItem(`BAT:${db.connection.origin}`)).be.not.ok;
});
});
}
Expand Down

0 comments on commit a004f48

Please sign in to comment.