From af6c160261c22bf7712b0465497912e777388f03 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 20 Jan 2016 15:02:41 +0100 Subject: [PATCH] Web interface: support service.base_location=/something/ to override default '/' root location used by the web interface --- .../src/html/{footer.html => footer.shtml} | 1 + .../src/html/{header.html => header.shtml} | 0 .../src/html/instances/index.shtml | 4 +-- .../src/html/instances/register.shtml | 4 +-- spectrum_manager/src/html/js/app.js | 8 ++--- .../html/login/{index.html => index.shtml} | 3 +- spectrum_manager/src/managerconfig.cpp | 1 + spectrum_manager/src/server.cpp | 36 ++++++++++++++++--- 8 files changed, 43 insertions(+), 14 deletions(-) rename spectrum_manager/src/html/{footer.html => footer.shtml} (89%) rename spectrum_manager/src/html/{header.html => header.shtml} (100%) rename spectrum_manager/src/html/login/{index.html => index.shtml} (98%) diff --git a/spectrum_manager/src/html/footer.html b/spectrum_manager/src/html/footer.shtml similarity index 89% rename from spectrum_manager/src/html/footer.html rename to spectrum_manager/src/html/footer.shtml index 2822dd86..8be84028 100644 --- a/spectrum_manager/src/html/footer.html +++ b/spectrum_manager/src/html/footer.shtml @@ -8,3 +8,4 @@ + diff --git a/spectrum_manager/src/html/header.html b/spectrum_manager/src/html/header.shtml similarity index 100% rename from spectrum_manager/src/html/header.html rename to spectrum_manager/src/html/header.shtml diff --git a/spectrum_manager/src/html/instances/index.shtml b/spectrum_manager/src/html/instances/index.shtml index f7992f92..1283e257 100644 --- a/spectrum_manager/src/html/instances/index.shtml +++ b/spectrum_manager/src/html/instances/index.shtml @@ -1,4 +1,4 @@ - + - + diff --git a/spectrum_manager/src/html/instances/register.shtml b/spectrum_manager/src/html/instances/register.shtml index c5d306b1..5ad12303 100644 --- a/spectrum_manager/src/html/instances/register.shtml +++ b/spectrum_manager/src/html/instances/register.shtml @@ -1,4 +1,4 @@ - +

Register Spectrum 2 instance

