cualsea/cualsea-server/lib/Cualsea/Server/MessageController.pm

176 lines
4.1 KiB
Perl

package Cualsea::Server::MessageController;
use v5.30.0;
use strict;
use warnings;
use Data::Dumper;
use Socket qw/SOL_SOCKET SO_PEERCRED/;
use Params::ValidationCompiler qw/validation_for/;
use Types::Standard qw/Object HashRef Str/;
use Cualsea::MessageManager;
my %commands = {
add => {
params => [
'name',
'init', # Only sysvinit supported
'pidfile',
'binpath'
],
validator => validation_for(
params => {
name => { type => Str },
init => { type => Str },
pidfile => { type => Str },
binpath => { type => Str },
}
),
},
del => {
params => [
'name'
],
validator => validation_for(
params => {
name => { type => Str },
}
),
},
report => {
params => [],
validator => validation_for(
params => {},
),
},
start => {
params => [
'name',
],
validator => validation_for(
params => {
name => { type => Str },
}
),
},
stop => {
params => [
'name',
],
validator => validation_for(
params => {
name => { type => Str },
}
),
},
restart => {
params => [
'name',
],
validator => validation_for(
params => {
name => { type => Str },
}
),
}
}
sub new {
my $class = shift;
return bless {}, $class;
}
{
my $validator = validation_for(
params => {
socket => { type => Object },
}
);
sub dispatch {
my $self = shift;
my %params = $validator->(@_);
my $socket = $params{socket};
my $message_manager = Cualsea::MessageManager->new( socket => $socket );
my $message = $message_manager->read_message;
if ( !$self->check_if_user_has_permissions( socket => $socket ) ) {
$self->write_no_permission( message_manager => $message_manager );
}
if ( !$self->check_is_command( message => $message ) ) {
$self->write_malformed( message_manager => $message_manager );
return;
}
$message_manager->write_message( message => $message );
}
}
{
my $validator = validation_for(
params => {
socket => { type => Object },
}
);
sub check_if_user_has_permissions {
my $self = shift;
my %params = $validator->(@_);
my $socket = $params{socket};
my ($pid, $uid, $gid) = unpack 'LLL', $socket->sockopt(SO_PEERCRED);
my $user = getpwuid($uid);
while (my ($name, undef, undef, $members) = getgrent()) {
if ($name eq 'cualsea') {
return List::Util::any { $_ eq $user } split ',', $members;
last;
}
}
}
}
{
my $validator = validation_for(
params => {
message_manager => { type => Object }
}
);
sub write_no_permission {
my $self = shift;
my %params = $validator->(@_);
my $message_manager = $params{message_manager};
$message_manager->write_message(
message => { is_error => 1, status => 403 } );
}
}
{
my $validator = validation_for(
params => {
message_manager => { type => Object }
}
);
sub write_malformed {
my $self = shift;
my %params = $validator->(@_);
my $message_manager = $params{message_manager};
$message_manager->write_message(
message => { is_error => 1, status => 400 } );
}
}
{
my $validator = validation_for(
params => {
message => { type => HashRef },
}
);
sub check_is_command {
my $self = shift;
my %params = $validator->(@_);
my $message = $params{message};
return 1 if exists $message->{command};
}
}
1