Add a route to kill tunnel if open with same JWT token
This commit is contained in:
+18
-1
@@ -2,6 +2,7 @@ import http from 'http';
|
||||
import Debug from 'debug';
|
||||
import pump from 'pump';
|
||||
import EventEmitter from 'events';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
// A client encapsulates req/res handling using an agent
|
||||
//
|
||||
@@ -13,6 +14,7 @@ class Client extends EventEmitter {
|
||||
|
||||
const agent = this.agent = options.agent;
|
||||
const id = this.id = options.id;
|
||||
this.securityToken = options.securityToken;
|
||||
|
||||
this.debug = Debug(`lt:Client[${this.id}]`);
|
||||
|
||||
@@ -45,6 +47,21 @@ class Client extends EventEmitter {
|
||||
});
|
||||
}
|
||||
|
||||
isSecurityTokenEqual(securityToken) {
|
||||
const decodeJWT = (token) => {
|
||||
return jwt.decode(token.replace(/Bearer /, ''), {complete: false});
|
||||
}
|
||||
if (this.securityToken === null) {
|
||||
return false;
|
||||
}
|
||||
try{
|
||||
return decodeJWT(this.securityToken).name === decodeJWT(securityToken).name;
|
||||
}catch(error){
|
||||
this.debug('error with jwt %s %s', securityToken, error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
stats() {
|
||||
return this.agent.stats();
|
||||
}
|
||||
@@ -129,4 +146,4 @@ class Client extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
export default Client;
|
||||
export default Client;
|
||||
|
||||
@@ -30,7 +30,7 @@ class ClientManager {
|
||||
// create a new tunnel with `id`
|
||||
// if the id is already used, a random id is assigned
|
||||
// if the tunnel could not be created, throws an error
|
||||
async newClient(id) {
|
||||
async newClient(id, securityToken) {
|
||||
const clients = this.clients;
|
||||
const stats = this.stats;
|
||||
|
||||
@@ -49,6 +49,7 @@ class ClientManager {
|
||||
const client = new Client({
|
||||
id,
|
||||
agent,
|
||||
securityToken
|
||||
});
|
||||
|
||||
// add to clients map immediately
|
||||
|
||||
@@ -11,22 +11,22 @@ describe('ClientManager', () => {
|
||||
|
||||
it('should create a new client with random id', async () => {
|
||||
const manager = new ClientManager();
|
||||
const client = await manager.newClient();
|
||||
const client = await manager.newClient(null, null);
|
||||
assert(manager.hasClient(client.id));
|
||||
manager.removeClient(client.id);
|
||||
});
|
||||
|
||||
it('should create a new client with id', async () => {
|
||||
const manager = new ClientManager();
|
||||
const client = await manager.newClient('foobar');
|
||||
const client = await manager.newClient('foobar', null);
|
||||
assert(manager.hasClient('foobar'));
|
||||
manager.removeClient('foobar');
|
||||
});
|
||||
|
||||
it('should create a new client with random id if previous exists', async () => {
|
||||
const manager = new ClientManager();
|
||||
const clientA = await manager.newClient('foobar');
|
||||
const clientB = await manager.newClient('foobar');
|
||||
const clientA = await manager.newClient('foobar', null);
|
||||
const clientB = await manager.newClient('foobar', null);
|
||||
assert(clientA.id, 'foobar');
|
||||
assert(manager.hasClient(clientB.id));
|
||||
assert(clientB.id != clientA.id);
|
||||
@@ -36,7 +36,7 @@ describe('ClientManager', () => {
|
||||
|
||||
it('should remove client once it goes offline', async () => {
|
||||
const manager = new ClientManager();
|
||||
const client = await manager.newClient('foobar');
|
||||
const client = await manager.newClient('foobar', null);
|
||||
|
||||
const socket = await new Promise((resolve) => {
|
||||
const netClient = net.createConnection({ port: client.port }, () => {
|
||||
@@ -57,8 +57,8 @@ describe('ClientManager', () => {
|
||||
|
||||
it('should remove correct client once it goes offline', async () => {
|
||||
const manager = new ClientManager();
|
||||
const clientFoo = await manager.newClient('foo');
|
||||
const clientBar = await manager.newClient('bar');
|
||||
const clientFoo = await manager.newClient('foo', null);
|
||||
const clientBar = await manager.newClient('bar', null);
|
||||
|
||||
const socket = await new Promise((resolve) => {
|
||||
const netClient = net.createConnection({ port: clientFoo.port }, () => {
|
||||
@@ -80,7 +80,7 @@ describe('ClientManager', () => {
|
||||
|
||||
it('should remove clients if they do not connect within 5 seconds', async () => {
|
||||
const manager = new ClientManager();
|
||||
const clientFoo = await manager.newClient('foo');
|
||||
const clientFoo = await manager.newClient('foo', null);
|
||||
assert(manager.hasClient('foo'));
|
||||
|
||||
// wait past grace period (1s)
|
||||
|
||||
Reference in New Issue
Block a user