diff --git a/src/Jirafeau/a.php b/src/Jirafeau/a.php index 2c33c39..65c40e1 100644 --- a/src/Jirafeau/a.php +++ b/src/Jirafeau/a.php @@ -2,7 +2,6 @@ /* * Kaz addon (see https://git.kaz.bzh/KAZ/depollueur for information) * create un archive for a set of file or update file deadline - * version : 2.22 (2024-12-09) a.php?r=email => track a.php?p=email => period @@ -14,118 +13,7 @@ action: a=login a=logout a=r[on|off] a=p[minute|hour|day|week|month|quarter|semester] */ -use PHPMailer\PHPMailer\PHPMailer; -use PHPMailer\PHPMailer\SMTP; -use PHPMailer\PHPMailer\Exception; -require 'vendor/autoload.php'; - -define ('JIRAFEAU_ROOT', dirname (__FILE__) . '/'); - -require (JIRAFEAU_ROOT . 'lib/settings.php'); -require (JIRAFEAU_ROOT . 'lib/functions.php'); -require (JIRAFEAU_ROOT . 'lib/lang.php'); - -define ('VAR_TOKENS', $cfg ['var_root'].'tokens/'); -define ('VAR_MODE', $cfg ['var_root'].'mode/'); -define ('VAR_TRACKS', $cfg ['var_root'].'tracks/'); -define ('VAR_PERIOD', $cfg ['var_root'].'period/'); -define ('VAR_LANG', $cfg ['var_root'].'lang/'); -define ('VAR_FAKE', $cfg ['var_root'].'fake/'); -define ('VAR_ADMIN', $cfg ['var_root'].'admin/'); -define ('VAR_CONFIG', $cfg ['var_root'].'config/'); -define ('FILE_CONFIG', VAR_CONFIG.'default.php'); - -$domain="kaz.local"; -if (preg_match ("%^.*//([^/]*)/?.*$%", $cfg ['web_root'], $matches)) - $domain = $matches [1]; - -define ('MAX_VALID_UPLOAD_TIME', 60); -define ('TOKEN_USE_LIMIT', "-2 hours"); -define ('TOKEN_LOGIN_LIMIT', "-15 minutes"); -define ('TOKEN_LOGOUT_LIMIT', "-8 hours"); -if (!file_exists (VAR_CONFIG)) - mkdir (VAR_CONFIG, 0755); -if (!file_exists (FILE_CONFIG)) { - file_put_contents (FILE_CONFIG, "
Ceci est un message automatique, car vous venez de cliquer sur une demande de consultation de vos pièces jointes.

!!! Si vous n'êtes pas à l'origine de cette demande, ne cliquez sur aucun lien de ce message. !!!

Le lien de connexion suivant est valable 15 minutes.
___LINK___

Vous pouvez signaler des abus auprès de Kaz en faisant suivre ce message qui contient les traces de son émetteur (___IP___, ___DATE___).

Bonne navigation.
."); -define ('M_DOWNLOAD', "Télécharger"); -define ('M_UPDATE', "Prolonger"); -define ('M_EMAIL_SUBJECT', "Lien de consultation des envois sur ".$domain."."); -define ('M_FILE', " fichier."); -define ('M_FILES', " fichiers."); -define ('M_FILES_NOT_FOUND', " fichiers sont expirés."); -define ('M_FILES_RENAMED', " fichiers renommés."); -define ('M_FILE_NOT_FOUND', " fichier est expiré."); -define ('M_FILE_RENAMED', " fichier renommé."); -define ('M_INTRO_FORM', "Quelles sont les informations me concernant ?"); -define ('M_MEL', "votre mél"); -define ('M_NO_FILENAME', 'SansNom'); -define ('M_NO_SENDER', 'kaz-'); -define ('M_NEW_ATTACHEMENT_DIRNAME', "nouveau"); -define ('M_OLD_ATTACHEMENT_DIRNAME', "ancien"); -define ('M_SEND', "Connexion"); -define ('M_LOGOUT', 'Deconnecter'); -define ('M_REFRESH', 'Actualiser'); -define ('M_LOGOUT_TOKEN', "Vous n'êtes plus connecté."); -define ('M_SEND_TOKEN', "

Vous allez recevoir un lien d'accès temporaire à vos données.

"); -define ('M_WELCOME', "

Informations concernant le compte : ___SENDER______ADMIN___
(page actualisée à ___DATE___)

"); -define ('M_INCONSISTENT_DATES', - " (dates incohéantes avec ___FILENAME___ : ___DIRTIME___ != ___FILETIME___)"); - -define ('A_ACTION', 'a'); // action : T_LOGIN, T_LOGOUT, A_MODE(none|footer|attachment|both), A_RECORD+(on|off), A_PERIOD(minute|hour|day|week|month|quarter|semester), A_LANG(fr|en|br) -define ('A_GET', 'g'); // get archive -define ('A_HASH', 'h'); // file to update or delete -define ('A_OPEN_TOKEN', 'o'); // ask token -define ('A_SENDER', 's'); // session sender -define ('A_TOKEN', 't'); // session token -define ('A_UPDATE', 'u'); // update perriod for file or archive -define ('A_MODE', 'm'); // get mode status -define ('A_RECORD', 'r'); // get track status -define ('A_PERIOD', 'p'); // get period status -define ('A_LANG', 'l'); // get lang status -define ('A_DELETE', 'd'); // delete file ou archive + (sender+token) -define ('T_BAD_PASW', 'bad_psw'); -define ('T_CREATE', "create"); -define ('T_CRYPTED', 'crypted'); -define ('T_CRYPT_KEY', 'crypt_key'); -define ('T_ENTRIES', 'entries'); -define ('T_FILENAME', 'file_name'); -define ('T_HASH', 'hash'); -define ('T_LOGGED', "logged"); -define ('T_NEW', 'new'); -define ('T_SIGN', 'sign'); -define ('T_NOT_FOUND', 'not_found'); -define ('T_OLD', 'old'); -define ('T_RENAME', 'rename'); -define ('T_LOGIN', 'login'); -define ('T_LOGOUT', 'logout'); -define ('T_SENDER', 'sender'); -define ('T_TIME', 'time'); -define ('T_ID', 'id'); -define ('T_TOKEN', "token"); -define ('T_WARNING_FILENAME', "-Avertissement.txt"); -define ('T_ZIP_EXT', ".zip"); -define ('T_ARCHIVE_TITLE', "archive_content"); -define ('T_ARCHIVE_MIME', "text/kaz_email_archive"); - +require ("lib/attach-setup.php"); $modeText = ['none' => "sans", 'footer' => "pied de page", 'attachment' => "pièce jointe", 'both' => "les deux"]; $trackText = ['on' => "oui", 'off' => "non"]; @@ -139,14 +27,6 @@ $periodButton = ['hour' => ["🕐", ">1 heure"], // 1F550 ]; $langText = ['fr' => "Francais", 'br' => "Breton", 'en' => "english"]; $doLogout = ''; -$message = ''; - -/* Operations may take a long time. - * Be sure PHP's safe mode is off. - */ -@set_time_limit (0); -/* Remove errors. */ -@error_reporting (0); // ======================================== if (isset ($_REQUEST [A_MODE]) && !empty ($_REQUEST [A_MODE])) { @@ -213,9 +93,9 @@ if (isset ($_REQUEST [A_GET]) && !empty ($_REQUEST [A_GET])) { // ======================================== function returnError ($msg) { - require (JIRAFEAU_ROOT.'lib/template/header.php'); - echo '

' . $msg . '

'; - require (JIRAFEAU_ROOT.'lib/template/footer.php'); + displayHeadPage ("Gestion des pièces jointes"); + echo '
' . $msg . '
'; + displayFootPage (); exit; } @@ -343,49 +223,6 @@ function getSenderLang ($sender) { return DEFAULT_LANG; } -// ======================================== -function setSenderFake ($error, $sender, $owner, $dirLink, $fileLink) { - global $doLogout; - - if (!file_exists (VAR_FAKE)) - mkdir (VAR_FAKE, 0755); - $dirTime = $fileTime = $fileName = $fileType = $ip = ''; - if (count ($dirLink) != 0) { - $dirTime = $dirLink ['upload_date'].date (" Y-m-d H:i:s", $dirLink ['upload_date']); - $ip = $dirLink ['ip']; - } - if (!$sender) - return; - if (count ($fileLink) != 0) { - $fileTime = $fileLink ['upload_date'].date (" Y-m-d H:i:s", $fileLink ['upload_date']); - $fileName = $link ['file_name']; - $fileType = $link ['mime_type']; - } - $content = - "time : ".time ().NL. - "date : ".date ("Y-m-d H:i:s").NL. - "error : ".$error.NL. - "sender : <".$sender.">".NL. - "owner : <".$owner.">".NL. - "dirLink : <".$dirLink.">".NL. - "dirTime : ".$dirTime.NL. - "dirIp : ".$ip.NL. - "fileTime: ".$fileTime.NL. - "fileType: <".$fileType.">".NL. - "fileName: <".$fileName.">".NL; - - $log = $ip.$sender; - if ($log) - file_put_contents (VAR_FAKE.$log, $content); - - // $doLogout = true; - // rmToken ($sender); -} -function getSenderFake ($sender) { - return false; - // return $sender && file_exists (VAR_FAKE.$sender); -} - // ======================================== function isKazArchive ($link) { return @@ -474,98 +311,6 @@ function updateLink ($link_name, $link, $maxLimit) { return $time_more; } -// ======================================== -function sendEMail ($receiver, $receiver_name, $subject, $body_string){ - try { - // SERVER SETTINGS - $mail = new PHPMailer (true); - $mail->isSMTP (); - $mail->Host = 'smtp'; - $mail->SMTPAuth = false; - $mail->SMTPAutoTLS = false; - $mail->SMTPSecure = "none"; - $mail->Port = 25; - $mail->charSet = "UTF-8"; - $mail->ContentType = 'text/html'; - - global $domain; - //Recipients (change this for every project) - $mail->setFrom ('no-reply@'.$domain, ''); - $mail->addAddress ($receiver, $receiver_name); - - //Content - $mail->isHTML (true); - $mail->Subject = $subject; - $mail->Body = $body_string; - - //send the message, check for errors - if (!$mail->send ()) { - //echo 'Mailer Error: ' . $mail->ErrorInfo; - return 0; - } else { - //echo 'Message sent!'; - return 1; - } - } catch (Exception $e) { - return 0; - } -} - -// ======================================== -function cleanToken () { - if (!file_exists (VAR_TOKENS)) - mkdir (VAR_TOKENS, 0755); - $d = dir (VAR_TOKENS); - $oldest = strtotime (TOKEN_USE_LIMIT); - foreach (glob (VAR_TOKENS."*") as $file) { - if (filemtime ($file) <= $oldest) - unlink ($file); - } -} -function rmToken ($sender) { - if (!$sender) - return; - if (file_exists (VAR_TOKENS.$sender)) - unlink (VAR_TOKENS.$sender); -} -function setToken ($sender) { - if (!$sender) - return; - $token = md5 (rand ()); - if (file_put_contents (VAR_TOKENS.$sender, T_CREATE.": ".time ().NL.T_TOKEN.": ".$token.NL)) - return $token; - return false; -} -function setLoggedToken ($sender, $token) { - if (!$sender || !$token) - return; - file_put_contents (VAR_TOKENS.$sender, T_CREATE.": ".time ().NL.T_TOKEN.": ".$token.NL.T_LOGGED.": ok".NL); -} -function getTokenVar ($sender, $varName) { - if (!$sender) - return; - if (!file_exists (VAR_TOKENS.$sender)) - return false; - $content = file_get_contents (VAR_TOKENS.$sender); - if (preg_match ("/\b".$varName.":\s*([^\s]+)\n/", $content, $matches)) - return $matches [1]; - return false; -} -function getToken ($sender) { - return getTokenVar ($sender, T_TOKEN,); -} -function getCreateToken ($sender) { - return getTokenVar ($sender, T_CREATE); -} -function getLoggedToken ($sender) { - return getTokenVar ($sender, T_LOGGED); -} -function getTimeToken ($sender) { - if (!$sender || !file_exists (VAR_TOKENS.$sender)) - return false; - return filemtime (VAR_TOKENS.$sender); -} - // ======================================== function setAdmin ($sender) { if (!$sender) @@ -707,6 +452,8 @@ function deleteAction ($linkName) { } } +// ======================================== +// main // ======================================== if ($doUpdate) { $maxTime = time ()+period2seconds ($_REQUEST [A_UPDATE]); @@ -736,19 +483,6 @@ if ($doUpdate) { exit; } -$sender = ''; -$senderError = false; -if (isset ($_REQUEST [A_SENDER]) && !empty ($_REQUEST [A_SENDER])) { - // XXX - //if (!preg_match ("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/i", $_REQUEST [A_SENDER])) - if (!preg_match ("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/i", $_REQUEST [A_SENDER])) - $senderError = true; - else { - cleanToken (); - $sender = $_REQUEST [A_SENDER]; - } -} - // ======================================== if ($doDownload) { // check archive exist @@ -900,75 +634,26 @@ if ($doDownload) { // ======================================== // form -$token = ''; -if (isset ($_REQUEST [A_TOKEN]) && !empty ($_REQUEST [A_TOKEN])) { - if (!preg_match ("/^([0-9a-zA-Z_-]+)$/", $_REQUEST [A_TOKEN])) - return false; - $token = $_REQUEST [A_TOKEN]; -} - -$refToken = getToken ($sender); -$urlBase = $_SERVER ['HTTP_X_FORWARDED_PROTO']."://".$_SERVER ['HTTP_HOST']; -if (isset ($_REQUEST [A_ACTION]) && $_REQUEST [A_ACTION] == T_LOGIN && $sender) { - require (JIRAFEAU_ROOT . 'lib/template/header.php'); - if (getSenderFake ($sender)) - echo "Ce compte ne peut plus se connecter. Veuillez contacter les administrateurs."; - else { - $token = setToken ($sender); - // XXX test token - $url = $urlBase.$_SERVER ['SCRIPT_NAME']."?".A_SENDER."=".$sender."&".A_TOKEN."=".$token; - $result = sendEMail ($sender, "", M_EMAIL_SUBJECT, - str_replace (["___LINK___", "___IP___", "___DATE___"], - [$url, $_SERVER ['HTTP_X_REAL_IP'] , date ("Y-m-d H:i:s")], M_EMAIL_CONTENT)); - if ($result) - echo M_SEND_TOKEN; - else - echo - "Erreur dans l'envoi. Véritiez votre mél."; - } - echo "


"; - require (JIRAFEAU_ROOT.'lib/template/footer.php'); - exit; -} if (! ($sender && $token && $token == $refToken && (getLoggedToken ($sender) || (getTimeToken ($sender) >= strtotime (TOKEN_LOGIN_LIMIT))) && (getCreateToken ($sender) >= strtotime (TOKEN_LOGOUT_LIMIT)))) { // XXX temps de connexion - require (JIRAFEAU_ROOT . 'lib/template/header.php'); - echo M_INTRO_FORM; + displayHeadPage ("Gestion des pièces jointes"); if ($senderError) - echo "

".M_BAD_SENDER_NAME."

"; + $message .= '
'.M_BAD_SENDER_NAME.'
'.NL; else if (($token && !$refToken) || !getLoggedToken ($sender)) - echo "

".M_TOO_LONG_BEFORE_LOGGED."

"; + $message .= '
'.M_TOO_LONG_BEFORE_LOGGED.'
'.NL; else if ($token && $token != $refToken) - echo "

".M_BAD_TOKEN."

"; + $message .= '
'.M_BAD_TOKEN.'
'.NL; else if (getCreateToken ($sender) < strtotime (TOKEN_LOGOUT_LIMIT)) - echo "

".M_TOO_LONG_LOGGED."

"; + $message .= '
'.M_TOO_LONG_LOGGED.'
'.NL; - ?> -
-
- - - - - - - - - - -
-
-
-
-
-Info : ".$message."

"; + echo '
Info : '.$message.'
'; echo M_LOGOUT; - require (JIRAFEAU_ROOT.'lib/template/footer.php'); + displayFootPage (); exit; } @@ -1009,7 +694,7 @@ if (isset ($_REQUEST [A_ACTION])) { switch (true) { case preg_match ("/^".A_MODE."(".implode ("|", array_keys ($modeText)).")$/i", $_REQUEST [A_ACTION], $matches): setSenderMode ($sender, $matches [1]); - $message .= "Votre mode à été mise à jour."; + $message .= 'Votre mode à été mise à jour.'; break; case preg_match ("/^".A_RECORD."(on|off)$/i", $_REQUEST [A_ACTION], $matches): if ($matches [1] == "on") @@ -1060,12 +745,12 @@ while ( ($d = array_shift ($stack)) && $d != null) { $archives [] = $archiveInfo; } } -require (JIRAFEAU_ROOT . 'lib/template/header.php'); +displayHeadPage ("Gestion des pièces jointes"); echo str_replace (["___SENDER___", "___ADMIN___", "___DATE___"], [$sender, ($admin ? " (admin)" : ""), jirafeau_get_datetimefield (time ())], M_WELCOME); if ($message) - echo "

Info : ".$message."

"; + echo '
Info : '.$message.'
'; echo ' +
+ + + +
+ + +
+ +
+

+ + +
+
+ + + + +
+
+
+ +
+

+
+
+ + + + +
+
+
+ +
+

+
+
+ + + +
+
+
+ +
+

+
+
+
$url) { ?> +
+ () +
+
);"> + +
+
+
+ +
+

+
$url2) { ?> +
+ + + + + + + + + + +
+
+ + + + + +
+
+
+"); static const string HEAD_END (""); @@ -99,7 +99,7 @@ static const string KAZ_HTML_DONT_TOUCH ("(conservez cette partie intacte dans static const string KAZ_HTML_DOWLOAD_ONE ("Vos pièces jointes sont à télécharger individuellement ici :"); static const string KAZ_HTML_DOWLOAD_OTHER ("(Contenu dans des messages précédents)"); static const string KAZ_HTML_DOWLOAD_ALL ("Vous pouvez télécharger l'ensemble dans une archive là :"); -static const string KAZ_HTML_DOWLOAD_CLOUD ("Vous pouvez classer les pièces jointes dans votre cloud là :"); +static const string KAZ_HTML_DOWLOAD_CLOUD ("Expérimental : vous pouvez classer les pièces jointes dans votre cloud là :"); static const string KAZ_HTML_ARCHIVE ("archive"); static const string KAZ_HTML_CLOUD ("cloud"); diff --git a/src/cpp/eMailShrinker.cpp b/src/cpp/eMailShrinker.cpp index 7617881..6df09d4 100644 --- a/src/cpp/eMailShrinker.cpp +++ b/src/cpp/eMailShrinker.cpp @@ -33,8 +33,8 @@ //////////////////////////////////////////////////////////////////////////// #include "version.hpp" -const std::string kaz::LAST_VERSION_NUM ("2.23"); -const std::string kaz::LAST_VERSION_DATE ("2025-01-07"); +const std::string kaz::LAST_VERSION_NUM ("2.24"); +const std::string kaz::LAST_VERSION_DATE ("2025-01-26"); const std::string kaz::LAST_VERSION (LAST_VERSION_NUM+" "+LAST_VERSION_DATE+" eMailShrinker"); #include