diff --git a/README.rst b/README.rst index e76cdaab..7de8a870 100755 --- a/README.rst +++ b/README.rst @@ -55,6 +55,7 @@ The following SMS gateways are currently available: * Nexmo - * OctoPush - * FreeMobile (FR) - +* CM Telecom - diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index f02ccb67..2f060ef8 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -556,6 +556,9 @@ function psm_build_sms() { case 'smsgw': $sms = new \psm\Txtmsg\Smsgw(); break; + case 'cmbulksms': + $sms = new \psm\Txtmsg\CMBulkSMS(); + break; } // copy login information from the config file diff --git a/src/lang/bg_BG.lang.php b/src/lang/bg_BG.lang.php index 6cfb5f80..857352ac 100644 --- a/src/lang/bg_BG.lang.php +++ b/src/lang/bg_BG.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_octopush' => 'Octopush', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Потребител', 'sms_gateway_password' => 'Парола', 'sms_from' => 'Номер на изпращача', diff --git a/src/lang/cs_CZ.lang.php b/src/lang/cs_CZ.lang.php index a2f5c007..894b72a3 100644 --- a/src/lang/cs_CZ.lang.php +++ b/src/lang/cs_CZ.lang.php @@ -218,6 +218,7 @@ $sm_lang = array( 'sms_gateway_freemobilesms' => 'FreeMobileSMS', 'sms_gateway_clicksend' => 'ClickSend', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Uživatelské jméno brány', 'sms_gateway_password' => 'Heslo brány', 'sms_from' => 'Telefonní číslo odesilatele', diff --git a/src/lang/da_DK.lang.php b/src/lang/da_DK.lang.php index 15861c76..ecb37d9f 100644 --- a/src/lang/da_DK.lang.php +++ b/src/lang/da_DK.lang.php @@ -200,6 +200,7 @@ $sm_lang = array( 'sms_gateway_octopush' => 'Octopush', 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway brugernavn/apikey', 'sms_gateway_password' => 'Gateway adgangskode', 'sms_from' => 'Afsenderens navn.', diff --git a/src/lang/de_DE.lang.php b/src/lang/de_DE.lang.php index 1346c86e..410dc246 100644 --- a/src/lang/de_DE.lang.php +++ b/src/lang/de_DE.lang.php @@ -204,6 +204,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway Benutzername', 'sms_gateway_password' => 'Gateway Passwort', 'sms_from' => 'SMS-Sendernummer', diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index b9df5874..495f6b3f 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -240,6 +240,7 @@ $sm_lang = array( 'sms_gateway_clicksend' => 'ClickSend', 'sms_gateway_nexmo' => 'Nexmo', 'sms_gateway_smsgw' => 'SMSgw', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Sender\'s phone number', diff --git a/src/lang/es_ES.lang.php b/src/lang/es_ES.lang.php index 76fed0f4..567381e3 100644 --- a/src/lang/es_ES.lang.php +++ b/src/lang/es_ES.lang.php @@ -207,6 +207,7 @@ $sm_lang = array( 'sms_gateway_username' => 'Usuario', 'sms_gateway_password' => 'Contraseña', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Número origen del SMS', diff --git a/src/lang/et_ET.lang.php b/src/lang/et_ET.lang.php index ef6180ff..c3a88396 100644 --- a/src/lang/et_ET.lang.php +++ b/src/lang/et_ET.lang.php @@ -201,6 +201,7 @@ $sm_lang = array( 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Värava kasutajanimi', 'sms_gateway_password' => 'Värava parool', 'sms_from' => 'Saatja telefoni number', diff --git a/src/lang/fa_IR.lang.php b/src/lang/fa_IR.lang.php index 5819147b..ff4bd648 100644 --- a/src/lang/fa_IR.lang.php +++ b/src/lang/fa_IR.lang.php @@ -201,6 +201,7 @@ $sm_lang = array( 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'نام کاربری Gateway', 'sms_gateway_password' => 'کلمه عبور Gateway', 'sms_from' => 'شماره تلفن ارسال کننده', diff --git a/src/lang/fi_FI.lang.php b/src/lang/fi_FI.lang.php index 7d90e7ec..b0650390 100644 --- a/src/lang/fi_FI.lang.php +++ b/src/lang/fi_FI.lang.php @@ -201,6 +201,7 @@ $sm_lang = array( 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Palvelun käyttäjänimi', 'sms_gateway_password' => 'Palvelun salasana', 'sms_from' => 'Lähettäjän puhelinnumero', diff --git a/src/lang/fr_FR.lang.php b/src/lang/fr_FR.lang.php index c91dcabe..4533f904 100644 --- a/src/lang/fr_FR.lang.php +++ b/src/lang/fr_FR.lang.php @@ -205,6 +205,7 @@ $sm_lang = array( 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', 'sms_gateway_freemobilesms' => 'FreeMobileSMS', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Nom utilisateur de la passerelle', 'sms_gateway_password' => 'Mot de passe de la passerelle', 'sms_from' => 'SMS de l\'expéditeur', diff --git a/src/lang/it_IT.lang.php b/src/lang/it_IT.lang.php index 6f274c33..407591ec 100644 --- a/src/lang/it_IT.lang.php +++ b/src/lang/it_IT.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Nome Utente Gateway', 'sms_gateway_password' => 'Password Gateway', 'sms_from' => 'Numero di telefono del mittente', diff --git a/src/lang/ja_JP.lang.php b/src/lang/ja_JP.lang.php index a91e337c..6a6b206a 100644 --- a/src/lang/ja_JP.lang.php +++ b/src/lang/ja_JP.lang.php @@ -223,6 +223,7 @@ $sm_lang = array( 'sms_gateway_clicksend' => 'ClickSend', 'sms_gateway_nexmo' => 'Nexmo', 'sms_gateway_smsgw' => 'SMSgw', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'ゲートウェイのユーザー名', 'sms_gateway_password' => 'ゲートウェイのパスワード', 'sms_from' => '送信者の電話番号:', diff --git a/src/lang/ko_KR.lang.php b/src/lang/ko_KR.lang.php index f2a6b956..a725ab06 100644 --- a/src/lang/ko_KR.lang.php +++ b/src/lang/ko_KR.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_octopush' => 'Octopush', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Sender\'s phone number', diff --git a/src/lang/nl_NL.lang.php b/src/lang/nl_NL.lang.php index 5af0392c..ca9e3e00 100644 --- a/src/lang/nl_NL.lang.php +++ b/src/lang/nl_NL.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway gebruikersnaam', 'sms_gateway_password' => 'Gateway wachtwoord', 'sms_from' => 'Telefoonnummer afzender', diff --git a/src/lang/pl_PL.lang.php b/src/lang/pl_PL.lang.php index 57e90e68..e8fe8d63 100644 --- a/src/lang/pl_PL.lang.php +++ b/src/lang/pl_PL.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Login do bramki', 'sms_gateway_password' => 'Hasło do bramki', 'sms_from' => 'Numer nadawcy', diff --git a/src/lang/pt_BR.lang.php b/src/lang/pt_BR.lang.php index dcf36e16..594f7100 100644 --- a/src/lang/pt_BR.lang.php +++ b/src/lang/pt_BR.lang.php @@ -206,6 +206,7 @@ $sm_lang = array( 'sms_gateway_password' => 'Senha do Gateway', 'sms_from' => 'Número de telefone de envio', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Usuário do Gateway', 'sms_gateway_password' => 'Senha do Gateway', 'sms_from' => 'Número de telefone de envio', diff --git a/src/lang/ru_RU.lang.php b/src/lang/ru_RU.lang.php index 581f105d..5b2436b5 100644 --- a/src/lang/ru_RU.lang.php +++ b/src/lang/ru_RU.lang.php @@ -203,6 +203,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Пользователь', 'sms_gateway_password' => 'Пароль', 'sms_from' => 'Номер отправителя', diff --git a/src/lang/sk_SK.lang.php b/src/lang/sk_SK.lang.php index 388edc8e..08bf3a55 100644 --- a/src/lang/sk_SK.lang.php +++ b/src/lang/sk_SK.lang.php @@ -217,6 +217,7 @@ $sm_lang = array( 'sms_gateway_freemobilesms' => 'FreeMobileSMS', 'sms_gateway_clicksend' => 'ClickSend', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Užívateľské meno brány', 'sms_gateway_password' => 'Heslo brány', 'sms_from' => 'Telefónne číslo odosielateľa', diff --git a/src/lang/sl_SI.lang.php b/src/lang/sl_SI.lang.php index a63033ac..c4084e76 100644 --- a/src/lang/sl_SI.lang.php +++ b/src/lang/sl_SI.lang.php @@ -198,6 +198,7 @@ $sm_lang = array( 'sms_gateway_textmarketer' => 'Textmarketer', 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_smsit' => 'Smsit', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Uporabniško ime SMS prehoda', 'sms_gateway_password' => 'Geslo SMS prehoda', 'sms_from' => 'Telefonska številka pošiljatelja', diff --git a/src/lang/sv_SE.lang.php b/src/lang/sv_SE.lang.php index a12888ed..6ea29781 100644 --- a/src/lang/sv_SE.lang.php +++ b/src/lang/sv_SE.lang.php @@ -202,6 +202,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway användarnamn', 'sms_gateway_password' => 'Gateway lösenord', 'sms_from' => 'Avsändarens telefonnummer', diff --git a/src/lang/tr_TR.lang.php b/src/lang/tr_TR.lang.php index eff265e1..7e565e80 100644 --- a/src/lang/tr_TR.lang.php +++ b/src/lang/tr_TR.lang.php @@ -202,7 +202,8 @@ $sm_lang = array( 'sms_gateway_octopush' => 'Octopush', 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', - 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Servis kullanıcı adı', 'sms_gateway_password' => 'Servis şifresi', 'sms_from' => 'Gönderen numarası', diff --git a/src/lang/vi_VN.lang.php b/src/lang/vi_VN.lang.php index 92a745d7..7ada5b3b 100644 --- a/src/lang/vi_VN.lang.php +++ b/src/lang/vi_VN.lang.php @@ -198,6 +198,7 @@ $sm_lang = array( 'sms_gateway_textmarketer' => 'Textmarketer', 'sms_gateway_smsglobal' => 'SMSGlobal', 'sms_gateway_smsit' => 'Smsit', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Số điện thoại của người gửi', diff --git a/src/lang/zh_CN.lang.php b/src/lang/zh_CN.lang.php index 1931f8df..9b14778a 100644 --- a/src/lang/zh_CN.lang.php +++ b/src/lang/zh_CN.lang.php @@ -219,6 +219,7 @@ $sm_lang = array( 'sms_gateway_smsit' => 'Smsit', 'sms_gateway_freevoipdeal' => 'FreeVoipDeal', 'sms_gateway_nexmo' => 'Nexmo', + 'sms_gateway_cmbulksms' => 'CM Telecom', 'sms_gateway_username' => 'SMS网关用户名', 'sms_gateway_password' => 'SMS网关密码', 'sms_from' => '发信人电话号', diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index c8e77dab..c3e7b419 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -367,6 +367,7 @@ class ConfigController extends AbstractController { 'label_sms_gateway_spryng' => psm_get_lang('config', 'sms_gateway_spryng'), 'label_sms_gateway_inetworx' => psm_get_lang('config', 'sms_gateway_inetworx'), 'label_sms_gateway_clickatell' => psm_get_lang('config', 'sms_gateway_clickatell'), + 'label_sms_gateway_cmbulksms' => psm_get_lang('config', 'sms_gateway_cmbulksms'), 'label_sms_gateway_textmarketer' => psm_get_lang('config', 'sms_gateway_textmarketer'), 'label_sms_gateway_smsit' => psm_get_lang('config', 'sms_gateway_smsit'), 'label_sms_gateway_freevoipdeal' => psm_get_lang('config', 'sms_gateway_freevoipdeal'), diff --git a/src/psm/Txtmsg/CMBulkSMS.php b/src/psm/Txtmsg/CMBulkSMS.php new file mode 100644 index 00000000..07d06631 --- /dev/null +++ b/src/psm/Txtmsg/CMBulkSMS.php @@ -0,0 +1,234 @@ +. + * + * @package phpservermon + * @author Axel Wehner + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.2.1 + **/ + +namespace psm\Txtmsg; + +/** + * CMBulkSMS - Class for CM Telecom's Bulk SMS Gateway API + * + * Sending SMS notifications via the CM Telecom Bulk SMS Gateway + * Please use the gateway password field in your configuration for the CM API-Token + * + * Requirements: cURL v7.18.1+ and OpenSSL 0.9.8j+ + */ +class CMBulkSMS extends Core { + /** @var bool|null True when cURL request succeeded */ + public $result; + + /** @var string|null Contains error message if cURL request failed */ + public $error; + + /** @var bool Set to true for debug output/logging */ + protected $debug = false; + + /** @var bool Set to false if your operator isn't able to handle multipart messages */ + protected $multipartMessage = true; + + /** @var string|null Gateway API URL uses const GATEWAY_URL_XML or GATEWAY_URL_JSON */ + protected $apiUrl; + + /** @var string Gateway API Type: Use 'json' (default) or 'xml' */ + protected $apiType = 'json'; + + /** @var string|null JSON or XML message for cURL request */ + protected $request; + + /** @var string|null HTTP Content-Type for cURL request */ + protected $contentType; + + /** @var string|null Raw sms text message */ + protected $messageBody; + + /** @var string JSON Gateway API URL */ + const GATEWAY_URL_JSON = "https://gw.cmtelecom.com/v1.0/message"; + + /** @var string XML Gateway API URL */ + const GATEWAY_URL_XML = "https://sgw01.cm.nl/gateway.ashx"; + + /** + * Build the message and send cURL request to the sms gateway + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @param string $message Your text message + * @return boolean True when cURL request was successful + */ + public function sendSMS($message) { + // Check if recipient and text message are available + if(count($this->recipients) < 1 || empty($message)) { + return false; + } + + // Set message text + $this->messageBody = $message; + + // Prepare the message in CM's XML or JSON format + switch($this->apiType) { + case 'xml': + $this->request = $this->buildMessageXml(); + $this->contentType = 'Content-Type: application/xml'; + $this->apiUrl = self::GATEWAY_URL_XML; + break; + + case 'json': + default: + $this->request = $this->buildMessageJson(); + $this->contentType = 'Content-Type: application/json'; + $this->apiUrl = self::GATEWAY_URL_JSON; + break; + } + + $request = $this->executeCurlRequest(); + + return $request; + } + + /** + * Create a JSON batch sms message using CM's format + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart + * @return string JSON message object + */ + protected function buildMessageJson() { + // Prepare recipient array for batch message + $recipients = array(); + foreach($this->recipients as $recipient) { + $recipients[] = array('number' => $recipient); + } + + // Build message array in CM's Bulk SMS format + $msgArray = array( + 'messages' => array( + 'authentication' => array( + 'producttoken' => $this->password + ), + 'msg' => array( + array( + 'from' => substr($this->originator, 0, 11), + 'to' => $recipients, + 'body' => array( + 'content' => $this->messageBody + ) + ) + ) + ) + ); + + // Multipart message + if($this->multipartMessage) { + $msgArray['messages']['msg'][0]['minimumNumberOfMessageParts'] = 1; + $msgArray['messages']['msg'][0]['maximumNumberOfMessageParts'] = 8; + } + + // Convert array in JSON object + return json_encode($msgArray); + } + + /** + * Create a XML batch sms message in CM's format + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart + * @return string XML message + */ + protected function buildMessageXml() { + // Create XML string + $xml = new \SimpleXMLElement(''); + + // API-Token + $auth = $xml->addChild('AUTHENTICATION'); + $auth->addChild('PRODUCTTOKEN', $this->password); + + // Message + $msg = $xml->addChild('MSG'); + + // From + $msg->addChild('FROM', substr($this->originator, 0, 11)); + + // Recipients + foreach($this->recipients as $recipient) { + $msg->addChild('TO', $recipient); + } + + // Multipart message + if($this->multipartMessage) { + $msg->addChild('MINIMUMNUMBEROFMESSAGEPARTS', 1); + $msg->addChild('MAXIMUMNUMBEROFMESSAGEPARTS', 8); + } + + // Add body text + $msg->addChild('BODY', $this->messageBody); + + return $xml->asXML(); + } + + /** + * Create and execute the curl request + * + * @return boolean True if message is sent + */ + protected function executeCurlRequest() { + $cr = curl_init(); + curl_setopt_array($cr, array( + CURLOPT_URL => $this->apiUrl, + CURLOPT_HTTPHEADER => array($this->contentType), + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $this->request, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true + ) + ); + + // execute curl request and fetch the response/error + $cResponse = curl_exec($cr); + $cError = curl_error($cr); + $cErrorCode = curl_errno($cr); + curl_close($cr); + + // set result and log error if needed + if($cError) { + $this->error = 'Response: CM SMS API:' . $cResponse . ' cURL Error Code: ' . $cErrorCode . '"' . $cError . '"'; + error_log($this->error, E_USER_ERROR); + $this->result = false; + } else { + $this->result = true; + } + + // Debug output + // Note: CM's XML gateway gives no response when message is sent successfully :/ + if($this->debug || PSM_DEBUG) { + $debug = '
Request: '. $this->request . '
Response: ' . $cResponse.'
'; + error_log("Request: $this->request\r\nResponse: $cResponse", E_USER_NOTICE); + echo $debug; + } + + return $this->result; + } +} diff --git a/src/templates/default/module/config/config.tpl.html b/src/templates/default/module/config/config.tpl.html index 344adbf6..5ff81784 100644 --- a/src/templates/default/module/config/config.tpl.html +++ b/src/templates/default/module/config/config.tpl.html @@ -188,21 +188,22 @@
+