Skip to content

Commit

Permalink
Merge pull request #147 from zelcash/development
Browse files Browse the repository at this point in the history
v0.71.0
  • Loading branch information
TheTrunk committed Aug 31, 2020
2 parents 3ff6826 + 3950e39 commit 04fe1cd
Show file tree
Hide file tree
Showing 26 changed files with 3,639 additions and 925 deletions.
6 changes: 5 additions & 1 deletion ZelBack/config/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,13 @@ module.exports = {
portMax: 39999,
maxImageSize: 300000000, // 300mb
installation: {
probability: 100,
probability: 2, // 100
delay: 120, // in seconds
},
removal: {
probability: 20,
delay: 300,
},
blocksLasting: 22000, // registered app will live for 22000 of blocks 44000 minutes ~= 1 month
// every 100 blocks we run a check that deletes apps specifications and stops/removes the application from existence if it has been lastly updated more than 22k blocks ago
},
Expand Down
55 changes: 29 additions & 26 deletions ZelBack/src/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ module.exports = (app, expressWs) => {
app.get('/zelapps/listzelappsimages', (req, res) => {
zelappsService.listZelAppsImages(req, res);
});
app.get('/zelapps/installedzelapps', (req, res) => {
app.get('/zelapps/installedzelapps/:appname?', (req, res) => {
zelappsService.installedZelApps(req, res);
});
app.get('/zelapps/availablezelapps', (req, res) => {
Expand All @@ -254,9 +254,15 @@ module.exports = (app, expressWs) => {
app.get('/zelapps/permanentmessages', (req, res) => {
zelappsService.getZelAppsPermanentMessages(req, res);
});
app.get('/zelapps/globalspecifications', (req, res) => {
app.get('/zelapps/globalappsspecifications', (req, res) => {
zelappsService.getGlobalZelAppsSpecifications(req, res);
});
app.get('/zelapps/appspecifications/:appname?', (req, res) => {
zelappsService.getApplicationSpecificationAPI(req, res);
});
app.get('/zelapps/appowner/:appname?', (req, res) => {
zelappsService.getApplicationOwnerAPI(req, res);
});
app.get('/zelapps/hashes', (req, res) => {
zelappsService.getZelAppHashes(req, res);
});
Expand All @@ -266,6 +272,9 @@ module.exports = (app, expressWs) => {
app.get('/zelapps/locations', (req, res) => {
zelappsService.getZelAppsLocations(req, res);
});
app.post('/zelapps/calculateprice', (req, res) => { // returns price in zel for both new registration of zelapp and update of zelapp
zelappsService.getAppPrice(req, res);
});

// app.get('/explorer/allutxos', (req, res) => {
// explorerService.getAllUtxos(req, res);
Expand Down Expand Up @@ -656,52 +665,43 @@ module.exports = (app, expressWs) => {
explorerService.rescanExplorer(req, res);
});

app.get('/zelapps/zelapppull/:repotag?', (req, res) => { // TODO make me post, needs redoing
zelappsService.zelAppPull(req, res);
});
app.get('/zelapps/zelappstart/:container?', (req, res) => {
app.get('/zelapps/zelappstart/:appname?', (req, res) => {
zelappsService.zelAppStart(req, res);
});
app.get('/zelapps/zelappstop/:container?', (req, res) => {
app.get('/zelapps/zelappstop/:appname?', (req, res) => {
zelappsService.zelAppStop(req, res);
});
app.get('/zelapps/restartzelapp/:container?', (req, res) => {
app.get('/zelapps/zelapprestart/:appname?', (req, res) => {
zelappsService.zelAppRestart(req, res);
});
app.get('/zelapps/zelappkill/:container?', (req, res) => {
zelappsService.zelAppKill(req, res);
});
app.get('/zelapps/zelappcontainerremove/:container?', (req, res) => {
zelappsService.zelAppRemove(req, res);
});
app.get('/zelapps/zelapppause/:container?', (req, res) => {
app.get('/zelapps/zelapppause/:appname?', (req, res) => {
zelappsService.zelAppPause(req, res);
});
app.get('/zelapps/zelappunpause/:container?', (req, res) => {
app.get('/zelapps/zelappunpause/:appname?', (req, res) => {
zelappsService.zelAppUnpause(req, res);
});
app.get('/zelapps/zelapptop/:container?', (req, res) => {
app.get('/zelapps/zelapptop/:appname?', (req, res) => {
zelappsService.zelAppTop(req, res);
});
app.get('/zelapps/zelapplog/:container?', (req, res) => {
app.get('/zelapps/zelapplog/:appname?/:lines?', (req, res) => {
zelappsService.zelAppLog(req, res);
});
app.get('/zelapps/zelappinspect/:container?', (req, res) => { // TODO this shall require app owner privilege for all information
app.get('/zelapps/zelappinspect/:appname?', (req, res) => {
zelappsService.zelAppInspect(req, res);
});
app.get('/zelapps/zelappupdate/:container?/:cpus?/:memory?', (req, res) => { // TODO this shall require app owner privilege for all information
zelappsService.zelAppUpdate(req, res);
app.get('/zelapps/zelappstats/:appname?', (req, res) => {
zelappsService.zelAppStats(req, res);
});
app.get('/zelapps/zelappchanges/:appname?', (req, res) => {
zelappsService.zelAppChanges(req, res);
});
app.get('/zelapps/zelappexec/:container?/:cmd?/:env?', (req, res) => { // todo post, privileges
app.post('/zelapps/zelappexec', (req, res) => {
zelappsService.zelAppExec(req, res);
});
app.get('/zelapps/zelappremove/:zelapp?', (req, res) => {
zelappsService.removeZelAppLocallyApi(req, res);
});
app.get('/zelapps/zelappimageremove/:image?', (req, res) => {
zelappsService.zelAppImageRemove(req, res);
});
app.get('/zelapps/installtemporarylocalapp/zelFoldingAtHome', (req, res) => {
app.get('/zelapps/installtemporarylocalapp/FoldingAtHomeB', (req, res) => {
zelappsService.temporaryZelAppRegisterFunctionForFoldingAtHome(req, res);
});
app.get('/zelapps/installtemporarylocalapp/dibi-UND', (req, res) => {
Expand Down Expand Up @@ -771,6 +771,9 @@ module.exports = (app, expressWs) => {
app.post('/zelapps/zelappregister', (req, res) => {
zelappsService.registerZelAppGlobalyApi(req, res);
});
app.post('/zelapps/zelappupdate', (req, res) => {
zelappsService.updateZelAppGlobalyApi(req, res);
});

// POST PROTECTED API - ZelNode owner level
app.post('/zelcash/signrawtransaction', (req, res) => {
Expand Down
22 changes: 16 additions & 6 deletions ZelBack/src/services/explorerService.js
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ async function processBlock(blockHeight) {
addresses.push(receiver.scriptPubKey.addresses[0]);
if (receiver.scriptPubKey.addresses[0] === config.zelapps.address) {
// it is a zelapp message. Get Satoshi amount
isZelAppMessageValue = receiver.valueSat;
isZelAppMessageValue += receiver.valueSat;
}
}
if (receiver.scriptPubKey.asm) {
Expand All @@ -325,7 +325,7 @@ async function processBlock(blockHeight) {
await serviceHelper.updateOneInDatabase(database, addressTransactionIndexCollection, query, update, options);
}));
// MAY contain ZelApp transaction. Store it.
if (isZelAppMessageValue >= 10 && message.length === 64 && blockDataVerbose.height >= config.zelapps.epochstart) { // min of 10 zel had to be paid for us bothering checking
if (isZelAppMessageValue >= 1000000000 && message.length === 64 && blockDataVerbose.height >= config.zelapps.epochstart) { // min of 10 zel had to be paid for us bothering checking
const zelappTxRecord = {
txid: tx.txid, height: blockDataVerbose.height, hash: message, value: isZelAppMessageValue, message: false, // message is boolean saying if we already have it stored as permanent message
};
Expand Down Expand Up @@ -371,6 +371,16 @@ async function processBlock(blockHeight) {
zelappsService.expireGlobalApplications();
}
}
if (blockHeight % 11 === 0) {
if (blockDataVerbose.height >= config.zelapps.epochstart) {
zelappsService.checkAndRemoveApplicationInstance();
}
}
if (blockHeight % 9 === 0) {
if (blockDataVerbose.height >= config.zelapps.epochstart) {
zelappsService.reinstallOldApplications();
}
}
const scannedHeight = blockDataVerbose.height;
// update scanned Height in scannedBlockHeightCollection
const query = { generalScannedHeight: { $gte: 0 } };
Expand Down Expand Up @@ -884,7 +894,7 @@ async function checkBlockProcessingStopped(i, callback) {
}

async function stopBlockProcessing(req, res) {
const authorized = await serviceHelper.verifyPrivilege('zelteam', req);
const authorized = await serviceHelper.verifyPrivilege('adminandzelteam', req);
if (authorized === true) {
const i = 0;
checkBlockProcessingStopped(i, async (response) => {
Expand All @@ -898,7 +908,7 @@ async function stopBlockProcessing(req, res) {
}

async function restartBlockProcessing(req, res) {
const authorized = await serviceHelper.verifyPrivilege('zelteam', req);
const authorized = await serviceHelper.verifyPrivilege('adminandzelteam', req);
if (authorized === true) {
const i = 0;
checkBlockProcessingStopped(i, async () => {
Expand All @@ -913,7 +923,7 @@ async function restartBlockProcessing(req, res) {
}

async function reindexExplorer(req, res) {
const authorized = await serviceHelper.verifyPrivilege('zelteam', req);
const authorized = await serviceHelper.verifyPrivilege('adminandzelteam', req);
if (authorized === true) {
// stop block processing
const i = 0;
Expand Down Expand Up @@ -957,7 +967,7 @@ async function reindexExplorer(req, res) {

async function rescanExplorer(req, res) {
try {
const authorized = await serviceHelper.verifyPrivilege('zelteam', req);
const authorized = await serviceHelper.verifyPrivilege('adminandzelteam', req);
if (authorized === true) {
// since what blockheight
let { blockheight } = req.params; // we accept both help/command and help?command=getinfo
Expand Down
150 changes: 148 additions & 2 deletions ZelBack/src/services/serviceHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,26 @@ async function collectionStats(database, collection) {
return result;
}

// helper owner zelapp function
async function getApplicationOwner(appName) {
const db = databaseConnection();
const database = db.db(config.database.zelappsglobal.database);

const query = { name: new RegExp(`^${appName}$`, 'i') };
const projection = {
projection: {
_id: 0,
owner: 1,
},
};
const globalZelAppsInformation = config.database.zelappsglobal.collections.zelappsInformation;
const appSpecs = await findOneInDatabase(database, globalZelAppsInformation, query, projection);
if (appSpecs) {
return appSpecs.owner;
}
return null;
}

// Verification functions
async function verifyAdminSession(headers) {
if (headers && headers.zelidauth) {
Expand Down Expand Up @@ -268,6 +288,43 @@ async function verifyUserSession(headers) {
}

async function verifyZelTeamSession(headers) {
if (headers && headers.zelidauth) {
const auth = ensureObject(headers.zelidauth);
if (auth.zelid && auth.signature) {
if (auth.zelid === config.zelTeamZelId) {
const db = databaseConnection();
const database = db.db(config.database.local.database);
const collection = config.database.local.collections.loggedUsers;
const query = { $and: [{ signature: auth.signature }, { zelid: auth.zelid }] };
const projection = {};
const result = await findOneInDatabase(database, collection, query, projection);
const loggedUser = result;
if (loggedUser) {
// check if signature corresponds to message with that zelid
let valid = false;
try {
valid = bitcoinMessage.verify(loggedUser.loginPhrase, auth.zelid, auth.signature);
} catch (error) {
return false;
}
if (valid) {
// now we know this is indeed a logged zelteam
return true;
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
return false;
}

async function verifyAdminAndZelTeamSession(headers) {
if (headers && headers.zelidauth) {
const auth = ensureObject(headers.zelidauth);
if (auth.zelid && auth.signature) {
Expand All @@ -288,7 +345,7 @@ async function verifyZelTeamSession(headers) {
return false;
}
if (valid) {
// now we know this is indeed a logged admin
// now we know this is indeed a logged admin or zelteam
return true;
}
} else {
Expand All @@ -304,7 +361,83 @@ async function verifyZelTeamSession(headers) {
return false;
}

async function verifyPrivilege(privilege, req) {
async function verifyAppOwnerSession(headers, appName) {
if (headers && headers.zelidauth && appName) {
const auth = ensureObject(headers.zelidauth);
if (auth.zelid && auth.signature) {
const ownerZelID = await getApplicationOwner(appName);
if (auth.zelid === ownerZelID) {
const db = databaseConnection();
const database = db.db(config.database.local.database);
const collection = config.database.local.collections.loggedUsers;
const query = { $and: [{ signature: auth.signature }, { zelid: auth.zelid }] };
const projection = {};
const result = await findOneInDatabase(database, collection, query, projection);
const loggedUser = result;
if (loggedUser) {
// check if signature corresponds to message with that zelid
let valid = false;
try {
valid = bitcoinMessage.verify(loggedUser.loginPhrase, auth.zelid, auth.signature);
} catch (error) {
return false;
}
if (valid) {
// now we know this is indeed a logged application owner
return true;
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
return false;
}

async function verifyAppOwnerOrHigherSession(headers, appName) {
if (headers && headers.zelidauth && appName) {
const auth = ensureObject(headers.zelidauth);
if (auth.zelid && auth.signature) {
const ownerZelID = await getApplicationOwner(appName);
if (auth.zelid === ownerZelID || auth.zelid === config.zelTeamZelId || auth.zelid === userconfig.initial.zelid) {
const db = databaseConnection();
const database = db.db(config.database.local.database);
const collection = config.database.local.collections.loggedUsers;
const query = { $and: [{ signature: auth.signature }, { zelid: auth.zelid }] };
const projection = {};
const result = await findOneInDatabase(database, collection, query, projection);
const loggedUser = result;
if (loggedUser) {
// check if signature corresponds to message with that zelid
let valid = false;
try {
valid = bitcoinMessage.verify(loggedUser.loginPhrase, auth.zelid, auth.signature);
} catch (error) {
return false;
}
if (valid) {
// now we know this is indeed a logged application owner
return true;
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
return false;
}

async function verifyPrivilege(privilege, req, appName) {
let authorized;
switch (privilege) {
case 'admin':
Expand All @@ -313,6 +446,15 @@ async function verifyPrivilege(privilege, req) {
case 'zelteam':
authorized = await verifyZelTeamSession(req.headers).catch((error) => { throw error; });
break;
case 'adminandzelteam':
authorized = await verifyAdminAndZelTeamSession(req.headers).catch((error) => { throw error; });
break;
case 'appownerabove':
authorized = await verifyAppOwnerOrHigherSession(req.headers, appName).catch((error) => { throw error; });
break;
case 'appowner':
authorized = await verifyAppOwnerSession(req.headers, appName).catch((error) => { throw error; });
break;
case 'user':
authorized = await verifyUserSession(req.headers).catch((error) => { throw error; });
break;
Expand Down Expand Up @@ -421,6 +563,9 @@ module.exports = {
verifyAdminSession,
verifyUserSession,
verifyZelTeamSession,
verifyAdminAndZelTeamSession,
verifyAppOwnerOrHigherSession,
verifyAppOwnerSession,
verifyPrivilege,
signMessage,
verifyMessage,
Expand All @@ -434,4 +579,5 @@ module.exports = {
delay,
initiateDB,
databaseConnection,
getApplicationOwner,
};
Loading

0 comments on commit 04fe1cd

Please sign in to comment.