]> git.proxmox.com Git - pmg-api.git/commitdiff
SMTPWhitelist.pm: finish/cleanup whitelist API
authorDietmar Maurer <dietmar@proxmox.com>
Mon, 27 Feb 2017 15:27:15 +0000 (16:27 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 27 Feb 2017 15:27:15 +0000 (16:27 +0100)
PMG/API2/SMTPWhitelist.pm
PMG/RuleDB/Domain.pm
PMG/RuleDB/EMail.pm
PMG/RuleDB/Object.pm
PMG/RuleDB/WhoRegex.pm

index fa2d43ff098bbbed990c388aba96ae058c8f84ac..ccf0ba03a690317076e0e1ad8049238c878a0873 100644 (file)
@@ -12,6 +12,15 @@ use PVE::RESTHandler;
 use PVE::INotify;
 
 use PMG::Config;
+
+use PMG::RuleDB::WhoRegex;
+use PMG::RuleDB::ReceiverRegex;
+use PMG::RuleDB::EMail;
+use PMG::RuleDB::Receiver;
+use PMG::RuleDB::IPAddress;
+use PMG::RuleDB::IPNet;
+use PMG::RuleDB::Domain;
+use PMG::RuleDB::ReceiverDomain;
 use PMG::RuleDB;
 
 use base qw(PVE::RESTHandler);
@@ -40,8 +49,14 @@ __PACKAGE__->register_method ({
 
        return [
            { subdir => 'objects' },
+           { subdir => 'sender' },
+           { subdir => 'receiver' },
            { subdir => 'sender_domain' },
            { subdir => 'receiver_domain' },
+           { subdir => 'sender_regex' },
+           { subdir => 'receiver_regex' },
+           { subdir => 'ip' },
+           { subdir => 'network' },
        ];
 
     }});
@@ -78,145 +93,17 @@ __PACKAGE__->register_method ({
        my $res = [];
 
        foreach my $obj (@$og) {
-           push @$res, {
-               id => $obj->{id},
-               otype => $obj->{otype},
-               receivertest => $obj->receivertest(),
-               descr => $obj->short_desc(),
-           };
+           push @$res, $obj->get_data();
        }
 
        return $res;
     }});
 
+
 # fixme:
 # $conn->reload_greylistdb () if $_class eq 'greylist';
 # $conn->reload_ruledb ();
 
