2 require_once "../inc/common.php";
3 require_once "../inc/header.php";
5 if (isset($_POST['do_del_server']))
7 $server = $_POST['del_server_name'] ?? null;
8 if (isset($config["unrealircd"][$server]))
10 unset($config["unrealircd"][$server]);
11 set_at_least_one_default_rpc_server();
12 write_config("unrealircd");
14 Message
::Fail("Delete failed: could not find server");
17 if (isset($_POST['do_add_server']))
19 $opts = (object)$_POST;
21 /* TODO: Server-side validation */
23 // TODO: syntax of each item
25 // TODO: check server already exists with that (new) displayname
27 if (isset($config["unrealircd"][$opts->rpc_displayname
]) &&
28 !($opts->rpc_displayname
== $opts->edit_existing
))
30 die("Server with that name already exists"); // TODO: pretier :D
34 "rpc_user" => $opts->rpc_user
,
35 "rpc_password" => $opts->rpc_password
,
36 "host"=>$opts->rpc_host
,
37 "port"=>$opts->rpc_port
,
38 "tls_verify_cert"=>isset($opts->rpc_tls_verify_cert
)?true:false,
39 "default"=>isset($opts->rpc_default
)?true:false,
42 if (!empty($opts->edit_existing
))
44 // Change existing server
45 if (!isset($config["unrealircd"][$opts->edit_existing
]))
46 die("Editing a server that does not exist!?"); // not very graceful, isn't it?
47 if ($new_properties["rpc_password"] == "****************")
48 $new_properties["rpc_password"] = $config["unrealircd"][$opts->edit_existing
]["rpc_password"];
49 // name change? unset the old one
50 if ($opts->edit_existing
!= $opts->rpc_displayname
)
51 unset($config["unrealircd"][$opts->edit_existing
]);
53 $config["unrealircd"][$opts->rpc_displayname
] = $new_properties;
56 $config["unrealircd"][$opts->rpc_displayname
] = $new_properties;
57 // TODO: encrypt pwd ;)
60 if ($new_properties["default"])
61 set_default_rpc_server($opts->rpc_displayname
);
63 set_at_least_one_default_rpc_server();
65 /* And write the new config */
68 Message
::Success("RPC Server successfully ". (empty($opts->edit_existing
) ? "added" : "modified").".");
74 You can configure which JSON
-RPC
server(s
) the panel can connect to
.<br
><br
>
75 You normally only need one server
, but it can be useful to have multiple servers
, so
76 you can
switch to a secondary server in
case the primary server goes down
.<br
>
80 if (empty($config["unrealircd"]))
82 Message
::Info("Let's get your panel linked to UnrealIRCd. ".
83 "Read <u><a href=\"https://www.unrealircd.org/docs/UnrealIRCd_webpanel#Configuring_UnrealIRCd\" target=\"_blank\">the UnrealIRCd instructions</a></u> ".
84 "and then click <i>Add Server</i> below.");
88 <!-- Server action
buttons (only Add server
) -->
89 <div id
="ServerActions">
91 <?php
if (1) /* current_user_can(PERMISSION_MANAGE_RPC_SERVERS)) */ { ?>
92 <div
class="col-sm-3">
94 <div
class="btn btn-primary" onclick
="add_rpc_server()">Add Server
</div
>
101 <!-- Add server modal
-->
102 <div
class="modal" id
="server_add" tabindex
="-1" role
="dialog" aria
-labelledby
="confirmModalCenterTitle" aria
-hidden
="true">
103 <div
class="modal-dialog modal-dialog-centered" role
="document">
105 <input name
="edit_existing" type
="hidden" id
="edit_existing" value
="">
106 <div
class="modal-content">
107 <div
class="modal-header">
108 <h5
class="modal-title" id
="server_add_title">Add RPC Server
</h5
>
109 <button type
="button" class="close" data
-dismiss
="modal" aria
-label
="Close">
110 <span aria
-hidden
="true">×
;</span
></button
>
112 <div
class="modal-body">
113 <div
class="form-group">
114 <label
for="rpc_displayname">Display name
</label
>
115 <input name
="rpc_displayname" type
="text" class="form-control" id
="rpc_displayname" aria
-describedby
="rpc_displayname_help" value
="" required
>
116 <small id
="rpc_displayname_help" class="form-text text-muted">A short display name
for in the RPC server
list.</small
>
118 <div
class="form-group form-check">
119 <input name
="rpc_default" type
="checkbox" class="revalidation-needed-rpc form-check-input" id
="rpc_default">
120 <label
class="form-check-label" for="rpc_default">Default server
</label
>
121 <small id
="rpc_default_help" class="form-text text-muted">Make this the
default (primary
) server that will be used
for connections
.</code
></small
>
123 <div
class="form-group">
124 <label
for="rpc_host">Hostname
or IP
</label
>
125 <input name
="rpc_host" type
="text" class="revalidation-needed-rpc form-control" id
="rpc_host" aria
-describedby
="hostname_help" value
="127.0.0.1">
126 <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
>
128 <div
class="form-group">
129 <label
for="rpc_port">Server Port
</label
>
130 <input name
="rpc_port" type
="text" class="revalidation-needed-rpc form-control" id
="rpc_port" aria
-describedby
="port_help" value
="8600">
131 <small id
="port_help" class="form-text text-muted">The port which you designated
for RPC connections in your
<code
>unrealircd
.conf
</code
></small
>
133 <div
class="form-group form-check">
134 <input name
="rpc_tls_verify_cert" type
="checkbox" class="revalidation-needed-rpc form-check-input" id
="rpc_tls_verify_cert">
135 <label
class="form-check-label" for="rpc_tls_verify_cert">Verify SSL
/TLS certificate
</label
>
136 <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>
138 <div class="form-group">
139 <label for="rpc_username">Username</label>
140 <input name="rpc_user" type="text" class="revalidation-needed-rpc form-control" id="rpc_user" aria-describedby="username_help" autocomplete="new-password">
141 <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>
143 <div class="form-group">
144 <label for="rpc_password">Password</label>
145 <input name="rpc_password" type="password" class="revalidation-needed-rpc form-control" id="rpc_password" autocomplete="new-password">
149 <div class="modal-footer">
150 <button id="CloseButton" type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
151 <button type="submit" name="do_add_server" id="do_add_server" class="btn btn-primary">Add Server</button>
158 <!-- Server error modal -->
159 <div class="modal" id="server_error" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true">
160 <div class="modal-dialog modal-dialog-centered" role="document">
161 <div class="modal-content">
162 <div class="modal-header">
163 <h5 class="modal-title">RPC Server error</h5>
164 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
165 <span aria-hidden="true">×</span>
168 <div class="modal-body">
169 The RPC Server failed to connect. Check your settings and try again.
172 <div class="modal-footer">
173 <button id="CloseButton" type="button" class="btn btn-primary" data-dismiss="modal" onclick="cancel_error()">OK</button>
179 <!-- Server delete confirmation modal -->
180 <div class="modal" id="server_confirm_del" tabindex="-1" role="dialog" aria-labelledby="confirmModalCenterTitle" aria-hidden="true">
181 <div class="modal-dialog modal-dialog-centered" role="document">
182 <div class="modal-content">
184 <input name="del_server_name" type="hidden" id="del_server_name" value="">
185 <div class="modal-header">
186 <h5 class="modal-title">Confirm deletion</h5>
187 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
188 <span aria-hidden="true">×</span>
191 <div class="modal-body">
192 Are you sure you want to delete this server?
194 <div class="modal-footer">
195 <button id="CloseButton" type="button" class="btn btn-primary" data-dismiss="modal">Cancel</button>
196 <button type="submit" name="do_del_server" id="do_del_server" class="btn btn-danger">Delete Server</button>
203 <!-- Todo figure out why it didnt work in css -->
205 .btn-group-xs > .btn, .btn-xs {
215 <table class="container-xxl table table-sm table-responsive caption-top table-striped">
216 <thead class="table-primary">
217 <th scope="col"></th>
218 <th scope="col">Display name</th>
219 <th scope="col">Hostname</th>
220 <th scope="col">Port</th>
221 <th scope="col">RPC User</th>
225 $servers = get_config('unrealircd
');
228 foreach($servers as $name=>$e)
231 if (isset($e["default"]) && $e["default"])
232 $primary = " <span class=\"badge rounded-pill badge-success\">Default</span>";
233 $name = htmlspecialchars($name);
234 $default_server = $e["default"] ? "true" : "false";
235 $host = htmlspecialchars($e["host"]);
236 $port = htmlspecialchars($e["port"]);
237 $rpc_user = htmlspecialchars($e["rpc_user"]);
238 $tls_verify_cert = $e["tls_verify_cert"] ? "true" : "false";
239 $html_name = "<a href=\"javascript:edit_rpc_server('$name',$default_server,'$host','$port','$rpc_user',$tls_verify_cert)\">$name</a>";
241 echo "<td scope=\"col\"><button type=\"button\" class=\"btn btn-xs btn-danger\" onclick=\"confirm_delete('".$name."')\"><i class=\"fa fa-trash fa-1\" aria-hidden=\"true\"></i></button></td>";
242 echo "<td scope=\"col\">".$html_name.$primary."</td>";
243 echo "<td scope=\"col\"><code>".$host."</code></td>";
244 echo "<td scope=\"col\"><code>".$port."</code></td>";
245 echo "<td scope=\"col\"><code>".$rpc_user."</code></td>";
253 let do_add_server = document.getElementById('do_add_server
');
255 let rpc_host = document.getElementById('rpc_host
');
256 let rpc_port = document.getElementById('rpc_port
');
257 let rpc_user = document.getElementById('rpc_user
');
258 let rpc_pass = document.getElementById('rpc_password
');
259 let rpc_tls_verify_cert = document.getElementById('rpc_tls_verify_cert
');
260 let rpc_server_ok = false;
262 do_add_server.addEventListener('click
', e => {
270 /* The RPC connection tester! */
271 function test_rpc_server()
273 fetch('<?php
echo get_config("base_url"); ?>' + 'api
/test_rpc_server
.php
', {
275 headers: {'Content-Type':'application/x-www-form-urlencoded'},
277 'host
='+encodeURIComponent(rpc_host.value)+
278 '&port
='+encodeURIComponent(rpc_port.value)+
279 '&user
='+encodeURIComponent(rpc_user.value)+
280 '&password
='+encodeURIComponent(rpc_pass.value)+
281 '&tls_verify
='+rpc_tls_verify_cert.checked+
282 '&edit_existing
='+encodeURIComponent(edit_existing.value)
284 .then(response => response.json())
288 rpc_server_ok = true;
289 do_add_server.click();
293 $('#server_add').modal('hide');
294 $
('#server_error').modal();
298 test_conn
.innerHTML
= "Failed!";
299 $
('#server_add').modal('hide');
300 $
('#server_error').modal();
304 function cancel_error()
306 $
('#server_add').modal('show');
310 function edit_rpc_server(name
, default_server
, host
, port
, rpc_user
, tls_verify_cert
)
312 $
('#edit_existing').val(name
);
313 $
('#rpc_displayname').val(name
);
314 $
('#rpc_default').prop('checked', default_server
);
315 $
('#rpc_host').val(host
);
316 $
('#rpc_port').val(port
);
317 $
('#rpc_user').val(rpc_user
);
318 $
('#rpc_password').val("****************"); // magic value to indicate saved password
319 $
('#server_add_title').html("Edit Server");
320 $
('#do_add_server').html("Submit");
321 $
('#rpc_tls_verify_cert').prop('checked', tls_verify_cert
);
322 $
('#do_del_server').show();
323 $
('#server_add').modal('show');
326 // This is in a function because a canceled edit_rpc_server otherwise causes a prefilled effect
327 function add_rpc_server()
329 $
('#edit_existing').val("");
330 $
('#rpc_displayname').val("");
331 $
('#rpc_host').val("127.0.0.1");
332 $
('#rpc_port').val("8600");
333 $
('#rpc_user').val("");
334 $
('#rpc_password').val("");
335 $
('#server_add_title').html("Add Server");
336 $
('#do_add_server').html("Add Server");
337 $
('#rpc_tls_verify_cert').prop('checked', false);
338 $
('#do_del_server').hide();
339 $
('#server_add').modal('show');
342 function confirm_delete(name
)
344 $
('#del_server_name').val(name
);
345 $
('#server_confirm_del').modal('show');
352 require_once "../inc/footer.php";