2 require_once "../inc/common.php";
3 require_once "../inc/header.php";
5 /* Ensure at least 1 server is default */
6 function set_at_least_one_default_server()
10 $has_default_server = false;
11 foreach ($config["unrealircd"] as $name=>$e)
13 $has_default_server = true;
14 if (!$has_default_server)
16 /* Make first server in the list the default */
17 foreach ($config["unrealircd"] as $name=>$e)
19 $config["unrealircd"][$name]["default"] = true;
25 if (isset($_POST['do_del_server']))
27 $server = $_POST['edit_existing'] ?? null;
28 if (isset($config["unrealircd"][$server]))
30 unset($config["unrealircd"][$server]);
31 set_at_least_one_default_server();
32 write_config("unrealircd");
34 Message
::Fail("Delete failed: could not find server");
37 if (isset($_POST['do_add_server']))
39 $opts = (object)$_POST;
41 /* TODO: Server-side validation */
43 // TODO: syntax of each item
45 // TODO: check server already exists with that (new) displayname
47 if (isset($config["unrealircd"][$opts->rpc_displayname
]) &&
48 !($opts->rpc_displayname
== $opts->edit_existing
))
50 die("Server with that name already exists"); // TODO: pretier :D
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,
62 if (!empty($opts->edit_existing
))
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
]);
73 $config["unrealircd"][$opts->rpc_displayname
] = $new_properties;
76 $config["unrealircd"][$opts->rpc_displayname
] = $new_properties;
77 // TODO: encrypt pwd ;)
80 if ($new_properties["default"])
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;
87 /* Ensure at least 1 server is default */
88 set_at_least_one_default_server();
91 /* And write the new config */
94 Message
::Success("RPC Server successfully ". (empty($opts->edit_existing
) ? "added" : "modified").".");
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
>
106 if (empty($config["unrealircd"]))
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.");
114 <!-- Server action
buttons (only Add server
) -->
115 <div id
="ServerActions">
117 <?php
if (1) /* current_user_can(PERMISSION_MANAGE_RPC_SERVERS)) */ { ?>
118 <div
class="col-sm-3">
120 <div
class="btn btn-primary" onclick
="add_rpc_server()">Add Server
</div
>
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">
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">×
;</span
></button
>
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
>
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
>
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
>
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
>
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>
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>
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">
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>
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">×</span>
195 <div class="modal-body">
196 The RPC Server failed to connect. Check your settings and try again.
199 <div class="modal-footer">
200 <button id="CloseButton" type="button" class="btn btn-primary" data-dismiss="modal" onclick="cancel_error()">OK</button>
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>
217 foreach($config['unrealircd
'] as $name=>$e)
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>";
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>";
241 let do_add_server = document.getElementById('do_add_server
');
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;
250 do_add_server.addEventListener('click
', e => {
258 /* The RPC connection tester! */
259 function test_rpc_server()
261 fetch(<?php echo get_config("base_url"); ?> + 'api
/test_rpc_server
.php
', {
263 headers: {'Content-Type':'application/x-www-form-urlencoded'},
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)
272 .then(response => response.json())
276 rpc_server_ok = true;
277 do_add_server.click();
281 $('#server_add').modal('hide');
282 $
('#server_error').modal();
286 test_conn
.innerHTML
= "Failed!";
287 $
('#server_add').modal('hide');
288 $
('#server_error').modal();
292 function cancel_error()
294 $
('#server_add').modal('show');
298 function edit_rpc_server(name
, default_server
, host
, port
, rpc_user
, tls_verify_cert
)
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');
314 // This is in a function because a canceled edit_rpc_server otherwise causes a prefilled effect
315 function add_rpc_server()
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');
332 require_once "../inc/footer.php";