1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 * 8 */ 9namespace Piwik\Plugins\MobileMessaging; 10 11use Piwik\Option; 12use Piwik\Piwik; 13 14class Model 15{ 16 /** 17 * send a SMS 18 * 19 * @param string $content 20 * @param string $phoneNumber 21 * @param string $from 22 * @return bool true 23 */ 24 public function sendSMS($content, $phoneNumber, $from) 25 { 26 $credential = $this->getSMSAPICredential(); 27 $SMSProvider = SMSProvider::factory($credential[MobileMessaging::PROVIDER_OPTION]); 28 $SMSProvider->sendSMS( 29 $credential[MobileMessaging::API_KEY_OPTION], 30 $content, 31 $phoneNumber, 32 $from 33 ); 34 35 $this->increaseCount(Piwik::getCurrentUserLogin(), MobileMessaging::SMS_SENT_COUNT_OPTION, $phoneNumber); 36 37 return true; 38 } 39 40 /** 41 * get activated phone number list 42 * 43 * @param string $login 44 * @return array $phoneNumber 45 */ 46 public function getActivatedPhoneNumbers($login) 47 { 48 $phoneNumbers = $this->retrievePhoneNumbers($login); 49 50 $activatedPhoneNumbers = array(); 51 foreach ($phoneNumbers as $phoneNumber => $verificationCode) { 52 if ($this->isActivated($verificationCode)) { 53 $activatedPhoneNumbers[] = $phoneNumber; 54 } 55 } 56 57 return $activatedPhoneNumbers; 58 } 59 60 public function retrievePhoneNumbers($login) 61 { 62 $settings = $this->getUserSettings($login); 63 64 $phoneNumbers = array(); 65 if (isset($settings[MobileMessaging::PHONE_NUMBERS_OPTION])) { 66 $phoneNumbers = $settings[MobileMessaging::PHONE_NUMBERS_OPTION]; 67 } 68 69 return $phoneNumbers; 70 } 71 72 public function savePhoneNumbers($login, $phoneNumbers) 73 { 74 $settings = $this->getUserSettings($login); 75 76 $settings[MobileMessaging::PHONE_NUMBERS_OPTION] = $phoneNumbers; 77 78 $this->setUserSettings($login, $settings); 79 } 80 81 public function increaseCount($login, $option, $phoneNumber) 82 { 83 $settings = $this->getUserSettings($login); 84 85 $counts = array(); 86 if (isset($settings[$option])) { 87 $counts = $settings[$option]; 88 } 89 90 $countToUpdate = 0; 91 if (isset($counts[$phoneNumber])) { 92 $countToUpdate = $counts[$phoneNumber]; 93 } 94 95 $counts[$phoneNumber] = $countToUpdate + 1; 96 97 $settings[$option] = $counts; 98 99 $this->setUserSettings($login, $settings); 100 } 101 102 public function getSMSAPICredential() 103 { 104 $settings = $this->getCredentialManagerSettings(); 105 106 $credentials = isset($settings[MobileMessaging::API_KEY_OPTION]) ? $settings[MobileMessaging::API_KEY_OPTION] : null; 107 108 // fallback for older values, where api key has been stored as string value 109 if (!empty($credentials) && !is_array($credentials)) { 110 $credentials = array( 111 'apiKey' => $credentials 112 ); 113 } 114 115 return array( 116 MobileMessaging::PROVIDER_OPTION => 117 isset($settings[MobileMessaging::PROVIDER_OPTION]) ? $settings[MobileMessaging::PROVIDER_OPTION] : null, 118 MobileMessaging::API_KEY_OPTION => 119 $credentials, 120 ); 121 } 122 123 /** 124 * get phone number list 125 * 126 * @param string $login 127 * @return array $phoneNumber => $isValidated 128 */ 129 public function getPhoneNumbers($login) 130 { 131 $rawPhoneNumbers = $this->retrievePhoneNumbers($login); 132 133 $phoneNumbers = array(); 134 foreach ($rawPhoneNumbers as $phoneNumber => $verificationCode) { 135 $phoneNumbers[$phoneNumber] = $this->isActivated($verificationCode); 136 } 137 138 return $phoneNumbers; 139 } 140 141 public function setCredentialManagerSettings($settings) 142 { 143 $this->setUserSettings($this->getCredentialManagerLogin(), $settings); 144 } 145 146 public function getCredentialManagerSettings() 147 { 148 return $this->getUserSettings($this->getCredentialManagerLogin()); 149 } 150 151 public function getDelegatedManagement() 152 { 153 $option = Option::get(MobileMessaging::DELEGATED_MANAGEMENT_OPTION); 154 return $option === 'true'; 155 } 156 157 public function setDelegatedManagement($delegatedManagement) 158 { 159 Option::set(MobileMessaging::DELEGATED_MANAGEMENT_OPTION, $delegatedManagement); 160 } 161 162 private function isActivated($verificationCode) 163 { 164 return $verificationCode === null; 165 } 166 167 private function setUserSettings($login, $settings) 168 { 169 Option::set( 170 $login . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION, 171 json_encode($settings) 172 ); 173 } 174 175 private function getCredentialManagerLogin() 176 { 177 return $this->getDelegatedManagement() ? Piwik::getCurrentUserLogin() : ''; 178 } 179 180 private function getUserSettings($user) 181 { 182 $optionIndex = $user . MobileMessaging::USER_SETTINGS_POSTFIX_OPTION; 183 $userSettings = Option::get($optionIndex); 184 185 if (empty($userSettings)) { 186 $userSettings = array(); 187 } else { 188 $userSettings = json_decode($userSettings, true); 189 } 190 191 return $userSettings; 192 } 193}