Proyectos de Subversion LeadersLinked - Services

Rev

Rev 316 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
314 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
 
7
use Laminas\Authentication\AuthenticationService;
8
use Laminas\Authentication\Result as AuthResult;
9
use Laminas\Db\Adapter\AdapterInterface;
10
 
11
use Laminas\Mvc\Controller\AbstractActionController;
12
use Laminas\Log\LoggerInterface;
13
use Laminas\View\Model\JsonModel;
14
 
15
use LeadersLinked\Authentication\AuthAdapter;
16
use LeadersLinked\Mapper\UserMapper;
17
use LeadersLinked\Mapper\EmailTemplateMapper;
18
use LeadersLinked\Model\User;
19
use LeadersLinked\Model\UserType;
20
 
21
use LeadersLinked\Library\AesCipher;
22
use LeadersLinked\Library\AesEncryption;
23
use LeadersLinked\Library\QueueEmail;
24
use LeadersLinked\Library\Functions;
25
use LeadersLinked\Model\EmailTemplate;
26
use LeadersLinked\Mapper\UserPasswordMapper;
27
use LeadersLinked\Mapper\DeviceMapper;
28
use LeadersLinked\Model\Device;
29
use LeadersLinked\Mapper\ApplicationMapper;
30
use LeadersLinked\Model\Application;
31
use LeadersLinked\Validator\PasswordStrengthCheck;
32
 
33
use LeadersLinked\Mapper\CompanyMapper;
34
use LeadersLinked\Model\Company;
35
use LeadersLinked\Mapper\MicrolearningTopicMapper;
36
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
37
use LeadersLinked\Mapper\MicrolearningSlideMapper;
38
use LeadersLinked\Model\MicrolearningSlide;
39
use LeadersLinked\Mapper\MicrolearningUserLogMapper;
40
use LeadersLinked\Mapper\MicrolearningUserProgressMapper;
41
use LeadersLinked\Mapper\MicrolearningQuizMapper;
42
use LeadersLinked\Mapper\MicrolearningQuestionMapper;
43
use LeadersLinked\Mapper\MicrolearningAnswerMapper;
44
use LeadersLinked\Model\MicrolearningUserProgress;
45
use LeadersLinked\Model\MicrolearningUserLog;
46
use LeadersLinked\Mapper\DeviceHistoryMapper;
47
use LeadersLinked\Model\DeviceHistory;
48
use LeadersLinked\Mapper\PushMapper;
49
use LeadersLinked\Model\Push;
50
use LeadersLinked\Mapper\MicrolearningCapsuleUserMapper;
51
use LeadersLinked\Mapper\CompanyServiceMapper;
52
use LeadersLinked\Model\Service;
53
use LeadersLinked\Model\CompanyService;
54
use LeadersLinked\Model\MicrolearningCapsuleUser;
55
use LeadersLinked\Model\MicrolearningUserQuiz;
56
use LeadersLinked\Mapper\MicrolearningUserQuizMapper;
57
use LeadersLinked\Mapper\MicrolearningUserMapper;
58
use LeadersLinked\Model\MicrolearningUser;
59
use LeadersLinked\Mapper\PushTemplateMapper;
60
use LeadersLinked\Model\PushTemplate;
61
use LeadersLinked\Mapper\SyncLogMapper;
62
use LeadersLinked\Model\SyncLog;
63
use LeadersLinked\Model\MicrolearningExtendUser;
64
use LeadersLinked\Mapper\MicrolearningExtendUserMapper;
65
use LeadersLinked\Model\MicrolearningExtendUserCompany;
66
use LeadersLinked\Mapper\MicrolearningCapsuleCommentMapper;
67
use LeadersLinked\Mapper\MicrolearningExtendUserCompanyMapper;
68
use LeadersLinked\Mapper\MicrolearningExtendUserFunctionMapper;
69
use LeadersLinked\Mapper\MicrolearningExtendUserGroupMapper;
70
use LeadersLinked\Mapper\MicrolearningExtendUserInstitutionMapper;
71
use LeadersLinked\Mapper\MicrolearningExtendUserPartnerMapper;
72
use LeadersLinked\Mapper\MicrolearningExtendUserProgramMapper;
73
use LeadersLinked\Mapper\MicrolearningExtendUserStudentTypeMapper;
74
use LeadersLinked\Mapper\MicrolearningExtendUserSectorMapper;
75
use Nullix\CryptoJsAes\CryptoJsAes;
76
use LeadersLinked\Model\MicrolearningTopic;
77
use LeadersLinked\Model\MicrolearningCapsule;
78
use LeadersLinked\Model\UserDeleted;
79
use LeadersLinked\Mapper\UserDeletedMapper;
80
use LeadersLinked\Mapper\ApplicationVariantMapper;
81
use LeadersLinked\Library\EasyAES;
82
 
