Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 1 | Rev 6803 | 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
 
8
use Laminas\Db\Adapter\AdapterInterface;
6749 efrain 9
use LeadersLinked\Cache\CacheInterface;
1 www 10
use Laminas\Mvc\Controller\AbstractActionController;
11
use Laminas\Log\LoggerInterface;
12
use Laminas\View\Model\JsonModel;
13
use GeoIp2\Database\Reader As GeoIp2Reader;
14
use LeadersLinked\Model\UserProvider;
15
use LeadersLinked\Mapper\UserMapper;
16
use LeadersLinked\Mapper\UserProviderMapper;
17
use LeadersLinked\Model\User;
18
use LeadersLinked\Model\UserType;
19
use LeadersLinked\Authentication\AuthSocialAdapter;
20
use LeadersLinked\Library\Functions;
21
use LeadersLinked\Library\Image;
22
use LeadersLinked\Library\Facebook;
23
use LeadersLinked\Model\Provider;
24
use LeadersLinked\Mapper\UserBrowserMapper;
25
use LeadersLinked\Model\UserBrowser;
26
use LeadersLinked\Mapper\UserIpMapper;
27
use LeadersLinked\Model\UserIp;
28
 
29
class OauthController extends AbstractActionController
30
{
31
    /**
32
     *
33
     * @var AdapterInterface
34
     */
35
    private $adapter;
36
 
37
    /**
38
     *
6749 efrain 39
     * @var CacheInterface
1 www 40
     */
41
    private $cache;
42
 
43
    /**
44
     *
45
     * @var  LoggerInterface
46
     */
47
    private $logger;
48
 
49
 
50
    /**
51
     *
52
     * @var array
53
     */
54
    private $config;
55
 
56
 
57
 
58
    /**
59
     *
60
     * @param AdapterInterface $adapter
6749 efrain 61
     * @param CacheInterface $cache
1 www 62
     * @param LoggerInterface $logger
63
     * @param array $config
64
     */
65
    public function __construct($adapter, $cache , $logger, $config)
66
    {
67
        $this->adapter      = $adapter;
68
        $this->cache        = $cache;
69
        $this->logger       = $logger;
70
        $this->config       = $config;
71
    }
72
 
73
    public function indexAction()
74
    {
75
        return new JsonModel(['success' => false, 'error' => 'Missing authentication']);
76
    }
77
 
78
    /**
79
     *
80
     * @param string $id
81
     * @param string $name
82
     * @param string $email
83
     * @param string $picture
84
     * @param string $provider
85
     */
86
    private function process($id , $name, $email, $picture, $provider)
87
    {
88
        $flashMessenger = $this->plugin('FlashMessenger');
89
        if(empty($id) || empty($name) || empty($email))
90
        {
91
            if($provider == UserProvider::PROVIDER_FACEBOOK) {
92
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
93
            }
94
            if($provider == UserProvider::PROVIDER_TWITTER) {
95
                $flashMessenger->addErrorMessage('ERROR_TWITTER_AUTH');
96
            }
97
            if($provider == UserProvider::PROVIDER_GOOGLE) {
98
                $flashMessenger->addErrorMessage('ERROR_GOOGLE_AUTH');
99
            }
100
 
101
            $this->logger->err('Parámetro(s) inválido(s) [id = ' . $id . ' email = ' . $email .' name = ' . $name . ' picture = ' . $picture, ['ip' => Functions::getUserIP()]);
102
 
103
            return  $this->redirect()->toRoute('home');
104
        }
105
 
106
 
107
        $userMapper = UserMapper::getInstance($this->adapter);
108
        $userProviderMapper = UserProviderMapper::getInstance($this->adapter);
109
        $userProvider = $userProviderMapper->fetchOneByIdAndProdiver($id, $provider);
110
 
111
        //El usuario tiene una sesión activa
112
        $currentUserPlugin = $this->plugin('currentUserPlugin');
113
        $currentUser = $currentUserPlugin->getUser();
114
        if($currentUser) {
115
 
116
            if(!$currentUser->image) {
117
                $this->downloadImage($picture, $currentUser, $userMapper);
118
            }
119
 
120
            if(!$userProvider) {
121
 
122
                $userProvider = new UserProvider();
123
                $userProvider->user_id = $currentUser->id;
124
                $userProvider->id = $id;
125
                $userProvider->name = $name;
126
                $userProvider->email = $email;
127
                $userProvider->image = $picture;
128
                $userProvider->provider = $provider;
129
 
130
                if($userProviderMapper->insert($userProvider)) {
131
 
132
                    if($provider == UserProvider::PROVIDER_FACEBOOK) {
133
                        $this->logger->info('Registro del token de Facebook', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
134
                    }
135
                    if($provider == UserProvider::PROVIDER_TWITTER) {
136
                        $this->logger->info('Registro del token de Twitter', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
137
                    }
138
                    if($provider == UserProvider::PROVIDER_GOOGLE) {
139
                        $this->logger->info('Registro del token de  Google', ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
140
                    }
141
 
142
 
143
                } else {
144
                    $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
145
                }
146
            }
147
 
148
            $this->registerBroserAndIp($currentUser);
149
 
150
            return $this->redirect()->toRoute('account-settings', [], ['query'=>['tab'=>'nav-social-networks']]);
151
 
152
        } else {
153
            //El usuario no tiene sesión activa
154
 
155
            //Si existe la cuenta del provider en el sistema recuperamos el usuario
156
            if($userProvider) {
157
                $user = $userMapper->fetchOne($userProvider->user_id);
158
            } else {
159
                //Buscamos si esta registrado el usuario por email
160
                $user = $userMapper->fetchOneByEmail($email);
161
 
162
                //Creamos un usuario
163
                if(empty($user))
164
                {
165
 
166
 
167
 
168
                    $names = explode(' ', $name);
169
                    $user = new User();
170
                    $user->email                = $email;
171
                    $user->first_name           = $names[0];
172
                    $user->last_name            = count($names) > 1 ?  implode(' ', array_slice($names, 1)) : '';
173
                    $user->usertype_id          = UserType::USER;
174
                    $user->password             = '';
175
                    $user->activation_key       = '';
176
                    $user->status               = User::STATUS_ACTIVE;
177
                    $user->blocked              = User::BLOCKED_NO;
178
                    $user->email_verified       = User::EMAIL_VERIFIED_YES;
179
                    $user->login_attempt        = 0;
180
                    $user->balance              = 0;
181
 
182
 
183
                    if($userMapper->insert($user)) {
184
                        $this->logger->info('Creamos el usuario usando los datos del provider', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
185
 
186
                    } else {
187
                        $flashMessenger->addErrorMessage($userMapper->getError());
188
                        return  $this->redirect()->toRoute('home');
189
                    }
190
                    $user = $userMapper->fetchOne($user->id);
191
                }
192
                if($user) {
193
                    if(!$user->image) {
194
                        $this->downloadImage($picture, $user, $userMapper);
195
                    }
196
                    $userProvider = new UserProvider();
197
                    $userProvider->user_id = $user->id;
198
                    $userProvider->id = $id;
199
                    $userProvider->name = $name;
200
                    $userProvider->email = $email;
201
                    $userProvider->image = $picture;
202
                    $userProvider->provider = $provider;
203
 
204
                    if($userProviderMapper->insert($userProvider)) {
205
                        if($provider == UserProvider::PROVIDER_FACEBOOK) {
206
                            $this->logger->info('Registro del token de Facebook', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
207
                        }
208
                        if($provider == UserProvider::PROVIDER_TWITTER) {
209
                            $this->logger->info('Registro del token de Twitter', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
210
                        }
211
                        if($provider == UserProvider::PROVIDER_GOOGLE) {
212
                            $this->logger->info('Registro del token de  Google', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
213
                        }
214
                    }
215
                }
216
            }
217
 
218
 
219
 
220
            $authSocialAdapter = new AuthSocialAdapter($this->adapter, $this->logger);
221
            $authSocialAdapter->setData($id, $provider);
222
 
223
            $authService = new \Laminas\Authentication\AuthenticationService();
224
            $authService->setAdapter($authSocialAdapter);
225
 
226
 
227
            $result = $authService->authenticate();
228
            if($result->getCode() == \Laminas\Authentication\Result::SUCCESS)
229
            {
230
                if($provider == UserProvider::PROVIDER_FACEBOOK) {
231
                    $this->logger->info('Acceso Facebook', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
232
                }
233
                if($provider == UserProvider::PROVIDER_TWITTER) {
234
                    $this->logger->info('Acceso Twitter', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
235
                }
236
                if($provider == UserProvider::PROVIDER_GOOGLE) {
237
                    $this->logger->info('Acceso Google', ['user_id' => $user->id, 'ip' => Functions::getUserIP()]);
238
                }
239
 
240
                $this->registerBroserAndIp($user);
241
 
242
 
243
                return $this->redirect()->toRoute('dashboard');
244
            }
245
            else
246
            {
247
                $message = $result->getMessages()[0];
248
                $flashMessenger->addErrorMessage($message);
249
 
250
                return  $this->redirect()->toRoute('home');
251
            }
252
        }
253
    }
254
 
255
    /**
256
     *
257
     * @param string $picture
258
     * @param User $user
259
     * @param UserMapper $userMapper
260
     */
261
    private function downloadImage($picture, $user, $userMapper)
262
    {
263
        $target_path = $this->config['leaderslinked.fullpath.user'] . $user->uuid;
264
 
265
        $picture_content = file_get_contents($picture);
266
        if($picture_content) {
267
            $temp_file = tempnam(sys_get_temp_dir(), 'Tux');
268
            file_put_contents($temp_file, $picture_content);
269
 
270
            $target_filename    = 'user-' . uniqid() . '.png';
271
            list( $target_width, $target_height ) = explode('x', $this->config['leaderslinked.image_sizes.user_size']);
272
            $source             = $temp_file;
273
            $crop_to_dimensions = true;
274
            if(Image::uploadImage($source, $target_path, $target_filename, $target_width, $target_height, $crop_to_dimensions)) {
275
                $user->image = $target_filename;
276
                $userMapper->updateImage($user);
277
            }
278
        }
279
    }
280
 
281
    public function facebookAction()
282
    {
6749 efrain 283
        /*
1 www 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);
6749 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
}