Proyectos de Subversion Moodle

Rev

Rev 1388 | Rev 1390 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1388 Rev 1389
Línea 1... Línea 1...
1
<?php
1
<?php
-
 
2
// Configuración de headers para respuesta JSON y CORS
2
header('Content-Type: application/json');
3
header('Content-Type: application/json');
3
header('Access-Control-Allow-Origin: *');
4
header('Access-Control-Allow-Origin: *');
-
 
5
 
-
 
6
// Definición de constantes para autenticación y encriptación
4
define('LLWS_USERNAME', 'leaderdslinked-ws');
7
define('LLWS_USERNAME', 'leaderdslinked-ws');
5
define('LLWS_PASSWORD', 'KFB3lFsLp&*CpB0uc2VNc!zVn@w!EZqZ*jr$J0AlE@sYREUcyP');
8
define('LLWS_PASSWORD', 'KFB3lFsLp&*CpB0uc2VNc!zVn@w!EZqZ*jr$J0AlE@sYREUcyP');
6
define('LLWS_RSA_N', 34589927);
9
define('LLWS_RSA_N', 34589927);  // Clave pública RSA N
7
define('LLWS_RSA_D', 4042211);
10
define('LLWS_RSA_D', 4042211);   // Clave privada RSA D
8
define('LLWS_RSA_E', 7331);
11
define('LLWS_RSA_E', 7331);      // Clave pública RSA E
9
define('LLWS_CATEGORY_ID', 6);
12
define('LLWS_CATEGORY_ID', 6);   // ID de categoría para cursos
10
 
-
 
Línea -... Línea 13...
-
 
13
 
11
 
14
// Inclusión de archivos necesarios de Moodle
12
require_once(__DIR__ . '/../config.php');
15
require_once(__DIR__ . '/../config.php');
Línea -... Línea 16...
-
 
16
global $DB, $CFG;
13
global $DB, $CFG;
17
 
14
 
18
// Inclusión de librerías de Moodle
15
require_once($CFG->libdir . '/moodlelib.php');
19
require_once($CFG->libdir . '/moodlelib.php');
16
require_once($CFG->libdir . '/externallib.php');
20
require_once($CFG->libdir . '/externallib.php');
17
require_once($CFG->libdir . '/authlib.php');
-
 
18
require_once($CFG->libdir . '/gdlib.php');
21
require_once($CFG->libdir . '/authlib.php');
19
 
22
require_once($CFG->libdir . '/gdlib.php');
20
require_once($CFG->dirroot . '/user/lib.php');
23
require_once($CFG->dirroot . '/user/lib.php');
21
require_once __DIR__ . '/rsa.php';
-
 
22
require_once __DIR__ . '/lib.php';
-
 
23
 
-
 
24
 
-
 
25
 
-
 
26
/*
-
 
27
$username   = trim(isset($_SERVER['HTTP_USERNAME']) ? filter_var($_SERVER['HTTP_USERNAME'], FILTER_SANITIZE_STRING) : '');
-
 
28
$password   = trim(isset($_SERVER['HTTP_PASSWORD']) ? filter_var($_SERVER['HTTP_PASSWORD'], FILTER_SANITIZE_STRING) : '');
-
 
29
$timestamp  = trim(isset($_SERVER['HTTP_TIMESTAMP']) ? filter_var($_SERVER['HTTP_TIMESTAMP'], FILTER_SANITIZE_STRING) : '');
-
 
Línea -... Línea 24...
-
 
24
require_once(__DIR__ . '/rsa.php');
30
$rand       = intval(isset($_SERVER['HTTP_RAND']) ? filter_var($_SERVER['HTTP_RAND'], FILTER_SANITIZE_NUMBER_INT) : 0,10);
25
require_once(__DIR__ . '/lib.php');
31
*/
26
 
32
 
