From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 4C92D6A026 for ; Thu, 21 Jan 2021 16:52:08 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 40D9313D1A for ; Thu, 21 Jan 2021 16:51:38 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 6087B13D0B for ; Thu, 21 Jan 2021 16:51:36 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 2A523460AA for ; Thu, 21 Jan 2021 16:51:36 +0100 (CET) From: Stoiko Ivanov To: pmg-devel@lists.proxmox.com Date: Thu, 21 Jan 2021 16:51:05 +0100 Message-Id: <20210121155107.1971-5-s.ivanov@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210121155107.1971-1-s.ivanov@proxmox.com> References: <20210121155107.1971-1-s.ivanov@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.062 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_FILL_THIS_FORM_SHORT 0.01 Fill in a short form with personal information URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [statistics.pm] Subject: [pmg-devel] [PATCH pmg-api v2] api: statistics: make email a parameter X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jan 2021 15:52:08 -0000 This patch changes the semantics for the detailed contact, sender and receiver statistics call: additionally to the current way of providing the e-mail address as path component, it is now also possible to provide 'detail' as path and the address in the additional parameter 'detailaddress'. This allows the statistics to be displayed for addresses containing '/' in their localpart, once this is permitted in our api schema. the idea follows a similar change for the user blocklists in e8d909c11faeb5a4f84f39ef50e0eaf8ea65046d The verification of the paramter now happens inside the common sub for detail statistics instead of the API decomposer. Backward compatibility is ensured, since the only additional value 'detail' was not allowed as value for 'pmg-email-address'. Signed-off-by: Stoiko Ivanov --- v1->v2: * instead of adding the new paths contacts, senders, receivers in addition to their singular counterparts, handle the detail calls in the old path with the special value 'detail' (instead of an e-mail address) src/PMG/API2/Statistics.pm | 59 ++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 9 deletions(-) src/PMG/API2/Statistics.pm | 58 ++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/PMG/API2/Statistics.pm b/src/PMG/API2/Statistics.pm index 72bfeb5..732a3b4 100644 --- a/src/PMG/API2/Statistics.pm +++ b/src/PMG/API2/Statistics.pm @@ -294,6 +294,19 @@ my $detail_return_properties = sub { sub get_detail_statistics { my ($type, $param) =@_; + my $detail_address; + if ($param->{$type} eq 'detail') { + if (!defined($param->{detailaddress})) { + raise_param_exc({ $type => 'need detailaddress'}); + } + $detail_address = $param->{detailaddress}; + } else { + $detail_address = $param->{$type}; + } + + PVE::JSONSchema::validate($detail_address, get_standard_option('pmg-email-address'), + 'Address parameter verification failed'); + my ($start, $end) = $extract_start_end->($param); my $stat = PMG::Statistic->new($start, $end); @@ -309,19 +322,22 @@ sub get_detail_statistics { my $res = []; if ($type eq 'contact') { $res = $stat->user_stat_contact_details( - $rdb, $param->{contact}, $userstat_limit, $sorters, $param->{filter}); + $rdb, $detail_address, $userstat_limit, $sorters, $param->{filter}); } elsif ($type eq 'sender') { $res = $stat->user_stat_sender_details( - $rdb, $param->{sender}, $userstat_limit, $sorters, $param->{filter}); + $rdb, $detail_address, $userstat_limit, $sorters, $param->{filter}); } elsif ($type eq 'receiver') { $res = $stat->user_stat_receiver_details( - $rdb, $param->{receiver}, $userstat_limit, $sorters, $param->{filter}); + $rdb, $detail_address, $userstat_limit, $sorters, $param->{filter}); } else { die "invalid type provided (not 'contact', 'sender', 'receiver')\n"; } return $res; } +# FIXME: change for PMG 7.0 - remove support for providing addresses as path +# addresses can contain '/' which breaks API path resolution - hardcode +# 'detail' for the path pattern. __PACKAGE__->register_method ({ name => 'contactdetails', path => 'contact/{contact}', @@ -331,8 +347,14 @@ __PACKAGE__->register_method ({ parameters => { additionalProperties => 0, properties => $default_properties->({ - contact => get_standard_option('pmg-email-address', { - description => "Contact email address.", + contact => { + type => 'string', + description => "'detail', with the address provided as 'detailaddress' or" + . "the address - the latter is deprecated.", + }, + detailaddress => get_standard_option('pmg-email-address', { + description => "The e-mail address if contact is 'detail'.", + optional => 1, }), filter => { description => "Sender address filter.", @@ -425,6 +447,9 @@ __PACKAGE__->register_method ({ return $res; }}); +# FIXME: change for PMG 7.0 - remove support for providing addresses as path +# addresses can contain '/' which breaks API path resolution - hardcode +# 'detail' for the path pattern. __PACKAGE__->register_method ({ name => 'senderdetails', path => 'sender/{sender}', @@ -434,8 +459,14 @@ __PACKAGE__->register_method ({ parameters => { additionalProperties => 0, properties => $default_properties->({ - sender => get_standard_option('pmg-email-address', { - description => "Sender email address.", + sender => { + type => 'string', + description => "'detail', with the address provided as 'detailaddress' or" + . "the address - the latter is deprecated.", + }, + detailaddress => get_standard_option('pmg-email-address', { + description => "The e-mail address if sender is 'detail'.", + optional => 1, }), filter => { description => "Receiver address filter.", @@ -536,6 +567,9 @@ __PACKAGE__->register_method ({ return $res; }}); +# FIXME: change for PMG 7.0 - remove support for providing addresses as path +# addresses can contain '/' which breaks API path resolution - hardcode +# 'detail' for the path pattern. __PACKAGE__->register_method ({ name => 'receiverdetails', path => 'receiver/{receiver}', @@ -545,8 +579,14 @@ __PACKAGE__->register_method ({ parameters => { additionalProperties => 0, properties => $default_properties->({ - receiver => get_standard_option('pmg-email-address', { - description => "Receiver email address.", + receiver => { + type => 'string', + description => "'detail', with the address provided as 'detailaddress' or" + . "the address - the latter is deprecated.", + }, + detailaddress => get_standard_option('pmg-email-address', { + description => "The e-mail address if contact is 'detail'.", + optional => 1, }), filter => { description => "Sender address filter.", -- 2.20.1