Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6849 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
/**
3
 *
4
 * Este controllador agrupa las funciones de Callback para todas las operaciones de OAUTH
5
 */
6
namespace LeadersLinked\Controller;
7
 
6803 efrain 8
 
1 www 9
use Laminas\Db\Adapter\AdapterInterface;
6849 efrain 10
 
1 www 11
use Laminas\Mvc\Controller\AbstractActionController;
12
use Laminas\Log\LoggerInterface;
13
use Laminas\View\Model\JsonModel;
14
use GeoIp2\Database\Reader As GeoIp2Reader;
15
use LeadersLinked\Model\UserProvider;
16
use LeadersLinked\Mapper\UserMapper;
17
use LeadersLinked\Mapper\UserProviderMapper;
18
use LeadersLinked\Model\User;
19
use LeadersLinked\Model\UserType;
20
use LeadersLinked\Authentication\AuthSocialAdapter;
21
use LeadersLinked\Library\Functions;
22
use LeadersLinked\Library\Image;
23
use LeadersLinked\Library\Facebook;
24
use LeadersLinked\Model\Provider;
25
use LeadersLinked\Mapper\UserBrowserMapper;
26
use LeadersLinked\Model\UserBrowser;
27
use LeadersLinked\Mapper\UserIpMapper;
28
use LeadersLinked\Model\UserIp;
29
 