83
 
84
class ServiceController extends AbstractActionController
85
{
86
    /**
87
     *
88
     * @var \Laminas\Db\Adapter\AdapterInterface
89
     */
90
    private $adapter;
91
 
92
    /**
93
     *
94
     * @var \LeadersLinked\Cache\CacheInterface
95
     */
96
    private $cache;
97
 
98
 
99
    /**
100
     *
101
     * @var \Laminas\Log\LoggerInterface
102
     */
103
    private $logger;
104
 
105
    /**
106
     *
107
     * @var array
108
     */
109
    private $config;
110
 
111
 
112
    /**
113
     *
114
     * @var \Laminas\Mvc\I18n\Translator
115
     */
116
    private $translator;
117
 
118
 
119
    /**
120
     *
121
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
122
     * @param \LeadersLinked\Cache\CacheInterface $cache
123
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
124
     * @param array $config
125
     * @param \Laminas\Mvc\I18n\Translator $translator
126
     */
127
    public function __construct($adapter, $cache, $logger, $config, $translator)
128
    {
129
        $this->adapter      = $adapter;
130
        $this->cache        = $cache;
131
        $this->logger       = $logger;
132
        $this->config       = $config;
133
        $this->translator   = $translator;
134
    }
135
 
136
    public function indexAction()
137
    {
138
        return new JsonModel(['ok' => false]);
139
    }
140
 
141
    public function signinAction()
142
    {
143
        $request = $this->getRequest();
144
 
145
        if($request->isPost()) {
146
 
147
 
148
            $seed   = $this->config['leaderslinked.services.seed'];
149
            $min    = strtotime('-1 day');
150
            $max    = strtotime('+1 day');
151
 
152
 
153
 
154
 
155
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device', ''));
156
            $user_uuid      = Functions::sanitizeFilterString($this->params()->fromPost('user', ''));
157
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
158
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
159
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
160
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
161
 
162
 
163
            $ok = $device_uuid && strlen($device_uuid) == 36;
164
            $ok = $ok && $rand > 0;
165
            $ok = $ok && $timestamp >= $min;
166
            $ok = $ok && $timestamp <= $max;
167
            $ok = $ok && strlen($password) == 32;
168
            $ok = $ok && strlen($user_uuid)  == 36;
169
            $ok = $ok && $sync_id;
170
 
171
            if(!$ok) {
172
                return new JsonModel([
173
                    'success' => false,
174
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
175
                ]);
176
            }
177
 
178
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
179
            if($password != $password_md5) {
180
                return new JsonModel([
181
                    'success' => false,
182
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
183
                ]);
184
 
185
 
186
            }
187
 
188
 
189
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
190
            $device = $deviceMapper->fetchOne($device_uuid);
191
            if(!$device) {
192
                return new JsonModel([
193
                    'success' => false,
194
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
195
                ]);
196
            }
197
 
198
            $userMapper = UserMapper::getInstance($this->adapter);
199
            $user = $userMapper->fetchOneByUuid($user_uuid);
200
            if(!$user) {
201
                return new JsonModel([
202
                    'success' => false,
203
                    'data' => 'ERROR_USER_NOT_FOUND',
204
                ]);
205
            }
206
 
207
 
208
            $syncLog = new SyncLog();
209
            $syncLog->data          = json_encode(['user' => $user_uuid]);
210
            $syncLog->type          = 'signin';
211
            $syncLog->device_uuid   = $device->id;
212
            $syncLog->ip            = Functions::getUserIP();
213
 
214
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
215
            $syncLogMapper->insert($syncLog);
216
 
217
            $device->user_id        = $user->id;
218
            $device->ip             = Functions::getUserIP();
219
            $result                 = $deviceMapper->update($device);
220
 
221
            if($result) {
222
 
223
                $deviceHistory = new DeviceHistory();
224
                $deviceHistory->device_id   = $device->ip;
225
                $deviceHistory->user_id     = $user->id;
226
                $deviceHistory->ip          = Functions::getUserIP();
227
 
228
                $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
229
                $deviceHistoryMapper->insert($deviceHistory);
230
 
231
 
232
 
233
                return new JsonModel([
234
                    'success' => true,
235
                    'data' => [
236
                        'sync_id' => $sync_id
237
                    ]
238
                ]);
239
            } else {
240
                return new JsonModel([
241
                    'success' => false,
242
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
243
                ]);
244
            }
245
 
246
        }
247
 
248
        return new JsonModel([
249
            'success' => false,
250
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
251
        ]);
252
 
253
 
254
    }
255
 
256
    public function fcmAction()
257
    {
258
        $request = $this->getRequest();
259
 
260
        if($request->isPost()) {
261
 
262
 
263
            $seed   = $this->config['leaderslinked.services.seed'];
264
            $min    = strtotime('-1 day');
265
            $max    = strtotime('+1 day');
266
 
267
 
268
 
269
 
270
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device', ''));
271
            $token          = Functions::sanitizeFilterString($this->params()->fromPost('token', ''));
272
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
273
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
274
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
275
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
276
 
277
 
278
            $ok = $device_uuid && strlen($device_uuid) == 36;
279
            $ok = $ok && $rand > 0;
280
            $ok = $ok && $timestamp >= $min;
281
            $ok = $ok && $timestamp <= $max;
282
            $ok = $ok && strlen($password) == 32;
283
            $ok = $ok && strlen($token) <= 512;
284
            $ok = $ok && $sync_id;
285
 
286
            if(!$ok) {
287
                return new JsonModel([
288
                    'success' => false,
289
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
290
                ]);
291
            }
292
 
293
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $token );
294
            if($password != $password_md5) {
295
                return new JsonModel([
296
                    'success' => false,
297
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
298
                ]);
299
 
300
 
301
            }
302
 
303
 
304
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
305
            $device = $deviceMapper->fetchOne($device_uuid);
306
            if(!$device) {
307
                return new JsonModel([
308
                    'success' => false,
309
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
310
                ]);
311
            }
312
 
313
 
314
            $syncLog = new SyncLog();
315
            $syncLog->data          = json_encode(['token' => $token]);
316
            $syncLog->type          = 'token';
317
            $syncLog->device_uuid   = $device->id;
318
            $syncLog->ip            = Functions::getUserIP();
319
 
320
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
321
            $syncLogMapper->insert($syncLog);
322
 
323
            $device->token          = $token;
324
            $device->ip             = Functions::getUserIP();
325
            $result                 = $deviceMapper->update($device);
326
 
327
            if($result) {
328
                return new JsonModel([
329
                    'success' => true,
330
                    'data' => [
331
                        'sync_id' => $sync_id
332
                    ]
333
                ]);
334
            } else {
335
                return new JsonModel([
336
                    'success' => false,
337
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
338
                ]);
339
            }
340
 
341
        }
342
 
343
        return new JsonModel([
344
            'success' => false,
345
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
346
        ]);
347
    }
