]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blob - settings/rpc-servers.php
Settings - RPC Servers: Don't re-order list on edit.
[irc/unrealircd/unrealircd-webpanel.git] / settings / rpc-servers.php
1 <?php
2 require_once "../inc/common.php";
3 require_once "../inc/header.php";
4
5 /* Ensure at least 1 server is default */
6 function set_at_least_one_default_server()
7 {
8 GLOBAL $config;
9
10 $has_default_server = false;
11 foreach ($config["unrealircd"] as $name=>$e)
12 if ($e["default"])
13 $has_default_server = true;
14 if (!$has_default_server)
15 {
16 /* Make first server in the list the default */
17 foreach ($config["unrealircd"] as $name=>$e)
18 {
19 $config["unrealircd"][$name]["default"] = true;
20 break;
21 }
22 }
23 }
24
25 if (isset($_POST['do_del_server']))
26 {
27 $server = $_POST['edit_existing'] ?? null;
28 if (isset($config["unrealircd"][$server]))
29 {
30 unset($config["unrealircd"][$server]);
31 set_at_least_one_default_server();
32 write_config("unrealircd");
33 } else {
34 Message::Fail("Delete failed: could not find server");
35 }
36 } else
37 if (isset($_POST['do_add_server']))
38 {
39 $opts = (object)$_POST;
40
41 /* TODO: Server-side validation */
42
43 // TODO: syntax of each item
44
45 // TODO: check server already exists with that (new) displayname
46
47 if (isset($config["unrealircd"][$opts->rpc_displayname]) &&
48 !($opts->rpc_displayname == $opts->edit_existing))
49 {
50 die("Server with that name already exists"); // TODO: pretier :D
51 }
52
53 $new_properties = [
54 "rpc_user" => $opts->rpc_user,
55 "rpc_password" => $opts->rpc_password,
56 "host"=>$opts->rpc_host,
57 "port"=>$opts->rpc_port,
58 "tls_verify_cert"=>isset($opts->rpc_tls_verify_cert)?true:false,
59 "default"=>isset($opts->rpc_default)?true:false,
60 ];
61
62 if (!empty($opts->edit_existing))
63 {
64 // Change existing server
65 if (!isset($config["unrealircd"][$opts->edit_existing]))
66 die("Editing a server that does not exist!?"); // not very graceful, isn't it?
67 if ($new_properties["rpc_password"] == "****************")
68 $new_properties["rpc_password"] = $config["unrealircd"][$opts->edit_existing]["rpc_password"];
69 // name change? unset the old one
70 if ($opts->edit_existing != $opts->rpc_displayname)
71 unset($config["unrealircd"][$opts->edit_existing]);
72 // set new properties
73 $config["unrealircd"][$opts->rpc_displayname] = $new_properties;
74 } else {
75 // Add new server
76 $config["unrealircd"][$opts->rpc_displayname] = $new_properties;
77 // TODO: encrypt pwd ;)
78 }
79
80 if ($new_properties["default"])
81 {
82 /* Mark all other servers as non-default */
83 foreach ($config["unrealircd"] as $name=>$e)
84 if ($name != $opts->rpc_displayname)
85 $config["unrealircd"][$name]["default"] = false;
86 } else {
87 /* Ensure at least 1 server is default */
88 set_at_least_one_default_server();
89 }
90
91 /* And write the new config */
92 write_config();
93
94 Message::Success("RPC Server successfully ". (empty($opts->edit_existing) ? "added" : "modified").".");
95 }
96
97 ?>
98
99 <h2>RPC Servers</h2>
100 You can configure which JSON-RPC server(s) the panel can connect to.<br><br>
101 You normally only need one server, but it can be useful to have multiple servers, so
102 you can switch to a secondary server in case the primary server goes down.<br>
103 <br>
104
105 <?php
106 if (empty($config["unrealircd"]))
107 {
108 Message::Info("Let's get your panel linked to UnrealIRCd. ".
109 "Read <u><a href=\"https://www.unrealircd.org/docs/UnrealIRCd_webpanel#Configuring_UnrealIRCd\" target=\"_blank\">the UnrealIRCd instructions</a></u> ".
110 "and then click <i>Add Server</i> below.");
111 }
112 ?>
113
114 <!-- Server action buttons (only Add server) -->
115 <div id="ServerActions">
116 <div class="row">
117 <?php if (1) /* current_user_can(PERMISSION_MANAGE_RPC_SERVERS)) */ { ?>
118 <div class="col-sm-3">
119 <form method="post">
120 <div class="btn btn-primary" onclick="add_rpc_server()">Add Server</div>
121 </form>
122 </div>
123 <?php } ?>
124 </div>
125 <br>
126
127 <!-- Add server modal -->
128 <div class="modal" id="server_add" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true">
129 <div class="modal-dialog modal-dialog-centered" role="document">
130 <form method="post">
131 <input name="edit_existing" type="hidden" id="edit_existing" value="">
132 <div class="modal-content">
133 <div class="modal-header">
134 <h5 class="modal-title" id="server_add_title">Add RPC Server</h5>
135 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
136 <span aria-hidden="true">&times;</span></button>
137 </div>
138 <div class="modal-body">
139 <div class="form-group">
140 <label for="rpc_displayname">Display name</label>
141 <input name="rpc_displayname" type="text" class="form-control" id="rpc_displayname" aria-describedby="rpc_displayname_help" value="" required>
142 <small id="rpc_displayname_help" class="form-text text-muted">A short display name for in the RPC server list.</small>
143 </div>
144 <div class="form-group form-check">
145 <input name="rpc_default" type="checkbox" class="revalidation-needed-rpc form-check-input" id="rpc_default">
146 <label class="form-check-label" for="rpc_default">Default server</label>
147 <small id="rpc_default_help" class="form-text text-muted">Make this the default (primary) server that will be used for connections.</code></small>
148 </div>
149 <div class="form-group">
150 <label for="rpc_host">Hostname or IP</label>
151 <input name="rpc_host" type="text" class="revalidation-needed-rpc form-control" id="rpc_host" aria-describedby="hostname_help" value="127.0.0.1">
152 <small id="hostname_help" class="form-text text-muted">The hostname or IP address of your UnrealIRCd server. You should use <code>127.0.0.1</code> for the same machine.</small>
153 </div>
154 <div class="form-group">
155 <label for="rpc_port">Server Port</label>
156 <input name="rpc_port" type="text" class="revalidation-needed-rpc form-control" id="rpc_port" aria-describedby="port_help" value="8600">
157 <small id="port_help" class="form-text text-muted">The port which you designated for RPC connections in your <code>unrealircd.conf</code></small>
158 </div>
159 <div class="form-group form-check">
160 <input name="rpc_tls_verify_cert" type="checkbox" class="revalidation-needed-rpc form-check-input" id="rpc_tls_verify_cert">
161 <label class="form-check-label" for="rpc_tls_verify_cert">Verify SSL/TLS certificate</label>
162 <small id="rpc_tls_verify_cert_help" class="form-text text-muted">Can only be used with hostnames, don't enable this for 127.0.0.1.</code></small>
163 </div>
164 <div class="form-group">
165 <label for="rpc_username">Username</label>
166 <input name="rpc_user" type="text" class="revalidation-needed-rpc form-control" id="rpc_user" aria-describedby="username_help" autocomplete="new-password">
167 <small id="username_help" class="form-text text-muted">The name of your <code>rpc-user</code> block as defined in your <code>unrealircd.conf</code></small>
168 </div>
169 <div class="form-group">
170 <label for="rpc_password">Password</label>
171 <input name="rpc_password" type="password" class="revalidation-needed-rpc form-control" id="rpc_password" autocomplete="new-password">
172 </div>
173 </div>
174
175 <div class="modal-footer">
176 <button id="CloseButton" type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
177 <button type="submit" name="do_add_server" id="do_add_server" class="btn btn-primary">Add Server</button>
178 <button type="submit" name="do_del_server" id="do_del_server" class="btn btn-danger">Delete Server</button>
179 </div>
180 </div>
181 </form>
182 </div>
183 </div>
184
185 <!-- Server error modal -->
186 <div class="modal" id="server_error" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true">
187 <div class="modal-dialog modal-dialog-centered" role="document">
188 <div class="modal-content">
189 <div class="modal-header">
190 <h5 class="modal-title">RPC Server error</h5>
191 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
192 <span aria-hidden="true">&times;</span>
193 </button>
194 </div>
195 <div class="modal-body">
196 The RPC Server failed to connect. Check your settings and try again.
197 </div>
198
199 <div class="modal-footer">
200 <button id="CloseButton" type="button" class="btn btn-primary" data-dismiss="modal" onclick="cancel_error()">OK</button>
201 </div>
202 </div>
203 </div>
204 </div>
205
206 <!-- Server list -->
207 <form method="post">
208 <table class="container-xxl table table-sm table-responsive caption-top table-striped">
209 <thead class="table-primary">
210 <th scope="col">Display name</th>
211 <th scope="col">Hostname</th>
212 <th scope="col">Port</th>
213 <th scope="col">RPC User</th>
214 </thead>
215 <tbody>
216 <?php
217 foreach($config['unrealircd'] as $name=>$e)
218 {
219 $primary = "";
220 if (isset($e["default"]) && $e["default"])
221 $primary = " <span class=\"badge rounded-pill badge-success\">Default</span>";
222 $name = htmlspecialchars($name);
223 $default_server = $e["default"] ? "true" : "false";
224 $host = htmlspecialchars($e["host"]);
225 $port = htmlspecialchars($e["port"]);
226 $rpc_user = htmlspecialchars($e["rpc_user"]);
227 $tls_verify_cert = $e["tls_verify_cert"] ? "true" : "false";
228 $name = "<a href=\"javascript:edit_rpc_server('$name',$default_server,'$host','$port','$rpc_user',$tls_verify_cert)\">$name</a>";
229 echo "<tr>";
230 echo "<td scope=\"col\">".$name.$primary."</td>";
231 echo "<td scope=\"col\"><code>".$host."</code></td>";
232 echo "<td scope=\"col\"><code>".$port."</code></td>";
233 echo "<td scope=\"col\"><code>".$rpc_user."</code></td>";
234 echo "</tr>";
235 }
236 ?>
237 </tbody>
238 </table>
239
240 <script>
241 let do_add_server = document.getElementById('do_add_server');
242
243 let rpc_host = document.getElementById('rpc_host');
244 let rpc_port = document.getElementById('rpc_port');
245 let rpc_user = document.getElementById('rpc_user');
246 let rpc_pass = document.getElementById('rpc_password');
247 let rpc_tls_verify_cert = document.getElementById('rpc_tls_verify_cert');
248 let rpc_server_ok = false;
249
250 do_add_server.addEventListener('click', e => {
251 if (rpc_server_ok)
252 return true;
253 e.preventDefault();
254 test_rpc_server();
255 return false;
256 });
257
258 /* The RPC connection tester! */
259 function test_rpc_server()
260 {
261 fetch(<?php echo get_config("base_url"); ?> + 'api/test_rpc_server.php', {
262 method:'POST',
263 headers: {'Content-Type':'application/x-www-form-urlencoded'},
264 body: 'method=rpc&'+
265 'host='+encodeURIComponent(rpc_host.value)+
266 '&port='+encodeURIComponent(rpc_port.value)+
267 '&user='+encodeURIComponent(rpc_user.value)+
268 '&password='+encodeURIComponent(rpc_pass.value)+
269 '&tls_verify='+rpc_tls_verify_cert.checked+
270 '&edit_existing='+encodeURIComponent(edit_existing.value)
271 })
272 .then(response => response.json())
273 .then(data => {
274 if (data.success)
275 {
276 rpc_server_ok = true;
277 do_add_server.click();
278 }
279 else
280 {
281 $('#server_add').modal('hide');
282 $('#server_error').modal();
283 }
284 })
285 .catch(error => {
286 test_conn.innerHTML = "Failed!";
287 $('#server_add').modal('hide');
288 $('#server_error').modal();
289 });
290 }
291
292 function cancel_error()
293 {
294 $('#server_add').modal('show');
295 return true;
296 }
297
298 function edit_rpc_server(name, default_server, host, port, rpc_user, tls_verify_cert)
299 {
300 $('#edit_existing').val(name);
301 $('#rpc_displayname').val(name);
302 $('#rpc_default').prop('checked', default_server);
303 $('#rpc_host').val(host);
304 $('#rpc_port').val(port);
305 $('#rpc_user').val(rpc_user);
306 $('#rpc_password').val("****************"); // magic value to indicate saved password
307 $('#server_add_title').html("Edit Server");
308 $('#do_add_server').html("Submit");
309 $('#rpc_tls_verify_cert').prop('checked', tls_verify_cert);
310 $('#do_del_server').show();
311 $('#server_add').modal('show');
312 }
313
314 // This is in a function because a canceled edit_rpc_server otherwise causes a prefilled effect
315 function add_rpc_server()
316 {
317 $('#edit_existing').val("");
318 $('#rpc_displayname').val("");
319 $('#rpc_host').val("127.0.0.1");
320 $('#rpc_port').val("8600");
321 $('#rpc_user').val("");
322 $('#rpc_password').val("");
323 $('#server_add_title').html("Add Server");
324 $('#do_add_server').html("Add Server");
325 $('#rpc_tls_verify_cert').prop('checked', false);
326 $('#do_del_server').hide();
327 $('#server_add').modal('show');
328 }
329 </script>
330
331 <?php
332 require_once "../inc/footer.php";