Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6749 | Ir a la última revisión | | 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;
9
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
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
     *
39
     * @var AbstractAdapter
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
61
     * @param AbstractAdapter $cache
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
    {
283
        $flashMessenger = $this->plugin('FlashMessenger');
284
 
285
        $app_id = $this->config['leaderslinked.facebook.app_id'];
286
        $app_password = $this->config['leaderslinked.facebook.app_password'];
287
        $app_graph_version = $this->config['leaderslinked.facebook.app_graph_version'];
288
 
289
 
290
 
291
        if(!isset($_GET['code']) && !isset($_GET['state']))
292
        {
293
            $flashMessenger->addErrorMessage('Facebook code or state not available');
294
            return $this->redirect()->toRoute('home');
295
        }
296
        //$code   = trim(filter_var($_GET['code'], FILTER_SANITIZE_STRING));
297
        $state  = trim(filter_var($_GET['state'], FILTER_SANITIZE_STRING));
298
 
299
        $fb = new \Facebook\Facebook([
300
            'app_id' => $app_id,
301
            'app_secret' => $app_password,
302
            'default_graph_version' => $app_graph_version
303
        ]);
304
 
305
        $helper = $fb->getRedirectLoginHelper();
306
        $helper->getPersistentDataHandler()->set('state', $state);
307
 
308
        $accessToken = null;
309
        try {
310
            $accessToken = $helper->getAccessToken();
311
        }
312
        catch(\Facebook\Exceptions\FacebookResponseException $e)
313
        {
314
            $this->logger->err('Facebook Graph: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
315
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
316
 
317
            return $this->redirect()->toRoute('home');
318
        }
319
        catch(\Facebook\Exceptions\FacebookSDKException $e)
320
        {
321
            $this->logger->err('Facebook SDK: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
322
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
323
 
324
            return $this->redirect()->toRoute('home');
325
        }
326
 
327
 
328
 
329
        if (!$accessToken) {
330
            if ($helper->getError()) {
331
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
332
                $this->logger->err($helper->getErrorDescription(), ['ip' => Functions::getUserIP()]);
333
 
334
                return $this->redirect()->toRoute('home');
335
            } else {
336
                $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
337
                $this->logger->err('Facebook Bad request', ['ip' => Functions::getUserIP()]);
338
 
339
 
340
                return $this->redirect()->toRoute('home');
341
            }
342
        }
343
 
344
        try {
345
            $response = $fb->get('/me?fields=id,name,email,picture',  $accessToken->getValue());
346
        } catch(\Facebook\Exceptions\FacebookResponseException $e) {
347
            $this->logger->err('Facebook Graph: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
348
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
349
 
350
        } catch(\Facebook\Exceptions\FacebookSDKException $e) {
351
            $this->logger->err('Facebook SDK: ' . $e->getMessage(), ['ip' => Functions::getUserIP()]);
352
            $flashMessenger->addErrorMessage('ERROR_FACEBOOK_AUTH');
353
 
354
            return $this->redirect()->toRoute('home');
355
        }
356
 
357
        $fb_user = $response->getGraphUser();
358
        if(is_object($fb_user)) {
359
            $id      = filter_var($fb_user->getId(), FILTER_SANITIZE_STRING);
360
            $name    = filter_var($fb_user->getName(), FILTER_SANITIZE_STRING);
361
            $email   = filter_var($fb_user->getEmail(), FILTER_SANITIZE_EMAIL);
362
            $picture = $fb_user->getPicture();
363
            if(is_array($picture)) {
364
                $picture = filter_var($picture['url'], FILTER_SANITIZE_URL);
365
            } else if(is_object($picture)) {
366
                $picture = filter_var($picture->getUrl(), FILTER_SANITIZE_URL);
367
            } else {
368
                $picture = filter_var($picture, FILTER_SANITIZE_URL);
369
            }
370
        }
371
 
372
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_FACEBOOK);
373
    }
374
 
375
    public function facebookDeleteAction()
376
    {
377
        error_log('---START FACEBOOK DELETE---');
378
        error_log('GET');
379
        error_log(print_r($_GET, true));
380
        error_log('POST');
381
        error_log(print_r($_POST, true));
382
        error_log('---END FACEBOOK DELETE---');
383
 
384
 
385
        return new JsonModel([
386
            'success' => true,
387
        ]);
388
 
389
    }
390
 
391
    public function facebookCancelAction()
392
    {
393
        $signed_request = isset($_POST['signed_request']) ? trim(filter_var($_POST['signed_request'], FILTER_SANITIZE_STRING)) : '';
394
        if($signed_request) {
395
            $facebook = new \LeadersLinked\Library\Facebook($this->config);
396
            $data = $facebook->parse_signed_request($signed_request);
397
            if($data && $data['user_id']) {
398
                $userProviderMapper = UserProviderMapper::getInstance($this->adapter);
399
                $userProvider = $userProviderMapper->fetchOneByIdAndProdiver($data['user_id'], Provider::FACEBOOK);
400
                if($userProvider) {
401
                    if($userProviderMapper->deleteByIdAndProvider($userProvider->id, $userProvider->provider)) {
402
                        $this->logger->info('Se borro la cuenta de Facebook');
403
                        return new JsonModel([
404
                            'success' => true,
405
                        ]);
406
                    }
407
                }
408
            }
409
        }
410
 
411
        return new JsonModel([
412
            'success' => false,
413
        ]);
414
    }
415
 
416
    public function googleAction()
417
    {
418
        $currentUserPlugin = $this->plugin('currentUserPlugin');
419
        $currentUser = $currentUserPlugin->getUser();
420
 
421
        $google = new \Google_Client();
422
        $google->setAuthConfig('data/google/auth-leaderslinked/apps.google.com_secreto_cliente.json');
423
        $google->setAccessType("offline");        // offline access
424
        $google->setIncludeGrantedScopes(true);   // incremental auth
425
 
426
        $google->addScope('profile');
427
        $google->addScope('email');
428
 
429
 
430
        if (! isset($_GET['code'])) {
431
            $auth_url = $google->createAuthUrl();
432
            return $this->redirect()->toUrl(filter_var($auth_url, FILTER_SANITIZE_URL));
433
        }
434
 
435
        $google->authenticate(filter_var($_GET['code'], FILTER_SANITIZE_STRING));
436
        $accessToken = $google->getAccessToken();
437
 
438
        if(empty($accessToken)) {
439
            $flashMessenger = $this->plugin('FlashMessenger');
440
            $flashMessenger->addErrorMessage('Google access token is wrong');
441
 
442
 
443
 
444
 
445
            return $this->redirect()->toRoute('home');
446
        }
447
 
448
        $userInfo   = $google->verifyIdToken();
449
        if(!is_array($userInfo) || empty($userInfo['sub']) || empty($userInfo['name']) || empty($userInfo['email']) || empty($userInfo['picture'])) {
450
            $flashMessenger = $this->plugin('FlashMessenger');
451
            $flashMessenger->addErrorMessage('Google verify token is wrong');
452
            return $this->redirect()->toRoute('home');
453
        }
454
 
455
        $id         = filter_var($userInfo['sub'], FILTER_SANITIZE_STRING);
456
        $name       = filter_var($userInfo['name'], FILTER_SANITIZE_STRING);
457
        $email      = filter_var($userInfo['email'], FILTER_SANITIZE_EMAIL);
458
        $picture    = filter_var($userInfo['picture'], FILTER_SANITIZE_URL);;
459
 
460
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_GOOGLE);
461
    }
462
 
463
    public function twitterAction()
464
    {
465
        if($this->config['leaderslinked.runmode.sandbox']) {
466
 
467
            $twitter_api_key = $this->config['leaderslinked.twitter.sandbox_api_key'];
468
            $twitter_api_secret = $this->config['leaderslinked.twitter.sandbox_api_secret'];
469
 
470
        } else {
471
            $twitter_api_key = $this->config['leaderslinked.twitter.production_api_key'];
472
            $twitter_api_secret = $this->config['leaderslinked.twitter.production_api_secret'];
473
        }
474
 
475
        $twitterSession = new \Laminas\Session\Container('twitter');
476
 
477
        $request_token = [];
478
        $request_token['oauth_token']           = $twitterSession->oauth_token;
479
        $request_token['oauth_token_secret']    = $twitterSession->oauth_token_secret;
480
 
481
        if (isset($_GET['oauth_token']) && $request_token['oauth_token'] !== $_GET['oauth_token']) {
482
            // Abort! Something is wrong.
483
 
484
 
485
            $flashMessenger = $this->plugin('FlashMessenger');
486
            $flashMessenger->addErrorMessage('Twitter Oauth token is wrong');
487
            return $this->redirect()->toRoute('home');
488
        }
489
 
490
        $twitter = new  \Abraham\TwitterOAuth\TwitterOAuth($twitter_api_key, $twitter_api_secret, $request_token['oauth_token'], $request_token['oauth_token_secret']);
491
        $access_token = $twitter->oauth('oauth/access_token', ['oauth_verifier' => $_GET['oauth_verifier']]);
492
 
493
        $oauth_token        = $access_token['oauth_token'];
494
        $oauth_token_secret = $access_token['oauth_token_secret'];
495
 
496
        /*
497
         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 )
498
         */
499
 
500
 
501
        $twitter = new  \Abraham\TwitterOAuth\TwitterOAuth($twitter_api_key, $twitter_api_secret, $oauth_token, $oauth_token_secret);
502
        $response =  $twitter->get('account/verify_credentials', ['include_entities' => true, 'skip_status' => true, 'include_email' => true]);
503
 
504
        $id         = isset($response->id) ? filter_var($response->id, FILTER_SANITIZE_STRING) : '';
505
        $name       = isset($response->name) ? filter_var($response->name, FILTER_SANITIZE_STRING) : '';
506
        $email      = isset($response->email) ? filter_var($response->email, FILTER_SANITIZE_EMAIL) : '';
507
        $picture    = isset($response->profile_image_url_https) ? filter_var($response->profile_image_url_https, FILTER_SANITIZE_URL) : '';
508
 
509
        return $this->process($id, $name, $email, $picture, UserProvider::PROVIDER_TWITTER);
510
    }
511
 
512
    private function registerBroserAndIp($user)
513
    {
514
        $navigator = get_browser(null, true);
515
        $device_type    =  $navigator['device_type'];
516
        $platform       =  $navigator['platform'];
517
        $browser        =  $navigator['browser'];
518
 
519
        $userBrowserMapper = UserBrowserMapper::getInstance($this->adapter);
520
        $userBrowser = $userBrowserMapper->fetch($user->id, $device_type, $platform, $browser);
521
        if($userBrowser) {
522
            $userBrowserMapper->update($userBrowser);
523
        } else {
524
            $userBrowser = new UserBrowser();
525
            $userBrowser->user_id           = $user->id;
526
            $userBrowser->browser           = $browser;
527
            $userBrowser->platform          = $platform;
528
            $userBrowser->device_type       = $device_type;
529
            $userBrowser->is_tablet         = intval( $navigator['istablet']);
530
            $userBrowser->is_mobile_device  = intval( $navigator['ismobiledevice']);
531
            $userBrowser->version           = $navigator['version'];
532
 
533
            $userBrowserMapper->insert($userBrowser);
534
        }
535
        //
536
 
537
        $ip = Functions::getUserIP();
538
        $ip = $ip == '127.0.0.1' ? '148.240.211.148' : $ip;
539
 
540
        $userIpMapper = UserIpMapper::getInstance($this->adapter);
541
        $userIp = $userIpMapper->fetch($user->id, $ip);
542
        if(empty($userIp)) {
543
 
544
            if($this->config['leaderslinked.runmode.sandbox']) {
545
                $filename = $this->config['leaderslinked.geoip2.production_database'];
546
            } else {
547
                $filename = $this->config['leaderslinked.geoip2.sandbox_database'];
548
            }
549
 
550
            $reader = new GeoIp2Reader($filename); //GeoIP2-City.mmdb');
551
            $record = $reader->city($ip);
552
            if($record) {
553
                $userIp = new UserIp();
554
                $userIp->user_id = $user->id;
555
                $userIp->city = utf8_decode($record->city->name);
556
                $userIp->state_code = utf8_decode($record->mostSpecificSubdivision->isoCode);
557
                $userIp->state_name = utf8_decode($record->mostSpecificSubdivision->name);
558
                $userIp->country_code = utf8_decode($record->country->isoCode);
559
                $userIp->country_name = utf8_decode($record->country->name);
560
                $userIp->ip = $ip;
561
                $userIp->latitude = $record->location->latitude;
562
                $userIp->longitude = $record->location->longitude;
563
                $userIp->postal_code =  $record->postal->code;
564
 
565
                $userIpMapper->insert($userIp);
566
            }
567
 
568
 
569
        } else {
570
            $userIpMapper->update($userIp);
571
        }
572
    }
573
}