27
// Obtención y sanitización de parámetros de la petición
33
$username   = trim(isset($_REQUEST['username']) ? filter_var($_REQUEST['username'], FILTER_SANITIZE_STRING) : '');
28
$username   = trim(isset($_REQUEST['username']) ? filter_var($_REQUEST['username'], FILTER_SANITIZE_STRING) : '');
34
$password   = trim(isset($_REQUEST['password']) ? filter_var($_REQUEST['password'], FILTER_SANITIZE_STRING) : '');
29
$password   = trim(isset($_REQUEST['password']) ? filter_var($_REQUEST['password'], FILTER_SANITIZE_STRING) : '');
Línea 68... Línea 63...
68
$password  = password_hash($username.'-'. $password. '-' . $rand. '-' . $timestamp, PASSWORD_DEFAULT);
63
$password  = password_hash($username.'-'. $password. '-' . $rand. '-' . $timestamp, PASSWORD_DEFAULT);
Línea 69... Línea 64...
69
 
64
 
70
$data       = $rsa->encrypt(json_encode(['email' => 'usuario4@test.com', 'first_name' => 'usuario4', 'last_name' => 'test']));
65
$data       = $rsa->encrypt(json_encode(['email' => 'usuario4@test.com', 'first_name' => 'usuario4', 'last_name' => 'test']));
Línea -... Línea 66...
-
 
66
*/
71
*/
67
 
72
 
68
// Validación de parámetros de seguridad
73
if (empty($username) || empty($password) || empty($timestamp) || empty($rand) || !is_integer($rand)) {
69
if (empty($username) || empty($password) || empty($timestamp) || empty($rand) || !is_integer($rand)) {
74
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY1']);
70
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY1']);
Línea -... Línea 71...
-
 
71
    exit;
75
    exit;
72
}
76
}
73
 
77
 
74
// Validación del nombre de usuario
78
if ($username != LLWS_USERNAME) {
75
if ($username != LLWS_USERNAME) {
Línea -... Línea 76...
-
 
76
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY2']);
79
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY2']);
77
    exit;
80
    exit;
78
}
81
}
79
 
82
 
80
// Validación del formato del timestamp
83
$dt = \DateTime::createFromFormat('Y-m-d\TH:i:s', $timestamp);
81
$dt = \DateTime::createFromFormat('Y-m-d\TH:i:s', $timestamp);
Línea -... Línea 82...
-
 
82
if (!$dt) {
84
if (!$dt) {
83
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY3']);
85
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY3']);
84
    exit;
86
    exit;
85
}
Línea 87... Línea 86...
87
}
86
 
88
 
87
// Validación del rango de tiempo del timestamp (±5 minutos)
89
$t0 = $dt->getTimestamp();
88
$t0 = $dt->getTimestamp();
90
$t1 = strtotime('-5 minutes');
89
$t1 = strtotime('-5 minutes');
Línea -... Línea 90...
-
 
90
$t2 = strtotime('+5 minutes');
91
$t2 = strtotime('+5 minutes');
91
 
92
 
92
if ($t0 < $t1 || $t0 > $t2) {
93
if ($t0 < $t1 || $t0 > $t2) {
93
    //echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY4']) ;
94
    //echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY4']) ;
94
    //exit;
Línea -... Línea 95...
-
 
95
}
95
    //exit;
96
 
96
}
97
// Validación de la contraseña
97
 
98
if (!password_verify($username . '-' . LLWS_PASSWORD . '-' . $rand . '-' . $timestamp, $password)) {
98
if (!password_verify($username . '-' . LLWS_PASSWORD . '-' . $rand . '-' . $timestamp, $password)) {
99
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY5']);
Línea -... Línea 100...
-
 
100
    exit;
99
    echo json_encode(['success' => false, 'data' => 'ERROR_SECURITY5']);
101
}
100
    exit;
102
 
101
}
103
// Validación de datos
102
 
104
if (empty($data)) {
103
if (empty($data)) {
105
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS1']);
Línea -... Línea 106...
-
 
106
    exit;
104
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS1']);
107
}
105
    exit;
108
 
106
}
109
// Decodificación de datos en base64
107
 
110
$data = base64_decode($data);
108
$data = base64_decode($data);
111
if (empty($data)) {
109
if (empty($data)) {
112
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS2']);
110
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS2']);
113
    exit;
111
    exit;
114
}
Línea -... Línea 115...
-
 
115
 
112
}
116
// Desencriptación de datos usando RSA
113
 
