176 lines
4.1 KiB
Perl
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
|