-my $load_object = sub {
-    my ($rdb, $id, $gid, $exp_otype) = @_;
-
-    my $obj = $rdb->load_object($id);
-    die "object '$id' does not exists\n" if !defined($obj);
-
-    my $otype = $obj->otype();
-    die "wrong object type ($otype != $exp_otype)\n"
-       if $otype != $exp_otype;
-
-    die "wrong object group ($obj->{ogroup} != $gid)\n"
-       if $obj->{ogroup} != $gid;
-
-    return $obj;
-};
-
-
-__PACKAGE__->register_method ({
-    name => 'sender_domain',
-    path => 'sender_domain',
-    method => 'POST',
-    description => "Add a sender domain to the SMTP whitelist.",
-    proxyto => 'master',
-    parameters => {
-       additionalProperties => 0,
-       properties => {
-           domain => {
-               description => "DNS domain name.",
-               type => 'string', format => 'dns-name',
-           },
-       },
-    },
-    returns => {
-       description => "The object ID.",
-       type => 'integer',
-    },
-    code => sub {
-       my ($param) = @_;
-
-       my $rdb = PMG::RuleDB->new();
-
-       my $gid = $rdb->greylistexclusion_groupid();
-
-       my $obj = PMG::RuleDB::Domain->new($param->{domain});
-       $obj->{ogroup} = $gid;
-
-       my $id = $obj->save($rdb);
-
-       return $id;
-    }});
-
-__PACKAGE__->register_method ({
-    name => 'update_sender_domain',
-    path => 'sender_domain/{id}',
-    method => 'PUT',
-    description => "Modify sender domain SMTP whitelist entryp.",
-    proxyto => 'master',
-    parameters => {
-       additionalProperties => 0,
-       properties => {
-           id => {
-               description => "Object ID.",
-               type => 'integer',
-           },
-           domain => {
-               description => "DNS domain name.",
-               type => 'string', format => 'dns-name',
-           },
-       },
-    },
-    returns => { type => 'null' },
-    code => sub {
-       my ($param) = @_;
-
-       my $rdb = PMG::RuleDB->new();
-
-       my $gid = $rdb->greylistexclusion_groupid();
-       my $exp_otype = PMG::RuleDB::Domain->otype();
-
-       my $obj = $load_object->($rdb, $param->{id}, $gid, $exp_otype);
-
-       $obj->{address} = $param->{domain};
-
-       $obj->save($rdb);
-
-       return undef;
-    }});
-
-
-__PACKAGE__->register_method ({
-    name => 'receiver_domain',
-    path => 'receiver_domain',
-    method => 'POST',
-    description => "Add a receiver domain to the SMTP whitelist.",
-    proxyto => 'master',
-    parameters => {
-       additionalProperties => 0,
-       properties => {
-           domain => {
-               description => "DNS domain name.",
-               type => 'string', format => 'dns-name',
-           },
-       },
-    },
-    returns => {
-       description => "The object ID.",
-       type => 'integer',
-    },
-    code => sub {
-       my ($param) = @_;
-
-       my $rdb = PMG::RuleDB->new();
-
-       my $gid = $rdb->greylistexclusion_groupid();
-
-       my $obj = PMG::RuleDB::ReceiverDomain->new($param->{domain});
-       $obj->{ogroup} = $gid;
-
-       my $id = $obj->save($rdb);
-
-       return $id;
-    }});
-
-
 __PACKAGE__->register_method ({
     name => 'delete_object',
     path => 'objects/{id}',
@@ -247,4 +134,17 @@ __PACKAGE__->register_method ({
        return undef;
     }});
 
+
+PMG::RuleDB::EMail->register_api(__PACKAGE__, 'sender', 1);
+PMG::RuleDB::Receiver->register_api(__PACKAGE__, 'receiver', 1);
+
+PMG::RuleDB::Domain->register_api(__PACKAGE__, 'sender_domain', 1);
+PMG::RuleDB::ReceiverDomain->register_api(__PACKAGE__, 'receiver_domain', 1);
+
+PMG::RuleDB::WhoRegex->register_api(__PACKAGE__, 'sender_regex', 1);
+PMG::RuleDB::ReceiverRegex->register_api(__PACKAGE__, 'receiver_regex', 1);
+
+PMG::RuleDB::IPAddress->register_api(__PACKAGE__, 'ip', 1);
+PMG::RuleDB::IPNet->register_api(__PACKAGE__, 'network', 1);
+
 1;
index 53bb56ac1aa132546d7d7ce46091e56c77cd23c6..4b78f41757c6c5652ef2c648b74d465a07a83d67 100644 (file)
@@ -28,9 +28,9 @@ sub oconfigsite {
 
 sub new {
     my ($type, $address, $ogroup) = @_;
-    
+
     my $class = ref($type) || $type;
+
     $address //= 'domain.tld';
 
     my $self = $class->SUPER::new($address, $ogroup);
@@ -41,20 +41,35 @@ sub new {
 sub who_match {
     my ($self, $addr) = @_;
 
-    $addr =~ m/^.+@(.+)$/; 
+    $addr =~ m/^.+@(.+)$/;
 
     return (lc ($1) eq lc ($self->address));
 }
 
 sub short_desc {
     my $self = shift;
-    
+
     my $desc = $self->{address};
-    
+
     return $desc;
 }
 
+sub properties {
+    my ($class) = @_;
 
+    return {
+       domain => {
+           description => "DNS domain name (Sender).",
+           type => 'string', format => 'dns-name',
+       },
+    };
+}
+
+sub update {
+    my ($self, $param) = @_;
+
+    $self->{address} = $param->{domain};
+}
 
 1;
 __END__
@@ -72,4 +87,3 @@ An Email domain. We use case insensitive compares.
 =head2 Examples
 
     $obj = PMG::RuleDB::Domain->new ('yourdomain.com');
-
index d10800a411b3306efed82155b6a4b94687cc1794..06b05b1fdf6a34ed26f0659c11d3483e8524223f 100644 (file)
@@ -47,6 +47,23 @@ sub short_desc {
     return $desc;
 }
 
+sub properties {
+    my ($class) = @_;
+
+    return {
+       email => {
+           description => "Email address.",
+           type => 'string', format => 'email',
+       },
+    };
+}
+
+sub update {
+    my ($self, $param) = @_;
+
+    $self->{address} = $param->{email};
+}
+
 1;
 
 __END__
index 4229a3459cc59b1f9240e97b42d44f15e5eb0a14..c389b511dd04f48a7b433e57e5623c54bc8ae5cc 100644 (file)
@@ -26,6 +26,12 @@ sub save {
     croak "never call this method: ERROR"; 
 }
 
+sub update {
+    my ($self, $param) = @_;
+
+    croak "never call this method: ERROR";
+}
+
 sub load_attr { 
     croak "never call this method: ERROR"; 
 }
@@ -113,6 +119,161 @@ sub short_desc {
     return "basic object";
 }
 
+sub get_data {
+    my ($self) = @_;
+
+    return {
+       id => $self->{id},
+       ogroup => $self->{ogroup},
+       otype => $self->{otype},
+       otype_text => $self->otype_text(),
+       receivertest => $self->receivertest(),
+       descr => $self->short_desc(),
+    };
+}
+
+my $load_object = sub {
+    my ($rdb, $id, $gid, $exp_otype) = @_;
+
+    my $obj = $rdb->load_object($id);
+    die "object '$id' does not exists\n" if !defined($obj);
+
+    my $otype = $obj->otype();
+    die "wrong object type ($otype != $exp_otype)\n"
+       if $otype != $exp_otype;
+
+    die "wrong object group ($obj->{ogroup} != $gid)\n"
+       if $obj->{ogroup} != $gid;
+
+    return $obj;
+};
+
+sub register_api {
+    my ($class, $apiclass, $name, $use_greylist_gid) = @_;
+
+    my $otype = $class->otype();
+
+    my $otype_text = $class->otype_text();
+
+    my $properties = $class->properties();
+
+    my $create_properties = {};
+    my $update_properties = {
+       id => {
+           description => "Object ID.",
+           type => 'integer',
+       },
+    };
+    my $read_properties = {
+       id => {
+           description => "Object ID.",
+           type => 'integer',
+       },
+    };
+
+    if (!$use_greylist_gid) {
+       $read_properties = $create_properties->{ogroup} = $update_properties->{ogroup} = {
+           description => "Object Groups ID.",
+           type => 'integer',
+       };
+    };
+
+    foreach my $key (keys %$properties) {
+       $create_properties->{$key} = $properties->{$key};
+       $update_properties->{$key} = $properties->{$key};
+    }
+
+    $apiclass->register_method ({
+       name => $name,
+       path => $name,
+       method => 'POST',
+       description => "Add '$otype_text' object.",
+       proxyto => 'master',
+       parameters => {
+           additionalProperties => 0,
+           properties => $create_properties,
+       },
+       returns => {
+           description => "The object ID.",
+           type => 'integer',
+       },
+       code => sub {
+           my ($param) = @_;
+
+           my $rdb = PMG::RuleDB->new();
+
+           my $gid = $use_greylist_gid ?
+               $rdb->greylistexclusion_groupid() : $param->{ogroup};
+
+           my $obj = $rdb->get_opject($otype);
+           $obj->{ogroup} = $gid;
+
+           $obj->update($param);
+
+           my $id = $obj->save($rdb);
+
+           return $id;
+       }});
+
+    $apiclass->register_method ({
+       name => "read_$name",
+       path => "$name/{id}",
+       method => 'GET',
+       description => "Read '$otype_text' object settings.",
+       proxyto => 'master',
+       parameters => {
+           additionalProperties => 0,
+           properties => $read_properties,
+       },
+       returns => {
+           type => "object",
+           properties => {
+               id => { type => 'integer'},
+           },
+       },
+       code => sub {
+           my ($param) = @_;
+
+           my $rdb = PMG::RuleDB->new();
+
+           my $gid = $use_greylist_gid ?
+               $rdb->greylistexclusion_groupid() : $param->{ogroup};
+
+           my $obj = $load_object->($rdb, $param->{id}, $gid, $otype);
+
+           return $obj->get_data();
+       }});
+
+    $apiclass->register_method ({
+       name => "update_$name",
+       path => "$name/{id}",
+       method => 'PUT',
+       description => "Update '$otype_text' object.",
+       proxyto => 'master',
+       parameters => {
+           additionalProperties => 0,
+           properties => $update_properties,
+       },
+       returns => { type => 'null' },
+       code => sub {
+           my ($param) = @_;
+
+           my $rdb = PMG::RuleDB->new();
+
+           my $gid = $use_greylist_gid ?
+               $rdb->greylistexclusion_groupid() : $param->{ogroup};
+
+           my $obj = $load_object->($rdb, $param->{id}, $gid, $otype);
+
+           $obj->update($param);
+
+           $obj->save($rdb);
+
+           return undef;
+       }});
+
+}
+
 1;
 
 __END__
index 715231baa267cc04214fcf41c840767fa24b8cd9..0d0b5deae63e534209f4019544881c5d77f2ca77 100644 (file)
@@ -113,6 +113,24 @@ sub short_desc {
     return $desc;
 }
 
+sub properties {
+    my ($class) = @_;
+
+    return {
+       regex => {
+           description => "Email address regular expression.",
+           type => 'string',
+           maxLength => 1024,
+       },
+    };
+}
+
+sub update {
+    my ($self, $param) = @_;
+
+    $self->{address} = $param->{regex};
+}
+
 1;
 
 __END__