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.
This commit is contained in:
Erik Thuning 2025-03-13 14:49:34 +01:00
parent e953f6c7a5
commit e640c24515
3 changed files with 52 additions and 52 deletions

@ -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.'));
}

@ -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;

@ -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));