+ // Check blacklisted IPs
+ if ($aid == 'blacklist_check') {
+ global $globals;
+ $ips_to_check = array();
+ $blacklist_host_resolution_count = 0;
+
+ foreach ($issue->arts as $key => $articles) {
+ foreach ($articles as $article) {
+ $article_ips = $article->getLinkIps($blacklist_host_resolution_count);
+ if (!empty($article_ips)) {
+ $ips_to_check[$article->title()] = $article_ips;
+ }
+ }
+ }
+
+ $page->assign('ips_to_check', $ips_to_check);
+ if ($blacklist_host_resolution_count >= $globals->mail->blacklist_host_resolution_limit) {
+ $page->trigError("Toutes les url et adresses emails de la lettre"
+ . " n'ont pas été prises en compte car la"
+ . " limite du nombre de résolutions DNS"
+ . " autorisée a été atteinte.");
+ }
+ }
+
+ if ($issue->state == NLIssue::STATE_SENT) {
+ $page->trigWarning("Cette lettre a déjà été envoyée ; il est recommandé de limiter les modifications au maximum (orthographe, adresses web et mail).");
+ }
+
+ $ufb->setEnv($issue->sufb->getEnv());
+ $page->assign_by_ref('nl', $nl);
+ $page->assign_by_ref('issue', $issue);
+ }
+
+ /** This handler will cancel the sending of the currently pending issue
+ * It is disabled for X.org mailings.
+ */
+ function handler_admin_nl_cancel($page, $nid, $force = null)
+ {
+ $nl = $this->getNl();
+ if (!$nl) {
+ return PL_NOT_FOUND;
+ }
+
+ if (!$nl->mayEdit() || !S::has_xsrf_token()) {
+ return PL_FORBIDDEN;
+ }
+
+ if (!$nid) {
+ $page->kill("La lettre n'a pas été spécifiée");
+ }
+
+ $issue = $nl->getIssue($nid);
+ if (!$issue) {
+ $page->kill("La lettre {$nid} n'existe pas.");
+ }
+ if (!$issue->cancelMailing()) {
+ $page->trigErrorRedirect("Une erreur est survenue lors de l'annulation de l'envoi.", $nl->adminPrefix());
+ }
+
+ // Logs NL cancelling.
+ S::logger()->log('nl_mailing_cancel', $nid);
+
+ $page->trigSuccessRedirect("L'envoi de l'annonce {$issue->title()} est annulé.", $nl->adminPrefix());
+ }
+
+ /** This handler will enable the sending of the currently pending issue
+ * It is disabled for X.org mailings.
+ */
+ function handler_admin_nl_valid($page, $nid, $force = null)
+ {
+ $nl = $this->getNl();
+ if (!$nl) {
+ return PL_NOT_FOUND;
+ }
+
+ if (!$nl->mayEdit() || !S::has_xsrf_token()) {
+ return PL_FORBIDDEN;
+ }
+
+ if (!$nid) {
+ $page->kill("La lettre n'a pas été spécifiée.");
+ }
+
+ $issue = $nl->getIssue($nid);
+ if (!$issue) {
+ $page->kill("La lettre {$nid} n'existe pas.");
+ }
+
+ if ($issue->isEmpty()) {
+ $page->trigErrorRedirect("La lettre étant vide, il n'est pas possible de l'envoyer.", $nl->adminPrefix());
+ }
+
+ if (!$issue->scheduleMailing()) {
+ $page->trigErrorRedirect("Une erreur est survenue lors de la validation de l'envoi.", $nl->adminPrefix());
+ }
+
+ // Logs NL validation.
+ S::logger()->log('nl_mailing_valid', $nid);
+
+ $page->trigSuccessRedirect("L'envoi de la newsletter {$issue->title()} a été validé.", $nl->adminPrefix());
+ }
+
+ /** This handler will remove the given issue.
+ */
+ function handler_admin_nl_delete($page, $nid, $force = null)
+ {
+ $nl = $this->getNl();
+ if (!$nl) {
+ return PL_NOT_FOUND;
+ }
+
+ if (!$nl->mayEdit() || !S::has_xsrf_token()) {
+ return PL_FORBIDDEN;
+ }
+
+ if (!$nid) {
+ $page->kill("La lettre n'a pas été spécifiée.");
+ }
+
+ $issue = $nl->getIssue($nid);
+ if (!$issue) {
+ $page->kill("La lettre {$nid} n'existe pas");
+ }
+ if (!$issue->isEditable()) {
+ $page->trigErrorRedirect("La lette a été envoyée ou est en cours d'envoi, elle ne peut être supprimée.", $nl->adminPrefix());
+ }
+ if (!$issue->delete()) {
+ $page->trigErrorRedirect("Une erreur est survenue lors de la suppression de la lettre.", $nl->adminPrefix());
+ }
+
+ // Logs NL deletion.
+ S::logger()->log('nl_issue_delete', $nid);
+
+ $page->trigSuccessRedirect("La lettre a bien été supprimée.", $nl->adminPrefix());