348
 
349
 
350
    public function deviceAction()
351
    {
352
 
353
        $request = $this->getRequest();
354
 
355
        if($request->isPost()) {
356
 
357
            $seed   = $this->config['leaderslinked.services.seed'];
358
            $min    = strtotime('-1 day');
359
            $max    = strtotime('+1 day');
360
 
361
 
362
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
363
            $manufacturer   = Functions::sanitizeFilterString($this->params()->fromPost('manufacturer', ''));
364
            $platform       = Functions::sanitizeFilterString($this->params()->fromPost('platform', ''));
365
            $brand          = Functions::sanitizeFilterString($this->params()->fromPost('brand', ''));
366
            $version        = Functions::sanitizeFilterString($this->params()->fromPost('version', ''));
367
            $model          = Functions::sanitizeFilterString($this->params()->fromPost('model', ''));
368
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
369
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
370
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
371
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
372
 
373
            $ok = $device_uuid && strlen($device_uuid) == 36 && $sync_id;
374
            $ok = $ok && strlen($manufacturer) <= 250;
375
            $ok = $ok && strlen($brand) <= 250;
376
            $ok = $ok && strlen($version) <= 250;
377
            $ok = $ok && strlen($model) <= 250;
378
            $ok = $ok && $rand > 0;
379
            $ok = $ok && $timestamp >= $min;
380
            $ok = $ok && $timestamp <= $max;
381
            $ok = $ok && strlen($password) == 32;
382
            $ok = $ok && $sync_id;
383
 
384
 
385
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $manufacturer . '-' . $brand . '-' . $version . '-' . $model);
386
            if($password != $password_md5) {
387
                return new JsonModel([
388
                    'success' => false,
389
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
390
                ]);
391
 
392
 
393
            }
394
 
395
 
396
            if(!$ok) {
397
                return new JsonModel([
398
                    'success' => false,
399
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
400
                ]);
401
            }
402
 
403
 
404
 
405
 
406
            $syncLog = new SyncLog();
407
            $syncLog->data = json_encode([
408
                'platform' => $platform,
409
                'manufacturer' => $manufacturer,
410
                'brand' => $brand,
411
                'version' => $version,
412
                'model' => $model,
413
            ]);
414
            $syncLog->type          = 'device';
415
            $syncLog->device_uuid   = $device_uuid;
416
            $syncLog->ip            = Functions::getUserIP();
417
 
418
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
419
            $syncLogMapper->insert($syncLog);
420
 
421
 
422
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
423
            $device = $deviceMapper->fetchOne($device_uuid);
424
 
425
 
426
 
427
 
428
            if($device) {
429
                $device->platform       = $platform;
430
                $device->manufacturer   = $manufacturer;
431
                $device->brand          = $brand;
432
                $device->version        = $version;
433
                $device->model          = $model;
434
                $device->ip             = Functions::getUserIP();
435
                $result                 = $deviceMapper->update($device);
436
 
437
            } else {
438
                $device                 = new Device();
439
                $device->id             = $device_uuid;
440
                $device->manufacturer   = $manufacturer;
441
                $device->brand          = $brand;
442
                $device->version        = $version;
443
                $device->model          = $model;
444
                $device->platform       = $platform;
445
                $device->ip             = Functions::getUserIP();
446
                $result                 = $deviceMapper->insert($device);
447
            }
448
 
449
 
450
 
451
            if($result) {
452
                return new JsonModel([
453
                    'success' => true,
454
                    'data' => [
455
                        'sync_id'   => $sync_id,
456
                    ]
457
                ]);
458
            } else {
459
                return new JsonModel([
460
                    'success' => false,
461
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
462
                ]);
463
            }
464
 
465
        }
