mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 15:42:59 +00:00 
			
		
		
		
	Fix server options (#5899)
* removed illegal cahracter in filename
* fixes required plugin options & updates docs
* Update dev docs
* call self.displayError
* Revert "call self.displayError"
This reverts commit 5d599aa979.
* adds path based auth (backwards compatible)
* refactor per-route auth
* get status bug
* server options
* server options
* server options, new 'server-settings' param
* reflow
* fix boot.origin
* refactor new parameters
* restore sitetitle as servername option
* Soft reset to master
* docs update
* tweak wording
* docs
* cleanup
* remove literal string
* cleanup docs
* formatting
* Remove per-path auth
* revert get-status
* fold in PR 5538
* remove server-options
* remove doc
* required-plugins a server-parameter, not option
			
			
This commit is contained in:
		| @@ -34,7 +34,6 @@ function Server(options) { | ||||
| 	this.authenticators = options.authenticators || []; | ||||
| 	this.wiki = options.wiki; | ||||
| 	this.boot = options.boot || $tw.boot; | ||||
| 	this.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText("$:/SiteTitle") || "TiddlyWiki5"); | ||||
| 	// Initialise the variables | ||||
| 	this.variables = $tw.utils.extend({},this.defaultVariables); | ||||
| 	if(options.variables) { | ||||
| @@ -44,7 +43,8 @@ function Server(options) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	$tw.utils.extend({},this.defaultVariables,options.variables); | ||||
| 	// Setup the default required plugins | ||||
| 	this.requiredPlugins = this.get("required-plugins").split(','); | ||||
| 	// Initialise CSRF | ||||
| 	this.csrfDisable = this.get("csrf-disable") === "yes"; | ||||
| 	// Initialize Gzip compression | ||||
| @@ -52,14 +52,24 @@ function Server(options) { | ||||
| 	// Initialize browser-caching | ||||
| 	this.enableBrowserCache = this.get("use-browser-cache") === "yes"; | ||||
| 	// Initialise authorization | ||||
| 	var authorizedUserName = (this.get("username") && this.get("password")) ? this.get("username") : "(anon)"; | ||||
| 	var authorizedUserName; | ||||
| 	if(this.get("username") && this.get("password")) { | ||||
| 		authorizedUserName = this.get("username"); | ||||
| 	} else if(this.get("credentials")) { | ||||
| 		authorizedUserName = "(authenticated)"; | ||||
| 	} else { | ||||
| 		authorizedUserName = "(anon)"; | ||||
| 	} | ||||
| 	this.authorizationPrincipals = { | ||||
| 		readers: (this.get("readers") || authorizedUserName).split(",").map($tw.utils.trim), | ||||
| 		writers: (this.get("writers") || authorizedUserName).split(",").map($tw.utils.trim) | ||||
| 	} | ||||
| 	if(this.get("admin") || authorizedUserName !== "(anon)") { | ||||
| 		this.authorizationPrincipals["admin"] = (this.get("admin") || authorizedUserName).split(',').map($tw.utils.trim) | ||||
| 	} | ||||
| 	// Load and initialise authenticators | ||||
| 	$tw.modules.forEachModuleOfType("authenticator", function(title,authenticatorDefinition) { | ||||
| 		// console.log("Loading server route " + title); | ||||
| 		// console.log("Loading authenticator " + title); | ||||
| 		self.addAuthenticator(authenticatorDefinition.AuthenticatorClass); | ||||
| 	}); | ||||
| 	// Load route handlers | ||||
| @@ -71,15 +81,21 @@ function Server(options) { | ||||
| 	this.listenOptions = null; | ||||
| 	this.protocol = "http"; | ||||
| 	var tlsKeyFilepath = this.get("tls-key"), | ||||
| 		tlsCertFilepath = this.get("tls-cert"); | ||||
| 		tlsCertFilepath = this.get("tls-cert"), | ||||
| 		tlsPassphrase = this.get("tls-passphrase"); | ||||
| 	if(tlsCertFilepath && tlsKeyFilepath) { | ||||
| 		this.listenOptions = { | ||||
| 			key: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),"utf8"), | ||||
| 			cert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),"utf8") | ||||
| 			cert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),"utf8"), | ||||
| 			passphrase: tlsPassphrase || '' | ||||
| 		}; | ||||
| 		this.protocol = "https"; | ||||
| 	} | ||||
| 	this.transport = require(this.protocol); | ||||
| 	// Name the server and init the boot state | ||||
| 	this.servername = $tw.utils.transliterateToSafeASCII(this.get("server-name") || this.wiki.getTiddlerText("$:/SiteTitle") || "TiddlyWiki5"); | ||||
| 	this.boot.origin = this.get("origin")? this.get("origin"): this.protocol+"://"+this.get("host")+":"+this.get("port"); | ||||
| 	this.boot.pathPrefix = this.get("path-prefix") || ""; | ||||
| } | ||||
|  | ||||
| /* | ||||
| @@ -150,6 +166,7 @@ function sendResponse(request,response,statusCode,headers,data,encoding) { | ||||
| Server.prototype.defaultVariables = { | ||||
| 	port: "8080", | ||||
| 	host: "127.0.0.1", | ||||
| 	"required-plugins": "$:/plugins/tiddlywiki/filesystem,$:/plugins/tiddlywiki/tiddlyweb", | ||||
| 	"root-tiddler": "$:/core/save/all", | ||||
| 	"root-render-type": "text/plain", | ||||
| 	"root-serve-type": "text/html", | ||||
| @@ -239,15 +256,15 @@ Server.prototype.requestHandler = function(request,response,options) { | ||||
| 	state.pathPrefix = options.pathPrefix || this.get("path-prefix") || ""; | ||||
| 	state.sendResponse = sendResponse.bind(self,request,response); | ||||
| 	// Get the principals authorized to access this resource | ||||
| 	var authorizationType = this.methodMappings[request.method] || "readers"; | ||||
| 	state.authorizationType = options.authorizationType || this.methodMappings[request.method] || "readers"; | ||||
| 	// Check for the CSRF header if this is a write | ||||
| 	if(!this.csrfDisable && authorizationType === "writers" && request.headers["x-requested-with"] !== "TiddlyWiki") { | ||||
| 	if(!this.csrfDisable && state.authorizationType === "writers" && request.headers["x-requested-with"] !== "TiddlyWiki") { | ||||
| 		response.writeHead(403,"'X-Requested-With' header required to login to '" + this.servername + "'"); | ||||
| 		response.end(); | ||||
| 		return; | ||||
| 	} | ||||
| 	// Check whether anonymous access is granted | ||||
| 	state.allowAnon = this.isAuthorized(authorizationType,null); | ||||
| 	state.allowAnon = this.isAuthorized(state.authorizationType,null); | ||||
| 	// Authenticate with the first active authenticator | ||||
| 	if(this.authenticators.length > 0) { | ||||
| 		if(!this.authenticators[0].authenticateRequest(request,response,state)) { | ||||
| @@ -256,7 +273,7 @@ Server.prototype.requestHandler = function(request,response,options) { | ||||
| 		} | ||||
| 	} | ||||
| 	// Authorize with the authenticated username | ||||
| 	if(!this.isAuthorized(authorizationType,state.authenticatedUsername)) { | ||||
| 	if(!this.isAuthorized(state.authorizationType,state.authenticatedUsername)) { | ||||
| 		response.writeHead(401,"'" + state.authenticatedUsername + "' is not authorized to access '" + this.servername + "'"); | ||||
| 		response.end(); | ||||
| 		return; | ||||
| @@ -322,8 +339,16 @@ Server.prototype.listen = function(port,host,prefix) { | ||||
| 		port = process.env[port] || 8080; | ||||
| 	} | ||||
| 	// Warn if required plugins are missing | ||||
| 	if(!this.wiki.getTiddler("$:/plugins/tiddlywiki/tiddlyweb") || !this.wiki.getTiddler("$:/plugins/tiddlywiki/filesystem")) { | ||||
| 		$tw.utils.warning("Warning: Plugins required for client-server operation (\"tiddlywiki/filesystem\" and \"tiddlywiki/tiddlyweb\") are missing from tiddlywiki.info file"); | ||||
| 	var missing = []; | ||||
| 	for (var index=0; index<this.requiredPlugins.length; index++) { | ||||
| 		if (!this.wiki.getTiddler(this.requiredPlugins[index])) { | ||||
| 			missing.push(this.requiredPlugins[index]); | ||||
| 		} | ||||
| 	} | ||||
| 	if(missing.length > 0) { | ||||
| 		var error = "Warning: Plugin(s) required for client-server operation are missing.\n"+ | ||||
| 			"\""+ missing.join("\", \"")+"\""; | ||||
| 		$tw.utils.warning(error); | ||||
| 	} | ||||
| 	// Create the server | ||||
| 	var server; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Joshua Fontany
					Joshua Fontany