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}