1 package Koha::Auth::Client;
3 # Copyright Theke Solutions 2022
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 use Koha::Exceptions::Auth;
23 use Koha::Auth::Providers;
27 Koha::Auth::Client - Base Koha auth client
35 my $auth_client = Koha::Auth::Client->new();
43 bless( $self, $class );
48 $auth_client->get_user($provider, $data)
50 Get user data according to provider's mapping configuration
55 my ( $self, $params ) = @_;
56 my $provider_code = $params->{provider};
57 my $data = $params->{data};
58 my $interface = $params->{interface};
59 my $config = $params->{config};
61 my $provider = Koha::Auth::Providers->search({ code => $provider_code })->next;
63 my ( $mapped_data, $patron ) = $self->_get_data_and_patron({ provider => $provider, data => $data, config => $config });
66 my $domain = $self->has_valid_domain_config({ provider => $provider, email => $mapped_data->{email}, interface => $interface});
68 $mapped_data->{categorycode} = $domain->default_category_id;
69 $mapped_data->{branchcode} = $domain->default_library_id;
71 return ( $patron, $mapped_data, $domain );
75 =head3 get_valid_domain_config
77 my $domain = Koha::Auth::Client->get_valid_domain_config(
78 { provider => $provider,
80 interface => $interface
84 Gets the best suited valid domain configuration for the given provider.
88 sub get_valid_domain_config {
89 # FIXME: Should be a hashref param
90 my ( $self, $params ) = @_;
91 my $provider = $params->{provider};
92 my $user_email = $params->{email};
93 my $interface = $params->{interface};
95 my $domains = $provider->domains;
97 my $allow = "allow_$interface";
98 my @subdomain_matches;
101 while ( my $domain = $domains->next ) {
102 next unless $domain->$allow;
104 my $domain_text = $domain->domain;
105 unless ( defined $domain_text && $domain_text ne '') {
106 $default_match = $domain;
109 my ( $asterisk, $domain_name ) = ( $domain_text =~ /^(\*)?(.+)$/ );
110 if ( $asterisk eq '*' ) {
113 $domain_name =~ s/\./\\\./g;
114 $pattern .= $domain_name . '$';
115 if ( $user_email =~ /$pattern/ ) {
116 if ( $asterisk eq '*' ) {
117 push @subdomain_matches, { domain => $domain, match_length => length $domain_name };
120 # Perfect match.. return this one.
126 if ( @subdomain_matches ) {
127 @subdomain_matches = sort { $b->{match_length} <=> $a->{match_length} } @subdomain_matches
128 unless scalar @subdomain_matches == 1;
129 return $subdomain_matches[0]->{domain};
132 return $default_match || 0;
135 =head3 has_valid_domain_config
137 my $has_valid_domain = Koha::Auth::Client->has_valid_domain_config(
138 { provider => $provider,
139 email => $user_email,
140 interface => $interface
144 Checks if provider has a valid domain for user email. If has, returns that domain.
148 sub has_valid_domain_config {
149 # FIXME: Should be a hashref param
150 my ( $self, $params ) = @_;
151 my $domain = $self->get_valid_domain_config( $params );
153 Koha::Exceptions::Auth::NoValidDomain->throw( code => 401 )
159 =head3 _get_data_and_patron
161 my $mapping = $auth_client->_get_data_and_patron(
162 { provider => $provider,
168 Generic method that maps raw data to patron schema, and returns a patron if it can.
170 Note: this only returns an empty I<hashref>. Each class should have its
171 own mapping returned.
175 sub _get_data_and_patron {
179 =head3 _tranverse_hash
181 my $value = $auth_client->_tranverse_hash( { base => $base_hash, keys => $key_string } );
183 Get deep nested value in a hash.
187 sub _tranverse_hash {
188 my ($self, $params) = @_;
189 my $base = $params->{base};
190 my $keys = $params->{keys};
191 my ($key, $rest) = ($keys =~ /^([^.]+)(?:\.(.*))?/);
192 return unless defined $key;
193 my $value = ref $base eq 'HASH' ? $base->{$key} : $base->[$key];
194 return $value unless $rest;
195 return $self->_tranverse_hash({ base => $value, keys => $rest });