1 package PMG
::API2
::DKIMSign
;
6 use PVE
::Tools
qw(extract_param dir_glob_foreach);
7 use PVE
::JSONSchema
qw(get_standard_option);
8 use PVE
::Exception
qw(raise_param_exc);
14 use PMG
::API2
::DKIMSignDomains
;
16 use base
qw(PVE::RESTHandler);
18 __PACKAGE__-
>register_method({
19 subclass
=> "PMG::API2::DKIMSignDomains",
23 __PACKAGE__-
>register_method({
27 description
=> "Directory index.",
29 additionalProperties
=> 0,
36 properties
=> { section
=> { type
=> 'string'} },
38 links
=> [ { rel
=> 'child', href
=> "{section}" } ],
44 { section
=> 'domains'},
45 { section
=> 'selector'},
46 { section
=> 'selectors'}
50 __PACKAGE__-
>register_method({
51 name
=> 'set_selector',
54 description
=> "Generate a new private key for selector. All future mail will be signed with the new key!",
56 permissions
=> { check
=> [ 'admin' ] },
59 additionalProperties
=> 0,
62 description
=> "DKIM Selector",
63 type
=> 'string', format
=> 'dns-name',
66 description
=> "Number of bits for the RSA-Key",
67 type
=> 'integer', minimum
=> 1024
70 description
=> "Overwrite existing key",
71 type
=> 'boolean', optional
=> 1
75 returns
=> { type
=> 'null' },
78 my $selector = extract_param
($param, 'selector');
79 my $keysize = extract_param
($param, 'keysize');
80 my $force = extract_param
($param, 'force');
82 PMG
::DKIMSign
::set_selector
($selector, $keysize, $force);
87 sub pmg_verify_dkim_pubkey_record
{
88 my ($rec, $noerr) = @_;
90 if ($rec !~ /\._domainkey\tIN\tTXT\t\( "v=DKIM1; h=sha256; k=rsa; ".+ \) ; ----- DKIM key/ms ) {
91 return undef if $noerr;
92 die "value does not look like a valid DKIM TXT record\n";
98 PVE
::JSONSchema
::register_format
(
99 'pmg-dkim-record', \
&pmg_verify_dkim_pubkey_record
);
101 __PACKAGE__-
>register_method({
102 name
=> 'get_selector_info',
105 description
=> "Get the public key for the configured selector, prepared as DKIM TXT record",
107 permissions
=> { check
=> [ 'admin' ] },
110 additionalProperties
=> 0,
116 selector
=> { type
=> 'string', format
=> 'dns-name', optional
=> 1 },
117 keysize
=> { type
=> 'integer', minimum
=> 1024 , optional
=> 1},
118 record
=> { type
=> 'string', format
=> 'pmg-dkim-record', optional
=> 1},
122 my $cfg = PMG
::Config-
>new();
123 my $selector = $cfg->get('admin', 'dkim_selector');
125 return {} if !defined($selector);
128 eval { ($record, $size) = PMG
::DKIMSign
::get_selector_info
($selector); };
129 return {selector
=> $selector} if $@;
131 return { selector
=> $selector, keysize
=> $size, record
=> $record };
134 __PACKAGE__-
>register_method({
135 name
=> 'get_selector_list',
138 description
=> "Get a list of all existing selectors",
140 permissions
=> { check
=> [ 'admin' ] },
143 additionalProperties
=> 0,
150 properties
=> { selector
=> { type
=> 'string', format
=> 'dns-name' } },
152 links
=> [ { rel
=> 'child', href
=> "{selector}" } ],
157 my @selectors = dir_glob_foreach
('/etc/pmg/dkim/', '.*\.private', sub {
159 $sel =~ s/\.private$//;
160 push @$res, { selector
=> $sel };