diff --git a/VERSION b/VERSION index 6a39225..5f22788 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.8.3 +v3.9.0 diff --git a/controllers/internals/Received.php b/controllers/internals/Received.php index 3e6218e..8c96abf 100644 --- a/controllers/internals/Received.php +++ b/controllers/internals/Received.php @@ -11,6 +11,8 @@ namespace controllers\internals; +use Exception; + class Received extends StandardController { protected $model; @@ -88,14 +90,6 @@ namespace controllers\internals; return false; } - //Check if the received message is a SMS STOP and we must register it - $internal_smsstop = new SmsStop($this->bdd); - $is_stop = $internal_smsstop->check_for_stop($received['text']); - if ($is_stop) - { - $internal_smsstop->create($id_user, $origin); - } - //Link medias $internal_media = new Media($this->bdd); foreach ($media_ids as $media_id) @@ -116,6 +110,32 @@ namespace controllers\internals; return false; } + //Check if the received message is a SMS STOP and we must register it + $internal_smsstop = new SmsStop($this->bdd); + $is_stop = $internal_smsstop->check_for_stop($received['text']); + if ($is_stop) + { + $stop_exists = (bool) $internal_smsstop->get_by_number_for_user($id_user, $origin); + if ($stop_exists) + { + return $id_received; + } + + $internal_smsstop->create($id_user, $origin); + + //If stop response enabled, respond to user + //(this will happen only for first stop, any further stop will not trigger responses) + $internal_setting = new Setting($this->bdd); + $user_settings = $internal_setting->gets_for_user($id_user); + + if ((int) ($user_settings['smsstop_respond'] ?? false)) + { + $response = $user_settings['smsstop_response']; + $internal_scheduled = new Scheduled($this->bdd); + $internal_scheduled->create($id_user, (new \DateTime())->format('Y-m-d H:i:s'), $response, $id_phone, null, false, false, \models\SmsStop::SMS_STOP_TAG, [['number' => $origin, 'data' => '[]']]); + } + } + return $id_received; } diff --git a/controllers/internals/Scheduled.php b/controllers/internals/Scheduled.php index b4ec0d6..a02e040 100644 --- a/controllers/internals/Scheduled.php +++ b/controllers/internals/Scheduled.php @@ -602,8 +602,8 @@ use Monolog\Logger; continue; } - //Remove messages to smsstops numbers - if (($users_smsstops[$id_user] ?? false) && in_array($target['number'], $users_smsstops[$id_user])) + //Remove messages to smsstops numbers if not with tag SMS_STOP + if ($scheduled['tag'] != \models\SmsStop::SMS_STOP_TAG && ($users_smsstops[$id_user] ?? false) && in_array($target['number'], $users_smsstops[$id_user])) { unset($targets[$key]); continue; diff --git a/controllers/internals/SmsStop.php b/controllers/internals/SmsStop.php index 29d310a..00e8865 100644 --- a/controllers/internals/SmsStop.php +++ b/controllers/internals/SmsStop.php @@ -73,7 +73,8 @@ namespace controllers\internals; */ public function check_for_stop(string $str) { - return 'stop' == trim(mb_strtolower($str)); + $str = trim(mb_strtolower($str)); + return 'stop' == $str || 'stop sms' == $str; } /** diff --git a/descartes/ApiController.php b/descartes/ApiController.php index feaa303..da738d3 100644 --- a/descartes/ApiController.php +++ b/descartes/ApiController.php @@ -91,21 +91,21 @@ /** * Cette fonction permet de faire un retour sous forme de json - * @param array $data : Les données à retourner sous forme de json + * @param array $datas : Les données à retourner sous forme de json * @param boolean $secure : Défini si l'affichage doit être sécurisé contre les XSS, par défaut true * @return ApiController : On retourne l'API controlleur lui meme pour pouvoir chainer */ - public function json ($data, $secure = true) + public function json ($datas, $secure = true) { header('Content-Type: application/json'); if ($secure) { - echo htmlspecialchars(json_encode($data), ENT_NOQUOTES); + echo htmlspecialchars(json_encode($datas), ENT_NOQUOTES); } else { - echo json_encode($data); + echo json_encode($datas); } return $this; diff --git a/descartes/Controller.php b/descartes/Controller.php index 7c2caf9..1d7832a 100644 --- a/descartes/Controller.php +++ b/descartes/Controller.php @@ -24,7 +24,7 @@ if (!is_readable($template_path)) { - throw new DescartesTemplateNotReadableException('Template ' . $template_path . ' is not readable.'); + throw new exceptions\DescartesExceptionTemplateNotReadable('Template ' . $template_path . ' is not readable.'); } require $template_path; diff --git a/descartes/Router.php b/descartes/Router.php index a88bea4..5b78a05 100644 --- a/descartes/Router.php +++ b/descartes/Router.php @@ -72,6 +72,10 @@ protected static function clean_url (string $url) { $to_remove = parse_url(HTTP_PWD, PHP_URL_PATH); + if ($to_remove === null) + { + return $url; + } $url = mb_strcut($url, mb_strlen($to_remove)); $url = parse_url($url, PHP_URL_PATH); diff --git a/descartes/env.php b/descartes/env.php index c512901..7b5428c 100644 --- a/descartes/env.php +++ b/descartes/env.php @@ -4,7 +4,7 @@ /* * Define Descartes env */ - $http_dir_path = '/raspisms'; //Path we need to put after servername in url to access app + $http_dir_path = ''; //Path we need to put after servername in url to access app $https = $_SERVER['HTTPS'] ?? 0; // Check for proxy forward @@ -27,10 +27,9 @@ $port = $proxy ? '' : $port; $http_server_port = $port ? ':' . $port : ''; - + $pwd = substr(__DIR__, 0, strrpos(__DIR__, '/')); - $http_pwd = $http_protocol . $http_server_name . $http_server_port . $http_dir_path; - + $env = [ //Global http and file path @@ -39,31 +38,25 @@ 'HTTP_SERVER_NAME' => $http_server_name, 'HTTP_SERVER_PORT' => $http_server_port, 'PWD' => $pwd, - 'HTTP_PWD' => $http_pwd, - + //path of back resources 'PWD_CONTROLLER' => $pwd . '/controllers', //Controllers dir 'PWD_MODEL' => $pwd . '/models', //Models dir 'PWD_TEMPLATES' => $pwd . '/templates', //Templates dir //path of front resources - 'PWD_ASSETS' => $pwd . '/assets', //Assets dir - 'HTTP_PWD_ASSETS' => $http_pwd . '/assets', //HTTP path of asset dir + 'PWD_ASSETS' => $pwd . '/assets', //Assets dir //images 'PWD_IMG' => $pwd . '/assets' . '/img', - 'HTTP_PWD_IMG' => $http_pwd . '/assets' . '/img', - + //css 'PWD_CSS' => $pwd . '/assets' . '/css', - 'HTTP_PWD_CSS' => $http_pwd . '/assets' . '/css', - + //javascript 'PWD_JS' => $pwd . '/assets' . '/js', - 'HTTP_PWD_JS' => $http_pwd . '/assets' . '/js', - + //fonts 'PWD_FONT' => $pwd . '/assets' . '/font', - 'HTTP_PWD_FONT' => $http_pwd . '/assets' . '/font', ]; diff --git a/descartes/load-environment.php b/descartes/load-environment.php index a4ce6c7..2bae0bf 100644 --- a/descartes/load-environment.php +++ b/descartes/load-environment.php @@ -21,6 +21,7 @@ $environment = []; $env = []; + // Load descartes base env require_once(__DIR__ . '/env.php'); $environment = array_merge($environment, $env); @@ -31,11 +32,8 @@ $environment = array_merge($environment, $env); } - //Define all Descartes constants - define_array($environment); - ### GLOBAL ENV ### - $environment = []; + //Load global app env $env = []; if (file_exists(__DIR__ . '/../env.php')) { @@ -43,19 +41,30 @@ $environment = array_merge($environment, $env); } - define_array($environment); - ### SPECIFIC ENV ### - $environment = []; + // Load specific environment env $env = []; - - if (defined('ENV') && file_exists(__DIR__ . '/../env.' . ENV . '.php')) + if (isset($environment['ENV']) && file_exists(__DIR__ . '/../env.' . $environment['ENV'] . '.php')) { - require_once(__DIR__ . '/../env.' . ENV . '.php'); + require_once(__DIR__ . '/../env.' . $environment['ENV'] . '.php'); $environment = array_merge($environment, $env); } + ### BUILD HTTP PWD CONSTS ### + // We compute http pwd at last minute to allow for simple overriding by user + // by simply defining custom HTTP_* (PROTOCOL, SERVER_NAME, SERVER_PORT, DIR_PATH) + $http_pwd = $environment['HTTP_PROTOCOL'] . $environment['HTTP_SERVER_NAME'] . $environment['HTTP_SERVER_PORT'] . $environment['HTTP_DIR_PATH']; + $env = [ + "HTTP_PWD" => $http_pwd, + 'HTTP_PWD_ASSETS' => $http_pwd . '/assets', //HTTP path of asset dir + 'HTTP_PWD_IMG' => $http_pwd . '/assets' . '/img', + 'HTTP_PWD_CSS' => $http_pwd . '/assets' . '/css', + 'HTTP_PWD_JS' => $http_pwd . '/assets' . '/js', + 'HTTP_PWD_FONT' => $http_pwd . '/assets' . '/font', + ]; + $environment = array_merge($environment, $env); + define_array($environment); } diff --git a/env.php.dist b/env.php.dist index afd6dd5..1ce52ac 100644 --- a/env.php.dist +++ b/env.php.dist @@ -2,23 +2,25 @@ /* This file define constants and options for the app */ - + $dir_path = '/raspisms'; + $http_pwd = $environment['HTTP_PROTOCOL'] . $dir_path . $environment['HTTP_SERVER_PORT'] . $environment['HTTP_DIR_PATH']; $env = [ 'ENV' => '%APP_ENV%', #env name (probably 'dev' or 'prod'), this value is used to get the env.XXX.php.dist matching env file 'SESSION_NAME' => 'raspisms', + 'HTTP_DIR_PATH' => $dir_path, // Override default dir path //RaspiSMS settings 'WEBSITE_TITLE' => 'RaspiSMS', 'WEBSITE_DESCRIPTION' => '', 'WEBSITE_AUTHOR' => 'Raspberry Pi FR', - 'PWD_SCRIPTS' => PWD . '/scripts', - 'PWD_RECEIVEDS' => PWD . '/receiveds', - 'HTTP_PWD_SOUND' => HTTP_PWD_ASSETS . '/sounds', - 'PWD_ADAPTERS' => PWD . '/adapters', - 'PWD_DATA' => PWD . '/data', - 'HTTP_PWD_DATA' => HTTP_PWD . '/data', - 'PWD_DATA_PUBLIC' => PWD . '/data/public', - 'HTTP_PWD_DATA_PUBLIC' => HTTP_PWD . '/data/public', + 'PWD_SCRIPTS' => $environment['PWD'] . '/scripts', + 'PWD_RECEIVEDS' => $environment['PWD'] . '/receiveds', + 'HTTP_PWD_SOUND' => $http_pwd . '/assets' . '/sounds', + 'PWD_ADAPTERS' => $environment['PWD'] . '/adapters', + 'PWD_DATA' => $environment['PWD'] . '/data', + 'HTTP_PWD_DATA' => $http_pwd . '/data', + 'PWD_DATA_PUBLIC' => $environment['PWD'] . '/data/public', + 'HTTP_PWD_DATA_PUBLIC' => $http_pwd . '/data/public', 'PWD_LOGS' => '/var/log/raspisms', 'PWD_PID' => '/var/run/raspisms', 'APP_SECRET' => '%APP_SECRET%', @@ -87,6 +89,8 @@ 'phone_limit' => 0, 'phone_priority' => 0, 'shorten_url' => 0, + 'smsstop_respond' => 1, + 'smsstop_response' => 'Demande prise en compte, vous ne recevrez plus de messages.', ], ]; diff --git a/models/SmsStop.php b/models/SmsStop.php index 65cc522..18b7db7 100644 --- a/models/SmsStop.php +++ b/models/SmsStop.php @@ -13,6 +13,8 @@ namespace models; class SmsStop extends StandardModel { + const SMS_STOP_TAG = 'SMS_STOP'; + /** * Return a smsstop by his number and user. * diff --git a/templates/phone/add.php b/templates/phone/add.php index b7fb0ee..c071d6f 100644 --- a/templates/phone/add.php +++ b/templates/phone/add.php @@ -161,6 +161,16 @@ '' + ''; } + else if (field.type == 'textarea') + { + html += '
' + + '' + + '

' + field.description + '

' + + '
' + + '' + + '
' + + '
'; + } else { html += '
' + diff --git a/templates/phone/edit.php b/templates/phone/edit.php index 835fdf7..84e4f3f 100644 --- a/templates/phone/edit.php +++ b/templates/phone/edit.php @@ -225,6 +225,16 @@ '
' + ''; } + else if (field.type == 'textarea') + { + html += '
' + + '' + + '

' + field.description + '

' + + '
' + + '' + + '
' + + '
'; + } else { html += '' + diff --git a/templates/setting/show.php b/templates/setting/show.php index 5b9a0d8..0cbf3df 100644 --- a/templates/setting/show.php +++ b/templates/setting/show.php @@ -203,6 +203,47 @@ +
+
+
+

Activation des réponses automatiques aux SMS-STOP

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

Texte de réponse aux SMS-STOP

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