/** * * */ function generateHtmlEmail(&$smarty, $template_file, $mailCfg) { // same objet that is returned by email_send $op = new stdClass(); $op->status_ok = true; $op->msg = 'ok'; $html_report = $smarty->fetch($template_file); if (!property_exists($mailCfg, 'from')) { $mailCfg->from = $_SESSION['currentUser']->emailAddress; } if (!property_exists($mailCfg, 'to')) { $mailCfg->to = $mailCfg->from; } if ($mailCfg->to == "") { $op->status_ok = false; $op->msg = lang_get("error_sendreport_no_email_credentials"); } else { // TICKET 6905: Link to test case is still raw link (no title) in email(HTML) type of test report // array('strip_email_links' => false) $op = email_send($mailCfg->from, $mailCfg->to, $mailCfg->subject, $html_report, $mailCfg->cc, false, true, array('strip_email_links' => false)); if ($op->status_ok) { $op->msg = sprintf(lang_get('mail_sent_to'), $mailCfg->to); } } return $op; }
function sendErrorReport() { $options = getOptions(); $extra_vars = isset($options['params']) ? $options['params'] : false; $content = parseEmail($options['email'], $extra_vars); email_send($options['mailTo'], "Une erreur s'est produite sur OpenNAS", $content, $outError); exit($outError); }
public function quick_mail() { $RequestMethod = $this->input->server('REQUEST_METHOD'); if ($RequestMethod == "POST") { $subject = $this->input->post('subject'); $msg = $this->input->post('msg'); email_send($this->input->post('emailto'), $subject, $msg); $this->session->set_flashdata('log_sucess', 'Email Successfully Send'); redirect(site_url() . 'administrator/dashboard'); } }
function send_transaction_mail($cust_email, $mer_email) { if (!empty($cust_email)) { $to[] = $cust_email; } if (!empty($mer_email)) { $to[] = $mer_email; } $sub = 'Payment Transaction'; $msg = 'Payment Transaction Done Please check the Portal for Details'; email_send($to, $sub, $msg, $cc = '', $bcc = '', $attach = ''); }
/** * * */ function generateHtmlEmail(&$smarty, $template_file, $mailCfg) { // same objet that is returned by email_send $op = new stdClass(); $op->status_ok = true; $op->msg = 'ok'; $html_report = $smarty->fetch($template_file); if (!property_exists($mailCfg, 'from')) { $mailCfg->from = $_SESSION['currentUser']->emailAddress; } if (!property_exists($mailCfg, 'to')) { $mailCfg->to = $mailCfg->from; } if ($mailCfg->to == "") { $op->status_ok = false; $op->msg = lang_get("error_sendreport_no_email_credentials"); } else { $op = email_send($mailCfg->from, $mailCfg->to, $mailCfg->subject, $html_report, $mailCfg->cc, false, true); if ($op->status_ok) { $op->msg = sprintf(lang_get('mail_sent_to'), $mailCfg->to); } } return $op; }
//verify a users email require '../includes/config/config.php'; //get variables $email = set_get('e', ''); if (empty($email) || !email_is_valid($email)) { notices_set('Invalid email.', 'error'); do_redirect(); } //check if it is valid $sql = sql_query(" SELECT id, confirm FROM `users` WHERE email='{$email}' LIMIT 1 "); if (sql_count($sql) <= 0) { notices_set('Invalid email.', 'error'); do_redirect(); } //check if account already verified $data = sql_fetch($sql); if (!isset($data['confirm'])) { //account already confirmed notices_set('Email already confirmed.', 'success'); do_redirect(); } //create account confirm $confirm = confirm_token_create($email); //update account with new verify code sql_query(" UPDATE `users` SET confirm='{$confirm}' WHERE id='{$data['id']}' LIMIT 1 "); //send email email_send('verify_resend', 'Planling Verification Code', array($email => $email), array('{{%LINK%}}' => 'http://' . MAIN_URL . '/verify?e=' . $email . '&t=' . $confirm)); //set message notices_set('Confirmation code successfully sent!', 'success'); //redirect user do_redirect();
function test_compose_email($project_id, $test_id, $recipients, $action) { $display_generic_info = true; $display_generic_url = true; $generic_url = RTH_URL . "login.php?project_id={$project_id}&page=test_detail_page.php&test_id={$test_id}&project_id={$project_id}"; $username = session_get_username(); $project_name = session_get_project_name(); $user_details = user_get_name_by_username($username); $first_name = $user_details[USER_FNAME]; $last_name = $user_details[USER_LNAME]; $test_detail = test_get_detail($test_id); $test_name = $test_detail[TEST_NAME]; $status = $test_detail[TEST_STATUS]; $priority = $test_detail[TEST_PRIORITY]; $test_area = $test_detail[TEST_AREA_TESTED]; $test_type = $test_detail[TEST_TESTTYPE]; $ba_owner = $test_detail[TEST_BA_OWNER]; $qa_owner = $test_detail[TEST_QA_OWNER]; $assigned_to = $test_detail[TEST_ASSIGNED_TO]; $comments = $test_detail[TEST_COMMENTS]; # CREATE EMAIL SUBJECT AND MESSAGE switch ($action) { case "status_change": $subject = "RTH: {$test_name} - Test Status Change"; $message = "The test status of {$test_name} has been updated by {$first_name} {$last_name}\r\n" . NEWLINE; break; case "steps_uploaded": $subject = "RTH: {$test_name} - Test Steps Added"; $message = "Test Steps have been uploaded to {$test_name} by {$first_name} {$last_name}\r\n" . NEWLINE; break; } # Generic link to results page if the $generic_url variable has been set if ($display_generic_url) { $message .= "Click the following link to view the Test Results:" . NEWLINE; $message .= "{$generic_url}\n" . NEWLINE; } if ($display_generic_info) { $message .= "Project Name: {$project_name}\r" . NEWLINE; $message .= "Test Name: {$test_name}\r" . NEWLINE; $message .= "Status: {$status}\r" . NEWLINE; $message .= "Priority: {$priority}\r\n\r" . NEWLINE; $message .= "Test Area: {$test_name}\r" . NEWLINE; $message .= "Test Type: {$test_area}\r" . NEWLINE; $message .= "BA Owner: {$ba_owner}\r" . NEWLINE; $message .= "QA Owner: {$qa_owner}\r" . NEWLINE; $message .= "Assigned To: {$assigned_to}\r" . NEWLINE; $message .= "Comments: {$comments}\r\n\r" . NEWLINE; } email_send($recipients, $subject, $message); }
/** * send mail to administrators (users that have default role = administrator) * to warn about new user created. * */ function notifyGlobalAdmins(&$dbHandler, &$userObj) { // Get email addresses for all users that have default role = administrator $cfg = config_get('notifications'); if (!is_null($cfg->userSignUp->to->roles)) { foreach ($cfg->userSignUp->to->roles as $roleID) { $roleMgr = new tlRole($roleID); $userSet = $roleMgr->getUsersWithGlobalRole($dbHandler); $key2loop = array_keys($userSet); foreach ($key2loop as $userID) { if (!isset($mail['to'][$userID])) { $mail['to'][$userID] = $userSet[$userID]->emailAddress; } } } } if (!is_null($cfg->userSignUp->to->users)) { // Brute force query $tables = tlObject::getDBTables('users'); $sql = " SELECT id,email FROM {$tables['users']} " . " WHERE login IN('" . implode("','", $cfg->userSignUp->to->users) . "')"; $userSet = $dbHandler->fetchRowsIntoMap($sql, 'id'); if (!is_null($userSet)) { foreach ($userSet as $userID => $elem) { if (!isset($mail['to'][$userID])) { $mail['to'][$userID] = $elem['email']; } } } } $mail['to'] = implode(',', $mail['to']); // email_api uses ',' as list separator $mail['subject'] = lang_get('new_account'); $mail['body'] = lang_get('new_account') . "\n"; $mail['body'] .= " user:{$userObj->login}\n"; $mail['body'] .= " first name:{$userObj->firstName} surname:{$userObj->lastName}\n"; $mail['body'] .= " email:{$userObj->emailAddress}\n"; // silence errors @email_send(config_get('from_email'), $mail['to'], $mail['subject'], $mail['body']); }
function results_email($project_id, $release_id, $build_id, $testset_id, $test_id, $recipients, $action) { $display_generic_info = true; $display_generic_url = true; $generic_url = RTH_URL . "login.php?project_id={$project_id}&page=results_test_run_page.php&release_id={$release_id}&build_id={$build_id}&testset_id={$testset_id}&test_id={$test_id}"; $username = session_get_username(); $project_name = session_get_project_name(); $release_name = admin_get_release_name($release_id); $build_name = admin_get_build_name($build_id); $testset_name = admin_get_testset_name($testset_id); $user_details = user_get_name_by_username($username); $first_name = $user_details[USER_FNAME]; $last_name = $user_details[USER_LNAME]; $row_test_detail = testset_query_test_details($testset_id, $test_id); $test_name = $row_test_detail[TEST_NAME]; $status = $row_test_detail[TEST_TS_ASSOC_STATUS]; $finished = $row_test_detail[TEST_TS_ASSOC_FINISHED]; $assigned_to = $row_test_detail[TEST_TS_ASSOC_ASSIGNED_TO]; $comments = $row_test_detail[TEST_TS_ASSOC_COMMENTS]; $root_cause = $row_test_detail[TEST_RESULTS_ROOT_CAUSE]; # CREATE EMAIL SUBJECT AND MESSAGE switch ($action) { case "test_run": $subject = "RTH: Test Run Notification - {$test_name}"; $message = "Test {$test_name} has been run by {$first_name} {$last_name}\n" . NEWLINE; break; case "update_test_result": $subject = "RTH: Test Result has been Updated"; $message = "The test result for {$test_name} has been updated by {$first_name} {$last_name}\n" . NEWLINE; break; } # Generic link to results page if the $generic_url variable has been set if ($display_generic_url) { $message .= "Click the following link to view the Test Results:" . NEWLINE; $message .= "{$generic_url}\n" . NEWLINE; } if ($display_generic_info) { $message .= "Project Name: {$project_name}\r" . NEWLINE; $message .= "Release Name: {$release_name}\r" . NEWLINE; $message .= "Build Name: {$build_name}\r" . NEWLINE; $message .= "TestSet Name: {$testset_name}\r\n\r" . NEWLINE; $message .= "Test Name: {$test_name}\r" . NEWLINE; $message .= "Status: {$status}\r" . NEWLINE; if (!empty($root_cause)) { $message .= "Root Cause: {$root_cause}\r" . NEWLINE; } $message .= "Comments: {$comments}\r\n\r" . NEWLINE; } email_send($recipients, $subject, $message); }
<td bgcolor="#f4f4f4"> <span class="title">Testing Email</span> <p>You can test the ability for Mantis to send email notifications with this form. Just click "Send Mail". If the page takes a very long time to reappear or results in an error then you will need to investigate your php/mail server settings (see PHPMailer related settings in your config_inc.php, if they don't exist, copy from config_defaults_inc.php). Note that errors can also appear in the server error log. More help can be found at the <a href="http://www.php.net/manual/en/ref.mail.php">PHP website</a> if you are using the mail() PHPMailer sending mode.</p> <?php if ($f_mail_test) { echo '<b><font color="#ff0000">Testing Mail</font></b> - '; # @@@ thraxisp - workaround to ensure a language is set without authenticating # will disappear when this is properly localized lang_push('english'); $t_email_data = new EmailData(); $t_email_data->email = config_get_global('administrator_email'); $t_email_data->subject = 'Testing PHP mail() function'; $t_email_data->body = 'Your PHP mail settings appear to be correctly set.'; $t_email_data->metadata['priority'] = config_get('mail_priority'); $t_email_data->metadata['charset'] = lang_get('charset', lang_get_current()); $result = email_send($t_email_data); #$result = email_send( config_get_global( 'administrator_email' ), 'Testing PHP mail() function', 'Your PHP mail settings appear to be correctly set.'); if (!$result) { echo ' PROBLEMS SENDING MAIL TO: ' . config_get_global('administrator_email') . '. Please check your php/mail server settings.<br />'; } else { echo ' mail() send successful.<br />'; } } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> #email"> Email Address: <?php echo config_get_global('administrator_email'); ?>
// codigo correcto if (mysqli_num_rows($q_user) == 1) { $r_user = mysqli_fetch_assoc($q_user); $sql = "UPDATE usuarios SET password = '******'pass']) . "' WHERE recuperacion = '" . $_POST['codigo'] . "'"; $q_pass = mysqli_query($link, $sql); //Cambio pass correcto if (mysqli_errno($link) == 0) { $sql = "UPDATE usuarios SET recuperacion = '0' WHERE recuperacion = '" . $_POST['codigo'] . "'"; //mysqli_query($link, $sql); print "<div class='centrar'><div class='ok_ajustable'>Enhorabuena, tu contraseña nueva se a guardado, ya puedes acceder a <a href='login.php'>" . Sitio . "</a> con ella.<br>\n\t\t\t\t\t\t\t\tTambien te hemos mandado un email a tu direccion con la contraseña nueva</div></div>"; $destinatario_email = $r_user['email']; $destinatario_name = $r_user['nombre'] . " " . $r_user['apellidos']; $titulo = "Contraseña nueva - " . Sitio; // No separar del borde $mensaje = "\n<html>\n<body style=\"background-color:#3869A0;text-align:center;padding:20px;\">\n<b style=\"color:white;font-size:40px;\">" . Sitio . "</b><br>\n<div style=\"background-color:white;border-radius:10px;display: inline-block;\nmargin: 10px;padding:20px;text-align:left;font-size:15px;\">\nHola " . $r_user['nombre'] . ", la contraseña nueva para tu cuenta es:<br><br>\n<b>" . $_POST['pass'] . "</b><br><br>\nYa puedes entrar con ella:<a href=\"http://" . Sitio_direccion . "/login.php\">\nhttp://" . Sitio_direccion . "/login.php</a><br>\n<center><i style=\"font-size:12px; color: grey;\">" . Sitio . " (c)</i></center>\n</div>\n</body></html>"; $email_state = email_send($destinatario_name, $destinatario_email, $titulo, $mensaje); if ($email_state != TRUE) { print "<div class='centrar'><div class='error_ajustable'>Se ha producido un error al enviar el correo</div></div>"; } die; // Cambio pass fail } else { print "<div class='centrar'><div class='error_ajustable'>Se ha producido un error al cambiar la contraseña</div></div>"; } } } ?> Si has perdido tu contraseña puedes generar otra introduciendo tu email a continuacion,<br> la nueva contraseña se enviara a tu correo electronico.<br><br> <form method='POST' action='otros.php'>
function users_send_password_reset_code(&$user) { $code = users_generate_password_reset_code($user); if (!$code) { return 0; } $GLOBALS['smarty']->assign('code', $code); email_send(array('to_email' => $user['email'], 'template' => 'email_password_reset.txt')); return 1; }
$sql = sql_query(" SELECT id FROM `users` WHERE email='{$email1}' LIMIT 1 "); if (sql_count($sql) > 0) { notices_set('Email already in use, please use a different email or reset your password', 'error'); $terror = true; } //last error check if ($terror) { //exit script echo notices_get(); return false; } //create password $hash_token = password_hash_create(); //creates a users unique hash $password = password_encrypt($password1, $hash_token); //create account confirm $confirm = confirm_token_create($email1); //add to database sql_query(" INSERT INTO `users` (hash_token, email, password, confirm) VALUES('{$hash_token}', '{$email1}', '{$password}', '{$confirm}') "); //set notices notices_set('Account successfully created!', 'success'); //send email email_send('register', 'Welcome to Planling!', array($email1 => $email1), array('{{%LINK%}}' => 'http://' . MAIN_URL . '/verify?e=' . $email1 . '&t=' . $confirm)); //log the user in if (do_login($email1, $password1)) { $main_data = set_main_data(); } else { return false; } //success return true;
/** * Send link with filters to access (after login) * to testCaseAssignedToMe feature * */ function emailLinkToExecPlanning($context, $targetUsers = null) { $debugMsg = 'Class:' . __CLASS__ . ' - Method: ' . __FUNCTION__; if (is_null($targetUsers)) { $sql = "/* {$debugMsg} */ " . " SELECT id FROM {$this->tables['users']} "; $targetUsers = $this->db->fetchColumnsIntoArray($sql, 'id'); } $uSet = (array) $targetUsers; // if user has at least 1 assignment in context // send link $atd = $this->get_available_types(); $tplan_id = intval($context['tplan_id']); $build_id = intval($context['build_id']); $sql = "/* {$debugMsg} */ " . " SELECT UA.user_id, U.email " . " FROM {$this->tables['user_assignments']} UA " . " JOIN {$this->tables['builds']} B " . " ON UA.build_id = B.id " . " LEFT JOIN {$this->tables['users']} U " . " ON U.id = UA.user_id " . " WHERE B.testplan_id = " . $tplan_id . " AND B.id = " . $build_id . " AND type = " . intval($atd['testcase_execution']['id']); $rs = $this->db->fetchRowsIntoMap($sql, 'user_id'); $bye = true; if (!is_null($rs) && count($rs) > 0) { $bye = false; $sql = " SELECT NHTPRJ.name AS tproject, " . " NHTPL.name AS tplan " . " FROM {$this->tables['nodes_hierarchy']} NHTPRJ " . " JOIN {$this->tables['nodes_hierarchy']} NHTPL " . " ON NHTPRJ.id = NHTPL.parent_id " . " JOIN {$this->tables['node_types']} NT " . " ON NHTPRJ.node_type_id = NT.id " . " WHERE NT.description = 'testproject' " . " AND NHTPL.id = " . $tplan_id; $names = $this->db->get_recordset($sql); $names = $names[0]; $body_flines = lang_get('testproject') . ': ' . $names['tproject'] . '<br />' . lang_get('testplan') . ': ' . $names['tplan'] . '<br /><br />'; } if ($bye) { return; // >>>----> Bye,Bye!!! } $email = array(); $email['from_address'] = config_get('from_email'); $isoTS = date(DATE_RFC1123); $genby = lang_get('generated_by_TestLink_on') . ' ' . $isoTS; $ll = lang_get('mail_subject_link_to_assigned'); $email['subject'] = sprintf($ll, $names['tplan'], $isoTS); $ln = $_SESSION['basehref'] . 'ltx.php?item=xta2m&tplan_id=' . $tplan_id . '&user_id='; $hint = lang_get('hint_you_need_to_be_logged'); require_once 'email_api.php'; foreach ($uSet as $user_id) { if (isset($rs[$user_id])) { $email['to_address'] = trim($rs[$user_id]['email']); if ($email['to_address'] != '') { $email['body'] = $body_flines; $email['body'] .= $hint . '<br><br>' . $ln . $user_id; $email['body'] .= '<br><br>' . $genby; $eop = email_send($email['from_address'], $email['to_address'], $email['subject'], $email['body'], '', true, true); } } } }
/** * reset user password in DB * * @param resource &$db reference to database handler * @param integer $userID * @param string $newPasswordSendMethod, default 'send_password_by_mail' * * @return hash * status: integer result status code * password: new password * msg: error message (if any) */ function resetPassword(&$db, $userID, $passwordSendMethod = 'send_password_by_mail') { $retval = array('status' => tl::OK, 'password' => '', 'msg' => ''); $user = new tlUser($userID); $retval['status'] = $user->readFromDB($db); // Reset can be done ONLY if user authentication method allows it. $doIt = false; if ($retval['status'] >= tl::OK) { $cfg = config_get('authentication'); $cfg = $cfg['domain']; $doIt = isset($cfg[$user->authentication]) && $cfg[$user->authentication]['allowPasswordManagement']; } if ($doIt) { $retval['status'] = tlUser::E_EMAILLENGTH; if (trim($user->emailAddress) != "") { $newPassword = tlUser::generatePassword(8, 4); $retval['status'] = $user->setPassword($newPassword, $cfg[$user->authentication]); if ($retval['status'] >= tl::OK) { $retval['password'] = $newPassword; $mail_op = new stdClass(); $mail_op->status_ok = false; if ($passwordSendMethod == 'send_password_by_mail') { $msgBody = lang_get('your_password_is') . "\n\n" . $newPassword . "\n\n" . lang_get('contact_admin'); $mail_op = @email_send(config_get('from_email'), $user->emailAddress, lang_get('mail_passwd_subject'), $msgBody); } if ($mail_op->status_ok || $passwordSendMethod == 'display_on_screen') { $retval['status'] = $user->writePasswordToDB($db); } else { $retval['status'] = tl::ERROR; $retval['msg'] = $mail_op->msg; } } } } $retval['msg'] = $retval['msg'] != "" ? $retval['msg'] : getUserErrorMessage($retval['status']); return $retval; }
if (defined('MANTIS_VERSION')) { $t_mantis_version = MANTIS_VERSION; } else { $t_mantis_version = config_get('mantis_version'); } if (version_compare($t_mantis_version, '1.1.0a2', '>=')) { foreach ($t_email_ids as $t_email) { $t_recipient = trim($t_email); $t_subject = string_email(trim($t_subject)); $t_message = string_email_links(trim($t_message)); $t_email_data = new EmailData(); $t_email_data->email = $t_recipient; $t_email_data->subject = $t_subject; $t_email_data->body = $t_message; $t_email_data->metadata = array(); $t_email_data->metadata['headers'] = array('X-Mantis' => 'ReleaseMgt'); $t_email_data->metadata['priority'] = config_get('mail_priority'); $t_email_data->metadata['charset'] = 'utf-8'; $t_email_data->metadata['plugins_htmlmail_html_message'] = base64_encode($t_html_message); email_queue_add($t_email_data); } if (OFF == config_get('email_send_using_cronjob')) { email_send_all(); } } else { foreach ($t_email_ids as $t_email) { email_send($t_email, $t_subject, $t_message); } } } release_mgt_successful_redirect($t_redirect_url);
function users_send_password_reset_code(&$user) { $code = users_generate_password_reset_code($user); if (!$code) { return 0; } $GLOBALS['smarty']->assign('code', $code); $args = array('to_email' => $user['email'], 'template' => 'email_password_reset.txt'); if (isset($GLOBALS['cfg']['password_retrieval_from_email'])) { $args['from_email'] = $GLOBALS['cfg']['password_retrieval_from_email']; } if (isset($GLOBALS['cfg']['password_retrieval_from_name'])) { $args['from_name'] = $GLOBALS['cfg']['password_retrieval_from_name']; } email_send($args); return 1; }
/** * This function sends all the emails that are stored in the queue. * It will be called * - immediately after queueing messages in case of synchronous emails * - from a cronjob in case of asynchronous emails * If a failure occurs, then the function exits. * @todo In case of synchronous email sending, we may get a race condition where two requests send the same email. * @param bool $p_delete_on_failure indicates whether to remove email from queue on failure (default false) * @return null */ function email_send_all($p_delete_on_failure = false) { $t_ids = email_queue_get_ids('ASC'); $t_date_format = config_get('complete_date_format'); log_event(LOG_EMAIL, "Processing e-mail queue (" . count($t_ids) . " messages)"); foreach ($t_ids as $t_id) { $t_email_data = email_queue_get($t_id); $t_start = microtime(true); log_event(LOG_EMAIL, "Sending message #{$t_id} queued on " . date($t_date_format, $t_email_data->submitted)); # check if email was not found. This can happen if another request # picks up the email first and sends it. if ($t_email_data === false) { $t_email_sent = true; log_event(LOG_EMAIL, 'message has already been sent'); } else { $t_email_sent = email_send($t_email_data); } if (!$t_email_sent) { if ($p_delete_on_failure) { email_queue_delete($t_email_data->email_id); } # If unable to place the email in the email server queue and more # than 5 seconds have elapsed, then we assume that the server # connection is down, hence no point to continue trying with the # rest of the emails. if (microtime(true) - $t_start > 5) { log_event(LOG_EMAIL, 'Server not responding for 5 seconds, aborting'); break; } } } }
$input_errors[] = gettext("The old password is not correct."); } // Validate new password. if ($_POST['password_new'] !== $_POST['password_confirm']) { $input_errors[] = gettext("The confimed password does not match. Please ensure the passwords match exactly."); } if (empty($input_errors)) { $a_user[$cnid]['password'] = $_POST['password_new']; write_config(); updatenotify_set("userdb_user", UPDATENOTIFY_MODE_MODIFIED, $a_user[$cnid]['uuid']); // Write syslog entry and send an email to the administrator $message = sprintf("The user %s has changed his password via user portal.", Session::getUserName()); write_log($message); if (0 == @email_validate_settings()) { $subject = sprintf(gettext("Notification email from host: %s"), system_get_hostname()); @email_send($config['system']['email']['from'], $subject, $message, $error); } $savemsg = gettext("The administrator has been notified to apply your changes."); } } include "fbegin.inc"; ?> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="tabcont"> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?> " method="post" name="iform" id="iform"> <?php if (!empty($input_errors)) {
function report_site() { $this->_secure(5); $result = ''; $user = $this->session->all_userdata(); $post_data = $_POST; if (!empty($post_data) && isset($post_data['site_id']) && isset($post_data['client_id']) && isset($post_data['report_reason'])) { $this->load->model('model_users'); $this->load->model('model_sites'); $site_id = $post_data['site_id']; $client_id = $post_data['client_id']; $report_reason = $post_data['report_reason']; $user_id = $user['user_id']; $site = $this->model_sites->get_records(array('client_id' => $client_id, 'site_id' => $site_id)); $site_admins = $this->model_users->get_records(array('client_id' => $client_id, 'security_level_alias' => array('ADM', 'SUP'))); if (!empty($site_admins)) { $email_from = empty($user['user_email']) ? get_app_var('FROM_EMAIL') : $user['user_email']; $email_subject = get_app_var('REPORT_ISSUE_SUBJECT') . ' ' . $site[0]['site_title']; $email_content_raw = get_app_var('REPORT_ISSUE'); $email_content = replace_tokens($email_content_raw, array('site_name' => get_app_var('SITE_NAME'), 'login_page' => 'http://' . $_SERVER['SERVER_NAME'] . '/', 'site_title' => $site[0]['site_title'], 'report_user' => trim($user['user_first_name'] . ' ' . $user['user_last_name']), 'report_reason' => $report_reason)); foreach ($site_admins as $site_admin) { $email_to = $site_admin['user_email']; email_send($email_from, $email_to, $email_subject, $email_content, true); } } $result = 'Thank you for reporting this issue. Your information has been sent to the dashboard administrator' . (sizeof($site_admins) > 1 ? 's' : '') . '.'; } $data = array(); $data['any'] = $result; $data['action_view'] = 'misc/any'; $this->load->view('layouts/blank', $data); }
/** * send_mail_to_testers * * * @return void */ function send_mail_to_testers(&$dbHandler, &$tcaseMgr, &$guiObj, &$argsObj, $features, $operation) { $testers['new'] = null; $mail_details['new'] = lang_get('mail_testcase_assigned') . "<br /><br />"; $mail_subject['new'] = lang_get('mail_subject_testcase_assigned'); $use_testers['new'] = true; $tcaseSet = null; $tcnames = null; $email = array(); $userSet[] = $argsObj->userID; $userSet[] = $argsObj->testerID; $userData = tlUser::getByIDs($dbHandler, $userSet); $assigner = $userData[$argsObj->userID]->firstName . ' ' . $userData[$argsObj->userID]->lastName; $email['from_address'] = config_get('from_email'); $body_first_lines = lang_get('testproject') . ': ' . $argsObj->tproject_name . '<br />' . lang_get('testplan') . ': ' . $guiObj->testPlanName . '<br /><br />'; // Get testers id foreach ($features as $feature_id => $value) { if ($use_testers['new']) { $testers['new'][$value['user_id']][$value['tcase_id']] = $value['tcase_id']; } $tcaseSet[$value['tcase_id']] = $value['tcase_id']; $tcversionSet[$value['tcversion_id']] = $value['tcversion_id']; } $infoSet = $tcaseMgr->get_by_id_bulk($tcaseSet, $tcversionSet); foreach ($infoSet as $value) { $tcnames[$value['testcase_id']] = $guiObj->testCasePrefix . $value['tc_external_id'] . ' ' . $value['name']; } $path_info = $tcaseMgr->tree_manager->get_full_path_verbose($tcaseSet, array('output_format' => 'simple')); $flat_path = null; foreach ($path_info as $tcase_id => $pieces) { $flat_path[$tcase_id] = implode('/', $pieces) . '/' . $tcnames[$tcase_id]; } foreach ($testers as $tester_type => $tester_set) { if (!is_null($tester_set)) { $email['subject'] = $mail_subject[$tester_type] . ' ' . $guiObj->testPlanName; foreach ($tester_set as $user_id => $value) { $userObj = $userData[$user_id]; $email['to_address'] = $userObj->emailAddress; $email['body'] = $body_first_lines; $email['body'] .= sprintf($mail_details[$tester_type], $userObj->firstName . ' ' . $userObj->lastName, $assigner); foreach ($value as $tcase_id) { $email['body'] .= $flat_path[$tcase_id] . '<br />'; } $email['body'] .= '<br />' . date(DATE_RFC1123); $email_op = email_send($email['from_address'], $email['to_address'], $email['subject'], $email['body'], '', true, true); } // foreach($tester_set as $user_id => $value) } } }
function delivery_run(&$argv, &$argc) { global $a, $db; if (is_null($a)) { $a = new App(); } if (is_null($db)) { @(include ".htconfig.php"); require_once "include/dba.php"; $db = new dba($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); } require_once "include/session.php"; require_once "include/datetime.php"; require_once 'include/items.php'; require_once 'include/bbcode.php'; require_once 'include/diaspora.php'; require_once 'include/email.php'; load_config('config'); load_config('system'); load_hooks(); if ($argc < 3) { return; } $a->set_baseurl(get_config('system', 'url')); logger('delivery: invoked: ' . print_r($argv, true), LOGGER_DEBUG); $cmd = $argv[1]; $item_id = intval($argv[2]); for ($x = 3; $x < $argc; $x++) { $contact_id = intval($argv[$x]); // Some other process may have delivered this item already. $r = q("select * from deliverq where cmd = '%s' and item = %d and contact = %d limit 1", dbesc($cmd), dbesc($item_id), dbesc($contact_id)); if (!count($r)) { continue; } $maxsysload = intval(get_config('system', 'maxloadavg')); if ($maxsysload < 1) { $maxsysload = 50; } if (function_exists('sys_getloadavg')) { $load = sys_getloadavg(); if (intval($load[0]) > $maxsysload) { logger('system: load ' . $load . ' too high. Delivery deferred to next queue run.'); return; } } // It's ours to deliver. Remove it from the queue. q("delete from deliverq where cmd = '%s' and item = %d and contact = %d", dbesc($cmd), dbesc($item_id), dbesc($contact_id)); if (!$item_id || !$contact_id) { continue; } $expire = false; $top_level = false; $recipients = array(); $url_recipients = array(); $normal_mode = true; $recipients[] = $contact_id; if ($cmd === 'expire') { $normal_mode = false; $expire = true; $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1 \n\t\t\t\tAND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 30 MINUTE", intval($item_id)); $uid = $item_id; $item_id = 0; if (!count($items)) { continue; } } else { // find ancestors $r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", intval($item_id)); if (!count($r) || !intval($r[0]['parent'])) { continue; } $target_item = $r[0]; $parent_id = intval($r[0]['parent']); $uid = $r[0]['uid']; $updated = $r[0]['edited']; // POSSIBLE CLEANUP --> The following seems superfluous. We've already checked for "if (! intval($r[0]['parent']))" a few lines up if (!$parent_id) { continue; } $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` \n\t\t\t\tFROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", intval($parent_id)); if (!count($items)) { continue; } $icontacts = null; $contacts_arr = array(); foreach ($items as $item) { if (!in_array($item['contact-id'], $contacts_arr)) { $contacts_arr[] = intval($item['contact-id']); } } if (count($contacts_arr)) { $str_contacts = implode(',', $contacts_arr); $icontacts = q("SELECT * FROM `contact` \n\t\t\t\t\tWHERE `id` IN ( {$str_contacts} ) "); } if (!($icontacts && count($icontacts))) { continue; } // avoid race condition with deleting entries if ($items[0]['deleted']) { foreach ($items as $item) { $item['deleted'] = 1; } } if (count($items) == 1 && $items[0]['uri'] === $items[0]['parent-uri']) { logger('delivery: top level post'); $top_level = true; } } $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, \n\t\t\t`user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, \n\t\t\t`user`.`page-flags`, `user`.`prvnets`\n\t\t\tFROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` \n\t\t\tWHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", intval($uid)); if (!count($r)) { continue; } $owner = $r[0]; $walltowall = $top_level && $owner['id'] != $items[0]['contact-id'] ? true : false; $public_message = true; // fill this in with a single salmon slap if applicable $slap = ''; require_once 'include/group.php'; $parent = $items[0]; // This is IMPORTANT!!!! // We will only send a "notify owner to relay" or followup message if the referenced post // originated on our system by virtue of having our hostname somewhere // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere. // if $parent['wall'] == 1 we will already have the parent message in our array // and we will relay the whole lot. // expire sends an entire group of expire messages and cannot be forwarded. // However the conversation owner will be a part of the conversation and will // be notified during this run. // Other DFRN conversation members will be alerted during polled updates. // Diaspora members currently are not notified of expirations, and other networks have // either limited or no ability to process deletions. We should at least fix Diaspora // by stringing togther an array of retractions and sending them onward. $localhost = $a->get_hostname(); if (strpos($localhost, ':')) { $localhost = substr($localhost, 0, strpos($localhost, ':')); } /** * * Be VERY CAREFUL if you make any changes to the following line. Seemingly innocuous changes * have been known to cause runaway conditions which affected several servers, along with * permissions issues. * */ if (!$top_level && $parent['wall'] == 0 && !$expire && stristr($target_item['uri'], $localhost)) { logger('relay denied for delivery agent.'); /* no relay allowed for direct contact delivery */ continue; } if (strlen($parent['allow_cid']) || strlen($parent['allow_gid']) || strlen($parent['deny_cid']) || strlen($parent['deny_gid'])) { $public_message = false; // private recipients, not public } $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0", intval($contact_id)); if (count($r)) { $contact = $r[0]; } $hubxml = feed_hublinks(); logger('notifier: slaps: ' . print_r($slaps, true), LOGGER_DATA); require_once 'include/salmon.php'; if ($contact['self']) { continue; } $deliver_status = 0; switch ($contact['network']) { case NETWORK_DFRN: logger('notifier: dfrndelivery: ' . $contact['name']); $feed_template = get_markup_template('atom_feed.tpl'); $mail_template = get_markup_template('atom_mail.tpl'); $atom = ''; $birthday = feed_birthday($owner['uid'], $owner['timezone']); if (strlen($birthday)) { $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>'; } $atom .= replace_macros($feed_template, array('$version' => xmlify(FRIENDICA_VERSION), '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname']), '$feed_title' => xmlify($owner['name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00', ATOM_TIME)), '$hub' => $hubxml, '$salmon' => '', '$name' => xmlify($owner['name']), '$profile_page' => xmlify($owner['url']), '$photo' => xmlify($owner['photo']), '$thumb' => xmlify($owner['thumb']), '$picdate' => xmlify(datetime_convert('UTC', 'UTC', $owner['avatar-date'] . '+00:00', ATOM_TIME)), '$uridate' => xmlify(datetime_convert('UTC', 'UTC', $owner['uri-date'] . '+00:00', ATOM_TIME)), '$namdate' => xmlify(datetime_convert('UTC', 'UTC', $owner['name-date'] . '+00:00', ATOM_TIME)), '$birthday' => $birthday, '$community' => $owner['page-flags'] == PAGE_COMMUNITY ? '<dfrn:community>1</dfrn:community>' : '')); foreach ($items as $item) { if (!$item['parent']) { continue; } // private emails may be in included in public conversations. Filter them. if ($public_message && $item['private'] == 1) { continue; } $item_contact = get_item_contact($item, $icontacts); if (!$item_contact) { continue; } if ($normal_mode) { if ($item_id == $item['id'] || $item['id'] == $item['parent']) { $atom .= atom_entry($item, 'text', null, $owner, true, $top_level ? $contact['id'] : 0); } } else { $atom .= atom_entry($item, 'text', null, $owner, true); } } $atom .= '</feed>' . "\r\n"; logger('notifier: ' . $atom, LOGGER_DATA); $basepath = implode('/', array_slice(explode('/', $contact['url']), 0, 3)); // perform local delivery if we are on the same site if (link_compare($basepath, $a->get_baseurl())) { $nickname = basename($contact['url']); if ($contact['issued-id']) { $sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id'])); } else { $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id'])); } $x = q("SELECT\t`contact`.*, `contact`.`uid` AS `importer_uid`,\n\t\t\t\t\t\t`contact`.`pubkey` AS `cpubkey`,\n\t\t\t\t\t\t`contact`.`prvkey` AS `cprvkey`,\n\t\t\t\t\t\t`contact`.`thumb` AS `thumb`,\n\t\t\t\t\t\t`contact`.`url` as `url`,\n\t\t\t\t\t\t`contact`.`name` as `senderName`,\n\t\t\t\t\t\t`user`.*\n\t\t\t\t\t\tFROM `contact`\n\t\t\t\t\t\tINNER JOIN `user` ON `contact`.`uid` = `user`.`uid`\n\t\t\t\t\t\tWHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0\n\t\t\t\t\t\tAND `contact`.`network` = '%s' AND `user`.`nickname` = '%s'\n\t\t\t\t\t\t{$sql_extra}\n\t\t\t\t\t\tAND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 LIMIT 1", dbesc(NETWORK_DFRN), dbesc($nickname)); if ($x && count($x)) { $write_flag = $x[0]['rel'] && $x[0]['rel'] != CONTACT_IS_SHARING ? true : false; if (($owner['page-flags'] == PAGE_COMMUNITY || $write_flag) && !$x[0]['writable']) { q("update contact set writable = 1 where id = %d", intval($x[0]['id'])); $x[0]['writable'] = 1; } $ssl_policy = get_config('system', 'ssl_policy'); fix_contact_ssl_policy($x[0], $ssl_policy); // If we are setup as a soapbox we aren't accepting input from this person if ($x[0]['page-flags'] == PAGE_SOAPBOX) { break; } require_once 'library/simplepie/simplepie.inc'; logger('mod-delivery: local delivery'); local_delivery($x[0], $atom); break; } } if (!was_recently_delayed($contact['id'])) { $deliver_status = dfrn_deliver($owner, $contact, $atom); } else { $deliver_status = -1; } logger('notifier: dfrn_delivery returns ' . $deliver_status); if ($deliver_status == -1) { logger('notifier: delivery failed: queuing message'); add_to_queue($contact['id'], NETWORK_DFRN, $atom); } break; case NETWORK_OSTATUS: // Do not send to otatus if we are not configured to send to public networks if ($owner['prvnets']) { break; } if (get_config('system', 'ostatus_disabled') || get_config('system', 'dfrn_only')) { break; } // only send salmon if public - e.g. if it's ok to notify // a public hub, it's ok to send a salmon if ($public_message && !$expire) { $slaps = array(); foreach ($items as $item) { if (!$item['parent']) { continue; } // private emails may be in included in public conversations. Filter them. if ($public_message && $item['private'] == 1) { continue; } $item_contact = get_item_contact($item, $icontacts); if (!$item_contact) { continue; } if ($top_level && $public_message && $item['author-link'] === $item['owner-link'] && !$expire) { $slaps[] = atom_entry($item, 'html', null, $owner, true); } } logger('notifier: slapdelivery: ' . $contact['name']); foreach ($slaps as $slappy) { if ($contact['notify']) { if (!was_recently_delayed($contact['id'])) { $deliver_status = slapper($owner, $contact['notify'], $slappy); } else { $deliver_status = -1; } if ($deliver_status == -1) { // queue message for redelivery add_to_queue($contact['id'], NETWORK_OSTATUS, $slappy); } } } } break; case NETWORK_MAIL: case NETWORK_MAIL2: if (get_config('system', 'dfrn_only')) { break; } // WARNING: does not currently convert to RFC2047 header encodings, etc. $addr = $contact['addr']; if (!strlen($addr)) { break; } if ($cmd === 'wall-new' || $cmd === 'comment-new') { $it = null; if ($cmd === 'wall-new') { $it = $items[0]; } else { $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($argv[2]), intval($uid)); if (count($r)) { $it = $r[0]; } } if (!$it) { break; } $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid)); if (!count($local_user)) { break; } $reply_to = ''; $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", intval($uid)); if ($r1 && $r1[0]['reply_to']) { $reply_to = $r1[0]['reply_to']; } $subject = $it['title'] ? email_header_encode($it['title'], 'UTF-8') : t("(no subject)"); // only expose our real email address to true friends if ($contact['rel'] == CONTACT_IS_FRIEND && !$contact['blocked']) { if ($reply_to) { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . $reply_to . '>' . "\n"; $headers .= 'Sender: ' . $local_user[0]['email'] . "\n"; } else { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; } } else { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; } //if($reply_to) // $headers .= 'Reply-to: ' . $reply_to . "\n"; $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n"; //logger("Mail: uri: ".$it['uri']." parent-uri ".$it['parent-uri'], LOGGER_DEBUG); //logger("Mail: Data: ".print_r($it, true), LOGGER_DEBUG); //logger("Mail: Data: ".print_r($it, true), LOGGER_DATA); if ($it['uri'] !== $it['parent-uri']) { $headers .= "References: <" . iri2msgid($it["parent-uri"]) . ">"; // If Threading is enabled, write down the correct parent if ($it["thr-parent"] != "" and $it["thr-parent"] != $it["parent-uri"]) { $headers .= " <" . iri2msgid($it["thr-parent"]) . ">"; } $headers .= "\n"; if (!$it['title']) { $r = q("SELECT `title` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($it['parent-uri']), intval($uid)); if (count($r) and $r[0]['title'] != '') { $subject = $r[0]['title']; } else { $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($it['parent-uri']), intval($uid)); if (count($r) and $r[0]['title'] != '') { $subject = $r[0]['title']; } } } if (strncasecmp($subject, 'RE:', 3)) { $subject = 'Re: ' . $subject; } } email_send($addr, $subject, $headers, $it); } break; case NETWORK_DIASPORA: if ($public_message) { $loc = 'public batch ' . $contact['batch']; } else { $loc = $contact['name']; } logger('delivery: diaspora batch deliver: ' . $loc); if (get_config('system', 'dfrn_only') || !get_config('system', 'diaspora_enabled') || !$normal_mode) { break; } if (!$contact['pubkey'] && !$public_message) { break; } if ($target_item['verb'] === ACTIVITY_DISLIKE) { // unsupported break; } elseif ($target_item['deleted'] && $target_item['uri'] === $target_item['parent-uri']) { // top-level retraction logger('delivery: diaspora retract: ' . $loc); diaspora_send_retraction($target_item, $owner, $contact, $public_message); break; } elseif ($target_item['uri'] !== $target_item['parent-uri']) { // we are the relay - send comments, likes and relayable_retractions to our conversants logger('delivery: diaspora relay: ' . $loc); diaspora_send_relay($target_item, $owner, $contact, $public_message); break; } elseif ($top_level && !$walltowall) { // currently no workable solution for sending walltowall logger('delivery: diaspora status: ' . $loc); diaspora_send_status($target_item, $owner, $contact, $public_message); break; } logger('delivery: diaspora unknown mode: ' . $contact['name']); break; case NETWORK_FEED: case NETWORK_FACEBOOK: if (get_config('system', 'dfrn_only')) { break; } case NETWORK_PUMPIO: if (get_config('system', 'dfrn_only')) { break; } default: break; } } return; }
/** * send_mail_to_testers * * * @return void */ function send_mail_to_testers(&$dbHandler, &$tcaseMgr, &$guiObj, &$argsObj, $features, $operation) { $testers['new'] = null; $testers['old'] = null; $mail_details['new'] = lang_get('mail_testcase_assigned') . "<br /><br />"; $mail_details['old'] = lang_get('mail_testcase_assignment_removed') . "<br /><br />"; $mail_subject['new'] = lang_get('mail_subject_testcase_assigned'); $mail_subject['old'] = lang_get('mail_subject_testcase_assignment_removed'); $use_testers['new'] = $operation == 'del' ? false : true; $use_testers['old'] = $operation == 'ins' ? false : true; $tcaseSet = null; $tcnames = null; $email = array(); $assigner = $guiObj->all_users[$argsObj->user_id]->firstName . ' ' . $guiObj->all_users[$argsObj->user_id]->lastName; $email['from_address'] = config_get('from_email'); $body_first_lines = lang_get('testproject') . ': ' . $argsObj->tproject_name . '<br />' . lang_get('testplan') . ': ' . $guiObj->testPlanName . '<br /><br />'; // Get testers id foreach ($features as $feature_id => $value) { if ($use_testers['new']) { $ty = (array) $value['user_id']; foreach ($ty as $user_id) { $testers['new'][$user_id][$value['tcase_id']] = $value['tcase_id']; } } if ($use_testers['old']) { $testers['old'][$value['previous_user_id']][$value['tcase_id']] = $value['tcase_id']; } $tcaseSet[$value['tcase_id']] = $value['tcase_id']; $tcversionSet[$value['tcversion_id']] = $value['tcversion_id']; } $infoSet = $tcaseMgr->get_by_id_bulk($tcaseSet, $tcversionSet); foreach ($infoSet as $value) { $tcnames[$value['testcase_id']] = $guiObj->testCasePrefix . $value['tc_external_id'] . ' ' . $value['name']; } $path_info = $tcaseMgr->tree_manager->get_full_path_verbose($tcaseSet); $flat_path = null; foreach ($path_info as $tcase_id => $pieces) { $flat_path[$tcase_id] = implode('/', $pieces) . '/' . $tcnames[$tcase_id]; } foreach ($testers as $tester_type => $tester_set) { if (!is_null($tester_set)) { $email['subject'] = $mail_subject[$tester_type] . ' ' . $guiObj->testPlanName; foreach ($tester_set as $user_id => $value) { // workaround till solution will be found if ($user_id <= 0) { continue; } $userObj = $guiObj->all_users[$user_id]; $email['to_address'] = $userObj->emailAddress; $email['body'] = $body_first_lines; $email['body'] .= sprintf($mail_details[$tester_type], $userObj->firstName . ' ' . $userObj->lastName, $assigner); foreach ($value as $tcase_id) { $email['body'] .= $flat_path[$tcase_id] . '<br />'; } $email['body'] .= '<br />' . date(DATE_RFC1123); $email_op = email_send($email['from_address'], $email['to_address'], $email['subject'], $email['body'], '', true, true); } // foreach($tester_set as $user_id => $value) } } }
function notifier_run(&$argv, &$argc) { global $a, $db; if (is_null($a)) { $a = new App(); } if (is_null($db)) { @(include ".htconfig.php"); require_once "include/dba.php"; $db = new dba($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); } require_once "include/session.php"; require_once "include/datetime.php"; require_once 'include/items.php'; require_once 'include/bbcode.php'; require_once 'include/email.php'; load_config('config'); load_config('system'); load_hooks(); if ($argc < 3) { return; } $a->set_baseurl(get_config('system', 'url')); logger('notifier: invoked: ' . print_r($argv, true), LOGGER_DEBUG); $cmd = $argv[1]; switch ($cmd) { case 'mail': default: $item_id = intval($argv[2]); if (!$item_id) { return; } break; } $expire = false; $mail = false; $fsuggest = false; $relocate = false; $top_level = false; $recipients = array(); $url_recipients = array(); $normal_mode = true; if ($cmd === 'mail') { $normal_mode = false; $mail = true; $message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1", intval($item_id)); if (!count($message)) { return; } $uid = $message[0]['uid']; $recipients[] = $message[0]['contact-id']; $item = $message[0]; } elseif ($cmd === 'expire') { $normal_mode = false; $expire = true; $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1\n\t\t\tAND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE", intval($item_id)); $uid = $item_id; $item_id = 0; if (!count($items)) { return; } } elseif ($cmd === 'suggest') { $normal_mode = false; $fsuggest = true; $suggest = q("SELECT * FROM `fsuggest` WHERE `id` = %d LIMIT 1", intval($item_id)); if (!count($suggest)) { return; } $uid = $suggest[0]['uid']; $recipients[] = $suggest[0]['cid']; $item = $suggest[0]; } elseif ($cmd === 'removeme') { $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($item_id)); if (!$r) { return; } $user = $r[0]; $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", intval($item_id)); if (!$r) { return; } $self = $r[0]; $r = q("SELECT * FROM `contact` WHERE `self` = 0 AND `uid` = %d", intval($item_id)); if (!$r) { return; } require_once 'include/Contact.php'; foreach ($r as $contact) { terminate_friendship($user, $self, $contact); } return; } elseif ($cmd === 'relocate') { $normal_mode = false; $relocate = true; $uid = $item_id; } else { // find ancestors $r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", intval($item_id)); if (!count($r) || !intval($r[0]['parent'])) { return; } $target_item = $r[0]; $parent_id = intval($r[0]['parent']); $uid = $r[0]['uid']; $updated = $r[0]['edited']; // POSSIBLE CLEANUP --> The following seems superfluous. We've already checked for "if (! intval($r[0]['parent']))" a few lines up if (!$parent_id) { return; } $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer`\n\t\t\tFROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", intval($parent_id)); if (!count($items)) { return; } // avoid race condition with deleting entries if ($items[0]['deleted']) { foreach ($items as $item) { $item['deleted'] = 1; } } if (count($items) == 1 && $items[0]['id'] === $target_item['id'] && $items[0]['uri'] === $items[0]['parent-uri']) { logger('notifier: top level post'); $top_level = true; } } $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`,\n\t\t`user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`,\n\t\t`user`.`page-flags`, `user`.`prvnets`\n\t\tFROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`\n\t\tWHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", intval($uid)); if (!count($r)) { return; } $owner = $r[0]; $walltowall = $top_level && $owner['id'] != $items[0]['contact-id'] ? true : false; $hub = get_config('system', 'huburl'); // If this is a public conversation, notify the feed hub $public_message = true; // Do a PuSH $push_notify = false; // fill this in with a single salmon slap if applicable $slap = ''; if (!($mail || $fsuggest || $relocate)) { require_once 'include/group.php'; $parent = $items[0]; $thr_parent = q("SELECT `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d", dbesc($target_item["thr-parent"]), intval($target_item["uid"])); logger('Parent is ' . $parent['network'] . '. Thread parent is ' . $thr_parent[0]['network'], LOGGER_DEBUG); // This is IMPORTANT!!!! // We will only send a "notify owner to relay" or followup message if the referenced post // originated on our system by virtue of having our hostname somewhere // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere. // if $parent['wall'] == 1 we will already have the parent message in our array // and we will relay the whole lot. // expire sends an entire group of expire messages and cannot be forwarded. // However the conversation owner will be a part of the conversation and will // be notified during this run. // Other DFRN conversation members will be alerted during polled updates. // Diaspora members currently are not notified of expirations, and other networks have // either limited or no ability to process deletions. We should at least fix Diaspora // by stringing togther an array of retractions and sending them onward. $localhost = str_replace('www.', '', $a->get_hostname()); if (strpos($localhost, ':')) { $localhost = substr($localhost, 0, strpos($localhost, ':')); } /** * * Be VERY CAREFUL if you make any changes to the following several lines. Seemingly innocuous changes * have been known to cause runaway conditions which affected several servers, along with * permissions issues. * */ $relay_to_owner = false; if (!$top_level && $parent['wall'] == 0 && !$expire && stristr($target_item['uri'], $localhost)) { $relay_to_owner = true; } if ($cmd === 'uplink' && intval($parent['forum_mode']) == 1 && !$top_level) { $relay_to_owner = true; } // until the 'origin' flag has been in use for several months // we will just use it as a fallback test // later we will be able to use it as the primary test of whether or not to relay. if (!$target_item['origin']) { $relay_to_owner = false; } if ($parent['origin']) { $relay_to_owner = false; } if ($relay_to_owner) { logger('notifier: followup ' . $target_item["guid"], LOGGER_DEBUG); // local followup to remote post $followup = true; $public_message = false; // not public $conversant_str = dbesc($parent['contact-id']); $recipients = array($parent['contact-id']); if (!$target_item['private'] and $target_item['wall'] and strlen($target_item['allow_cid'] . $target_item['allow_gid'] . $target_item['deny_cid'] . $target_item['deny_gid']) == 0) { $push_notify = true; } // We notify Friendica users in the thread when it is an OStatus thread. // Hopefully this transfers the messages to the other Friendica servers. (Untested) if ($thr_parent and $thr_parent[0]['network'] == NETWORK_OSTATUS or $parent['network'] == NETWORK_OSTATUS) { $push_notify = true; if ($parent["network"] == NETWORK_OSTATUS) { $r = q("SELECT `author-link` FROM `item` WHERE `parent` = %d AND `author-link` != '%s'", intval($target_item["parent"]), dbesc($owner['url'])); foreach ($r as $parent_item) { $probed_contact = probe_url($parent_item["author-link"]); if ($probed_contact["notify"] != "" and $probed_contact["network"] == NETWORK_DFRN) { logger('Notify Friendica user ' . $probed_contact["url"] . ': ' . $probed_contact["notify"]); $url_recipients[$probed_contact["notify"]] = $probed_contact["notify"]; } } } if (count($url_recipients)) { logger("url_recipients " . print_r($url_recipients, true)); } } } else { $followup = false; logger('Distributing directly ' . $target_item["guid"], LOGGER_DEBUG); // don't send deletions onward for other people's stuff if ($target_item['deleted'] && !intval($target_item['wall'])) { logger('notifier: ignoring delete notification for non-wall item'); return; } if (strlen($parent['allow_cid']) || strlen($parent['allow_gid']) || strlen($parent['deny_cid']) || strlen($parent['deny_gid'])) { $public_message = false; // private recipients, not public } $allow_people = expand_acl($parent['allow_cid']); $allow_groups = expand_groups(expand_acl($parent['allow_gid']), true); $deny_people = expand_acl($parent['deny_cid']); $deny_groups = expand_groups(expand_acl($parent['deny_gid'])); // if our parent is a public forum (forum_mode == 1), uplink to the origional author causing // a delivery fork. private groups (forum_mode == 2) do not uplink if (intval($parent['forum_mode']) == 1 && !$top_level && $cmd !== 'uplink') { proc_run('php', 'include/notifier.php', 'uplink', $item_id); } $conversants = array(); foreach ($items as $item) { $recipients[] = $item['contact-id']; $conversants[] = $item['contact-id']; // pull out additional tagged people to notify (if public message) if ($public_message && strlen($item['inform'])) { $people = explode(',', $item['inform']); foreach ($people as $person) { if (substr($person, 0, 4) === 'cid:') { $recipients[] = intval(substr($person, 4)); $conversants[] = intval(substr($person, 4)); } else { $url_recipients[] = substr($person, 4); } } } } if (count($url_recipients)) { logger('notifier: ' . $target_item["guid"] . ' url_recipients ' . print_r($url_recipients, true)); } $conversants = array_unique($conversants); $recipients = array_unique(array_merge($recipients, $allow_people, $allow_groups)); $deny = array_unique(array_merge($deny_people, $deny_groups)); $recipients = array_diff($recipients, $deny); $conversant_str = dbesc(implode(', ', $conversants)); } // If the thread parent is OStatus then do some magic to distribute the messages. // We have not only to look at the parent, since it could be a Friendica thread. if ($thr_parent and $thr_parent[0]['network'] == NETWORK_OSTATUS or $parent['network'] == NETWORK_OSTATUS) { logger('Some parent is OStatus for ' . $target_item["guid"], LOGGER_DEBUG); // Send a salmon notification to every person we mentioned in the post $arr = explode(',', $target_item['tag']); foreach ($arr as $x) { //logger('Checking tag '.$x, LOGGER_DEBUG); $matches = null; if (preg_match('/@\\[url=([^\\]]*)\\]/', $x, $matches)) { $probed_contact = probe_url($matches[1]); if ($probed_contact["notify"] != "") { logger('Notify mentioned user ' . $probed_contact["url"] . ': ' . $probed_contact["notify"]); $url_recipients[$probed_contact["notify"]] = $probed_contact["notify"]; } } } // It only makes sense to distribute answers to OStatus messages to Friendica and OStatus - but not Diaspora $sql_extra = " AND `network` IN ('" . NETWORK_OSTATUS . "', '" . NETWORK_DFRN . "')"; } else { $sql_extra = ""; } $r = q("SELECT * FROM `contact` WHERE `id` IN ({$conversant_str}) AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0" . $sql_extra); if (count($r)) { $contacts = $r; } } $feed_template = get_markup_template('atom_feed.tpl'); $mail_template = get_markup_template('atom_mail.tpl'); $atom = ''; $slaps = array(); $hubxml = feed_hublinks(); $birthday = feed_birthday($owner['uid'], $owner['timezone']); if (strlen($birthday)) { $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>'; } $atom .= replace_macros($feed_template, array('$version' => xmlify(FRIENDICA_VERSION), '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname']), '$feed_title' => xmlify($owner['name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00', ATOM_TIME)), '$hub' => $hubxml, '$salmon' => '', '$name' => xmlify($owner['name']), '$profile_page' => xmlify($owner['url']), '$photo' => xmlify($owner['photo']), '$thumb' => xmlify($owner['thumb']), '$picdate' => xmlify(datetime_convert('UTC', 'UTC', $owner['avatar-date'] . '+00:00', ATOM_TIME)), '$uridate' => xmlify(datetime_convert('UTC', 'UTC', $owner['uri-date'] . '+00:00', ATOM_TIME)), '$namdate' => xmlify(datetime_convert('UTC', 'UTC', $owner['name-date'] . '+00:00', ATOM_TIME)), '$birthday' => $birthday, '$community' => $owner['page-flags'] == PAGE_COMMUNITY ? '<dfrn:community>1</dfrn:community>' : '')); if ($mail) { $public_message = false; // mail is not public $body = fix_private_photos($item['body'], $owner['uid'], null, $message[0]['contact-id']); $atom .= replace_macros($mail_template, array('$name' => xmlify($owner['name']), '$profile_page' => xmlify($owner['url']), '$thumb' => xmlify($owner['thumb']), '$item_id' => xmlify($item['uri']), '$subject' => xmlify($item['title']), '$created' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00', ATOM_TIME)), '$content' => xmlify($body), '$parent_id' => xmlify($item['parent-uri']))); } elseif ($fsuggest) { $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_suggest.tpl'); $atom .= replace_macros($sugg_template, array('$name' => xmlify($item['name']), '$url' => xmlify($item['url']), '$photo' => xmlify($item['photo']), '$request' => xmlify($item['request']), '$note' => xmlify($item['note']))); // We don't need this any more q("DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1", intval($item['id'])); } elseif ($relocate) { $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_relocate.tpl'); /* get site pubkey. this could be a new installation with no site keys*/ $pubkey = get_config('system', 'site_pubkey'); if (!$pubkey) { $res = new_keypair(1024); set_config('system', 'site_prvkey', $res['prvkey']); set_config('system', 'site_pubkey', $res['pubkey']); } $rp = q("SELECT `resource-id` , `scale`, type FROM `photo` \n\t\t\t\t\t\tWHERE `profile` = 1 AND `uid` = %d ORDER BY scale;", $uid); $photos = array(); $ext = Photo::supportedTypes(); foreach ($rp as $p) { $photos[$p['scale']] = $a->get_baseurl() . '/photo/' . $p['resource-id'] . '-' . $p['scale'] . '.' . $ext[$p['type']]; } unset($rp, $ext); $atom .= replace_macros($sugg_template, array('$name' => xmlify($owner['name']), '$photo' => xmlify($photos[4]), '$thumb' => xmlify($photos[5]), '$micro' => xmlify($photos[6]), '$url' => xmlify($owner['url']), '$request' => xmlify($owner['request']), '$confirm' => xmlify($owner['confirm']), '$notify' => xmlify($owner['notify']), '$poll' => xmlify($owner['poll']), '$sitepubkey' => xmlify(get_config('system', 'site_pubkey')))); $recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'", intval($uid), NETWORK_DFRN); unset($photos); } else { $slap = ostatus_salmon($target_item, $owner); //$slap = atom_entry($target_item,'html',null,$owner,false); if ($followup) { foreach ($items as $item) { // there is only one item if (!$item['parent']) { continue; } if ($item['id'] == $item_id) { logger('notifier: followup: item: ' . print_r($item, true), LOGGER_DATA); //$slap = atom_entry($item,'html',null,$owner,false); $atom .= atom_entry($item, 'text', null, $owner, false); } } } else { foreach ($items as $item) { if (!$item['parent']) { continue; } // private emails may be in included in public conversations. Filter them. if ($public_message && $item['private'] == 1) { continue; } $contact = get_item_contact($item, $contacts); if (!$contact) { continue; } if ($normal_mode) { // we only need the current item, but include the parent because without it // older sites without a corresponding dfrn_notify change may do the wrong thing. if ($item_id == $item['id'] || $item['id'] == $item['parent']) { $atom .= atom_entry($item, 'text', null, $owner, true); } } else { $atom .= atom_entry($item, 'text', null, $owner, true); } if ($top_level && $public_message && $item['author-link'] === $item['owner-link'] && !$expire) { $slaps[] = ostatus_salmon($item, $owner); } //$slaps[] = atom_entry($item,'html',null,$owner,true); } } } $atom .= '</feed>' . "\r\n"; logger('notifier: ' . $atom, LOGGER_DATA); logger('notifier: slaps: ' . print_r($slaps, true), LOGGER_DATA); // If this is a public message and pubmail is set on the parent, include all your email contacts $mail_disabled = function_exists('imap_open') && !get_config('system', 'imap_disabled') ? 0 : 1; if (!$mail_disabled) { if (!strlen($target_item['allow_cid']) && !strlen($target_item['allow_gid']) && !strlen($target_item['deny_cid']) && !strlen($target_item['deny_gid']) && intval($target_item['pubmail'])) { $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `network` = '%s'", intval($uid), dbesc(NETWORK_MAIL)); if (count($r)) { foreach ($r as $rr) { $recipients[] = $rr['id']; } } } } if ($followup) { $recip_str = $parent['contact-id']; } else { $recip_str = implode(', ', $recipients); } if ($relocate) { $r = $recipients_relocate; } else { $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ", dbesc($recip_str)); } require_once 'include/salmon.php'; $interval = get_config('system', 'delivery_interval') === false ? 2 : intval(get_config('system', 'delivery_interval')); // If we are using the worker we don't need a delivery interval if (get_config("system", "worker")) { $interval = false; } // delivery loop if (count($r)) { foreach ($r as $contact) { if (!$mail && !$fsuggest && !$followup && !$relocate && !$contact['self']) { if ($contact['network'] === NETWORK_DIASPORA && $public_message) { continue; } q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )", dbesc($cmd), intval($item_id), intval($contact['id'])); } } // This controls the number of deliveries to execute with each separate delivery process. // By default we'll perform one delivery per process. Assuming a hostile shared hosting // provider, this provides the greatest chance of deliveries if processes start getting // killed. We can also space them out with the delivery_interval to also help avoid them // getting whacked. // If $deliveries_per_process > 1, we will chain this number of multiple deliveries // together into a single process. This will reduce the overall number of processes // spawned for each delivery, but they will run longer. // When using the workerqueue, we don't need this functionality. $deliveries_per_process = intval(get_config('system', 'delivery_batch_count')); if ($deliveries_per_process <= 0 or get_config("system", "worker")) { $deliveries_per_process = 1; } $this_batch = array(); for ($x = 0; $x < count($r); $x++) { $contact = $r[$x]; if ($contact['self']) { continue; } logger("Deliver " . $target_item["guid"] . " to " . $contact['url'], LOGGER_DEBUG); // potentially more than one recipient. Start a new process and space them out a bit. // we will deliver single recipient types of message and email recipients here. if (!$mail && !$fsuggest && !$relocate && !$followup) { $this_batch[] = $contact['id']; if (count($this_batch) == $deliveries_per_process) { proc_run('php', 'include/delivery.php', $cmd, $item_id, $this_batch); $this_batch = array(); if ($interval) { @time_sleep_until(microtime(true) + (double) $interval); } } continue; } // be sure to pick up any stragglers if (count($this_batch)) { proc_run('php', 'include/delivery.php', $cmd, $item_id, $this_batch); } $deliver_status = 0; logger("main delivery by notifier: followup={$followup} mail={$mail} fsuggest={$fsuggest} relocate={$relocate}"); switch ($contact['network']) { case NETWORK_DFRN: // perform local delivery if we are on the same site $basepath = implode('/', array_slice(explode('/', $contact['url']), 0, 3)); if (link_compare($basepath, $a->get_baseurl())) { $nickname = basename($contact['url']); if ($contact['issued-id']) { $sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id'])); } else { $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id'])); } $x = q("SELECT\t`contact`.*, `contact`.`uid` AS `importer_uid`,\n\t\t\t\t\t\t\t`contact`.`pubkey` AS `cpubkey`,\n\t\t\t\t\t\t\t`contact`.`prvkey` AS `cprvkey`,\n\t\t\t\t\t\t\t`contact`.`thumb` AS `thumb`,\n\t\t\t\t\t\t\t`contact`.`url` as `url`,\n\t\t\t\t\t\t\t`contact`.`name` as `senderName`,\n\t\t\t\t\t\t\t`user`.*\n\t\t\t\t\t\t\tFROM `contact`\n\t\t\t\t\t\t\tINNER JOIN `user` ON `contact`.`uid` = `user`.`uid`\n\t\t\t\t\t\t\tWHERE `contact`.`blocked` = 0 AND `contact`.`archive` = 0\n\t\t\t\t\t\t\tAND `contact`.`pending` = 0\n\t\t\t\t\t\t\tAND `contact`.`network` = '%s' AND `user`.`nickname` = '%s'\n\t\t\t\t\t\t\t{$sql_extra}\n\t\t\t\t\t\t\tAND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 LIMIT 1", dbesc(NETWORK_DFRN), dbesc($nickname)); if ($x && count($x)) { $write_flag = $x[0]['rel'] && $x[0]['rel'] != CONTACT_IS_SHARING ? true : false; if (($owner['page-flags'] == PAGE_COMMUNITY || $write_flag) && !$x[0]['writable']) { q("update contact set writable = 1 where id = %d", intval($x[0]['id'])); $x[0]['writable'] = 1; } // if contact's ssl policy changed, which we just determined // is on our own server, update our contact links $ssl_policy = get_config('system', 'ssl_policy'); fix_contact_ssl_policy($x[0], $ssl_policy); // If we are setup as a soapbox we aren't accepting top level posts from this person if ($x[0]['page-flags'] == PAGE_SOAPBOX and $top_level) { break; } require_once 'library/simplepie/simplepie.inc'; logger('mod-delivery: local delivery'); local_delivery($x[0], $atom); break; } } logger('notifier: dfrndelivery: ' . $contact['name']); $deliver_status = dfrn_deliver($owner, $contact, $atom); logger('notifier: dfrn_delivery returns ' . $deliver_status); if ($deliver_status == -1) { logger('notifier: delivery failed: queuing message'); // queue message for redelivery add_to_queue($contact['id'], NETWORK_DFRN, $atom); } break; case NETWORK_OSTATUS: // Do not send to ostatus if we are not configured to send to public networks if ($owner['prvnets']) { break; } if (get_config('system', 'ostatus_disabled') || get_config('system', 'dfrn_only')) { break; } if ($followup && $contact['notify']) { logger('slapdelivery followup item ' . $item_id . ' to ' . $contact['name']); $deliver_status = slapper($owner, $contact['notify'], $slap); if ($deliver_status == -1) { // queue message for redelivery add_to_queue($contact['id'], NETWORK_OSTATUS, $slap); } } else { // only send salmon if public - e.g. if it's ok to notify // a public hub, it's ok to send a salmon if (count($slaps) && $public_message && !$expire) { logger('slapdelivery item ' . $item_id . ' to ' . $contact['name']); foreach ($slaps as $slappy) { if ($contact['notify']) { $deliver_status = slapper($owner, $contact['notify'], $slappy); if ($deliver_status == -1) { // queue message for redelivery add_to_queue($contact['id'], NETWORK_OSTATUS, $slappy); } } } } } break; case NETWORK_MAIL: case NETWORK_MAIL2: if (get_config('system', 'dfrn_only')) { break; } // WARNING: does not currently convert to RFC2047 header encodings, etc. $addr = $contact['addr']; if (!strlen($addr)) { break; } if ($cmd === 'wall-new' || $cmd === 'comment-new') { $it = null; if ($cmd === 'wall-new') { $it = $items[0]; } else { $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($argv[2]), intval($uid)); if (count($r)) { $it = $r[0]; } } if (!$it) { break; } $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid)); if (!count($local_user)) { break; } $reply_to = ''; $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", intval($uid)); if ($r1 && $r1[0]['reply_to']) { $reply_to = $r1[0]['reply_to']; } $subject = $it['title'] ? email_header_encode($it['title'], 'UTF-8') : t("(no subject)"); // only expose our real email address to true friends if ($contact['rel'] == CONTACT_IS_FRIEND && !$contact['blocked']) { if ($reply_to) { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . $reply_to . '>' . "\n"; $headers .= 'Sender: ' . $local_user[0]['email'] . "\n"; } else { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; } } else { $headers = 'From: ' . email_header_encode($local_user[0]['username'], 'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; } //if($reply_to) // $headers .= 'Reply-to: ' . $reply_to . "\n"; $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n"; if ($it['uri'] !== $it['parent-uri']) { $headers .= "References: <" . iri2msgid($it["parent-uri"]) . ">"; // If Threading is enabled, write down the correct parent if ($it["thr-parent"] != "" and $it["thr-parent"] != $it["parent-uri"]) { $headers .= " <" . iri2msgid($it["thr-parent"]) . ">"; } $headers .= "\n"; if (!$it['title']) { $r = q("SELECT `title` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($it['parent-uri']), intval($uid)); if (count($r) and $r[0]['title'] != '') { $subject = $r[0]['title']; } else { $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($it['parent-uri']), intval($uid)); if (count($r) and $r[0]['title'] != '') { $subject = $r[0]['title']; } } } if (strncasecmp($subject, 'RE:', 3)) { $subject = 'Re: ' . $subject; } } email_send($addr, $subject, $headers, $it); } break; case NETWORK_DIASPORA: if (get_config('system', 'dfrn_only') || !get_config('system', 'diaspora_enabled')) { break; } if ($mail) { diaspora_send_mail($item, $owner, $contact); break; } if (!$normal_mode) { break; } // special handling for followup to public post // all other public posts processed as public batches further below if ($public_message) { if ($followup) { diaspora_send_followup($target_item, $owner, $contact, true); } break; } if (!$contact['pubkey']) { break; } $unsupported_activities = array(ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE); //don't transmit activities which are not supported by diaspora foreach ($unsupported_activities as $act) { if (activity_match($target_item['verb'], $act)) { break 2; } } if ($target_item['deleted'] && ($target_item['uri'] === $target_item['parent-uri'] || $followup)) { // send both top-level retractions and relayable retractions for owner to relay diaspora_send_retraction($target_item, $owner, $contact); break; } elseif ($followup) { // send comments and likes to owner to relay diaspora_send_followup($target_item, $owner, $contact); break; } elseif ($target_item['uri'] !== $target_item['parent-uri']) { // we are the relay - send comments, likes and relayable_retractions // (of comments and likes) to our conversants diaspora_send_relay($target_item, $owner, $contact); break; } elseif ($top_level && !$walltowall) { // currently no workable solution for sending walltowall diaspora_send_status($target_item, $owner, $contact); break; } break; case NETWORK_FEED: case NETWORK_FACEBOOK: if (get_config('system', 'dfrn_only')) { break; } case NETWORK_PUMPIO: if (get_config('system', 'dfrn_only')) { break; } default: break; } } } // send additional slaps to mentioned remote tags (@foo@example.com) //if($slap && count($url_recipients) && ($followup || $top_level) && ($public_message || $push_notify) && (! $expire)) { if ($slap && count($url_recipients) && ($public_message || $push_notify) && !$expire) { if (!get_config('system', 'dfrn_only')) { foreach ($url_recipients as $url) { if ($url) { logger('notifier: urldelivery: ' . $url); $deliver_status = slapper($owner, $url, $slap); // TODO: redeliver/queue these items on failure, though there is no contact record } } } } if ($public_message) { if (!$followup) { $r0 = diaspora_fetch_relay(); } else { $r0 = array(); } $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'\n\t\t\tAND `uid` = %d AND `rel` != %d group by `batch` ORDER BY rand() ", dbesc(NETWORK_DIASPORA), intval($owner['uid']), intval(CONTACT_IS_SHARING)); $r2 = q("SELECT `id`, `name`,`network` FROM `contact`\n\t\t\tWHERE `network` in ( '%s', '%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0\n\t\t\tAND `rel` != %d order by rand() ", dbesc(NETWORK_DFRN), dbesc(NETWORK_MAIL2), intval($owner['uid']), intval(CONTACT_IS_SHARING)); $r = array_merge($r2, $r1, $r0); if (count($r)) { logger('pubdeliver: ' . print_r($r, true), LOGGER_DEBUG); // throw everything into the queue in case we get killed foreach ($r as $rr) { if (!$mail && !$fsuggest && !$followup) { q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )", dbesc($cmd), intval($item_id), intval($rr['id'])); } } foreach ($r as $rr) { // except for Diaspora batch jobs // Don't deliver to folks who have already been delivered to if ($rr['network'] !== NETWORK_DIASPORA && in_array($rr['id'], $conversants)) { logger('notifier: already delivered id=' . $rr['id']); continue; } if (!$mail && !$fsuggest && !$followup) { logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); proc_run('php', 'include/delivery.php', $cmd, $item_id, $rr['id']); if ($interval) { @time_sleep_until(microtime(true) + (double) $interval); } } } } $push_notify = true; } if ($push_notify and strlen($hub)) { $hubs = explode(',', $hub); if (count($hubs)) { foreach ($hubs as $h) { $h = trim($h); if (!strlen($h)) { continue; } if ($h === '[internal]') { // Set push flag for PuSH subscribers to this topic, // they will be notified in queue.php q("UPDATE `push_subscriber` SET `push` = 1 " . "WHERE `nickname` = '%s'", dbesc($owner['nickname'])); logger('Activating internal PuSH for item ' . $item_id, LOGGER_DEBUG); } else { $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname']); post_url($h, $params); logger('publish for item ' . $item_id . ' ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code()); } if (count($hubs) > 1) { sleep(7); } // try and avoid multiple hubs responding at precisely the same time } } // Handling the pubsubhubbub requests proc_run('php', 'include/pubsubpublish.php'); } // If the item was deleted, clean up the `sign` table if ($target_item['deleted']) { $r = q("DELETE FROM sign where `retract_iid` = %d", intval($target_item['id'])); } logger('notifier: calling hooks', LOGGER_DEBUG); if ($normal_mode) { call_hooks('notifier_normal', $target_item); } call_hooks('notifier_end', $target_item); return; }
/** * send mail to administrators (users that have default role = administrator) * to warn about new user created. * */ function notifyGlobalAdmins(&$dbHandler, &$userObj) { // Get email addresses for all users that have default role = administrator $roleMgr = new tlRole(TL_ROLES_ADMIN); $userSet = $roleMgr->getUsersWithGlobalRole($dbHandler); $mail['subject'] = lang_get('new_account'); $key2loop = array_keys($userSet); foreach ($key2loop as $userID) { $mail['to'][$userID] = $userSet[$userID]->emailAddress; } // email_api uses ',' as list separator $mail['to'] = implode(',', $mail['to']); $mail['body'] = lang_get('new_account') . "\n"; $mail['body'] .= " user:{$userObj->login}\n"; $mail['body'] .= " first name:{$userObj->firstName} surname:{$userObj->lastName}\n"; $mail['body'] .= " email:{$userObj->emailAddress}\n"; // silence errors @email_send(config_get('from_email'), $mail['to'], $mail['subject'], $mail['body']); }
function email_send_all() { $t_ids = email_queue_get_ids(); $t_emails_recipients_failed = array(); $t_start = microtime_float(); foreach ($t_ids as $t_id) { $t_email_data = email_queue_get($t_id); # check if email was not found. This can happen if another request picks up the email first and sends it. if ($t_email_data === false) { continue; } # if unable to place the email in the email server queue, then the connection to the server is down, # and hence no point to continue trying with the rest of the emails. if (!email_send($t_email_data)) { if (microtime_float() - $t_start > 5) { break; } else { continue; } } } }
if ($f_to !== null) { if ($f_to == 'all') { echo "Sending emails...<br />"; email_send_all(); echo "Done"; } else { if ($f_to == 'sendordelall') { echo "Sending or deleting emails...<br />"; email_send_all(true); echo "Done"; } else { $t_email_data = email_queue_get((int) $f_to); // check if email was found. This can fail if another request picks up the email first and sends it. echo 'Sending email...<br />'; if ($t_email_data !== false) { if (!email_send($t_email_data)) { echo 'Email Not Sent - Deleting from queue<br />'; email_queue_delete($t_email_data->email_id); } else { echo 'Email Sent<br />'; } } else { echo 'Email not found in queue<br />'; } } } } $t_ids = email_queue_get_ids(); if (count($t_ids) > 0) { echo '<table><tr><th>' . lang_get('id') . '</th><th>' . lang_get('email') . '</th><th>' . lang_get('timestamp') . '</th><th>Send Or Delete</th></tr>'; foreach ($t_ids as $t_id) {
function sendSuccessReport() { $xml = simplexml_load_file('/conf/config.xml'); $name = $xml->xpath('/opennas/system/hostname'); email_send(getMailTo(), "Plus d'erreur détectées sur OpenNAS", "Aucune erreur n'a été détectée sur l'OpenNAS \"" . $name['0'] . "\" ( " . get_hast_role() . " ).", $outError); return !$outError; }
//send a password reset request to a user //check if form submitted if (!isset($_POST['email'])) { return false; } //variables not set yet //get variables $email = set_post('email', ''); if (empty($email) || !email_is_valid($email)) { notices_set('Invalid email.', 'error'); return false; } //check if it is valid $sql = sql_query(" SELECT id FROM `users` WHERE email='{$email}' LIMIT 1 "); if (sql_count($sql) <= 0) { notices_set('Invalid email.', 'error'); return false; } $data = sql_fetch($sql); //create code $confirm = confirm_token_create($email); //delete all tokens for that email sql_query(" DELETE FROM `password_reset` WHERE user='******'id']}' LIMIT 1 "); //insert sql_query(" INSERT INTO `password_reset` (user, token) VALUES('{$data['id']}' , '{$confirm}') \n\t\t\tON DUPLICATE KEY UPDATE token='{$confirm}' "); //send email email_send('password_reset', 'Planling Password Reset', array($email => $email), array('{{%LINK%}}' => 'http://' . MAIN_URL . '/password?e=' . $email . '&t=' . $confirm)); //set message notices_set('Instructions on how to reset your password has been sent to <strong>' . $email . '</strong>.', 'success'); //redirect user do_redirect();
/** * */ public function writeEvent(&$event) { if (!$this->doLogging) { return tl::OK; } if (!($event->logLevel & $this->logLevelFilter)) { return tl::OK; } if (!$this->configIsOK) { return tl::ERROR; } // this event logger supports tlMetaString and normal strings if (is_object($event->description)) { $description = $event->description->localize('en_GB'); } else { $description = $event->description; } // to avoid log writes related to log logic $this->disableLogging(); // build the logfile entry $subjects = array("%timestamp", "%errorlevel", "%source", "%description", "%sessionid"); $verboseTimeStamp = gmdate("y/M/j H:i:s", $event->timestamp); $replacements = array($verboseTimeStamp, tlLogger::$logLevels[$event->logLevel], $event->source, $description, $event->sessionID ? $event->sessionID : "<nosession>"); $email_body = str_replace($subjects, $replacements, self::$eventFormatString); try { $mail_subject = $verboseTimeStamp . lang_get('mail_logger_email_subject'); $mail_subject .= isset($_SESSION['basehref']) ? $_SESSION['basehref'] : config_get('instance_id'); email_send($this->from_email, $this->sendto_email, $mail_subject, $email_body); } catch (Exception $exceptionObj) { // do nothing return tl::KO; } $this->enableLogging(); return tl::OK; }