From fe4d6229a4d809095f6f657800779fd16dab165d Mon Sep 17 00:00:00 2001 From: ltning Date: Sun, 25 Jan 2026 20:49:27 +0000 Subject: [PATCH 1/3] Add new send_reg_approval_email_from_register function Current send_reg_approval_email function expects account to already exist, and does not seem to be called anywhere. New function takes necessary information from the register table. Added call to new function in Regate.php after verification is done. Will fail and roll back if the function call fails or if no admin accounts were found to notify (delivered<1). --- Zotlabs/Module/Regate.php | 10 ++++- include/account.php | 85 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/Zotlabs/Module/Regate.php b/Zotlabs/Module/Regate.php index 13a89a707..711d94260 100644 --- a/Zotlabs/Module/Regate.php +++ b/Zotlabs/Module/Regate.php @@ -142,7 +142,15 @@ class Regate extends \Zotlabs\Web\Controller { if (($flags & ACCOUNT_PENDING ) == ACCOUNT_PENDING) { $nextpage = 'regate/' . bin2hex($did2) . $didx; - q("COMMIT"); + $approve = send_reg_approval_email_from_register([ 'reg_id' => $r['reg_id'] ]); + if ($approve['success']) { + q("COMMIT"); + } else { + q("ROLLBACK"); + $msg_code = 'ZAR1237E'; + $msg = t('Account verification notify error'); + zar_log($msg_code . ' ' . $msg . ': ' . print_r($approve, true)); + } } elseif (($flags ^ REGISTER_AGREED) == 0) { diff --git a/include/account.php b/include/account.php index 9b859432c..11f5c9cd9 100644 --- a/include/account.php +++ b/include/account.php @@ -311,7 +311,7 @@ function verify_email_address(string $email): bool { pop_lang(); if(! $res) - logger("send_reg_approval_email: failed sending email to: {$email}"); + logger("send_reg_verification_email: failed sending email to: {$email}"); return $res; } @@ -392,6 +392,89 @@ function send_reg_approval_email($arr) { return($delivered ? true : false); } + +/** + * send_reg_approval_email_from_register + * @author ltning + * @since 2026-01-25 + * + * Account approval after verification based on table register. + * This function sends email to admin(s). + * + */ +function send_reg_approval_email_from_register($arr) { + + $result = array('success' => false, 'message' => 'rid:' . $arr['reg_id']); + $now = datetime_convert(); + + $register = q("SELECT * FROM register WHERE reg_id = %d", + intval($arr['reg_id']) + ); + + if(! ($register && count($register))) { + logger('send_reg_approval_email: could not find data for reg_id ' . $arr['reg_id']); + return $result; + } + + $r = q("select * from account where (account_roles & %d) >= 4096", + intval(ACCOUNT_ROLE_ADMIN) + ); + + $admins = array(); + + foreach($r as $rr) { + if(strlen($rr['account_email'])) { + $admins[] = array('email' => $rr['account_email'], 'lang' => $rr['account_lang']); + } + } + + if(! count($admins)) { + logger('send_reg_approval_email: could not find any admins to notify for reg_id ' . $arr['reg_id']); + return $result; + } + + $delivered = 0; + + foreach($admins as $admin) { + if(strlen($admin['lang'])) + push_lang($admin['lang']); + else + push_lang('en'); + + $email_msg = replace_macros(get_intltext_template('register_verify_eml.tpl'), array( + '$sitename' => Config::Get('system','sitename'), + '$siteurl' => z_root(), + '$email' => $register[0]['reg_email'], + '$uid' => $arr['reg_id'], + '$hash' => $register[0]['reg_hash'], + '$details' => $register[0]['reg_atip'] + )); + + $res = z_mail( + [ + 'toEmail' => $admin['email'], + 'messageSubject' => sprintf( t('Registration request at %s'), Config::Get('system','sitename')), + 'textVersion' => $email_msg, + ] + ); + + if($res) { + $delivered ++; + } else { + logger('send_reg_approval_email: failed to ' . $admin['email'] . 'reg_email: ' . $register[0]['reg_email']); + } + + pop_lang(); + } + + $result['delivered'] = $delivered; + if($delivered > 0) { + $result['success'] = true; + } + return $result; +} + + function send_register_success_email($email,$password) { $email_msg = replace_macros(get_intltext_template('register_open_eml.tpl'), array( From 0fa4962620ed9c5574d8409e3f9426822dba61e6 Mon Sep 17 00:00:00 2001 From: ltning Date: Sun, 25 Jan 2026 21:20:59 +0000 Subject: [PATCH 2/3] Clean up some whitespace confusion in the previous commit --- Zotlabs/Module/Regate.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Zotlabs/Module/Regate.php b/Zotlabs/Module/Regate.php index 711d94260..8a45492bc 100644 --- a/Zotlabs/Module/Regate.php +++ b/Zotlabs/Module/Regate.php @@ -142,15 +142,15 @@ class Regate extends \Zotlabs\Web\Controller { if (($flags & ACCOUNT_PENDING ) == ACCOUNT_PENDING) { $nextpage = 'regate/' . bin2hex($did2) . $didx; - $approve = send_reg_approval_email_from_register([ 'reg_id' => $r['reg_id'] ]); - if ($approve['success']) { + $approve = send_reg_approval_email_from_register([ 'reg_id' => $r['reg_id'] ]); + if ($approve['success']) { q("COMMIT"); - } else { + } else { q("ROLLBACK"); $msg_code = 'ZAR1237E'; $msg = t('Account verification notify error'); zar_log($msg_code . ' ' . $msg . ': ' . print_r($approve, true)); - } + } } elseif (($flags ^ REGISTER_AGREED) == 0) { From e5d4358d61469638d79da54a6941cae63afbe99f Mon Sep 17 00:00:00 2001 From: ltning Date: Tue, 27 Jan 2026 00:49:27 +0000 Subject: [PATCH 3/3] Clean up send_reg_approval_email_from_register, new email template Since there is no easy way to produce direct links to approve/reject registrations, create new email template which simply links to the Accounts admin page. In response to comments: - Add type annotations - Simplify some 'if' statements - add and fix some whitespace - simplify input arguments to the function --- Zotlabs/Module/Regate.php | 2 +- include/account.php | 29 +++++++++---------- view/lang/en/register_verify_eml_no_links.tpl | 18 ++++++++++++ 3 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 view/lang/en/register_verify_eml_no_links.tpl diff --git a/Zotlabs/Module/Regate.php b/Zotlabs/Module/Regate.php index 8a45492bc..91fd06666 100644 --- a/Zotlabs/Module/Regate.php +++ b/Zotlabs/Module/Regate.php @@ -142,7 +142,7 @@ class Regate extends \Zotlabs\Web\Controller { if (($flags & ACCOUNT_PENDING ) == ACCOUNT_PENDING) { $nextpage = 'regate/' . bin2hex($did2) . $didx; - $approve = send_reg_approval_email_from_register([ 'reg_id' => $r['reg_id'] ]); + $approve = send_reg_approval_email_from_register($r['reg_id']); if ($approve['success']) { q("COMMIT"); } else { diff --git a/include/account.php b/include/account.php index 11f5c9cd9..6977ca333 100644 --- a/include/account.php +++ b/include/account.php @@ -402,17 +402,17 @@ function send_reg_approval_email($arr) { * This function sends email to admin(s). * */ -function send_reg_approval_email_from_register($arr) { +function send_reg_approval_email_from_register(int $reg_id): array { - $result = array('success' => false, 'message' => 'rid:' . $arr['reg_id']); + $result = array('success' => false, 'message' => 'rid:' . $reg_id); $now = datetime_convert(); $register = q("SELECT * FROM register WHERE reg_id = %d", - intval($arr['reg_id']) + intval($reg_id) ); - if(! ($register && count($register))) { - logger('send_reg_approval_email: could not find data for reg_id ' . $arr['reg_id']); + if (empty($register)) { + logger('send_reg_approval_email: could not find data for reg_id ' . $reg_id); return $result; } @@ -423,32 +423,31 @@ function send_reg_approval_email_from_register($arr) { $admins = array(); foreach($r as $rr) { - if(strlen($rr['account_email'])) { + if (strlen($rr['account_email'])) { $admins[] = array('email' => $rr['account_email'], 'lang' => $rr['account_lang']); } } - if(! count($admins)) { - logger('send_reg_approval_email: could not find any admins to notify for reg_id ' . $arr['reg_id']); + if (empty($admins)) { + logger('send_reg_approval_email: could not find any admins to notify for reg_id ' . $reg_id); return $result; } $delivered = 0; foreach($admins as $admin) { - if(strlen($admin['lang'])) + if (strlen($admin['lang'])) { push_lang($admin['lang']); - else + } else { push_lang('en'); + } - $email_msg = replace_macros(get_intltext_template('register_verify_eml.tpl'), array( + $email_msg = replace_macros(get_intltext_template('register_verify_eml_no_links.tpl'), array( '$sitename' => Config::Get('system','sitename'), '$siteurl' => z_root(), '$email' => $register[0]['reg_email'], - '$uid' => $arr['reg_id'], - '$hash' => $register[0]['reg_hash'], '$details' => $register[0]['reg_atip'] - )); + )); $res = z_mail( [ @@ -458,7 +457,7 @@ function send_reg_approval_email_from_register($arr) { ] ); - if($res) { + if ($res) { $delivered ++; } else { logger('send_reg_approval_email: failed to ' . $admin['email'] . 'reg_email: ' . $register[0]['reg_email']); diff --git a/view/lang/en/register_verify_eml_no_links.tpl b/view/lang/en/register_verify_eml_no_links.tpl new file mode 100644 index 000000000..31f610693 --- /dev/null +++ b/view/lang/en/register_verify_eml_no_links.tpl @@ -0,0 +1,18 @@ + +A new user registration request was received at {{$sitename}} which requires +your approval. + + +The login details are as follows: + +Site Location: {{$siteurl}} +Login Name: {{$email}} +IP Address: {{$details}} + +To approve or deny this request please visit the Accounts page: + +{{$siteurl}}/admin/accounts + + +Thank you. +