466
 
467
        return new JsonModel([
468
            'success' => false,
469
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
470
        ]);
471
 
472
    }
473
 
474
 
475
 
476
    public function signoutAction()
477
    {
478
        $request = $this->getRequest();
479
 
480
        if($request->isPost()) {
481
 
482
 
483
            $seed   = $this->config['leaderslinked.services.seed'];
484
            $min    = strtotime('-1 day');
485
            $max    = strtotime('+1 day');
486
 
487
 
488
 
489
 
490
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device', ''));
491
            $user_uuid      = Functions::sanitizeFilterString($this->params()->fromPost('user', ''));
492
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
493
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
494
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
495
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
496
 
497
 
498
            $ok = $device_uuid && strlen($device_uuid) == 36;
499
            $ok = $ok && $rand > 0;
500
            $ok = $ok && $timestamp >= $min;
501
            $ok = $ok && $timestamp <= $max;
502
            $ok = $ok && strlen($password) == 32;
503
            $ok = $ok && strlen($user_uuid)  == 36;
504
            $ok = $ok && $sync_id;
505
 
506
            if(!$ok) {
507
                return new JsonModel([
508
                    'success' => false,
509
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
510
                ]);
511
            }
512
 
513
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
514
            if($password != $password_md5) {
515
                return new JsonModel([
516
                    'success' => false,
517
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
518
                ]);
519
 
520
 
521
            }
522
 
523
 
524
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
525
            $device = $deviceMapper->fetchOne($device_uuid);
526
            if(!$device) {
527
                return new JsonModel([
528
                    'success' => false,
529
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
530
                ]);
531
            }
532
 
533
            $userMapper = UserMapper::getInstance($this->adapter);
534
            $user = $userMapper->fetchOneByUuid($user_uuid);
535
            if(!$user) {
536
                return new JsonModel([
537
                    'success' => false,
538
                    'data' => 'ERROR_USER_NOT_FOUND',
539
                ]);
540
            }
541
 
542
 
543
            $syncLog = new SyncLog();
544
            $syncLog->data          = json_encode(['user' => $user_uuid]);
545
            $syncLog->type          = 'signin';
546
            $syncLog->device_uuid   = $device->id;
547
            $syncLog->ip            = Functions::getUserIP();
548
 
549
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
550
            $syncLogMapper->insert($syncLog);
551
 
552
            $device->user_id        =
553
            $device->ip             = Functions::getUserIP();
554
            $result                 = $deviceMapper->update($device);
555
 
556
            if($result) {
557
                return new JsonModel([
558
                    'success' => true,
559
                    'data' => [
560
                        'sync_id' => $sync_id
561
                    ]
562
                ]);
563
            } else {
564
                return new JsonModel([
565
                    'success' => false,
566
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
567
                ]);
568
            }
569
 
570
        }
571
 
572
        return new JsonModel([
573
            'success' => false,
574
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
575
        ]);
576
 
577
 
578
    }
579
 
580
 
581
 
582
 
583
 
584
 
585
}
586
 
587