@@ -29,4 +29,4 @@ $(function() { }); - + diff --git a/spectrum_manager/src/html/js/app.js b/spectrum_manager/src/html/js/app.js index 54a7df0b..ca3e5df5 100644 --- a/spectrum_manager/src/html/js/app.js +++ b/spectrum_manager/src/html/js/app.js @@ -1,5 +1,5 @@ function show_instances() { - $.get("/api/v1/instances", function(data) { + $.get($.cookie("base_location") + "api/v1/instances", function(data) { $("#main_content").html("

List of Spectrum 2 instances

"); var admin = $.cookie("admin") == "1"; @@ -26,7 +26,7 @@ function show_instances() { row += '' if (command == 'register') { - row += ''; + row += ''; $("#main_result > tbody:last-child").append(row); } else if (command == "") { @@ -34,7 +34,7 @@ function show_instances() { $("#main_result > tbody:last-child").append(row); } else { - row += ''; + row += ''; $("#main_result > tbody:last-child").append(row); $(".button_command").click(function(e) { e.preventDefault(); @@ -68,7 +68,7 @@ function fill_instances_register_form() { var query = getQueryParams(document.location.search); $("#instance").attr("value", query.id); - $.get("/api/v1/instances/register_form/" + query.id, function(data) { + $.get($.cookie("base_location") + "api/v1/instances/register_form/" + query.id, function(data) { $("#jid_desc").html(data.username_label + ":"); $("#uin_desc").html(data.legacy_username_label + ":"); $("#password_desc").html(data.password_label + ":"); diff --git a/spectrum_manager/src/html/login/index.html b/spectrum_manager/src/html/login/index.shtml similarity index 98% rename from spectrum_manager/src/html/login/index.html rename to spectrum_manager/src/html/login/index.shtml index 969f17ed..1237173d 100644 --- a/spectrum_manager/src/html/login/index.html +++ b/spectrum_manager/src/html/login/index.shtml @@ -69,4 +69,5 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/spectrum_manager/src/managerconfig.cpp b/spectrum_manager/src/managerconfig.cpp index 02258e94..915df32e 100644 --- a/spectrum_manager/src/managerconfig.cpp +++ b/spectrum_manager/src/managerconfig.cpp @@ -35,6 +35,7 @@ bool ManagerConfig::load(const std::string &configfile, boost::program_options:: ("service.cert", value()->default_value(""), "Web interface certificate in PEM format when TLS should be used.") ("service.config_directory", value()->default_value("/etc/spectrum2/transports/"), "Directory with spectrum2 configuration files. One .cfg file per one instance") ("service.data_dir", value()->default_value("/var/lib/spectrum2_manager/html"), "Directory to store Spectrum 2 manager data") + ("service.base_location", value()->default_value("/"), "Base location of the web interface") ("servers.server", value >()->multitoken(), "Server.") ("database.type", value()->default_value("none"), "Database type.") ("database.database", value()->default_value("/var/lib/spectrum2/$jid/database.sql"), "Database used to store data") diff --git a/spectrum_manager/src/server.cpp b/spectrum_manager/src/server.cpp index d2e49549..72c4f70a 100644 --- a/spectrum_manager/src/server.cpp +++ b/spectrum_manager/src/server.cpp @@ -208,9 +208,10 @@ void Server::authorize(struct mg_connection *conn, struct http_message *hm) { "Set-Cookie: session=%s; max-age=3600; http-only\r\n" // Session ID "Set-Cookie: user=%s\r\n" // Set user, needed by Javascript code "Set-Cookie: admin=%s\r\n" // Set user, needed by Javascript code + "Set-Cookie: base_location=%s\r\n" // Set user, needed by Javascript code "Set-Cookie: original_url=/; max-age=0\r\n" // Delete original_url - "Location: %s/instances\r\n\r\n", - session->session_id, session->user, session->admin ? "1" : "0", host.c_str()); + "Location: %s%sinstances\r\n\r\n", + session->session_id, session->user, session->admin ? "1" : "0", CONFIG_STRING(m_config, "service.base_location").c_str(), host.c_str(), CONFIG_STRING(m_config, "service.base_location").c_str()); } else { // Authentication failure, redirect to login. redirect_to(conn, hm, "/login"); @@ -258,9 +259,11 @@ void Server::redirect_to(struct mg_connection *conn, struct http_message *hm, co host += std::string(host_hdr->p, host_hdr->len); } + where = where + 1; + mg_printf(conn, "HTTP/1.1 302 Found\r\n" "Set-Cookie: original_url=/\r\n" - "Location: %s%s\r\n\r\n", host.c_str(), where); + "Location: %s%s%s\r\n\r\n", host.c_str(), CONFIG_STRING(m_config, "service.base_location").c_str(), where); } void Server::print_html(struct mg_connection *conn, struct http_message *hm, const std::string &html) { @@ -373,8 +376,8 @@ void Server::serve_logout(struct mg_connection *conn, struct http_message *hm) { mg_printf(conn, "HTTP/1.1 302 Found\r\n" "Set-Cookie: session=%s; max-age=0\r\n" "Set-Cookie: admin=%s; max-age=0\r\n" - "Location: %s/\r\n\r\n", - session->session_id, session->admin ? "1" : "0", host.c_str()); + "Location: %s%s\r\n\r\n", + session->session_id, session->admin ? "1" : "0", host.c_str(), CONFIG_STRING(m_config, "service.base_location").c_str()); sessions.erase(session->session_id); delete session; @@ -727,10 +730,24 @@ void Server::serve_oauth2(struct mg_connection *conn, struct http_message *hm) { void Server::event_handler(struct mg_connection *conn, int ev, void *p) { struct http_message *hm = (struct http_message *) p; + if (ev == MG_EV_SSI_CALL) { + mbuf_resize(&conn->send_mbuf, conn->send_mbuf.size * 2); + std::string resp(conn->send_mbuf.buf, conn->send_mbuf.len); + boost::replace_all(resp, "href=\"/", std::string("href=\"") + CONFIG_STRING(m_config, "service.base_location")); + boost::replace_all(resp, "src=\"/", std::string("src=\"") + CONFIG_STRING(m_config, "service.base_location")); + boost::replace_all(resp, "action=\"/", std::string("action=\"") + CONFIG_STRING(m_config, "service.base_location")); + strcpy(conn->send_mbuf.buf, resp.c_str()); + mbuf_trim(&conn->send_mbuf); + return; + } + if (ev != MG_EV_HTTP_REQUEST) { return; } + hm->uri.p += CONFIG_STRING(m_config, "service.base_location").size() - 1; + hm->uri.len -= CONFIG_STRING(m_config, "service.base_location").size() - 1; + if (!is_authorized(conn, hm)) { redirect_to(conn, hm, "/login"); } else if (mg_vcmp(&hm->uri, "/authorize") == 0) { @@ -764,6 +781,15 @@ void Server::event_handler(struct mg_connection *conn, int ev, void *p) { } else if (has_prefix(&hm->uri, "/api/v1/")) { m_apiServer->handleRequest(this, get_session(hm), conn, hm); } else { + if (hm->uri.p[hm->uri.len - 1] != '/') { + std::string url(hm->uri.p, hm->uri.len); + if (url.find(".") == std::string::npos) { + url += "/"; + redirect_to(conn, hm, url.c_str()); + conn->flags |= MG_F_SEND_AND_CLOSE; + return; + } + } mg_serve_http(conn, hm, s_http_server_opts); }
NameStatusActions
' + instance.status + '' + command + '' + '
' + command + '' + '
' + command + '' + '
' + command + '' + '