From e5e82db49071f2451a27fce3e57676d363aba25d Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Fri, 22 Sep 2023 21:29:33 +0200 Subject: [PATCH] Add support for turning off server connections --- frontend_routes.pm | 82 +++++++++++++++++++++++++++++++++++--- logger.pm | 19 ++++++++- static/server_updated.html | 10 +++++ templates/panel.html | 1 + 4 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 static/server_updated.html diff --git a/frontend_routes.pm b/frontend_routes.pm index 3726440..d792396 100644 --- a/frontend_routes.pm +++ b/frontend_routes.pm @@ -86,6 +86,21 @@ sub verifyChannelAccess { return 1; } +sub enumerateServers { + my $aConnection = $_[0]; + + my $output = ""; + return $output; +} + sub enumerateChannels { my $aConnection = $_[0]; @@ -129,13 +144,13 @@ sub handlePath { $userbar.=""; } - my $query = $aConnection->prepare(qq(select channels.id, channels.name, channels.enabled, servers.name from channels inner join servers on channels.server_id=servers.id where channels.public=1;)); + my $query = $aConnection->prepare(qq(select channels.id, channels.name, channels.enabled, servers.name, servers.enabled from channels inner join servers on channels.server_id=servers.id where channels.public=1;)); $query->execute(); my $table = ""; while(my @row = $query->fetchrow_array()) { my $channelID = $row[0]; my $channelName = $row[1]; - my $channelEnabled = $row[2]; + my $channelEnabled = $row[2] && $row[4]; my $serverName = $row[3]; $channelName =~ s/%23/#/; my $status = $channelEnabled?"Enabled":"Disabled"; @@ -159,12 +174,12 @@ sub handlePath { } while(@row = $query->fetchrow_array()) { my $channelID = $row[0]; - my $channelQuery = $aConnection->prepare(qq(select channels.name, channels.enabled, servers.name from channels inner join servers on channels.server_id=servers.id where channels.id=$channelID;)); + my $channelQuery = $aConnection->prepare(qq(select channels.name, channels.enabled, servers.name, servers.enabled from channels inner join servers on channels.server_id=servers.id where channels.id=$channelID;)); $channelQuery->execute(); @row = $channelQuery->fetchrow_array(); my $channelName = $row[0]; $channelName =~ s/%23/#/; - my $channelEnabled = $row[1]; + my $channelEnabled = $row[1] && $row[3]; my $serverName = $row[2]; my $status = $channelEnabled?"Enabled":"Disabled"; $privateChannels.="$channelName$serverName$status"; @@ -274,6 +289,7 @@ sub handlePath { } my $addServer = ""; + my $updateServer = ""; if($privileges==2) { $addServer.="

Add server

"; $addServer.="
"; @@ -282,6 +298,12 @@ sub handlePath { $addServer.="
"; $addServer.=""; $addServer.="
"; + $updateServer.="

Update server

"; + $updateServer.="
"; + $updateServer.=enumerateServers($aConnection)."
"; + $updateServer.="Enabled
"; + $updateServer.=""; + $updateServer.="
"; } my $addChannel = ""; @@ -312,7 +334,15 @@ sub handlePath { $updateChannel.=""; } - frontend::sendTemplate("templates/panel.html", $aClient, {"username"=>$session->{"username"}, "manageChannelAccess"=>$manageChannelAccess, "addUser"=>$addUser, "addServer"=>$addServer, "addChannel"=>$addChannel, "updateChannel"=>$updateChannel}); + frontend::sendTemplate("templates/panel.html", $aClient, { + "username"=>$session->{"username"}, + "manageChannelAccess"=>$manageChannelAccess, + "addUser"=>$addUser, + "addServer"=>$addServer, + "updateServer"=>$updateServer, + "addChannel"=>$addChannel, + "updateChannel"=>$updateChannel + }); return 1; } when("/change_password_action") { @@ -505,6 +535,47 @@ sub handlePath { logger::createLogger($parameters{"name"}, $parameters{"address"}, $port, ()); return 1; } + when("/update_server_action") { + if(!verifyRequestPrivileges($aRequest, $aClient, 2, $aConnection)) { + return 1; + } + my %parameters = frontend::parsePathParameters($aRequest->{"content"}); + if(!defined($parameters{"server"}) || length($parameters{"server"})==0) { + frontend::sendBadRequest($aClient, "Server required"); + return 1; + } + my $query = $aConnection->prepare(qq(select name, host, port, enabled from servers where id=?;)); + $query->execute($parameters{"server"}); + my @row = $query->fetchrow_array(); + if(scalar(@row)==0) { + frontend::sendBadRequest($aClient, "Server with ID $parameters{'server'} doesn't exist"); + return 1; + } + my $server = $row[0]; + my $serverEnabled = $row[3]; + if(defined($parameters{"enabled"}) && !$serverEnabled) { + my $host = $row[1]; + my $port = $row[2]; + $query = $aConnection->prepare(qq(select name, enabled from channels where server_id=?;)); + $query->execute($parameters{"server"}); + my @channels; + while(@row = $query->fetchrow_array()) { + if(!$row[1]) { + next; + } + push(@channels, $row[0]); + } + logger::createLogger($server, $host, $port, \@channels); + } + elsif($serverEnabled) { + my $actionQueue = logger::getActionQueueByServerName($server); + push(@$actionQueue, "QUIT"); + } + $query = $aConnection->prepare(qq(update servers set enabled=? where id=?;)); + $query->execute(defined($parameters{"enabled"})?1:0, $parameters{"server"}); + frontend::redirect($aClient, "/server_updated.html"); + return 1; + } when("/add_channel_action") { if(!verifyRequestPrivileges($aRequest, $aClient, 2, $aConnection)) { return 1; @@ -577,7 +648,6 @@ sub handlePath { my $actionQueue = logger::getActionQueueByServerName($row[0]); if(defined($parameters{"enabled"}) && !$channelEnabled) { push(@$actionQueue, "JOIN", $channel); - print("Joining\n"); } elsif($channelEnabled) { push(@$actionQueue, "PART", $channel); diff --git a/logger.pm b/logger.pm index b42ea99..d4233bd 100644 --- a/logger.pm +++ b/logger.pm @@ -361,6 +361,12 @@ sub partChannel { $aStream->send(sprintf("PART %s\r\n", $aChannel)); } +sub quitFromServer { + my $aStream = $_[0]; + + $aStream->send("QUIT\r\n"); +} + sub handleNames { my $aCommand = $_[0]; my $aChannels = $_[1]; @@ -413,17 +419,22 @@ sub connectionWorker { my $buffer = ""; my @actionQueue :shared; + my $running = 1; my @connection :shared = ($aServerName, \@actionQueue); push(@connections, \@connection); my %logFiles; while($running) { my $stream = connectToServer($aHost, $aPort, $aServerName); my $streamSelect = IO::Select->new($stream); - while(!eof($stream)) { + while(!eof($stream) && $running) { if(scalar(@actionQueue)>0) { given($actionQueue[0]) { when("JOIN") { joinChannel($stream, $actionQueue[1]); } when("PART") { partChannel($stream, $actionQueue[1]); } + when("QUIT") { + quitFromServer($stream); + $running = 0; + } } @actionQueue = (); } @@ -460,6 +471,12 @@ sub connectionWorker { } close($stream); } + foreach my $i (0..scalar(@connections)-1) { + if($connections[$i][0] eq $aServerName) { + $connections[$i][0] = ""; + last; + } + } } sub createLogger { diff --git a/static/server_updated.html b/static/server_updated.html new file mode 100644 index 0000000..6b410f3 --- /dev/null +++ b/static/server_updated.html @@ -0,0 +1,10 @@ + + + + Server updated + + +

Server successfully updated

+ Return to user panel + + diff --git a/templates/panel.html b/templates/panel.html index f5c1337..ea18388 100644 --- a/templates/panel.html +++ b/templates/panel.html @@ -15,6 +15,7 @@ {{manageChannelAccess}} {{addUser}} {{addServer}} + {{updateServer}} {{addChannel}} {{updateChannel}}