Skip to content
This repository was archived by the owner on Sep 15, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 26 additions & 14 deletions auth/permission/permissionManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,16 @@ util.bitmaskToEnumString = function (bitmask, bitmaskEnum) {
}


function* uploadContract(admin, master) {
function* uploadContract(admin, master, chainId) {
// NOTE: in production, the contract is created and owned by the AdminInterface
// for testing purposes the creator is the admin user
const args = {
owner: admin.address,
master: master.address,
}
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args));
const doNotResolve = undefined;
const txParams = undefined;
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args), doNotResolve, txParams, chainId);
contract.src = 'removed';
return bind(admin, contract);
}
Expand All @@ -40,9 +42,9 @@ function* createPermissionsAdmin(admin, master, permissions) {
return contract;
}

function bind(admin, contract) {
function bind(admin, contract, chainId) {
contract.getState = function* () {
return yield rest.getState(contract);
return yield rest.getState(contract, chainId);
}
contract.grant = function* (args) {
return yield grant(admin, contract, args);
Expand Down Expand Up @@ -78,11 +80,13 @@ function bindAddress(admin, address) {

// throws: ErrorCodes
// returns: updated permissions
function* grant(admin, contract, args) {
function* grant(admin, contract, args, chainId) {
rest.verbose('grant', args);
// function grant(address _address, uint _permissions) returns (ErrorCodes) {
const method = 'grant';
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args));
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId);
if (restStatus != RestStatus.OK) {
throw new Error(restStatus);
}
Expand All @@ -91,11 +95,13 @@ function* grant(admin, contract, args) {

// throws: ErrorCodes
// returns: permissions
function* getPermissions(admin, contract, args) {
function* getPermissions(admin, contract, args, chainId) {
rest.verbose('getPermissions', args);
// function getPermissions(address _address) returns (ErrorCodes, uint) {
const method = 'getPermissions';
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args));
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId);
if (restStatus != RestStatus.OK) {
throw new rest.RestError(restStatus, method, args);
}
Expand All @@ -104,33 +110,39 @@ function* getPermissions(admin, contract, args) {

// throws: ErrorCodes
// returns: true if permitted
function* check(admin, contract, args) {
function* check(admin, contract, args, chainId) {
rest.verbose('check', args);
// function check(address _address, uint _permissions) returns (ErrorCodes) {
const method = 'check';
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args));
const value = undefined;
const doNotResolve = undefined;
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId);
if (restStatus != RestStatus.OK) {
return false;
}
return true;
}

// throws: ErrorCodes
function* revoke(admin, contract, args) {
function* revoke(admin, contract, args, chainId) {
rest.verbose('revoke', args);
// function revoke(address _address) returns (ErrorCodes) {
const method = 'revoke';
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args));
const value = undefined;
const doNotResolve = undefined;
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId);
if (restStatus != RestStatus.OK) {
throw new rest.RestError(restStatus, method, args);
}
return RestStatus.OK;
}

// transferOwnership
function* transferOwnership(admin, contract, args) {
function* transferOwnership(admin, contract, args, chainId) {
const method = "transferOwnership";
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args));
const value = undefined;
const doNotResolve = undefined;
const [restStatus] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId);
if (restStatus != RestStatus.OK) {
throw new rest.RestError(restStatus, method, args);
}
Expand Down
42 changes: 27 additions & 15 deletions auth/permission/permissionedHashmap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,22 @@ const { config, util } = ba.common
const contractName = 'PermissionedHashmap'
const contractFilename = `${config.libPath}/auth/permission/contracts/PermissionedHashmap.sol`

function* uploadContract(admin, permissionManager) {
function* uploadContract(admin, permissionManager, chainId) {
const args = { permissionManager: permissionManager.address }
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args))
const doNotResolve = undefined;
const txParams = undefined;
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args), doNotResolve, txParams, chainId)
contract.src = 'removed'
return bind(admin, contract)
}