117
try {
114
try {
118
    $rsa = new rsa();
115
    $rsa = new rsa();
119
    $rsa->setKeys(LLWS_RSA_N, LLWS_RSA_D, LLWS_RSA_E);
116
    $rsa->setKeys(LLWS_RSA_N, LLWS_RSA_D, LLWS_RSA_E);
120
    $data = $rsa->decrypt($data);
Línea 117... Línea -...
117
    $data = $rsa->decrypt($data);
-
 
-
 
121
} catch (Throwable $e) {
118
} catch (Throwable $e) {
122
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS3']);
119
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS3']);
123
    exit;
120
    exit;
124
}
Línea 121... Línea 125...
121
}
125
 
122
 
126
// Conversión de datos a array
123
$data = (array) json_decode($data);
127
$data = (array) json_decode($data);
124
if (empty($data)) {
128
if (empty($data)) {
Línea 125... Línea -...
125
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS4']);
-
 
126
    exit;
-
 
-
 
129
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS4']);
127
}
130
    exit;
128
 
131
}
129
 
132
 
130
$email      = trim(isset($data['email']) ? filter_var($data['email'], FILTER_SANITIZE_EMAIL) : '');
133
// Extracción y validación de datos del usuario
131
$first_name = trim(isset($data['first_name']) ? filter_var($data['first_name'], FILTER_SANITIZE_STRING) : '');
134
$email      = trim(isset($data['email']) ? filter_var($data['email'], FILTER_SANITIZE_EMAIL) : '');
132
$last_name  = trim(isset($data['last_name']) ? filter_var($data['last_name'], FILTER_SANITIZE_STRING) : '');
135
$first_name = trim(isset($data['first_name']) ? filter_var($data['first_name'], FILTER_SANITIZE_STRING) : '');
133
 
-
 
134
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || empty($first_name) || empty($last_name)) {
136
$last_name  = trim(isset($data['last_name']) ? filter_var($data['last_name'], FILTER_SANITIZE_STRING) : '');
Línea -... Línea 137...
-
 
137
 
135
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS5']);
138
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || empty($first_name) || empty($last_name)) {
136
    exit;
-
 
137
}
139
    echo json_encode(['success' => false, 'data' => 'ERROR_PARAMETERS5']);
138
 
140
    exit;
Línea 139... Línea -...
139
 
-
 
140
 
141
}
141
$user = ll_get_user_by_email($email);
142
 
142
if ($user) {
143
// Búsqueda o creación de usuario
143
    $new_user = false;
144
$user = ll_get_user_by_email($email);
144
} else {
145
if ($user) {
Línea 171... Línea 172...
171
            }
172
            }
172
        }
173
        }
173
    }
174
    }
174
}
175
}
Línea 175... Línea -...
175
 
-
 
176
 
-
 
-
 
176
 
177
 
177
// Verificación de creación de usuario
178
if (!$user) {
178
if (!$user) {
179
    echo json_encode(['success' => false, 'data' => 'ERROR_MOODLE1']);
179
    echo json_encode(['success' => false, 'data' => 'ERROR_MOODLE1']);
180
    exit;
180
    exit;
Línea -... Línea 181...
-
 
181
}
181
}
182
 
182
 
183
// Inscripción en cursos para usuarios nuevos
183
if ($new_user) {
184
if ($new_user) {
Línea 184... Línea 185...
184
    $role = $DB->get_record('role', array('archetype' => 'student'));
185
    $role = $DB->get_record('role', array('archetype' => 'student'));
Línea 214... Línea 215...
214
            }
215
            }
215
        }
216
        }
216
    }
217
    }
217
}
218
}
Línea 218... Línea -...
218
 
-
 
219
 
-
 
220
 
-
 
-
 
219
 
221
 
220
// Obtención de datos completos del usuario y login
222
$user = get_complete_user_data('id', $user->id);
221
$user = get_complete_user_data('id', $user->id);
223
if (!isloggedin()) {
222
if (!isloggedin()) {
224
    complete_user_login($user);
223
    complete_user_login($user);
Línea -... Línea 224...
-
 
224
}
225
}
225
 
226
 
226
// Redirección a la página personal del usuario