forked from stwebcode/register
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.php
More file actions
165 lines (129 loc) · 6.31 KB
/
server.php
File metadata and controls
165 lines (129 loc) · 6.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<?php
require_once 'database_manager.php';
header('Content-Type: application/json; charset=utf-8');
abstract Class ErrorType{
// Abstrakta klase, kas simulē Enum objektu priekš error tipiem, kas ir attiecināmi JS definētajiem error tipiem
// Error tips lietotājvārdu kļūdām
const USERNAME = "username_error";
// Error tips paroļu kļūdām
const PASSWORD = "password_error";
// Error tips attēlu kļūdām
const IMAGE = "image_error";
// Error tips nenoteiktām kļūdām
const NONE = "none";
}
function out($message, bool $is_error=false, string $type=ErrorType::NONE){
/*
out() - izvades funkcija
Šo funkciju jālieto gadījumos ja serveris izvada informāciju klientam.
Katru reizi kad kaut kas tiek izvadīts ar šo funkciju, skripts apstājas, tādā
veidā samazinot if/else statement lietošanu.
@author: CracX
@example: out("Invalid username", $is_error=true, ErrorType::USERNAME);
*/
switch($is_error){
// Ja izvade ir kļūda
case true:
// Sūtam jebkādu error kodu lai frontend AJAX funkcija nofeilo
http_response_code(404);
// izveidojam ziņojumu attiecīgā formātā
$out = array(
"error" => true,
"message" => $message,
"type" => $type
);
break;
// Ja izvade ir parasts ziņojums
case false:
// Sūtam success kodu
http_response_code(200);
// izveidojam ziņojumu attiecīgā formātā
$out = array(
"success" => true,
"message" => $message
);
break;
default:
// Noklusējuma rezultātā izvadām parastu ziņojumu
http_response_code(200);
$out = array(
"success" => true,
"message" => $message
);
}
// Liekam skriptam "nomirt" un neturpināt tālāk, izvadot ziņojumu
die(json_encode($out, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}
// Ja action neeksistē, tad php izvada faila pilno lokāciju, tāpēc nosūtīsim lietotājam 404 error lapu.
if (!isset($_POST['action'])){
http_response_code(404);
die();
}
// Iniciējam klase
$db = new DatabaseManager();
// Ja klients vēlas pievienot lietotāju
if($_POST['action'] == "insert_user"){
$username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_ARGON2I);
// Pārbaudam, vai lietotājvārds ir derīgs. Saglabājam funkcijas izvadi $res mainīgajā un skatamies kas pa error tiek izmests.
if(!($res = $db->check_username($username))['success']){
out($res['error_id'] == 0 ? "Lietotājvārdam jābūt vismaz 5 simbolus garam" : "Lietotājvārds jau ir aizņemts", $is_error=true, $type=ErrorType::USERNAME);
}
// Pārbaudam, vai parole ir derīga. Šeit mums nevajag saglabāt izvadi, jo kļūdas gadījumā tiks izvadīts tikai viens ziņojums.
if(!$db->check_password($password)['success']){
out("Parolei jābūt vismaz 5 simbolus garai", $is_error=true, $type=ErrorType::PASSWORD);
}
// Pārbauda vai lietotājs ir piekritis attēla augšupielādēšanai datubāzē
if($_POST['defaultPicture'] == 'false') {
$basename = "";
$supported_ext = array('jpg','jpeg','png','webp'); // atbalstītie failu extensions
// ja image masīvā atrodas vismaz 1 bilde, tad augšupielādējam to
if(!empty($_POST['image'])){
$time = time(); //laicīgi piefiksējam timestamp, lai visiem bildes izmēriem būtu vienāds basename
foreach ($_POST['image'] as $data){
switch ($data["size"]){
case "30":
$folderPath = "images/30x30/";
break;
case "200":
$folderPath = "images/200x200/";
break;
default:
out("Neatbalstīts bildes izmērs!", $is_error=true, $type=ErrorType::IMAGE);
}
$extension = explode('/', mime_content_type($data["image"]))[1]; // bildes extension. .png .jpg utt.
if(!in_array($extension,$supported_ext)){
out("Neatbalstīts faila formāts!", $is_error=true, $type=ErrorType::IMAGE);
}
$image_parts = explode(";base64,", $data["image"]); //$image_parts[1] būs datu daļa
$image_type_aux = explode("image/", $image_parts[0]);
$image_type = $image_type_aux[1];
$image_base64 = base64_decode($image_parts[1]); //$image_parts[1] būs datu daļa
//base64_decode Decodes data encoded with MIME base64, tātad te kļūst par reālu bildi
$basename = $time . "." . $extension;
$file = $folderPath . $basename;
if (file_exists($file)) { // gadījumā, ja brīnumainā kārtā bilde ar šādu timestamp jau eksistē
out("Šis attēls jau eksistē. Mēģiniet vēlreiz.", $is_error=true, $type=ErrorType::IMAGE);
}else{
file_put_contents($file, $image_base64); //šī funkcija ievieto failu mapē uz servera
//1. arguments ir faila nosaukums (tā ceļs, priekšā ir mape) un 2. ir faila saturs
}
}
}else{
out("Pievienojat attēlu vai izvēlieties lietot anonīmu.", $is_error=true, $type=ErrorType::IMAGE);
}
// Ja viss kārtībā, reģistrējam lietotāju.
if($db->register($username, $password, $basename)){
out("Lietotājs veiksmīgi reģistrēts");
}
} else if ($_POST['defaultPicture'] == 'true') {
// Ja lietotājs nepiekrita privātuma politikai, tad, izmantojot funkciju registerWithoutPicture(), reģistrē bez attēla
if($db->register($username, $password, $basename = "")){
out("Lietotājs veiksmīgi reģistrēts");
}
}
// Ja tomēr reģistrācija nebija veiksmīga, nosūtam 503. kodu signalozējot, ka kļūda ar datubāzi (šai līnijai nevajadzētu tikt sasniegtai).
http_response_code(503);
}
?>