1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
#include "admin_connection.h"
#include "admin_rc.h"
#include "admin_export.h"
#include "debug.h"
#include "configuration.h"
static std::string admin_sessionunlock(Environment &env, std::string id)
{
Session *session = env.sessions.session(id);
if(session) {
if(session->isReadonly()) {
env.sessions.deleteSession(id);
return "Session " + id + " was 'readonly' and has been discarded.";
} else {
session->setIdle(true);
return "Session " + id + " has been deactivated (set to idle).";
}
}
return "Session " + id + " does not exist or has been committed.";
}
static std::string admin_listactivesessions(Environment &env)
{
std::string str;
std::vector<std::string> act = env.sessions.activeSessions();
std::vector<std::string>::iterator i = act.begin();
while(i != act.end()) {
Session *s = env.sessions.session(*i);
SessionAutolock lock(*s);
str += "Session " + *i + ": "+s->templ+" on "+s->patientid+" "+
std::string(s->idle()?"[idle]":"[active]")+"\n";
i++;
}
return str;
}
static std::string admin_header(std::string uri)
{
return admin_rc("header1") + uri + admin_rc("header2");
}
static std::string admin_flush(Environment &env)
{
env.sessions.store();
return "All sessions flushed to disc in " + Conf::session_path + ".";
}
AdminConnection::AdminConnection(Environment &e, headers_t a, std::string u)
: env(e), args(a), uri(u) {}
AdminConnection::~AdminConnection() {}
bool AdminConnection::handle(const char *data, size_t size)
{
status = 200;
if(data == NULL && size == 0) {
DEBUG(admin, "URI: %s\n", uri.c_str());
if(uri == "/") {
reply = admin_header(uri) +
"Command list:\n"
"<strong>/sessionunlock?id=<em>[ID]</em></strong> unlock session with [ID] as its session id.\n"
"<strong>/listactivesessions</strong> lists all active sessions on the server.\n"
"<strong>/flushsessions</strong> flushes all active sessions to disc.\n"
"<strong>/export?template=<em>[TEMPLATE]</em></strong> export template with name [TEMPLATE] to a\n csf file (comma seperated file, that can be opened in OOCalc or Excel).\n"
+ admin_rc("footer");
return true;
}
if(uri == "/sessionunlock" && args.find("id") != args.end()) {
reply = admin_header(uri) + admin_sessionunlock(env, args["id"])
+ admin_rc("footer");
return true;
}
if(uri == "/listactivesessions") {
reply = admin_header(uri) + admin_listactivesessions(env)
+ admin_rc("footer");
return true;
}
if(uri == "/flushsessions") {
reply = admin_header(uri) + admin_flush(env) + admin_rc("footer");
return true;
}
if(uri == "/export" && args.find("template") != args.end()) {
bool ok;
std::string res = admin_export(env, args["template"], &ok);
if(!ok) reply = admin_header(uri) + res + admin_rc("footer");
else {
reply = res;
hdrs["Content-Type"] = "text/csv; charset=UTF-8";
hdrs["Content-Disposition"] = "attachment; filename=\""+args["template"]+".csv\"";
}
return true;
}
if(uri == "/favicon.ico") {
hdrs["Content-Type"] = "image/ico";
reply = admin_rc("favicon");
return true;
}
reply = admin_header(uri) +
"'" + uri + "' not recognised as a valid command."
+ admin_rc("footer");
return true;
}
return true;
}
void AdminConnection::getReply(Httpd::Reply &r)
{
if(hdrs.find("Content-Type") == hdrs.end())
hdrs["Content-Type"] = "text/html; charset=UTF-8";
r.data = reply;
r.headers = hdrs;
r.status = status;
}
|