| @@ -2,8 +2,9 @@ | ||
| 2 | 2 | |
| 3 | 3 | namespace AcyMailing\FrontControllers; |
| 4 | 4 | |
| 5 | 5 | use AcyMailing\Classes\CampaignClass; |
| 6 | +use AcyMailing\Classes\HistoryClass; | |
| 6 | 7 | use AcyMailing\Classes\MailArchiveClass; |
| 7 | 8 | use AcyMailing\Classes\MailClass; |
| 8 | 9 | use AcyMailing\Classes\UserClass; |
| 9 | 10 | use AcyMailing\Classes\UserStatClass; |
| @@ -122,14 +123,23 @@ | ||
| 122 | 123 | return false; |
| 123 | 124 | } |
| 124 | 125 | |
| 125 | 126 | $mailClass = new MailClass(); |
| 126 | - if ($mailClass->hasUserAccess($mailId) || $mailClass->isPublicArchive($mailId)) { | |
| 127 | + if ($mailClass->hasUserAccess($mailId)) { | |
| 127 | 128 | return true; |
| 128 | 129 | } |
| 129 | 130 | |
| 130 | - // Other types (automation, followup, welcome, unsubscribe...): the "view online" link embedded in | |
| 131 | - // the sent email carries the recipient's per-user secret key as userid=id-key. | |
| 131 | + $campaignClass = new CampaignClass(); | |
| 132 | + $campaign = $campaignClass->getOneByMailId($mailId); | |
| 133 | + if ( | |
| 134 | + !empty($campaign) | |
| 135 | + && (int)$campaign->visible === 1 | |
| 136 | + && (int)$campaign->active === 1 | |
| 137 | + && (int)$campaign->sent === 1 | |
| 138 | + ) { | |
| 139 | + return true; | |
| 140 | + } | |
| 141 | + | |
| 132 | 142 | $userKeys = acym_getVar('string', 'userid', ''); |
| 133 | 143 | $separatorPosition = strpos($userKeys, '-'); |
| 134 | 144 | if ($separatorPosition === false) { |
| 135 | 145 | return false; |
| @@ -140,14 +150,29 @@ | ||
| 140 | 150 | if (empty($userId) || empty($userKey)) { |
| 141 | 151 | return false; |
| 142 | 152 | } |
| 143 | 153 | |
| 154 | + $historyClass = new HistoryClass(); | |
| 155 | + $userHistory = $historyClass->getHistoryOfOneById($userId); | |
| 156 | + foreach ($userHistory as $userHistoryItem) { | |
| 157 | + if ((int)$userHistoryItem->mail_id === $mailId && $userHistoryItem->action === 'test_sent') { | |
| 158 | + return true; | |
| 159 | + } | |
| 160 | + } | |
| 161 | + | |
| 162 | + acym_setVar('id', $userId); | |
| 163 | + acym_setVar('key', $userKey); | |
| 144 | 164 | $userClass = new UserClass(); |
| 145 | - $user = $userClass->getOneById($userId); | |
| 146 | - if (empty($user) || !hash_equals((string)$user->key, $userKey)) { | |
| 165 | + $user = $userClass->identify(true); | |
| 166 | + | |
| 167 | + if (empty($user)) { | |
| 147 | 168 | return false; |
| 148 | 169 | } |
| 149 | 170 | |
| 171 | + if (!empty($user->cms_id) && $mailClass->hasUserAccess($mailId, false, $user->cms_id)) { | |
| 172 | + return true; | |
| 173 | + } | |
| 174 | + | |
| 150 | 175 | $userStatClass = new UserStatClass(); |
| 151 | 176 | |
| 152 | 177 | return $userStatClass->hasUserReceivedMail($mailId, $userId); |
| 153 | 178 | } |
| @@ -240,9 +265,9 @@ | ||
| 240 | 265 | if (!empty($viewParams['displayUserListOnly'])) { |
| 241 | 266 | $params['displayUserListOnly'] = $viewParams['displayUserListOnly']; |
| 242 | 267 | } |
| 243 | 268 | |
| 244 | - $params['page'] = $this->getVarFiltersListing('int', 'archive_pagination_page', 1); | |
| 269 | + $params['page'] = max(1, $this->getVarFiltersListing('int', 'archive_pagination_page', 1)); | |
| 245 | 270 | $campaignClass = new CampaignClass(); |
| 246 | 271 | $pagination = new PaginationHelper(); |
| 247 | 272 | $params['numberPerPage'] = (int)$viewParams['nbNewslettersPerPage']; |
| 248 | 273 | |