158 lines
6.2 KiB
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);
|
|
|
|
?>
|