Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.27 KB | None | 0 0
  1. <?PHP
  2.  
  3. /*
  4. * Ler Prop/ProjectInfo.txt para informações sobre a convenção usada para:
  5. * Variaveis Locais
  6. * Variaveis Globais
  7. * Objetos
  8. * Metodos
  9. * Funções
  10. * Nome de Classe
  11. * Arquivos
  12. */
  13.  
  14. class UserManager
  15. {
  16. /*
  17. * Classe que interage com o banco de dados a respeito dos usuario em relação a:
  18. * Login
  19. * Logout
  20. * Criação de usuario
  21. * Mudança de permições
  22. * Inscrição em materias
  23. * Recuperação de senha
  24. * Mudança de senha, usuario e e-mail
  25. * Verificação da sessão
  26. */
  27.  
  28. private $DatabaseConnection; // Objeto da classe DataBase que faz a conexão com o banco de dados e executa comandos
  29. private $CurrentUser; // Objeto da classe User que armazena as informções do usuario
  30.  
  31.  
  32. /*
  33. * Metodo construtor da classe UserManager
  34. * Recebe um objeto da classe DataBase, $db
  35. * Recebe um objeto da classe User, $User
  36. * Recebe o nome da pagina sem o tipo de arquivo, $nomepg
  37. * Inicia a sessão para ter acesso a variavel $_SESSION["Usuario"]
  38. * Não retorna nada
  39. */
  40. function __construct($Db)
  41. {
  42. $this->DatabaseConnection = $Db;
  43. $this->CurrentUser = new User();
  44. }
  45.  
  46.  
  47. /*
  48. * Metodo que loga o usuario e armazena o usuario na sessão
  49. * Recebe o nome do usuario, $nome_Usuario
  50. * Recebe a senha do usuario, $senha
  51. * Se o login for realizado com sucesso armazena o usuario atual na variavel $_SESSION["Usuario"]
  52. * Se o login fracassar limpa a variavel $_SESSION["Usuario"] por precaução
  53. * Retorna um array com 2 variaveis
  54. * $suc variavel que indica se o metodo teve sucesso ou não
  55. * $msg variavel que armazena a mensagem de erro ou sucesso
  56. */
  57. public function userLogin($nome_Usuario, $senha)
  58. {
  59.  
  60. $this->DatabaseConnection->connect();
  61.  
  62. $suc = false;
  63. $msg = "";
  64.  
  65. $json = array('suc'=>$suc, 'msg'=>$msg);
  66.  
  67. $nome_Usuario = $this->DatabaseConnection->escapeString($nome_Usuario);
  68.  
  69. $sql = "SELECT * FROM Users WHERE Username = '".$nome_Usuario."'";
  70.  
  71. $this->DatabaseConnection->executeCommand($sql);
  72.  
  73.  
  74. if($this->DatabaseConnection->getAffectedRows() == 1)
  75. {
  76.  
  77. $data = $this->DatabaseConnection->getNextResultSetPosition();
  78.  
  79. $this->CurrentUser->setDataFromRS($data);
  80.  
  81. if(password_verify($senha, $this->CurrentUser->getPasswordHash()))
  82. {
  83.  
  84. $_SESSION["Usuario"] = $this->CurrentUser;
  85. $json['suc'] = true;
  86. }
  87. else
  88. {
  89.  
  90. $this->CurrentUser = Null;
  91. $json['msg'] = "Nome de usuario ou senha incorreta";
  92. }
  93.  
  94. }
  95. else
  96. {
  97. $this->CurrentUser = Null;
  98. $json['msg'] = "Nome de usuario ou senha incorreta";
  99. }
  100.  
  101. $this->DatabaseConnection->disconnect();
  102.  
  103. return $json;
  104. }
  105.  
  106.  
  107. /*
  108. * Metodo que desloga o usuaro e limpa as variaveis de sessão
  109. *Limpa o objeto User, $CurrentUser
  110. *Não retorna nada
  111. */
  112. public function userLogout()
  113. {
  114. session_unset();
  115. session_destroy();
  116. unset($this->CurrentUser);
  117. }
  118.  
  119.  
  120. /*
  121. * Metodo que cria um usuario novo e o armazena no banco de dados
  122. * Recebe o nome do usuario, $nome_Usuario
  123. * Recebe a senha do usuario, $senha
  124. * Recebe o email do usuario, $email
  125. * Recebe o nome completo do usuario, $nome_Completo
  126. * Cria um objeto da classe User para armazenar o novo usuario temporariamente, $NewUser
  127. * Inspeciona o banco de dados verificando se ja existe um email ou nome de usuario iguais
  128. * Verifica se todos os campos estão de acordo com o padrão estabelecido
  129. * Se todas as verificações passarem armazena o novo usuario no banco de dados
  130. * Retorna um array com 2 variaveis
  131. * $suc variavel que indica se o metodo teve sucesso ou não
  132. * $msg variavel que indica a mensagem de erro ou sucesso
  133. */
  134. public function userCreate($nome_Usuario, $senha, $email, $nome_Completo)
  135. {
  136.  
  137. $this->DatabaseConnection->connect();
  138.  
  139. $NewUser = new User();
  140. $msg = "";
  141. $suc = false;
  142.  
  143. $json = array('suc'=>$suc, 'msg'=>$msg);
  144.  
  145. $nome_Usuario = $this->DatabaseConnection->escapeString($nome_Usuario);
  146. $email = $this->DatabaseConnection->escapeString($email);
  147. $senha = $this->DatabaseConnection->escapeString($senha);
  148. $nome_Completo = $this->DatabaseConnection->escapeString($nome_Completo);
  149.  
  150. $this->DatabaseConnection->executeCommand("SELECT * FROM Users WHERE Username = '".$nome_Usuario."'");
  151.  
  152. $qtd_Of_Same_User_Name = $this->DatabaseConnection->getSelectedRows();
  153.  
  154. $this->DatabaseConnection->executeCommand("SELECT * FROM Users WHERE Email = '".$email."'");
  155.  
  156. $qtd_Of_Same_Email = $this->DatabaseConnection->getSelectedRows();
  157.  
  158.  
  159. if(!$NewUser->setFullName($nome_Completo))
  160. $json['msg'] = "Nome completo deve possuir entre 4 e 64 caracteres";
  161.  
  162. else if(!$NewUser->setUserName($nome_Usuario))
  163. $json['msg'] = "Nome de usuario deve possuir entre 4 e 16 caracteres";
  164.  
  165. else if($qtd_Of_Same_User_Name > 0)
  166. $json['msg'] = "O nome de usuario escolhido ja existe.";
  167.  
  168. else if(!$NewUser->setEmail($email))
  169. $json['msg'] = "Endereço de e-mail invalido";
  170.  
  171. else if($qtd_Of_Same_Email > 0)
  172. $json['msg'] = "O email escolhido ja existe.";
  173.  
  174. else if(!$NewUser->setPasswordHash($senha))
  175. $json['msg'] = "Senha deve possuir pelo menos 6 caracteres";
  176.  
  177. if($json['msg'] == "")
  178. {
  179. $NewUser->setPermission(0);
  180. // Salva o registro no banco de dados
  181. $sql = "INSERT INTO Users
  182. (NomeCompleto, Username, Email, Password, Permission)
  183. VALUES (
  184. '".$nome_Completo."',
  185. '".$nome_Usuario."',
  186. '".$email."',
  187. '".$NewUser->getPasswordHash()."',
  188. '".$NewUser->getPermission()."'
  189. )";
  190.  
  191. $this->DatabaseConnection->executeCommand($sql);
  192. if($this->DatabaseConnection->getAffectedRows() == 1)
  193. {
  194. $json['msg'] = "Usuario criado com sucesso!";
  195. $json['suc'] = true;
  196. }
  197. }
  198.  
  199. $this->DatabaseConnection->disconnect();
  200.  
  201. return $json;
  202. }
  203.  
  204.  
  205. /*
  206. * Metodo que verifica se existe um usuario logado e personaliza as paginas de acordo
  207. * Cria um array com 8 variaveis
  208. * $suc variavel que indica se o metodo teve sucesso ou não
  209. * $msg variavel que armazena a mensagem de erro ou sucesso
  210. * $id variavel que armazena o id do usuario atual
  211. * $nome_completo variavel que armazena o nome completo do usuario atual
  212. * $nome_Usuario variavel que armazena o nome de usuario do usuario atual
  213. * $perm variavel que indica a permição que o usuario atual tem
  214. * $logado variavel que indica se existe um usuario logado atualmente
  215. * $Nome_Materia variavel que armazena os nomes das materias que o usuaio esta inscrito ou que ele é responsavel
  216.  
  217. * As variaveis $materias, $nomeMateria_P, $nomeMateria_A são variaveis auxiliares para o facilitar o acesso de tabelas diferentes no banco de dados
  218. * Verifica se a variavel $_SESSION["USuario"] esta setada
  219. * Se sim ele popula as variaveis do array com as informações do usuario logado no momento
  220. * Verifica se a permição do usuario é de professor ou maior(>2) ou se ela é de aluno ou poster(0-1)
  221. * Caso seja professor ou maior ele procura no banco de dados as materias que esse usuario é o responsavel e popula a variavel $materias
  222. * Caso seja aluno ou poster ele procura no banco de dados as materias que sse usuario é inscrito e popula a variavel $materias
  223. * Se não retorna o array com as variaveis nos valores default
  224. */
  225. public function userOn()
  226. {
  227.  
  228. $this->DatabaseConnection->connect();
  229.  
  230. $suc = false;
  231. $msg = "";
  232. $id = -1;
  233. $nome_Completo = "";
  234. $nome_Usuario = "";
  235. $perm = -1;
  236. $logado = false;
  237. $nome_Materia = array();
  238. $materias = array();
  239.  
  240.  
  241. $nome_Materia_Aux = array();
  242. $nome_Materia_P = array();
  243. $nome_Materia_A = array();
  244.  
  245. $json = array('msg'=>$msg, 'suc'=>$suc, 'logado'=>$logado, 'perm'=>$perm, 'nomeCompleto'=>$nome_Completo, 'id'=>$id, 'username'=>$nome_Usuario);
  246.  
  247. if(isset($_SESSION["Usuario"]))
  248. {
  249. $json['logado'] = true;
  250. $json['perm'] = $_SESSION["Usuario"]->getPermission();
  251. $json['nomeCompleto'] = $_SESSION["Usuario"]->getFullName();
  252. $json['id'] = $_SESSION["Usuario"]->getInternalID();
  253. $json['username'] = $_SESSION["Usuario"]->getUserName();
  254.  
  255. if($json['perm'] > 1)
  256. {
  257. $this->DatabaseConnection->executeCommand("SELECT * FROM Materias WHERE UserID = '".$json['id']."' AND Username = '".$json['username']."'");
  258.  
  259. while($val = $this->DatabaseConnection->getNextResultSetPosition())
  260. $nome_Materia_P[] = $val['NomeMateria'];
  261.  
  262. $nome_Materia = $nome_Materia_P;
  263. }
  264. else if($json['perm'] >= 0)
  265. {
  266.  
  267. $this->DatabaseConnection->executeCommand("SELECT NomeMateria FROM Materias");
  268.  
  269. while($val = $this->DatabaseConnection->getNextResultSetPosition())
  270. $nome_Materia_Aux[] = $val['NomeMateria'];
  271.  
  272.  
  273. for($i = 0;$i < sizeof($nome_Materia_Aux);$i++)
  274. {
  275.  
  276. $this->DatabaseConnection->executeCommand("SELECT * FROM ".$nome_Materia_Aux[$i]." WHERE UserID = '".$json['id']."'");
  277.  
  278. if($this->DatabaseConnection->getAffectedRows() == 1)
  279. $nome_Materia_A[] = $nome_Materia_Aux[$i];
  280.  
  281. }
  282.  
  283. $nome_Materia = $nome_Materia_A;
  284. }
  285.  
  286. $this->DatabaseConnection->executeCommand("SELECT * FROM Materias");
  287.  
  288. while($val = $this->DatabaseConnection->getNextResultSetPosition())
  289. $materias[] = $val['NomeMateria'];
  290.  
  291. $json["nomeMateria"] = $nome_Materia;
  292. $json["materias"] = $materias;
  293.  
  294. $json['suc'] = true;
  295. }
  296.  
  297. $this->DatabaseConnection->disconnect();
  298.  
  299. return $json;
  300. }
  301.  
  302.  
  303. /*
  304. * Metodo recupera a senha de um usuario
  305. * Recebe o nome do usuario, $nome_Usuario
  306. * Recebe o email do usuario, $email
  307. * Verifica no banco de dados se o nome de usuario e email estão corretos
  308. * Cria uma nova senha randomica
  309. * Armazena essa nova senha no lugar da antiga // Envia um link para o usuario escolher uma nova senha
  310. * Envia a nova senha por e-mail para o usuario em questão
  311. * O Usuario deve mudar a senha antes de um periodo X de tempo
  312. */
  313. public function userPasswordRecovery($nome_Usuario, $email)
  314. {
  315.  
  316. }
  317.  
  318.  
  319. /*
  320. * Metodo que muda a permissão de um usuario
  321. * Recebe o nome do usuario, $nome_Usuario
  322. * Recebe a nova permissão, $permissao
  323. * Verifica com o banco de dados se o nome e a permissão estão dentro dos valores corretos
  324. * Verifica se o usuario já tem a permissão escolhida
  325. * Verifica se o usuario atual tem permissão para mudar a permissão deste usuario
  326. * Verifica se o usuario é professor de alguma materia e se a nova permissão impede isso, caso impeça não muda a permissão
  327. * Se passar por todas as verificações muda a permissão do usuario para a escolhida
  328. * Retorna um array com 2 variaveis
  329. * $suc variavel que indica se o metodo teve sucesso ou não
  330. * $msg variavel que armazena a mensagem de erro ou sucesso
  331. */
  332. public function userChangePermission($nome_Usuario, $permissao)
  333. {
  334.  
  335. $this->DatabaseConnection->connect();
  336.  
  337. $suc = false;
  338. $msg = "";
  339.  
  340. $json = array('msg'=>$msg, 'suc'=>$suc);
  341.  
  342. switch ($permissao)
  343. {
  344. case ALUNO:
  345. $nome_Perm_N = "Aluno";
  346. break;
  347. case POSTER:
  348. $nome_Perm_N = "Poster";
  349. break;
  350. case PROFESSOR:
  351. $nome_Perm_N = "Professor";
  352. break;
  353. case PROFESSOR_ADMIN:
  354. $nome_Perm_N = "Professor-Admin";
  355. break;
  356. }
  357.  
  358.  
  359. if(strlen($nome_Usuario) < 3 || strlen($nome_Usuario) > 25)
  360. $json['msg'] = utf8_encode("O nome do usuário é invalido!");
  361. else if($permissao < 0 || $permissao > 3)
  362. $json['msg'] = utf8_encode("Escolha de permissão invalida");
  363. else
  364. {
  365. $nome_Usuario = $this->DatabaseConnection->escapeString($nome_Usuario);
  366.  
  367. $this->DatabaseConnection->executeCommand("SELECT * FROM Users WHERE Username = '".$nome_Usuario."'");
  368.  
  369. if($this->DatabaseConnection->getAffectedRows() == 0)
  370. $json['msg'] = utf8_encode("Esse nome de usuário não existe!");
  371. else
  372. {
  373.  
  374. $val = $this->DatabaseConnection->getNextResultSetPosition();
  375.  
  376. $perm_V = $val["Permission"];
  377.  
  378. if($permissao == $perm_V)
  379. $json['msg'] = utf8_encode("Esse usuário já possui a permissão de ".$nome_Perm_N);
  380. else
  381. {
  382.  
  383. switch ($perm_V)
  384. {
  385. case ALUNO:
  386. $nome_Perm_V = "Aluno";
  387. break;
  388. case POSTER:
  389. $nome_Perm_V = "Poster";
  390. break;
  391. case PROFESSOR:
  392. $nome_Perm_V = "Professor";
  393. break;
  394. case PROFESSOR_ADMIN:
  395. $nome_Perm_V = "Professor-Admin";
  396. break;
  397. }
  398.  
  399.  
  400. if($_SESSION["Usuario"]->getPermission() <= $perm_V)
  401. $json['msg'] = utf8_encode("Você não tem permissão para fazer alterações neste usuário!");
  402. else
  403. {
  404.  
  405. $this->DatabaseConnection->executeCommand("SELECT * FROM Materias WHERE Username = '".$nome_Usuario."'");
  406.  
  407.  
  408. if($this->DatabaseConnection->getAffectedRows() > 0)
  409. {
  410. if($permissao < 2)
  411. $json['msg'] = utf8_encode("Esse usuário é professor de alguma(s) matéria(s) sua permissão não pode ser menor do que a de professor!");
  412. }
  413. else
  414. {
  415. $this->DatabaseConnection->executeCommand("UPDATE Users SET Permission = '".$permissao."' WHERE Username = '".$nome_Usuario."'");
  416.  
  417. $json['suc'] = true;
  418. $json['msg'] = utf8_encode("A permissão do usuário ".$nome_Usuario." foi alterada de ".$nome_Perm_V." para ".$nome_Perm_N." com sucesso!");
  419. }
  420.  
  421. }
  422.  
  423. }
  424.  
  425. }
  426.  
  427. }
  428.  
  429. $this->DatabaseConnection->disconnect();
  430.  
  431. return $json;
  432. }
  433.  
  434.  
  435. /*
  436. * Metodo que muda as informações de um usuario
  437. * Recebe o nome completo, $nome_Completo
  438. * Recebe a data de nascimento, $data_Nascimento
  439. * Recebe o email, $email
  440. * Recebe o nome de usuario, $nome_Usuario
  441. * Limpa os dados recebidos
  442. * Verifica no banco de dados se o novo nome de usuario ou o email escolhido ja existem
  443. * Verifica se o nome completo e o email são validos
  444. * Verifica se a data de nascimento foi informada
  445. * Caso não atualiza o banco de dados sem a data de nascimento
  446. * Caso sim atualiza o banco de dados completo
  447. * Retorna um array com 2 variaveis
  448. * $suc variavel que indica se o metodo teve sucesso ou não
  449. * $msg variavel que armazena a mensagem de erro ou sucesso
  450. */
  451. public function userChangeInfo($nome_Completo, $data_Nascimento, $email, $nome_Usuario)
  452. {
  453. $this->DatabaseConnection->connect();
  454.  
  455. $suc = false;
  456. $msg = "";
  457.  
  458. $json = array('msg'=>$msg, 'suc'=>$suc);
  459.  
  460. $strTempNC = $nome_Completo;
  461. $strTempNC = trim($strTempNC);
  462.  
  463. $strTempE = $email;
  464. $strTempE = trim($strTempE);
  465.  
  466. $strTempNU = $nome_Usuario;
  467. $strTempNU = trim($strTempNU);
  468.  
  469. $strTempDN = $data_Nascimento;
  470. $strTempDN = trim($strTempDN);
  471.  
  472. if($strTempNC !== '' && $strTempE !== '' && $strTempNU !== '')
  473. {
  474.  
  475. $nome_Completo = $this->DatabaseConnection->escapeString($nome_Completo);
  476. $data_Nascimento = $this->DatabaseConnection->escapeString($data_Nascimento);
  477. $email = $this->DatabaseConnection->escapeString($email);
  478. $nome_Usuario = $this->DatabaseConnection->escapeString($nome_Usuario);
  479.  
  480. $this->DatabaseConnection->executeCommand("SELECT ID FROM Users WHERE Username = '".$nome_Usuario."'");
  481.  
  482. $Val = $this->DatabaseConnection->getNextResultSetPosition();
  483.  
  484. if($this->DatabaseConnection->getAffectedRows() == 0 || $Val['ID'] == $this->CurrentUser->getInternalID() )
  485. {
  486. $this->DatabaseConnection->executeCommand("SELECT ID FROM Users WHERE Email = '".$email."'");
  487.  
  488. $Val = $this->DatabaseConnection->getNextResultSetPosition();
  489.  
  490. if($this->DatabaseConnection->getAffectedRows() == 0 || $Val['ID'] == $this->CurrentUser->getInternalID())
  491. {
  492. $regex = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+";
  493. $regex .= ")*[.][A-z]{2,4}$/";
  494.  
  495. if(strlen($nome_Completo) < 4 || strlen($nome_Completo) > 64)
  496. $json['msg'] = "Nome completo deve possuir entre 4 e 64 caracteres";
  497.  
  498. else if(strlen($nome_Usuario) < 4 || strlen($nome_Usuario) > 20)
  499. $json['msg'] = "Nome de usuario deve possuir entre 4 e 16 caracteres";
  500.  
  501. else if(!preg_match($regex, $email) || strlen($email) > 128)
  502. $json['msg'] = "Endereço de e-mail invalido";
  503. else
  504. {
  505.  
  506. if($strTempDN == '')
  507. $this->DatabaseConnection->executeCommand("UPDATE Users SET NomeCompleto = '".$nome_Completo."', Email = '".$email."', Username = '".$nome_Usuario."'
  508. WHERE ID = '".$this->CurrentUser->getInternalID()."'");
  509.  
  510. else
  511. $this->DatabaseConnection->executeCommand("UPDATE Users SET NomeCompleto = '".$nome_Completo."', Email = '".$email."', Username = '".$nome_Usuario."',
  512. DataNascimento = '".$data_Nascimento."' WHERE ID = '".$this->CurrentUser->getInternalID()."'");
  513.  
  514. $this->CurrentUser->setFullName($nome_Completo);
  515. $this->CurrentUser->setUserName($nome_Usuario);
  516. $this->CurrentUser->setEmail($email);
  517.  
  518. $json['msg'] = "Informacoes alteradas com sucesso";
  519. $json['suc'] = true;
  520.  
  521. }
  522.  
  523. }
  524. else
  525. $json['msg'] = "Este email ja esta sendo usado";
  526.  
  527. }
  528. else
  529. $json['msg'] = "Este nome de usuario ja existe";
  530. }
  531. else
  532. $json['msg'] = "Todos Os campos menos a data de nascimento precisao ser preenchidos";
  533.  
  534. $this->DatabaseConnection->disconnect();
  535.  
  536. return $json;
  537. }
  538.  
  539. /*
  540. * Metodo que muda a senha do usuario
  541. * Recebe a senha nova do usuario, $senha_Nova
  542. * Recebe a senha velha do usuario, $senha_Velha
  543. * Limpa os dados recebidos
  544. * Verifica se as senhas foram informadas corretamente
  545. * Verifica se a senha velha esta correta
  546. * Verifica se a senha nova é valida
  547. * Criptografia a senha nova e atualiza o banco de dados
  548. * Retorna um array com 2 variaveis
  549. * $suc variavel que indica se o metodo teve sucesso ou não
  550. * $msg variavel que armazena a mensagem de erro ou sucesso
  551. */
  552. public function userChangePassword($senha_Nova, $senha_Velha)
  553. {
  554. $this->DatabaseConnection->connect();
  555.  
  556. $suc = false;
  557. $msg = "";
  558.  
  559. $json = array('msg'=>$msg, 'suc'=>$suc);
  560.  
  561. $strTempSV = $senha_Velha;
  562. $strTempSV = trim($strTempSV);
  563.  
  564. $strTempSN = $senha_Nova;
  565. $strTempSN = trim($strTempSN);
  566.  
  567. if($strTempSV !== '' && $strTempSN !== '')
  568. {
  569. $senha_Nova = $this->DatabaseConnection->escapeString($senha_Nova);
  570. $senha_Velha = $this->DatabaseConnection->escapeString($senha_Velha);
  571.  
  572. if(password_verify($senha_Velha, $this->CurrentUser->getPasswordHash()))
  573. {
  574. if(strlen($senha_Nova) < 6)
  575. $json['msg'] = "Senha nova invalida";
  576. else
  577. {
  578. $passwordHash = password_hash($senha_Nova, PASSWORD_DEFAULT, ['cost' => 11]);
  579. $this->DatabaseConnection->executeCommand("UPDATE Users SET Password = '".$passwordHash."' WHERE ID = '".$this->CurrentUser->getInternalID()."'");
  580.  
  581. $this->CurrentUser->setPasswordHash($senha_Nova);
  582.  
  583. $json['msg'] = "Senha alterada com sucesso";
  584. $json['suc'] = true;
  585. }
  586. }
  587. else
  588. $json['msg'] = "Senha incorreta";
  589. }
  590. else
  591. $json['msg'] = "Todos Os campos precisao ser preenchidos";
  592.  
  593. $this->DatabaseConnection->disconnect();
  594.  
  595. return $json;
  596. }
  597.  
  598.  
  599. }
  600. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement