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 B0EFC7D717 for ; Tue, 9 Nov 2021 12:27:53 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id EC730AFA2 for ; Tue, 9 Nov 2021 12:27:25 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (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 ABF69AF67 for ; Tue, 9 Nov 2021 12:27:24 +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 8320546065 for ; Tue, 9 Nov 2021 12:27:24 +0100 (CET) From: Wolfgang Bumiller To: pve-devel@lists.proxmox.com Date: Tue, 9 Nov 2021 12:26:57 +0100 Message-Id: <20211109112721.130935-9-w.bumiller@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211109112721.130935-1-w.bumiller@proxmox.com> References: <20211109112721.130935-1-w.bumiller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.551 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [user.pm] Subject: [pve-devel] [PATCH access-control 02/10] update read_user_tfa_type call X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Nov 2021 11:27:53 -0000 Signed-off-by: Wolfgang Bumiller --- src/PVE/API2/User.pm | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/PVE/API2/User.pm b/src/PVE/API2/User.pm index 8893d03..3d4d4e0 100644 --- a/src/PVE/API2/User.pm +++ b/src/PVE/API2/User.pm @@ -485,6 +485,12 @@ __PACKAGE__->register_method ({ additionalProperties => 0, properties => { userid => get_standard_option('userid-completed'), + multiple => { + type => 'boolean', + description => 'Request all entries as an array.', + optional => 1, + default => 0, + }, }, }, returns => { @@ -499,9 +505,23 @@ __PACKAGE__->register_method ({ user => { type => 'string', enum => [qw(oath u2f)], - description => "The type of TFA the user has set, if any.", + description => + "The type of TFA the user has set, if any." + . " Only set if 'multiple' was not passed.", optional => 1, }, + types => { + type => 'array', + description => + "Array of the user configured TFA types, if any." + . " Only available if 'multiple' was not passed.", + optional => 1, + items => { + type => 'string', + enum => [qw(totp u2f yubico webauthn recovedry)], + description => 'A TFA type.', + }, + }, }, type => "object" }, @@ -514,15 +534,24 @@ __PACKAGE__->register_method ({ my $realm_cfg = $domain_cfg->{ids}->{$realm}; die "auth domain '$realm' does not exist\n" if !$realm_cfg; + my $res = {}; my $realm_tfa = {}; $realm_tfa = PVE::Auth::Plugin::parse_tfa_config($realm_cfg->{tfa}) if $realm_cfg->{tfa}; + $res->{realm} = $realm_tfa->{type} if $realm_tfa->{type}; my $tfa_cfg = cfs_read_file('priv/tfa.cfg'); - my $tfa = $tfa_cfg->{users}->{$username}; - - my $res = {}; - $res->{realm} = $realm_tfa->{type} if $realm_tfa->{type}; - $res->{user} = $tfa->{type} if $tfa->{type}; + if ($param->{multiple}) { + my $tfa = $tfa_cfg->get_user($username); + my $user = []; + foreach my $type (keys %$tfa) { + next if !scalar($tfa->{$type}->@*); + push @$user, $type; + } + $res->{user} = $user; + } else { + my $tfa = $tfa_cfg->{users}->{$username}; + $res->{user} = $tfa->{type} if $tfa->{type}; + } return $res; }}); -- 2.30.2