From e640c245156d400a529eb8aa37463e4d8722c553 Mon Sep 17 00:00:00 2001 From: Erik Thuning <boooink@gmail.com> Date: Thu, 13 Mar 2025 14:49:34 +0100 Subject: [PATCH] FIX: Initiating a loan from a product no longer requires the user to already exist. Loans created on the checkout page and the product page used different functions to look up users, causing inconsistent behaviour. Now both use the "advanced" user lookup that will initialize users that don't currently exist in the system. --- include/Ajax.php | 2 +- include/CheckoutPage.php | 51 ---------------------------------------- include/Responder.php | 51 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/include/Ajax.php b/include/Ajax.php index 9beb326..49adff1 100644 --- a/include/Ajax.php +++ b/include/Ajax.php @@ -81,7 +81,7 @@ class Ajax extends Responder { private function checkout_product() { $user = null; try { - $user = new User($_POST['user'], 'name'); + $user = $this->user_init($_POST['user'], null); } catch(Exception $e) { return new Failure(i18n('Invalid user ID.')); } diff --git a/include/CheckoutPage.php b/include/CheckoutPage.php index 2296f6f..7bfa219 100644 --- a/include/CheckoutPage.php +++ b/include/CheckoutPage.php @@ -20,57 +20,6 @@ class CheckoutPage extends Page { } } - protected function user_init($name, $email) { - $nameuser = null; - $emailuser = null; - if($name) { - try { - $nameuser = new User($name, 'name'); - } catch(Exception $ue) { - # The user wasn't found locally - try { - $this->ldap->get_user($name); - $nameuser = User::create_user($name); - } catch(Exception $le) { - $err = i18n("Username {name} not found.", - $name); - throw new Exception($err); - } - } - } - if($email) { - try { - $search = $email; - if(strpos($email, '@') === false) { - $search = $email .'@dsv.su.se'; - } - # Lookup email directly in ldap since we don't store it - $uid = $this->ldap->search_email($search); - } catch(Exception $le) { - $err = i18n('Email address {address} not found.', - $search); - throw new Exception($err); - } - try { - $emailuser = new User($uid, 'name'); - } catch(Exception $ue) { - # User wasn't found locally, so initialize a new user - $emailuser = User::create_user($uid); - } - } - if($nameuser && $emailuser) { - if($nameuser != $emailuser) { - $err = i18n('Username and email match different users.'); - throw new Exception($err); - } - return $nameuser; - } - if($nameuser) { - return $nameuser; - } - return $emailuser; - } - protected function render_body() { $username = $this->userstr; $email = $this->emailstr; diff --git a/include/Responder.php b/include/Responder.php index bbc9104..2787279 100644 --- a/include/Responder.php +++ b/include/Responder.php @@ -27,6 +27,57 @@ abstract class Responder { abstract public function render(); + final protected function user_init($name, $email) { + $nameuser = null; + $emailuser = null; + if($name) { + try { + $nameuser = new User($name, 'name'); + } catch(Exception $ue) { + # The user wasn't found locally + try { + $this->ldap->get_user($name); + $nameuser = User::create_user($name); + } catch(Exception $le) { + $err = i18n("Username {name} not found.", + $name); + throw new Exception($err); + } + } + } + if($email) { + try { + $search = $email; + if(strpos($email, '@') === false) { + $search = $email .'@dsv.su.se'; + } + # Lookup email directly in ldap since we don't store it + $uid = $this->ldap->search_email($search); + } catch(Exception $le) { + $err = i18n('Email address {address} not found.', + $search); + throw new Exception($err); + } + try { + $emailuser = new User($uid, 'name'); + } catch(Exception $ue) { + # User wasn't found locally, so initialize a new user + $emailuser = User::create_user($uid); + } + } + if($nameuser && $emailuser) { + if($nameuser != $emailuser) { + $err = i18n('Username and email match different users.'); + throw new Exception($err); + } + return $nameuser; + } + if($nameuser) { + return $nameuser; + } + return $emailuser; + } + final protected function escape_tags($tags) { foreach($tags as $key => $tag) { $tags[$key] = $this->escape_string(strtolower($tag));