Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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