diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/html/passreset.php | 9 | ||||
-rw-r--r-- | web/lib/acctfuncs.inc.php | 72 | ||||
-rw-r--r-- | web/lib/pkgbasefuncs.inc.php | 106 | ||||
-rw-r--r-- | web/lib/pkgreqfuncs.inc.php | 115 |
4 files changed, 61 insertions, 241 deletions
diff --git a/web/html/passreset.php b/web/html/passreset.php index 29f2c648..cb2f6bcd 100644 --- a/web/html/passreset.php +++ b/web/html/passreset.php @@ -46,14 +46,7 @@ if (isset($_GET['resetkey'], $_POST['email'], $_POST['password'], $_POST['confir if (empty($email)) { $error = __('Missing a required field.'); } else { - $subject = 'AUR Password Reset'; - $body = __('A password reset request was submitted for the ' . - 'account %s associated with your e-mail address. ' . - 'If you wish to reset your password follow the ' . - 'link below, otherwise ignore this message and ' . - 'nothing will happen.', $username); - send_resetkey($email, $subject, $body); - + send_resetkey($email); header('Location: ' . get_uri('/passreset/') . '?step=confirm'); exit(); } diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php index edd38ee8..2b57b2dd 100644 --- a/web/lib/acctfuncs.inc.php +++ b/web/lib/acctfuncs.inc.php @@ -288,26 +288,14 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$P="",$C="", "<strong>", htmlspecialchars($U,ENT_QUOTES), "</strong>"); print "<p>\n"; - if (!$send_resetkey) { + if ($send_resetkey) { + send_resetkey($email, true); + print __("A password reset key has been sent to your e-mail address."); + print "</p>\n"; + } else { print __("Click on the Login link above to use your account."); print "</p>\n"; - return; } - - $subject = 'Welcome to the Arch User Repository'; - $body = __('Welcome to %s! In order ' . - 'to set an initial password ' . - 'for your new account, ' . - 'please click the link ' . - 'below. If the link does ' . - 'not work try copying and ' . - 'pasting it into your ' . - 'browser.', - aur_location()); - send_resetkey($email, $subject, $body); - - print __("A password reset key has been sent to your e-mail address."); - print "</p>\n"; } else { /* Modify an existing account. */ $q = "SELECT InactivityTS FROM Users WHERE "; @@ -705,12 +693,11 @@ function create_resetkey($resetkey, $uid) { * Send a reset key to a specific e-mail address * * @param string $email E-mail address of the user resetting their password - * @param string $subject Subject of the email - * @param string $body Body of the email + * @param bool $welcome Whether to use the welcome message * * @return void */ -function send_resetkey($email, $subject, $body) { +function send_resetkey($email, $welcome=false) { $uid = uid_from_email($email); if ($uid == null) { return; @@ -721,16 +708,7 @@ function send_resetkey($email, $subject, $body) { create_resetkey($resetkey, $uid); /* Send e-mail with confirmation link. */ - $body = wordwrap($body, 70); - $body .= "\n\n". get_uri('/passreset/', true) . - "?resetkey={$resetkey}"; - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Reply-to: noreply@aur.archlinux.org\r\n" . - "From: notify@aur.archlinux.org\r\n" . - "X-Mailer: PHP\r\n" . - "X-MimeOLE: Produced By AUR"; - @mail($email, $subject, $body, $headers); + notify(array($welcome ? 'welcome' : 'send-resetkey', $uid)); } /** @@ -1309,3 +1287,37 @@ function account_set_ssh_keys($uid, $ssh_keys, $ssh_fingerprints) { return true; } + +/* + * Invoke the email notification script. + * + * @param string $params Command line parameters for the script. + * @param string $text Text to pass via stdin. + * + * @return void + */ +function notify($params, $text='') { + $cmd = realpath('../../scripts/notify.py'); + foreach ($params as $param) { + $cmd .= ' ' . escapeshellarg($param); + } + + $descspec = array( + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w') + ); + + $p = proc_open($cmd, $descspec, $pipes); + + if (!is_resource($p)) { + return false; + } + + fwrite($pipes[0], $text); + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + + return proc_close($p); +} diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php index 92202bf8..5d191ebf 100644 --- a/web/lib/pkgbasefuncs.inc.php +++ b/web/lib/pkgbasefuncs.inc.php @@ -97,37 +97,7 @@ function pkgbase_add_comment($base_id, $uid, $comment) { $bcc = array(); if ($result) { - while ($row = $result->fetch(PDO::FETCH_ASSOC)) { - array_push($bcc, $row['Email']); - } - - $q = "SELECT Name FROM PackageBases WHERE ID = "; - $q.= intval($base_id); - $result = $dbh->query($q); - $row = $result->fetch(PDO::FETCH_ASSOC); - - /* - * TODO: Add native language emails for users, based on their - * preferences. Simply making these strings translatable won't - * work, users would be getting emails in the language that the - * user who posted the comment was in. - */ - $body = 'from ' . get_pkgbase_uri($row['Name'], true) . "\n" - . username_from_sid($_COOKIE['AURSID']) . " wrote:\n\n" - . $comment - . "\n\n---\nIf you no longer wish to receive notifications about this package, please go the the above package page and click the UnNotify button."; - $body = wordwrap($body, 70); - $bcc = implode(', ', $bcc); - $thread_id = "<pkg-notifications-" . $row['Name'] . "@aur.archlinux.org>"; - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Bcc: $bcc\r\n" . - "Reply-to: noreply@aur.archlinux.org\r\n" . - "From: notify@aur.archlinux.org\r\n" . - "In-Reply-To: $thread_id\r\n" . - "References: $thread_id\r\n" . - "X-Mailer: AUR"; - @mail('undisclosed-recipients: ;', "AUR Comment for " . $row['Name'], $body, $headers); + notify(array('comment', $uid, $base_id), $comment); } } @@ -355,33 +325,11 @@ function pkgbase_flag($base_ids) { $q.= " OutOfDateTS = UNIX_TIMESTAMP()"; $q.= " WHERE ID IN (" . implode(",", $base_ids) . ")"; $q.= " AND OutOfDateTS IS NULL"; + $dbh->exec($q); - $affected_pkgs = $dbh->exec($q); - - if ($affected_pkgs > 0) { - /* Notify of flagging by e-mail. */ - $f_name = username_from_sid($_COOKIE['AURSID']); - $f_email = email_from_sid($_COOKIE['AURSID']); - $f_uid = uid_from_sid($_COOKIE['AURSID']); - $q = "SELECT PackageBases.Name, Users.Email "; - $q.= "FROM PackageBases, Users "; - $q.= "WHERE PackageBases.ID IN (" . implode(",", $base_ids) .") "; - $q.= "AND Users.ID = PackageBases.MaintainerUID "; - $q.= "AND Users.ID != " . $f_uid; - $result = $dbh->query($q); - if ($result) { - while ($row = $result->fetch(PDO::FETCH_ASSOC)) { - $body = "Your package " . $row['Name'] . " has been flagged out of date by " . $f_name . " [1]. You may view your package at:\n" . get_pkgbase_uri($row['Name'], true) . "\n\n[1] - " . get_user_uri($f_name, true); - $body = wordwrap($body, 70); - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Reply-to: noreply@aur.archlinux.org\r\n" . - "From: notify@aur.archlinux.org\r\n" . - "X-Mailer: PHP\r\n" . - "X-MimeOLE: Produced By AUR"; - @mail($row['Email'], "AUR Out-of-date Notification for ".$row['Name'], $body, $headers); - } - } + $uid = uid_from_sid($_COOKIE['AURSID']); + foreach ($base_ids as $base_id) { + notify(array('flag', $uid, $base_id)); } return array(true, __("The selected packages have been flagged out-of-date.")); @@ -449,46 +397,12 @@ function pkgbase_delete ($base_ids, $merge_base_id, $via, $grant=false) { $merge_base_name = pkgbase_name_from_id($merge_base_id); } - /* Send e-mail notifications. */ + $uid = uid_from_sid($_COOKIE['AURSID']); foreach ($base_ids as $base_id) { - $q = "SELECT CommentNotify.*, Users.Email "; - $q.= "FROM CommentNotify, Users "; - $q.= "WHERE Users.ID = CommentNotify.UserID "; - $q.= "AND CommentNotify.UserID != " . uid_from_sid($_COOKIE['AURSID']) . " "; - $q.= "AND CommentNotify.PackageBaseID = " . $base_id; - $result = $dbh->query($q); - $bcc = array(); - - while ($row = $result->fetch(PDO::FETCH_ASSOC)) { - array_push($bcc, $row['Email']); - } - if (!empty($bcc)) { - $pkgbase_name = pkgbase_name_from_id($base_id); - - /* - * TODO: Add native language emails for users, based on - * their preferences. Simply making these strings - * translatable won't work, users would be getting - * emails in the language that the user who posted the - * comment was in. - */ - $body = ""; - if ($merge_base_id) { - $body .= username_from_sid($_COOKIE['AURSID']) . " merged \"".$pkgbase_name."\" into \"$merge_base_name\".\n\n"; - $body .= "You will no longer receive notifications about this package, please go to https://aur.archlinux.org" . get_pkgbase_uri($merge_base_name) . " and click the Notify button if you wish to recieve them again."; - } else { - $body .= username_from_sid($_COOKIE['AURSID']) . " deleted \"".$pkgbase_name."\".\n\n"; - $body .= "You will no longer receive notifications about this package."; - } - $body = wordwrap($body, 70); - $bcc = implode(', ', $bcc); - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Bcc: $bcc\r\n" . - "Reply-to: noreply@aur.archlinux.org\r\n" . - "From: notify@aur.archlinux.org\r\n" . - "X-Mailer: AUR"; - @mail('undisclosed-recipients: ;', "AUR Package deleted: " . $pkgbase_name, $body, $headers); + if ($merge_base_id) { + notify(array('delete', $uid, $base_id, $merge_base_id)); + } else { + notify(array('delete', $uid, $base_id)); } } diff --git a/web/lib/pkgreqfuncs.inc.php b/web/lib/pkgreqfuncs.inc.php index c056d681..3ea46926 100644 --- a/web/lib/pkgreqfuncs.inc.php +++ b/web/lib/pkgreqfuncs.inc.php @@ -153,59 +153,12 @@ function pkgreq_file($ids, $type, $merge_into, $comments) { $dbh->exec($q); $request_id = $dbh->lastInsertId(); - /* - * Send e-mail notifications. - * TODO: Move notification logic to separate function where it belongs. - */ - $cc = array(pkgreq_get_creator_email($request_id)); - - $q = "SELECT Users.Email "; - $q.= "FROM Users INNER JOIN PackageBases "; - $q.= "ON PackageBases.MaintainerUID = Users.ID "; - $q.= "WHERE PackageBases.ID = " . $base_id; - $result = $dbh->query($q); - if ($row = $result->fetch(PDO::FETCH_ASSOC)) { - $cc[] = $row['Email']; - } - - $q = "SELECT Name FROM PackageBases WHERE ID = " . $base_id; - $result = $dbh->query($q); - $row = $result->fetch(PDO::FETCH_ASSOC); - - /* - * TODO: Add native language emails for users, based on their - * preferences. Simply making these strings translatable won't - * work, users would be getting emails in the language that the - * user who posted the comment was in. - */ - $username = username_from_sid($_COOKIE['AURSID']); - if ($type == 'merge') { - $body = - $username . " [1] filed a request to merge " . - $row['Name'] . " [2] into " . $merge_into . - " [3]:\n\n" . $comments . "\n\n" . - "[1] " . get_user_uri($username, true) . "\n" . - "[2] " . get_pkgbase_uri($row['Name'], true) . "\n" . - "[3] " . get_pkgbase_uri($merge_into, true) . "\n"; - } else { - $body = - $username . " [1] filed a " . $type . " request for " . - $row['Name'] . " [2]:\n\n" . $comments . "\n\n" . - "[1] " . get_user_uri($username, true) . "\n" . - "[2] " . get_pkgbase_uri($row['Name'], true) . "\n"; + /* Send e-mail notifications. */ + $params = array('request-open', $uid, $request_id, $type, $base_id); + if ($type === 'merge') { + $params[] = $merge_into; } - $body = wordwrap($body, 70); - $cc = array_unique($cc); - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Cc: " . implode(', ', $cc) . "\r\n"; - $thread_id = "<pkg-request-" . $request_id . "@aur.archlinux.org>"; - $headers .= "From: notify@aur.archlinux.org\r\n" . - "Message-ID: $thread_id\r\n" . - "X-Mailer: AUR"; - $ml = config_get('options', 'aur_request_ml'); - @mail($ml, "[PRQ#" . $request_id . "] " . ucfirst($type) . - " Request for " . $row['Name'], $body, $headers); + notify($params, $comments); $auto_orphan_age = config_get('options', 'auto_orphan_age'); $auto_delete_age = config_get('options', 'auto_delete_age'); @@ -268,6 +221,7 @@ function pkgreq_close($id, $reason, $comments, $auto_close=false) { $dbh = DB::connect(); $id = intval($id); + $uid = uid_from_sid($_COOKIE["AURSID"]); if (!$auto_close && !has_credential(CRED_PKGREQ_CLOSE)) { return array(false, __("Only TUs and developers can close requests.")); @@ -277,61 +231,8 @@ function pkgreq_close($id, $reason, $comments, $auto_close=false) { $q.= "WHERE ID = " . intval($id); $dbh->exec($q); - /* - * Send e-mail notifications. - * TODO: Move notification logic to separate function where it belongs. - */ - $cc = array(pkgreq_get_creator_email($id)); - - $q = "SELECT Users.Email "; - $q.= "FROM Users INNER JOIN PackageBases "; - $q.= "ON PackageBases.MaintainerUID = Users.ID "; - $q.= "INNER JOIN PackageRequests "; - $q.= "ON PackageRequests.PackageBaseID = PackageBases.ID "; - $q.= "WHERE PackageRequests.ID = " . $id; - $result = $dbh->query($q); - if ($row = $result->fetch(PDO::FETCH_ASSOC)) { - $cc[] = $row['Email']; - } - - /* - * TODO: Add native language emails for users, based on their - * preferences. Simply making these strings translatable won't - * work, users would be getting emails in the language that the - * user who posted the comment was in. - */ - if ($auto_close) { - $body = "Request #" . intval($id) . " has been " . $reason . - " automatically by the Arch User Repository package " . - "request system"; - } else { - $username = username_from_sid($_COOKIE['AURSID']); - $body = "Request #" . intval($id) . " has been " . $reason . - " by " . $username . " [1]"; - } - if (!empty(trim($comments))) { - $body .= ":\n\n" . $comments . "\n"; - } else { - $body .= ".\n"; - } - if (!$auto_close) { - $body .= "\n"; - $body .= "[1] " . get_user_uri($username, true); - $body .= "\n"; - } - $body = wordwrap($body, 70); - $cc = array_unique($cc); - $headers = "MIME-Version: 1.0\r\n" . - "Content-type: text/plain; charset=UTF-8\r\n" . - "Cc: " . implode(', ', $cc) . "\r\n"; - $thread_id = "<pkg-request-" . $id . "@aur.archlinux.org>"; - $headers .= "From: notify@aur.archlinux.org\r\n" . - "In-Reply-To: $thread_id\r\n" . - "References: $thread_id\r\n" . - "X-Mailer: AUR"; - $ml = config_get('options', 'aur_request_ml'); - @mail($ml, "[PRQ#" . $id . "] Request " . ucfirst($reason), - $body, $headers); + /* Send e-mail notifications. */ + notify(array('request-close', $uid, $id, $reason), $comments); return array(true, __("Request closed successfully.")); } |