From 836189329de43906169ab26fa44396b53b91b713 Mon Sep 17 00:00:00 2001 From: onefang Date: Wed, 7 Aug 2019 00:12:46 +1000 Subject: The beginnings of an account management web page. Just some simple dynamic pages that don't actually do anything. --- .../Server/Handlers/Web/WebServerInConnector.cs | 207 ++++++++++++++++++--- 1 file changed, 183 insertions(+), 24 deletions(-) (limited to 'OpenSim/Server/Handlers/Web/WebServerInConnector.cs') diff --git a/OpenSim/Server/Handlers/Web/WebServerInConnector.cs b/OpenSim/Server/Handlers/Web/WebServerInConnector.cs index 52ee9ae..8c14fde 100644 --- a/OpenSim/Server/Handlers/Web/WebServerInConnector.cs +++ b/OpenSim/Server/Handlers/Web/WebServerInConnector.cs @@ -51,7 +51,7 @@ namespace OpenSim.Server.Handlers.Web private IConfigSource m_Config; protected MySQLGenericHandler m_Database = null; private Hashtable mime = new Hashtable(); - private Hashtable ssi = new Hashtable(); + private Hashtable ssi = new Hashtable(); public WebServerInConnector(IConfigSource config, IHttpServer server, string configName) : base(config, server, configName) { @@ -76,12 +76,12 @@ namespace OpenSim.Server.Handlers.Web throw new Exception("No StorageProvider configured"); //// TODO - Should do the plugin thing to pick between database backends. +//// Or not, we are all using MariaDB anyway. // m_Database = LoadPlugin(dllName, new Object[] { connString }); m_Database = new MySQLGenericHandler(connString); if (m_Database == null) throw new Exception("Could not find a storage interface in the given module " + dllName); - mime.Add(".gz", "application/gzip"); mime.Add(".js", "application/javascript"); mime.Add(".json", "application/json"); @@ -135,41 +135,200 @@ namespace OpenSim.Server.Handlers.Web string method = (string) request["http-method"]; string type = (string) request["content-type"]; string body = (string) request["body"]; - string file = Path.Combine(Util.webDir(), reqpath.Remove(0, 5)); + string file = reqpath.Remove(0, 5); + string path = Path.Combine(Util.webDir(), file); + + m_log.InfoFormat("[WEB SERVICE]: {0} method path {1} type {2} body {3}.", method, reqpath, type, body); + foreach (DictionaryEntry h in headers) + m_log.InfoFormat("[WEB SERVICE]: {0} method path {1} header {2} = {3}", method, reqpath, (string) h.Key, (string) h.Value); + foreach (String q in query) + m_log.InfoFormat("[WEB SERVICE]: {0} method path {1} query {2}", method, reqpath, q); reply["int_response_code"] = 200; - if (File.Exists(file)) - { - string m = (string) mime[Path.GetExtension(file).ToLower()]; - reply["content_type"] = m; - if ((null == m) || ("text/" != m.Substring(0, 5))) - { - reply["bin_response_data"] = File.ReadAllBytes(file); - } - else + if ("GET" == method) + { + if (File.Exists(path)) { - StreamReader csr = File.OpenText(file); - string content = csr.ReadToEnd(); - // Slow and wasteful, but I'm expecting only tiny web files, not accessed very often. - foreach (DictionaryEntry v in ssi) + string m = (string) mime[Path.GetExtension(path).ToLower()]; + reply["content_type"] = m; + if ((null == m) || ("text/" != m.Substring(0, 5))) + reply["bin_response_data"] = File.ReadAllBytes(path); + else { - content = content.Replace("", (string) v.Value); + StreamReader csr = File.OpenText(path); + string content = csr.ReadToEnd(); + // Slow and wasteful, but I'm expecting only tiny web files, not accessed very often. + foreach (DictionaryEntry v in ssi) + { + content = content.Replace("", (string) v.Value); + } + reply["str_response_string"] = content; + csr.Close(); } - reply["str_response_string"] = content; - csr.Close(); } - } - else + else + { + if ("account.html" == file) + reply["str_response_string"] = loginPage(null, ""); + else + { + m_log.ErrorFormat("[WEB SERVICE]: Unable to read {0}.", path); + reply["int_response_code"] = 404; + reply["content_type"] = "text/html"; + reply["str_response_string"] = "404 Unknown page" + + "404 error, can't find the " + reqpath + " page.

 

"; + } + } + } + else if ("POST" == method) { - m_log.ErrorFormat("[WEB SERVICE]: Unable to read {0}.", file); + Hashtable fields = new Hashtable(); + string[] bdy = body.Split('&'); + body = ""; + foreach (String bd in bdy) + { + string[] b = bd.Split('='); + if (b.Length == 0) + continue; + String n = System.Web.HttpUtility.UrlDecode(b[0]); + String v = ""; + if (b.Length > 1) + v = System.Web.HttpUtility.UrlDecode(b[1]); + fields[n] = v; + body = body + "

" + n + " = " + v + "

\n"; + } + + if ("account.html" == file) + { + if ("logout" == fields["doit"].ToString()) + reply["str_response_string"] = loginPage(null, "Logged out."); + else if ("create" == fields["doit"].ToString()) + { + if ("" == fields["email"].ToString()) + reply["str_response_string"] = loginPage(fields, "Please supply an email address when creating an account."); + else + { + reply["str_response_string"] = loggedOnPage(body, fields); + } + } + else + { + reply["str_response_string"] = loggedOnPage(body, fields); + } + } + else + { + m_log.ErrorFormat("[WEB SERVICE]: No such POST target {0}.", path); + reply["int_response_code"] = 404; + reply["content_type"] = "text/html"; + reply["str_response_string"] = "404 Unknown page" + + "404 error, can't find the " + reqpath + " page.

 

"; + } + } + else + { + m_log.ErrorFormat("[WEB SERVICE]: UNKNOWN method {0} path {1}.", method, reqpath); reply["int_response_code"] = 404; reply["content_type"] = "text/html"; - reply["str_response_string"] = "404 Unknown page" + - "404 error, can't find the " + reqpath + " page.

 

"; + reply["str_response_string"] = "Unknown method" + + "HUH! For " + reqpath + " page.

 

"; } + m_log.Info("[WEB SERVICE]: "); return reply; } + private string loginPage(Hashtable fields, string message) + { + string f = ""; + string l = ""; + string e = ""; + if (null != fields) + { + f = fields["firstName"].ToString(); + l = fields["lastName"].ToString(); + e = fields["email"].ToString(); + } + return header(ssi["grid"] + " account") + + form("account.html", "", + text("text", "first name", "firstName", f, 16, true) + + text("text", "last name", "lastName", l, 16, true) + + text("email", "email", "email", e, 0, false) + + text("password", "password", "password", "", 14,true) + + button("create") + + button("login") + ) + + "

" + message + "

" + + footer(); + } + + private string loggedOnPage(string body, Hashtable fields) + { + return header(ssi["grid"] + " account") + + "

" + ssi["grid"] + " account for " + fields["firstName"].ToString() + " " + fields["lastName"].ToString() + "

" + + form("account.html", fields["token"].ToString(), + hidden("firstName", fields["firstName"].ToString()) + + hidden("lastName", fields["lastName"].ToString()) + + text("email", "email", "email", fields["email"].ToString(), 0, false) + + text("password", "password", "password", "", 14, false) + + select("type", "type", + option("", false) + + option("approved", true) + + option("disabled", false) + + option("god", false) + ) + + button("delete") + + button("list") + + button("logout") +// + button("read") + + button("update") + ) + + body + + footer(); + } + + private string header(string title) + { + return "\n \n " + title + "\n \n \n"; + } + private string form(string action, string token, string form) + { + return "
\n" + hidden("token", token) + form + "
\n"; + } + private string hidden(string name, string val) + { + return " \n"; + } + private string text(string type, string title, string name, string val, int max, bool required) + { + string extra = ""; + if (0 < max) + extra = extra + " maxlength=\"" + max.ToString() + "\""; + if (required) + extra = extra + " required"; + if ("" != val) + val = "value=\"" + val + "\""; + return "

" + title + " :

\n"; + } + private string select(string title, string name, string options) + { + return "

" + title + " : \n \n

\n"; + } + private string option(string title, bool selected) + { + string sel = ""; + if (selected) + sel = " selected"; + return " \n"; + } + private string button(string title) + { + return " \n"; + } + private string footer() + { + return " \n\n"; + } + } } -- cgit v1.1