scrapeboard/www/subscribe.php

158 lines
6.2 KiB
PHP

<?php
/* [subscribe.php]
*
* Subscribe an email address to a Mailman3 mailing list. The email address is taken from the request, and
* the mailing list and API credentials are set below.
*
* Mailman3 API subscription documentation:
*
* [https://docs.mailman3.org/projects/mailman/en/latest/src/mailman/rest/docs/membership.html#joining-a-mailing-list]
*/
const MAILING_LIST_ID = "scrapeboard-list.nugget.fun";
const API_USER = "restadmin";
const API_TOKEN = "GgzPdbc0rvvsWkHIhmGtjtbv0rmDlz0Y4zBjQv+kEjl6HvSS";
const API_HOST = "http://localhost:8001";
const API_VERSION = "3.1";
/* Submit an API request to mailman using cURL with the above settings
*
* @param request request part of the URL to submit to mailman, see Mailman3 for possible requests
* @param method either "GET" or "POST"
* @param post_data array of post parameters to pass with the request URL
* @return array of reponse parameters decoded from JSON, along with response["success"] and response["message"]
*/
function submit_request_to_mailman($request, $method = "GET", $post_data = array())
{
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => API_HOST. "/" . API_VERSION . "/" . $request,
CURLOPT_HTTPAUTH => CURLAUTH_ANY,
CURLOPT_USERPWD => API_USER . ":" . API_TOKEN,
/* Return the response from curl_exec as a string instead or outputting it directly */
CURLOPT_RETURNTRANSFER => true
));
/* Use HTTP POST method if requested, application/x-www-form-urlencoded */
if ($method == "POST")
{
curl_setopt($ch, CURLOPT_POST, true);
/* Include any post data in the request, using http_build_query to post as application/x-www-form-urlencoded */
if ($post_data)
{
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
}
}
/* Define a response array that contains the success state and a message that will be filled in the case of an error */
$response = array("success" => false, "message" => "");
$result = curl_exec($ch);
if ($result !== false)
{
/* Make sure the appropriate response for GET or POST was received */
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($method == "POST" && $http_status != 201 || $method == "GET" && $http_status != 200)
{
$response["message"] = "[" . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "]";
if ($result != "")
{
$result = json_decode($result, true);
if (array_key_exists("title", $result))
{
$response["message"] .= " " . $result["title"];
}
if (array_key_exists("description", $result))
{
$response["message"] .= " " . $result["description"];
}
}
}
else
{
/* Merge the response from Mailman3 into the existing response array */
$response["success"] = true;
if ($result != "")
{
$response = array_merge($response, json_decode($result, true));
}
}
}
else
{
$response["message"] = "cURL error: " . curl_error($ch);
}
curl_close($ch);
return $response;
}
/* Start a response array that will be output as JSON and get the log directory */
// Commented out while transitioning away from Mailman
// $response = submit_request_to_mailman("system/configuration/paths.debian");
// if ($response["success"])
// {
/* There is a log_dir in the response for getting the system level log directory ($response["log_dir"]), but use
* /home/frank/ instead for now and log mailing list subscription request to a single site-wide file. */
$log_path = "/home/frank/signups.txt";
$response = array("success" => false, "message" => "");
file_put_contents(
$log_path,
"[" . date(DATE_RFC2822) . "] Subscription request to " . MAILING_LIST_ID . " with input " . json_encode($_POST) . "\n",
FILE_APPEND);
if (array_key_exists("email", $_POST))
{
/* Use Data Filtering to validate that a valid email address was submitted
* [https://www.php.net/manual/en/filter.examples.sanitization.php]
*
* If an invalid email was submitted, print an error message and exit
*/
$sanitized_email = filter_var($_POST["email"], FILTER_SANITIZE_EMAIL);
$response["email"] = $sanitized_email;
if (!filter_var($sanitized_email, FILTER_VALIDATE_EMAIL))
{
$response["success"] = false;
$response["message"] = $_POST["email"] . " (sanitized to $sanitized_email) is not a valid email address";
}
else
{
/* Skip the verification, confirmation, and approval emails, and subscribe the submitted address */
// $subscription_response = submit_request_to_mailman(
// "members", "POST", array(
// 'list_id' => MAILING_LIST_ID,
// 'subscriber' => $sanitized_email,
// 'pre_verified' => true,
// 'pre_confirmed' => true,
// 'pre_approved' => true));
// if ($subscription_response["success"])
// {
$response["success"] = true;
$response["message"] = "Added $sanitized_email to " . MAILING_LIST_ID;
// }
// else
// {
// /* Merge in the API request response, which will contain the error information */
// $response = array_merge($response, $subscription_response);
// }
}
}
else
{
$response["success"] = false;
$response["message"] = "No email address to subscribe was provided";
}
// }
/* Log the response internally, set the JSON output header, and output JSON for the client */
file_put_contents($log_path, "[" . date(DATE_RFC2822) . "] Final response is " . json_encode($response) . "\n", FILE_APPEND);
header("Content-Type: application/json");
echo json_encode($response);
?>