Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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