30
class OauthController extends AbstractActionController
31
{
32
    /**
33
     *
6866 efrain 34
     * @var \Laminas\Db\Adapter\AdapterInterface
1 www 35
     */
36
    private $adapter;
37
 
38
    /**
39
     *
6866 efrain 40
     * @var \LeadersLinked\Cache\CacheInterface
1 www 41
     */
6866 efrain 42
    private $cache;
1 www 43
 
44
 
45
    /**
46
     *
6866 efrain 47
     * @var \Laminas\Log\LoggerInterface
48
     */
49
    private $logger;
50
 
51
    /**
52
     *
1 www 53
     * @var array
54
     */
55
    private $config;
56
 
57
 
6866 efrain 58
    /**
59
     *
60
     * @var \Laminas\Mvc\I18n\Translator
61
     */
62
    private $translator;
1 www 63
 
6866 efrain 64
 
1 www 65
    /**
66
     *
6866 efrain 67
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
68
     * @param \LeadersLinked\Cache\CacheInterface $cache
69
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
1 www 70
     * @param array $config
6866 efrain 71
     * @param \Laminas\Mvc\I18n\Translator $translator
1 www 72
     */
6866 efrain 73
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 74
    {
75
        $this->adapter      = $adapter;
6866 efrain 76
        $this->cache        = $cache;
1 www 77
        $this->logger       = $logger;
78
        $this->config       = $config;
6866 efrain 79
        $this->translator   = $translator;
1 www 80
    }
81
 
82
    public function indexAction()
83
    {
84
        return new JsonModel(['success' => false, 'error' => 'Missing authentication']);
85
    }
86
 
87
    /**
88
     *
89
     * @param string $id
90
     * @param string $name
91
     * @param string $email
92
     * @param string $picture
93
     * @param string $provider
94
     */
95
    private function process($id , $name, $email, $picture, $provider)
96
    {
97
        $flashMessenger = $this->plugin('FlashMessenger');
98
        if(empty($id) || empty($name) || empty($email))
99
        {
100
            if($provider == UserProvider::PROVIDER_FACEBOOK) {
101
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
102
            }
103
            if($provider == UserProvider::PROVIDER_TWITTER) {
104
                $flashMessenger->addErrorMessage('ERROR_TWITTER_AUTH');
105
            }
106
            if($provider == UserProvider::PROVIDER_GOOGLE) {
107
                $flashMessenger->addErrorMessage('ERROR_GOOGLE_AUTH');
108
            }
109
 
110
            $this->logger->err('Parámetro(s) inválido(s) [id = ' . $id . ' email = ' . $email .' name = ' . $name . ' picture = ' . $picture, ['ip' => Functions::getUserIP()]);
111
 
112
            return  $this->redirect()->toRoute('home');
113
        }
114
 
115
 
116
        $userMapper = UserMapper::getInstance($this->adapter);
117
        $userProviderMapper = UserProviderMapper::getInstance($this->adapter);
118
        $userProvider = $userProviderMapper->fetchOneByIdAndProdiver($id, $provider);
119
 
120
        //El usuario tiene una sesión activa
121
        $currentUserPlugin = $this->plugin('currentUserPlugin');
122
        $currentUser = $currentUserPlugin->getUser();
123
        if($currentUser) {
124
 
125
            if(!$currentUser->image) {
126
                $this->downloadImage($picture, $currentUser, $userMapper);
127
            }
128
 
129
            if(!$userProvider) {
130
 
131
                $userProvider = new UserProvider();
132
                $userProvider->user_id = $currentUser->id;
133
                $userProvider->id = $id;
134
                $userProvider->name = $name;
135
                $userProvider->email = $email;
136
                $userProvider->image = $picture;
137
                $userProvider->provider = $provider;
138
 
139
                if($userProviderMapper->insert($userProvider)) {
140
 
141
                    if($provider == UserProvider::PROVIDER_FACEBOOK) {
142
                        $this->logger->info('Registro del token de Facebook', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
143
                    }
144
                    if($provider == UserProvider::PROVIDER_TWITTER) {
145
                        $this->logger->info('Registro del token de Twitter', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
146
                    }
147
                    if($provider == UserProvider::PROVIDER_GOOGLE) {
148
                        $this->logger->info('Registro del token de  Google', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
149
                    }
150
 
151
 
152
                } else {
153
                    $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
154
                }
155
            }
156
 
157
            $this->registerBroserAndIp($currentUser);
158
 
159
            return $this->redirect()->toRoute('account-settings', [], ['query'=>['tab'=>'nav-social-networks']]);
160
 
161
        } else {
162
            //El usuario no tiene sesión activa
163
 
164
            //Si existe la cuenta del provider en el sistema recuperamos el usuario
165
            if($userProvider) {
166
                $user = $userMapper->fetchOne($userProvider->user_id);
167
            } else {
168
                //Buscamos si esta registrado el usuario por email
169
                $user = $userMapper->fetchOneByEmail($email);
170
 
171
                //Creamos un usuario
172
                if(empty($user))
173
                {
174
 
175
 
176
 
177
                    $names = explode(' ', $name);
178
                    $user = new User();
179
                    $user->email                = $email;
180
                    $user->first_name           = $names[0];
181
                    $user->last_name            = count($names) > 1 ?  implode(' ', array_slice($names, 1)) : '';
182
                    $user->usertype_id          = UserType::USER;
183
                    $user->password             = '';
184
                    $user->activation_key       = '';
185
                    $user->status               = User::STATUS_ACTIVE;
186
                    $user->blocked              = User::BLOCKED_NO;
187
                    $user->email_verified       = User::EMAIL_VERIFIED_YES;
188
                    $user->login_attempt        = 0;
189
                    $user->balance              = 0;
190
 
191
 
192
                    if($userMapper->insert($user)) {
193
                        $this->logger->info('Creamos el usuario usando los datos del provider', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
194
 
195
                    } else {
196
                        $flashMessenger->addErrorMessage($userMapper->getError());
197
                        return  $this->redirect()->toRoute('home');
198
                    }
199
                    $user = $userMapper->fetchOne($user->id);
200
                }
201
                if($user) {
202
                    if(!$user->image) {
203
                        $this->downloadImage($picture, $user, $userMapper);
204
                    }
205
                    $userProvider = new UserProvider();
206
                    $userProvider->user_id = $user->id;
207
                    $userProvider->id = $id;
208
                    $userProvider->name = $name;
209
                    $userProvider->email = $email;
210
                    $userProvider->image = $picture;
211
                    $userProvider->provider = $provider;
212
 
213
                    if($userProviderMapper->insert($userProvider)) {
214
                        if($provider == UserProvider::PROVIDER_FACEBOOK) {
215
                            $this->logger->info('Registro del token de Facebook', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
216
                        }
217
                        if($provider == UserProvider::PROVIDER_TWITTER) {
218
                            $this->logger->info('Registro del token de Twitter', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
219
                        }
220
                        if($provider == UserProvider::PROVIDER_GOOGLE) {
221
                            $this->logger->info('Registro del token de  Google', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
222
                        }
223
                    }
224
                }
225
            }
226
 
227
 
228
 
229
            $authSocialAdapter = new AuthSocialAdapter($this->adapter, $this->logger);
230
            $authSocialAdapter->setData($id, $provider);
231
 
232
            $authService = new \Laminas\Authentication\AuthenticationService();
233
            $authService->setAdapter($authSocialAdapter);
234
 
235
 
236
            $result = $authService->authenticate();
237
            if($result->getCode() == \Laminas\Authentication\Result::SUCCESS)
238
            {
239
                if($provider == UserProvider::PROVIDER_FACEBOOK) {
240
                    $this->logger->info('Acceso Facebook', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
241
                }
242
                if($provider == UserProvider::PROVIDER_TWITTER) {
243
                    $this->logger->info('Acceso Twitter', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
244
                }
245
                if($provider == UserProvider::PROVIDER_GOOGLE) {
246
                    $this->logger->info('Acceso Google', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
247
                }
248
 
249
                $this->registerBroserAndIp($user);
250
 
251
 
252
                return $this->redirect()->toRoute('dashboard');
253
            }
254
            else
255
            {
256
                $message = $result->getMessages()[0];
257
                $flashMessenger->addErrorMessage($message);
258
 
259
                return  $this->redirect()->toRoute('home');
260
            }
261
        }
262
    }
263
 
264
    /**
265
     *
266
     * @param string $picture
267
     * @param User $user
268
     * @param UserMapper $userMapper
269
     */
270
    private function downloadImage($picture, $user, $userMapper)
271
    {
272
        $target_path = $this->config['leaderslinked.fullpath.user'] . $user->uuid;
273
 
274
        $picture_content = file_get_contents($picture);
275
        if($picture_content) {
276
            $temp_file = tempnam(sys_get_temp_dir(), 'Tux');
277
            file_put_contents($temp_file, $picture_content);
278
 
279
            $target_filename    = 'user-' . uniqid() . '.png';
280
            list( $target_width, $target_height ) = explode('x', $this->config['leaderslinked.image_sizes.user_size']);
281
            $source             = $temp_file;
282
            $crop_to_dimensions = true;
283
            if(Image::uploadImage($source, $target_path, $target_filename, $target_width, $target_height, $crop_to_dimensions)) {
284
                $user->image = $target_filename;
285
                $userMapper->updateImage($user);
286
            }
287
        }
288
    }
289
 
290
    public function facebookAction()
291
    {
292
        $flashMessenger = $this->plugin('FlashMessenger');
293
 
294
        $app_id = $this->config['leaderslinked.facebook.app_id'];
295
        $app_password = $this->config['leaderslinked.facebook.app_password'];
296
        $app_graph_version = $this->config['leaderslinked.facebook.app_graph_version'];
297
 
298
 
299
 
300
        if(!isset($_GET['code']) && !isset($_GET['state']))
301
        {
302
            $flashMessenger->addErrorMessage('Facebook code or state not available');
303
            return $this->redirect()->toRoute('home');
304
        }
6749 efrain 305
        //$code   = Functions::sanitizeFilterString($_GET['code']);
306
        $state  = Functions::sanitizeFilterString($_GET['state']);
1 www 307
 
308
        $fb = new \Facebook\Facebook([
309
            'app_id' => $app_id,
310
            'app_secret' => $app_password,
311
            'default_graph_version' => $app_graph_version
312
        ]);
313
 
314
        $helper = $fb->getRedirectLoginHelper();
315
        $helper->getPersistentDataHandler()->set('state', $state);
316
 
317
        $accessToken = null;
318
        try {
319
            $accessToken = $helper->getAccessToken();
320
        }
321
        catch(\Facebook\Exceptions\FacebookResponseException $e)
322
        {
323
            $this->logger->err('Facebook Graph: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
324
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
325
 
326
            return $this->redirect()->toRoute('home');
327
        }
328
        catch(\Facebook\Exceptions\FacebookSDKException $e)
329
        {
330
            $this->logger->err('Facebook SDK: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
331
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
332
 
333
            return $this->redirect()->toRoute('home');
334
        }
335
 
336
 
337
 
338
        if (!$accessToken) {
339
            if ($helper->getError()) {
340
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
341
                $this->logger->err($helper->getErrorDescription(), ['ip' => Functions::getUserIP()]);
342
 
343
                return $this->redirect()->toRoute('home');
344
            } else {
345
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
346
                $this->logger->err('Facebook Bad request', ['ip' => Functions::getUserIP()]);
347
 
348
 
349
                return $this->redirect()->toRoute('home');
350
            }
351
        }
352
 
353
        try {
354
            $response = $fb->get('/me?fields=id,name,email,picture',  $accessToken->getValue());
355
        } catch(\Facebook\Exceptions\FacebookResponseException $e) {
356
            $this->logger->err('Facebook Graph: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
357
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
358
 
359
        } catch(\Facebook\Exceptions\FacebookSDKException $e) {
360
            $this->logger->err('Facebook SDK: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
361
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
362
 
363
            return $this->redirect()->toRoute('home');
364
        }
365
 
366
        $fb_user = $response->getGraphUser();
367
        if(is_object($fb_user)) {
6749 efrain 368
            $id      = Functions::sanitizeFilterString($fb_user->getId());
369
            $name    = Functions::sanitizeFilterString($fb_user->getName());
1 www 370
            $email   = filter_var($fb_user->getEmail(), FILTER_SANITIZE_EMAIL);
371
            $picture = $fb_user->getPicture();
372
            if(is_array($picture)) {
373
                $picture = filter_var($picture['url'], FILTER_SANITIZE_URL);
374
            } else if(is_object($picture)) {
375
                $picture = filter_var($picture->getUrl(), FILTER_SANITIZE_URL);
376
            } else {
377
                $picture = filter_var($picture, FILTER_SANITIZE_URL);
378
            }
379
        }
380
 
381
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_FACEBOOK);
6804 efrain 382
 
1 www 383
    }
384
 
385
    public function facebookDeleteAction()
386
    {
387
        error_log('---START FACEBOOK DELETE---');
388
        error_log('GET');
389
        error_log(print_r($_GET, true));
390
        error_log('POST');
391
        error_log(print_r($_POST, true));
392
        error_log('---END FACEBOOK DELETE---');
393
 
394
 
395
        return new JsonModel([
396
            'success' => true,
397
        ]);
398
 
399
    }
400
 
401
    public function facebookCancelAction()
402
    {
6749 efrain 403
        $signed_request = $_POST['signed_request'] ? Functions::sanitizeFilterString($_POST['signed_request']) : '';
1 www 404
        if($signed_request) {
405
            $facebook = new \LeadersLinked\Library\Facebook($this->config);
406
            $data = $facebook->parse_signed_request($signed_request);
407
            if($data && $data['user_id']) {
408
                $userProviderMapper = UserProviderMapper::getInstance($this->adapter);
409
                $userProvider = $userProviderMapper->fetchOneByIdAndProdiver($data['user_id'], Provider::FACEBOOK);
410
                if($userProvider) {
411
                    if($userProviderMapper->deleteByIdAndProvider($userProvider->id, $userProvider->provider)) {
412
                        $this->logger->info('Se borro la cuenta de Facebook');
413
                        return new JsonModel([
414
                            'success' => true,
415
                        ]);
416
                    }
417
                }
418
            }
419
        }
420
 
421
        return new JsonModel([
422
            'success' => false,
423
        ]);
424
    }
425
 
426
    public function googleAction()
427
    {
428
        $currentUserPlugin = $this->plugin('currentUserPlugin');
429
        $currentUser = $currentUserPlugin->getUser();
430
 
431
        $google = new \Google_Client();
432
        $google->setAuthConfig('data/google/auth-leaderslinked/apps.google.com_secreto_cliente.json');
433
        $google->setAccessType("offline");        // offline access
434
        $google->setIncludeGrantedScopes(true);   // incremental auth
435
 
436
        $google->addScope('profile');
437
        $google->addScope('email');
438
 
439
 
440
        if (! isset($_GET['code'])) {
441
            $auth_url = $google->createAuthUrl();
442
            return $this->redirect()->toUrl(filter_var($auth_url, FILTER_SANITIZE_URL));
443
        }
444
 
6749 efrain 445
        $google->authenticate(Functions::sanitizeFilterString($_GET['code']));
1 www 446
        $accessToken = $google->getAccessToken();
447
 
448
        if(empty($accessToken)) {
449
            $flashMessenger = $this->plugin('FlashMessenger');
450
            $flashMessenger->addErrorMessage('Google access token is wrong');
451
 
452
 
453
 
454
 
455
            return $this->redirect()->toRoute('home');
456
        }
457
 
458
        $userInfo   = $google->verifyIdToken();
459
        if(!is_array($userInfo) || empty($userInfo['sub']) || empty($userInfo['name']) || empty($userInfo['email']) || empty($userInfo['picture'])) {
460
            $flashMessenger = $this->plugin('FlashMessenger');
461
            $flashMessenger->addErrorMessage('Google verify token is wrong');
462
            return $this->redirect()->toRoute('home');
463
        }
464
 
6749 efrain 465
        $id         = Functions::sanitizeFilterString($userInfo['sub']);
466
        $name       =Functions::sanitizeFilterString($userInfo['name']);
1 www 467
        $email      = filter_var($userInfo['email'], FILTER_SANITIZE_EMAIL);
6749 efrain 468
        $picture    = filter_var($userInfo['picture'], FILTER_SANITIZE_URL);
1 www 469
 
470
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_GOOGLE);
471
    }
472
 
473
    public function twitterAction()
474
    {
475
        if($this->config['leaderslinked.runmode.sandbox']) {
476
 
477
            $twitter_api_key = $this->config['leaderslinked.twitter.sandbox_api_key'];
478
            $twitter_api_secret = $this->config['leaderslinked.twitter.sandbox_api_secret'];
479
 
480
        } else {
481
            $twitter_api_key = $this->config['leaderslinked.twitter.production_api_key'];
482
            $twitter_api_secret = $this->config['leaderslinked.twitter.production_api_secret'];
483
        }
484
 
485
        $twitterSession = new \Laminas\Session\Container('twitter');
486
 
487
        $request_token = [];
488
        $request_token['oauth_token']           = $twitterSession->oauth_token;
489
        $request_token['oauth_token_secret']    = $twitterSession->oauth_token_secret;
490
 
491
        if (isset($_GET['oauth_token']) && $request_token['oauth_token'] !== $_GET['oauth_token']) {
492
            // Abort! Something is wrong.
493
 
494
 
495
            $flashMessenger = $this->plugin('FlashMessenger');
496
            $flashMessenger->addErrorMessage('Twitter Oauth token is wrong');
497
            return $this->redirect()->toRoute('home');
498
        }
499
 
500
        $twitter = new  \Abraham\TwitterOAuth\TwitterOAuth($twitter_api_key, $twitter_api_secret, $request_token['oauth_token'], $request_token['oauth_token_secret']);
501
        $access_token = $twitter->oauth('oauth/access_token', ['oauth_verifier' => $_GET['oauth_verifier']]);
502
 
503
        $oauth_token        = $access_token['oauth_token'];
504
        $oauth_token_secret = $access_token['oauth_token_secret'];
505
 
506
        /*
507
         stdClass Object ( [id] => 144499524 [id_str] => 144499524 [name] => Efrain Yanez R [screen_name] => eyanezve [location] => [description] => [url] => [entities] => stdClass Object ( [description] => stdClass Object ( [urls] => Array ( ) ) ) [protected] => 1 [followers_count] => 30 [friends_count] => 44 [listed_count] => 0 [created_at] => Sun May 16 13:36:21 +0000 2010 [favourites_count] => 5 [utc_offset] => [time_zone] => [geo_enabled] => [verified] => [statuses_count] => 0 [lang] => [contributors_enabled] => [is_translator] => [is_translation_enabled] => [profile_background_color] => C0DEED [profile_background_image_url] => http://abs.twimg.com/images/themes/theme1/bg.png [profile_background_image_url_https] => https://abs.twimg.com/images/themes/theme1/bg.png [profile_background_tile] => [profile_image_url] => http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png [profile_image_url_https] => https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png [profile_link_color] => 1DA1F2 [profile_sidebar_border_color] => C0DEED [profile_sidebar_fill_color] => DDEEF6 [profile_text_color] => 333333 [profile_use_background_image] => 1 [has_extended_profile] => 1 [default_profile] => 1 [default_profile_image] => 1 [following] => [follow_request_sent] => [notifications] => [translator_type] => none [suspended] => [needs_phone_verification] => [email] => eyanezve@gmail.com )
508
         */
509
 
510
 
511
        $twitter = new  \Abraham\TwitterOAuth\TwitterOAuth($twitter_api_key, $twitter_api_secret, $oauth_token, $oauth_token_secret);
512
        $response =  $twitter->get('account/verify_credentials', ['include_entities' => true, 'skip_status' => true, 'include_email' => true]);
513
 
6749 efrain 514
        $id         = $response->id ? Functions::sanitizeFilterString($response->id) : '';
515
        $name       = $response->name ? Functions::sanitizeFilterString($response->name) : '';
1 www 516
        $email      = isset($response->email) ? filter_var($response->email, FILTER_SANITIZE_EMAIL) : '';
517
        $picture    = isset($response->profile_image_url_https) ? filter_var($response->profile_image_url_https, FILTER_SANITIZE_URL) : '';
518
 
519
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_TWITTER);
520
    }
521
 
522
    private function registerBroserAndIp($user)
523
    {
524
        $navigator = get_browser(null, true);
525
        $device_type    =  $navigator['device_type'];
526
        $platform       =  $navigator['platform'];
527
        $browser        =  $navigator['browser'];
528
 
529
        $userBrowserMapper = UserBrowserMapper::getInstance($this->adapter);
530
        $userBrowser = $userBrowserMapper->fetch($user->id, $device_type, $platform, $browser);
531
        if($userBrowser) {
532
            $userBrowserMapper->update($userBrowser);
533
        } else {
534
            $userBrowser = new UserBrowser();
535
            $userBrowser->user_id           = $user->id;
536
            $userBrowser->browser           = $browser;
537
            $userBrowser->platform          = $platform;
538
            $userBrowser->device_type       = $device_type;
539
            $userBrowser->is_tablet         = intval( $navigator['istablet']);
540
            $userBrowser->is_mobile_device  = intval( $navigator['ismobiledevice']);
541
            $userBrowser->version           = $navigator['version'];
542
 
543
            $userBrowserMapper->insert($userBrowser);
544
        }
545
        //
546
 
547
        $ip = Functions::getUserIP();
548
        $ip = $ip == '127.0.0.1' ? '148.240.211.148' : $ip;
549
 
550
        $userIpMapper = UserIpMapper::getInstance($this->adapter);
551
        $userIp = $userIpMapper->fetch($user->id, $ip);
552
        if(empty($userIp)) {
553
 
554
            if($this->config['leaderslinked.runmode.sandbox']) {
555
                $filename = $this->config['leaderslinked.geoip2.production_database'];
556
            } else {
557
                $filename = $this->config['leaderslinked.geoip2.sandbox_database'];
558
            }
559
 
560
            $reader = new GeoIp2Reader($filename); //GeoIP2-City.mmdb');
561
            $record = $reader->city($ip);
562
            if($record) {
563
                $userIp = new UserIp();
564
                $userIp->user_id = $user->id;
6849 efrain 565
                $userIp->city = Functions::utf8_decode($record->city->name);
566
                $userIp->state_code = Functions::utf8_decode($record->mostSpecificSubdivision->isoCode);
567
                $userIp->state_name = Functions::utf8_decode($record->mostSpecificSubdivision->name);
568
                $userIp->country_code = Functions::utf8_decode($record->country->isoCode);
569
                $userIp->country_name = Functions::utf8_decode($record->country->name);
1 www 570
                $userIp->ip = $ip;
571
                $userIp->latitude = $record->location->latitude;
572
                $userIp->longitude = $record->location->longitude;
573
                $userIp->postal_code =  $record->postal->code;
574
 
575
                $userIpMapper->insert($userIp);
576
            }
577
 
578
 
579
        } else {
580
            $userIpMapper->update($userIp);
581
        }
582
    }
583
}