function bind(admin, _contract) {
function bind(admin, _contract, chainId) {
const contract = _contract
contract.getState = function* () {
return yield rest.getState(contract)
return yield rest.getState(contract, chainId)
}
contract.getStateVar = function* (args) {
return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length)
return yield rest.getStateVar(contract, args.name, args.count, args.offset, args.length, chainId)
}
contract.put = function* (args) {
return yield put(admin, contract, args)
Expand Down Expand Up @@ -49,38 +51,48 @@ function bindAddress(admin, address) {
return bind(admin, contract)
}

function* put(admin, contract, args) {
function* put(admin, contract, args, chainId) {
rest.verbose('put', args)
const method = 'put'
const result = yield rest.callMethod(admin, contract, method, util.usc(args))
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
return result
}

function* get(admin, contract, args) {
function* get(admin, contract, args, chainId) {
rest.verbose('get', args)
const method = 'get'
const result = yield rest.callMethod(admin, contract, method, util.usc(args))
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
return result[0]
}

function* contains(admin, contract, args) {
function* contains(admin, contract, args, chainId) {
rest.verbose('contains', args)
const method = 'contains'
const result = yield rest.callMethod(admin, contract, method, util.usc(args))
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
return result[0] == true
}

function* size(admin, contract, args) {
function* size(admin, contract, args, chainId) {
rest.verbose('size', args)
const method = 'size'
const result = yield rest.callMethod(admin, contract, method, util.usc(args))
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
return parseInt(result[0], 10)
}

function* remove(admin, contract, args) {
function* remove(admin, contract, args, chainId) {
rest.verbose('remove', args)
const method = 'remove'
yield rest.callMethod(admin, contract, method, util.usc(args))
const value = undefined;
const doNotResolve = undefined;
yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
}

module.exports = {
Expand Down
42 changes: 30 additions & 12 deletions auth/permission/test/permissionManager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,11 @@ describe('PermissionManager tests', function() {
// transfer ownership to a new admin, by the master
{
const args = { newOwner: newOwner.address }
const method = 'transferOwnership'
const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args))
const method = 'transferOwnership';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.OK, 'should succeed')
}
})
Expand All @@ -190,27 +193,39 @@ describe('PermissionManager tests', function() {
yield contract.grant(args)
// new admin unauthorized
{
const method = 'grant'
const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args))
const method = 'grant';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail')
}
// transfer ownership - must be master
{
const args = { newOwner: newOwner.address }
const method = 'transferOwnership'
const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args))
const method = 'transferOwnership';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus] = yield rest.callMethod(master, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.OK, 'should succeed')
}
// old admin unauthorized
{
const method = 'grant'
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args))
const method = 'grant';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(admin, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail')
}
// new admin works
{
const method = 'grant'
const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args))
const method = 'grant';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(newOwner, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.OK, 'should succeed')
}
})
Expand All @@ -222,8 +237,11 @@ describe('PermissionManager tests', function() {
{
const attacker = yield rest.createUser('Attacker_' + uid, '' + uid)
const args = { newOwner: attacker.address }
const method = 'transferOwnership'
const [restStatus, permissions] = yield rest.callMethod(attacker, contract, method, util.usc(args))
const method = 'transferOwnership';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus, permissions] = yield rest.callMethod(attacker, contract, method, util.usc(args), value, doNotResolve, chainId)
assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail')
}
})
Expand Down
18 changes: 12 additions & 6 deletions auth/permission/test/permissionedHashmap.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,11 @@ describe('PermissionedHashmap tests', function() {
const contract = yield permissionedHashmapJs.uploadContract(admin, hashmapPermissionManager)
const iuid = util.iuid();
const args = factory.createEntity(iuid);
const method = 'put'
const result = yield rest.callMethod(attacker, contract, method, util.usc(args))
const method = 'put';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(attacker, contract, method, util.usc(args), value, doNotResolve, chainId)

const state = yield contract.getState();
assert.equal(state.values.length, 1, 'length 1 - did not put');
Expand Down Expand Up @@ -126,8 +129,11 @@ describe('PermissionedHashmap tests', function() {
assert.equal(result, true, 'contains: true');
}
// remove
const method = 'remove'
const result = yield rest.callMethod(attacker, contract, method, util.usc(args))
const method = 'remove';
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(attacker, contract, method, util.usc(args), value, doNotResolve, chainId)

yield contract.getState()
// still contained - was not removed
Expand All @@ -146,14 +152,14 @@ describe('PermissionedHashmap tests', function() {
* @returns {object} the contract
*/

function* createHashmapPermissionManager(admin, master) {
function* createHashmapPermissionManager(admin, master, doNotResolve, txParams, chainId) {
const contractName = 'HashmapPermissionManager';
const contractFilename = `${config.libPath}/auth/permission/test/fixtures/HashmapPermissionManager.sol`;
const args = {
owner: admin.address,
master: master.address,
}
const hashmapPermissionManager = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args));
const hashmapPermissionManager = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args), doNotResolve, txParams, chainId);
return hashmapPermissionManager
}

Expand Down
5 changes: 4 additions & 1 deletion auth/user/test/userManager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ describe('UserManager tests', function() {

// create user UNAUTHORIZED
const method = 'createUser';
const [restStatus, address] = yield rest.callMethod(attacker, contract, method, util.usc(args));
const chainId = '';
const value = undefined;
const doNotResolve = undefined;
const [restStatus, address] = yield rest.callMethod(attacker, contract, method, util.usc(args), value, doNotResolve, chainId);
assert.equal(restStatus, RestStatus.UNAUTHORIZED, 'should fail');
});

Expand Down
16 changes: 10 additions & 6 deletions auth/user/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@ const contractFilename = `${ba.common.cwd}/${config.libPath}/auth/user/contracts
const RestStatus = rest.getFields(`${config.libPath}/rest/contracts/RestStatus.sol`);
const UserRole = rest.getEnums(`${config.libPath}/auth/user/contracts/UserRole.sol`).UserRole;

function* uploadContract(admin, args) {
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args));
function* uploadContract(admin, args, chainId) {
const doNotResolve = undefined;
const txParams = undefined;
const contract = yield rest.uploadContract(admin, contractName, contractFilename, util.usc(args), doNotResolve, txParams, chainId);
yield compileSearch(contract);
contract.src = 'removed';
return bind(admin, contract);
}

function bind(admin, contract) {
function bind(admin, contract, chainId) {
contract.getState = function* () {
return yield rest.getState(contract);
return yield rest.getState(contract, chainId);
}
contract.authenticate = function* (pwHash) {
return yield authenticate(admin, contract, pwHash);
Expand Down Expand Up @@ -50,14 +52,16 @@ function* getUserByAddress(address) {
return (yield rest.waitQuery(`${contractName}?address=eq.${address}`, 1))[0];
}

function* authenticate(admin, contract, pwHash) {
function* authenticate(admin, contract, pwHash, chainId) {
rest.verbose('authenticate', pwHash);
// function authenticate(bytes32 _pwHash) return (bool) {
const method = 'authenticate';
const args = {
_pwHash: pwHash,
};
const result = yield rest.callMethod(admin, contract, method, args);
const value = undefined;
const doNotResolve = undefined;
const result = yield rest.callMethod(admin, contract, method, args, value, doNotResolve, chainId);
const isAuthenticated = (result[0] === true);
return isAuthenticated;
}
Expand Down
Loading