mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-08-06 22:04:19 +00:00
add commands and scripts to create new user & assign roles and permissions
This commit is contained in:
parent
316aa018b1
commit
c5053f5480
@ -336,7 +336,7 @@ Get the browser location.hash. We don't use location.hash because of the way tha
|
|||||||
*/
|
*/
|
||||||
$tw.utils.getLocationHash = function() {
|
$tw.utils.getLocationHash = function() {
|
||||||
var href = window.location.href;
|
var href = window.location.href;
|
||||||
var idx = href.indexOf('#');
|
var idx = href.indexOf("#");
|
||||||
if(idx === -1) {
|
if(idx === -1) {
|
||||||
return "#";
|
return "#";
|
||||||
} else if(href.substr(idx + 1,1) === "#" || href.substr(idx + 1,3) === "%23") {
|
} else if(href.substr(idx + 1,1) === "#" || href.substr(idx + 1,3) === "%23") {
|
||||||
@ -605,7 +605,7 @@ var globalCheck =[
|
|||||||
" delete Object.prototype.__temp__;",
|
" delete Object.prototype.__temp__;",
|
||||||
" }",
|
" }",
|
||||||
" delete Object.prototype.__temp__;",
|
" delete Object.prototype.__temp__;",
|
||||||
].join('\n');
|
].join("\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Run code globally with specified context variables in scope
|
Run code globally with specified context variables in scope
|
||||||
@ -1997,7 +1997,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
|
|||||||
value = path.relative(rootPath, filename).split(path.sep).slice(0, -1);
|
value = path.relative(rootPath, filename).split(path.sep).slice(0, -1);
|
||||||
break;
|
break;
|
||||||
case "filepath":
|
case "filepath":
|
||||||
value = path.relative(rootPath, filename).split(path.sep).join('/');
|
value = path.relative(rootPath, filename).split(path.sep).join("/");
|
||||||
break;
|
break;
|
||||||
case "filename":
|
case "filename":
|
||||||
value = path.basename(filename);
|
value = path.basename(filename);
|
||||||
@ -2623,7 +2623,7 @@ $tw.boot.executeNextStartupTask = function(callback) {
|
|||||||
}
|
}
|
||||||
taskIndex++;
|
taskIndex++;
|
||||||
}
|
}
|
||||||
if(typeof callback === 'function') {
|
if(typeof callback === "function") {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -11,6 +11,18 @@
|
|||||||
"tiddlywiki/snowwhite"
|
"tiddlywiki/snowwhite"
|
||||||
],
|
],
|
||||||
"build": {
|
"build": {
|
||||||
|
"--mws-list-users": [
|
||||||
|
"--mws-list-users"
|
||||||
|
],
|
||||||
|
"mws-add-user": [
|
||||||
|
"--mws-add-permission", "READ", "Allows user to create tiddlers",
|
||||||
|
"--mws-add-permission", "WRITE", "Gives the user the permission to edit and delete tiddlers",
|
||||||
|
"--mws-add-role", "ADMIN", "System Administrator",
|
||||||
|
"--mws-assign-role-permission", "ADMIN", "READ",
|
||||||
|
"--mws-assign-role-permission", "ADMIN", "WRITE",
|
||||||
|
"--mws-add-user", "user", "pass123",
|
||||||
|
"--mws-assign-user-role", "user", "ADMIN"
|
||||||
|
],
|
||||||
"load-mws-demo-data": [
|
"load-mws-demo-data": [
|
||||||
"--mws-load-wiki-folder","./editions/tw5.com","docs", "TiddlyWiki Documentation from https://tiddlywiki.com","docs","TiddlyWiki Documentation from https://tiddlywiki.com",
|
"--mws-load-wiki-folder","./editions/tw5.com","docs", "TiddlyWiki Documentation from https://tiddlywiki.com","docs","TiddlyWiki Documentation from https://tiddlywiki.com",
|
||||||
"--mws-load-wiki-folder","./editions/dev","dev","TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev","dev-docs", "TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev",
|
"--mws-load-wiki-folder","./editions/dev","dev","TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev","dev-docs", "TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev",
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
"start": "node ./tiddlywiki.js ./editions/multiwikiserver --mws-load-plugin-bags --build load-mws-demo-data --mws-listen",
|
"start": "node ./tiddlywiki.js ./editions/multiwikiserver --mws-load-plugin-bags --build load-mws-demo-data --mws-listen",
|
||||||
"build:test-edition": "node ./tiddlywiki.js ./editions/test --verbose --version --build index",
|
"build:test-edition": "node ./tiddlywiki.js ./editions/test --verbose --version --build index",
|
||||||
"test:multiwikiserver-edition": "node ./tiddlywiki.js ./editions/multiwikiserver/ --build load-mws-demo-data --mws-listen --mws-test-server http://127.0.0.1:8080/ --quit",
|
"test:multiwikiserver-edition": "node ./tiddlywiki.js ./editions/multiwikiserver/ --build load-mws-demo-data --mws-listen --mws-test-server http://127.0.0.1:8080/ --quit",
|
||||||
|
"mws-add-user": "node ./tiddlywiki.js ./editions/multiwikiserver --build load-mws-demo-data --mws-listen --build mws-add-user --quit",
|
||||||
"test": "npm run build:test-edition && npm run test:multiwikiserver-edition",
|
"test": "npm run build:test-edition && npm run test:multiwikiserver-edition",
|
||||||
"lint:fix": "eslint . --fix",
|
"lint:fix": "eslint . --fix",
|
||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-add-permission.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to create a permission
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-add-permission",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.params.length < 2) {
|
||||||
|
return "Usage: --mws-add-permission <permission_name> <description>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var permission_name = this.params[0];
|
||||||
|
var description = this.params[1];
|
||||||
|
|
||||||
|
$tw.mws.store.sqlTiddlerDatabase.createPermission(permission_name, description);
|
||||||
|
|
||||||
|
console.log(permission_name+" Permission Created Successfully!")
|
||||||
|
self.callback();
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1,49 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-add-role.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to create a role
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-add-role",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.params.length < 2) {
|
||||||
|
return "Usage: --mws-add-role <role_name> <description>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var role_name = this.params[0];
|
||||||
|
var description = this.params[1];
|
||||||
|
|
||||||
|
$tw.mws.store.sqlTiddlerDatabase.createRole(role_name, description);
|
||||||
|
|
||||||
|
console.log(role_name+" Role Created Successfully!")
|
||||||
|
self.callback(null, "Role Created Successfully!");
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1,58 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-add-user.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to create users and grant permission
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var crypto = require("crypto");
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-add-user",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.params.length < 2) {
|
||||||
|
return "Usage: --mws-add-user <username> <password> [email]";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var username = this.params[0];
|
||||||
|
var password = this.params[1];
|
||||||
|
var email = this.params[2] || username + "@tiddlywiki.com";
|
||||||
|
var hashedPassword = crypto.createHash("sha256").update(password).digest("hex");
|
||||||
|
|
||||||
|
var user = $tw.mws.store.sqlTiddlerDatabase.getUserByUsername(username);
|
||||||
|
|
||||||
|
if(user) {
|
||||||
|
self.callback("WARNING: An account with the username (" + username + ") already exists");
|
||||||
|
} else {
|
||||||
|
$tw.mws.store.sqlTiddlerDatabase.createUser(username, email, hashedPassword);
|
||||||
|
console.log("User Account Created Successfully!")
|
||||||
|
self.callback();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1,62 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-assign-role-permission.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to assign permission to a role
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-assign-role-permission",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.params.length < 2) {
|
||||||
|
return "Usage: --mws-assign-role-permission <role_name> <permission_name>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var role_name = this.params[0];
|
||||||
|
var permission_name = this.params[1];
|
||||||
|
var role = $tw.mws.store.sqlTiddlerDatabase.getRoleByName(role_name);
|
||||||
|
var permission = $tw.mws.store.sqlTiddlerDatabase.getPermissionByName(permission_name);
|
||||||
|
|
||||||
|
if(!role) {
|
||||||
|
return "Error: Unable to find Role: "+role_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!permission) {
|
||||||
|
return "Error: Unable to find Permission: "+permission_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
var permission = $tw.mws.store.sqlTiddlerDatabase.getPermissionByName(permission_name);
|
||||||
|
|
||||||
|
|
||||||
|
$tw.mws.store.sqlTiddlerDatabase.addPermissionToRole(role.role_id, permission.permission_id);
|
||||||
|
|
||||||
|
console.log(permission_name+" permission assigned to "+role_name+" role successfully!")
|
||||||
|
self.callback();
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1,59 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-assign-user-role.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to assign a role to a user
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-assign-user-role",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.params.length < 2) {
|
||||||
|
return "Usage: --mws-assign-user-role <username> <role_name>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var username = this.params[0];
|
||||||
|
var role_name = this.params[1];
|
||||||
|
var role = $tw.mws.store.sqlTiddlerDatabase.getRoleByName(role_name);
|
||||||
|
var user = $tw.mws.store.sqlTiddlerDatabase.getUserByUsername(username);
|
||||||
|
|
||||||
|
if(!role) {
|
||||||
|
return "Error: Unable to find Role: "+role_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!user) {
|
||||||
|
return "Error: Unable to find user with the username "+username;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tw.mws.store.sqlTiddlerDatabase.addRoleToUser(user.user_id, role.role_id);
|
||||||
|
|
||||||
|
console.log(role_name+" role has been assigned to user with username "+username)
|
||||||
|
self.callback();
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1,46 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/plugins/tiddlywiki/multiwikiserver/commands/mws-list-users.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: command
|
||||||
|
|
||||||
|
Command to list users
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.info = {
|
||||||
|
name: "mws-list-users",
|
||||||
|
synchronous: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Command = function(params,commander,callback) {
|
||||||
|
this.params = params;
|
||||||
|
this.commander = commander;
|
||||||
|
this.callback = callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
Command.prototype.execute = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(!$tw.mws || !$tw.mws.store || !$tw.mws.store.sqlTiddlerDatabase) {
|
||||||
|
return "Error: MultiWikiServer or SQL database not initialized.";
|
||||||
|
}
|
||||||
|
|
||||||
|
var users = $tw.mws.store.sqlTiddlerDatabase.listUsers().map(function(user){
|
||||||
|
return ({
|
||||||
|
username: user.username,
|
||||||
|
email: user.email,
|
||||||
|
created_at: user.created_at,
|
||||||
|
})
|
||||||
|
});
|
||||||
|
console.log("Users:", users);
|
||||||
|
self.callback(null, "Users retrieved successfully:\n" + JSON.stringify(users, null, 2));
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
@ -19,8 +19,6 @@ exports.path = /^\/admin\/users\/([^\/]+)\/?$/;
|
|||||||
|
|
||||||
exports.handler = function(request,response,state) {
|
exports.handler = function(request,response,state) {
|
||||||
var user_id = $tw.utils.decodeURIComponentSafe(state.params[0]);
|
var user_id = $tw.utils.decodeURIComponentSafe(state.params[0]);
|
||||||
console.log("user_id =>", user_id)
|
|
||||||
|
|
||||||
var userData = state.server.sqlTiddlerDatabase.getUser(user_id);
|
var userData = state.server.sqlTiddlerDatabase.getUser(user_id);
|
||||||
|
|
||||||
if(!userData) {
|
if(!userData) {
|
||||||
|
@ -924,7 +924,7 @@ SqlTiddlerDatabase.prototype.listGroups = function() {
|
|||||||
// Role CRUD operations
|
// Role CRUD operations
|
||||||
SqlTiddlerDatabase.prototype.createRole = function(roleName, description) {
|
SqlTiddlerDatabase.prototype.createRole = function(roleName, description) {
|
||||||
const result = this.engine.runStatement(`
|
const result = this.engine.runStatement(`
|
||||||
INSERT INTO roles (role_name, description)
|
INSERT OR IGNORE INTO roles (role_name, description)
|
||||||
VALUES ($roleName, $description)
|
VALUES ($roleName, $description)
|
||||||
`, {
|
`, {
|
||||||
$roleName: roleName,
|
$roleName: roleName,
|
||||||
@ -941,6 +941,14 @@ SqlTiddlerDatabase.prototype.getRole = function(roleId) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SqlTiddlerDatabase.prototype.getRoleByName = function(roleName) {
|
||||||
|
return this.engine.runStatementGet(`
|
||||||
|
SELECT * FROM roles WHERE role_name = $roleName
|
||||||
|
`, {
|
||||||
|
$roleName: roleName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
SqlTiddlerDatabase.prototype.updateRole = function(roleId, roleName, description) {
|
SqlTiddlerDatabase.prototype.updateRole = function(roleId, roleName, description) {
|
||||||
this.engine.runStatement(`
|
this.engine.runStatement(`
|
||||||
UPDATE roles
|
UPDATE roles
|
||||||
@ -970,8 +978,8 @@ SqlTiddlerDatabase.prototype.listRoles = function() {
|
|||||||
// Permission CRUD operations
|
// Permission CRUD operations
|
||||||
SqlTiddlerDatabase.prototype.createPermission = function(permissionName, description) {
|
SqlTiddlerDatabase.prototype.createPermission = function(permissionName, description) {
|
||||||
const result = this.engine.runStatement(`
|
const result = this.engine.runStatement(`
|
||||||
INSERT INTO permissions (permission_name, description)
|
INSERT OR IGNORE INTO permissions (permission_name, description)
|
||||||
VALUES ($permissionName, $description)
|
VALUES ($permissionName, $description)
|
||||||
`, {
|
`, {
|
||||||
$permissionName: permissionName,
|
$permissionName: permissionName,
|
||||||
$description: description
|
$description: description
|
||||||
@ -987,6 +995,14 @@ SqlTiddlerDatabase.prototype.getPermission = function(permissionId) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SqlTiddlerDatabase.prototype.getPermissionByName = function(permissionName) {
|
||||||
|
return this.engine.runStatementGet(`
|
||||||
|
SELECT * FROM permissions WHERE permission_name = $permissionName
|
||||||
|
`, {
|
||||||
|
$permissionName: permissionName
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
SqlTiddlerDatabase.prototype.updatePermission = function(permissionId, permissionName, description) {
|
SqlTiddlerDatabase.prototype.updatePermission = function(permissionId, permissionName, description) {
|
||||||
this.engine.runStatement(`
|
this.engine.runStatement(`
|
||||||
UPDATE permissions
|
UPDATE permissions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user