Advertisement
Guest User

Untitled

a guest
Aug 24th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.79 KB | None | 0 0
  1. package lapr.project.model;
  2.  
  3. import java.io.Serializable;
  4. import java.math.BigInteger;
  5. import java.util.*;
  6. import javax.xml.parsers.*;
  7. import lapr.project.utils.*;
  8. import org.w3c.dom.*;
  9.  
  10. public class Utilizador implements Importable<Utilizador>, Exportable, Serializable {
  11.  
  12. private static final String ROOT_ELEMENT_NAME = "utilizador";
  13. private static final String NOME_ELEMENT_NAME = "nome";
  14. private static final String USERNAME_ELEMENT_NAME = "username";
  15. private static final String PASS_ELEMENT_NAME = "password";
  16. private static final String EMAIL_ELEMENT_NAME = "email";
  17. private static final String CONFIRMADO_ELEMENT_NAME = "confirmado";
  18. private static final String SHIFT_ELEMENT_NAME = "shift";
  19. private static final String KEYWORD_ELEMENT_NAME = "keyword";
  20.  
  21. /**
  22. * Variável que guarda o nome do utilizador.
  23. */
  24. private String nome;
  25.  
  26. /**
  27. * Variável que guarda o username do utilizador.
  28. */
  29. private String username;
  30.  
  31. /**
  32. * Variável que guarda a password do utilizador.
  33. */
  34. private String password;
  35.  
  36. /**
  37. * Variável que guarda o email do utilizador.
  38. */
  39. private String email;
  40.  
  41. /**
  42. * Variável que guarda a keyword do utilizador.
  43. */
  44. private String keyword;
  45.  
  46. /**
  47. * Utilzzador confirmado.
  48. */
  49. private boolean confirmado;
  50.  
  51. /**
  52. *
  53. */
  54. private int shift;
  55.  
  56. /**
  57. * Construtor de um Utilizador sem parâmetros.
  58. */
  59. public Utilizador() {
  60. nome = "";
  61. username = "";
  62. email = "";
  63. keyword = "";
  64. confirmado = false;
  65. this.shift = (new Random()).nextInt(20) + 5;
  66. }
  67.  
  68. /**
  69. * Método que permite modificar o nome do utilizador, recebendo o novo como
  70. * parâmetro.
  71. *
  72. * @param strNome novo nome
  73. */
  74. public void setNome(String strNome) {
  75. this.nome = strNome;
  76. }
  77.  
  78. /**
  79. * Método que devolve a password.
  80. *
  81. * @return password
  82. */
  83. public String getPassword() {
  84. return this.password;
  85. }
  86.  
  87. /**
  88. * Método que permite modificar a password do utilizador, recebendo a nova
  89. * como parâmetro.
  90. *
  91. * @param password nova password
  92. */
  93. public void setPassword(String password) {
  94. this.password = encryptPassword(password);
  95. }
  96.  
  97. public String encryptPassword(String password) {
  98. char[] chars = password.toCharArray();
  99. for (int i = 0; i < chars.length; i++) {
  100. chars[i] += shift;
  101. }
  102. return new String(chars);
  103. }
  104.  
  105. /**
  106. * Método que permite modificar o email do utilizador, recebendo o novo como
  107. * parâmetro.
  108. *
  109. * @param strEmail novo email
  110. */
  111. public void setEmail(String strEmail) {
  112. this.email = strEmail;
  113. }
  114.  
  115. /**
  116. * Método que permite modificar o username do utilizador, recebendo o novo
  117. * como parâmetro.
  118. *
  119. * @param username novo username
  120. */
  121. public void setUsername(String username) {
  122. this.username = username;
  123. }
  124.  
  125. /**
  126. * Método que permite modificar a keyword do utilizador, recebendo a nova
  127. * como parâmetro.
  128. *
  129. * @param keyword nova keyword
  130. */
  131. public void setKeyword(String keyword) {
  132. this.keyword = keyword;
  133. }
  134.  
  135. /**
  136. * Método que devolve o email do utilizador.
  137. *
  138. * @return email
  139. */
  140. public String getEmail() {
  141. return email;
  142. }
  143.  
  144. /**
  145. * Método que devolve o nome do utilizador.
  146. *
  147. * @return nome
  148. */
  149. public String getNome() {
  150. return nome;
  151. }
  152.  
  153. /**
  154. * Método que devolve o username do utilizador.
  155. *
  156. * @return username
  157. */
  158. public String getUsername() {
  159. return username;
  160. }
  161.  
  162. /**
  163. * Método que devolve a keyword do utilizador.
  164. *
  165. * @return keyword
  166. */
  167. public String getKeyword() {
  168. return keyword;
  169. }
  170.  
  171. /**
  172. * Método que valida o nome, email e username do utilizador.
  173. *
  174. * @return boolean com resultado da validação
  175. */
  176. public boolean valida() {
  177. return validaNome() && validaEmail() && validaUsername();
  178. }
  179.  
  180. /**
  181. * Método que valida o nome do utilizador.
  182. *
  183. * @return boolean com resultado da validação
  184. */
  185. private boolean validaNome() {
  186. if (nome.isEmpty()) {
  187. return false;
  188. }
  189. String specialChars = "\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF";
  190. //return nome.matches("[a-z A-Z" + specialChars + "]*");
  191. return nome.matches("[a-z 0-9A-Z" + specialChars + "]*");
  192. }
  193.  
  194. /**
  195. * Método que valida o email do utilizador.
  196. *
  197. * @return boolean com resultado da validação
  198. */
  199. private boolean validaEmail() {
  200. if (email.isEmpty()) {
  201. return false;
  202. }
  203. return email.matches("(([a-z0-9!#$%&'*+-/=?^_`{|}~]+)|([a-z0-9!#$%&'*+-/=?^_`{|}~]+.[a-z0-9!#$%&'*+-/=?^_`{|}~]+))@[a-z]+([.][a-z]+)+");
  204. }
  205.  
  206. /**
  207. * Método que valida a password do utilizador.
  208. *
  209. * @param password password do utilizador
  210. * @return boolean com resultado da validação
  211. */
  212. public static boolean validaPassword(String password) {
  213. if (password.isEmpty()) {
  214. return false;
  215. }
  216. return password.matches("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[,.-;:])(?!.*\\s).{4,7}$");
  217. }
  218.  
  219. /**
  220. * Método que valida o username do utilizador.
  221. *
  222. * @return boolean com resultado da validação
  223. */
  224. private boolean validaUsername() {
  225. if (username.isEmpty()) {
  226. return false;
  227. }
  228. //return username.matches("[a-zA-Z0-9_]{4,}");
  229. return username.matches("[a-zA-Z0-9_@.]{4,}");
  230. }
  231.  
  232. /**
  233. * Método que compara password.
  234. *
  235. * @param password password encriptada
  236. * @return boolean com resultado da comparação
  237. */
  238. public boolean comparaPassword(String password) {
  239. String encrypted = encryptPassword(password);
  240. return encrypted.equals(this.password);
  241. }
  242.  
  243. /**
  244. * Método que devolve a deslocação dos caracteres para a encriptação dos
  245. * dados.
  246. *
  247. * @return shift
  248. */
  249. public int getShift() {
  250. return shift;
  251. }
  252.  
  253. /**
  254. * Método responsável pela encriptação do shift.
  255. *
  256. * @param i
  257. * @return shift encriptado
  258. */
  259. public int encryptShift(int i) {
  260. BigInteger num = BigInteger.valueOf(i);
  261. num = num.setBit(7);
  262. return num.intValue();
  263. }
  264.  
  265. /**
  266. * Método que descriptografa o shift.
  267. *
  268. * @param i
  269. * @return shift descriptografado
  270. */
  271. public int decryptShift(int i) {
  272. BigInteger num = BigInteger.valueOf(i);
  273. num = num.clearBit(7);
  274. return num.intValue();
  275. }
  276.  
  277. /**
  278. * Método que descriptografa a keyword lida por ficheiro
  279. *
  280. * @param word
  281. * @return keyword descriptografada
  282. */
  283. public String decrypt(String word) {
  284. char[] chars = word.toCharArray();
  285. for (int i = 0; i < chars.length; i++) {
  286. chars[i] -= shift;
  287. }
  288. return new String(chars);
  289. }
  290.  
  291. /**
  292. * Método que permite alterar a deslocação dos caracteres para a encriptação
  293. * dos dados.
  294. *
  295. * @param shift shift
  296. */
  297. public void setShift(int shift) {
  298. this.shift = shift;
  299. }
  300.  
  301. /**
  302. * Método que permite a confirmação do utilizador.
  303. */
  304. public void confirmar() {
  305. this.confirmado = true;
  306. }
  307.  
  308. /**
  309. * Método que indica que o utilizador está confirmado.
  310. *
  311. * @return confirmado
  312. */
  313. public boolean isConfirmado() {
  314. return confirmado;
  315. }
  316.  
  317. /**
  318. * Método que encripta o username e o email
  319. *
  320. * @param data dados
  321. * @return username e email encriptados
  322. */
  323. public String encryptData(String data) {
  324. List<Character> alphabet = getAlphabet();
  325. char[] chars = data.toCharArray();
  326. for (int i = 0; i < chars.length; i++) {
  327. if (chars[i] >= 'a' && chars[i] <= 'z') {
  328. chars[i] = alphabet.get(chars[i] - 'a');
  329. chars[i] += shift;
  330. } else if (chars[i] >= 'A' && chars[i] <= 'Z') {
  331. chars[i] = (char) (alphabet.get(chars[i] - 'A'));
  332. chars[i] -= 'a' - 'A';
  333. chars[i] += shift;
  334. } else {
  335. chars[i] += shift;
  336. }
  337. }
  338. return new String(chars);
  339. }
  340.  
  341. /**
  342. * Método que descriptografa o username e o email.
  343. *
  344. * @param data
  345. * @return username e email descriptografados
  346. */
  347. public String decryptData(String data) {
  348. List<Character> alphabet = getAlphabet();
  349. char[] chars = data.toCharArray();
  350. for (int i = 0; i < chars.length; i++) {
  351. chars[i] -= shift;
  352. if (chars[i] >= 'a' && chars[i] <= 'z') {
  353. chars[i] = (char) (alphabet.indexOf(chars[i]) + 'a');
  354. } else if (chars[i] >= 'A' && chars[i] <= 'Z') {
  355. chars[i] -= 'A';
  356. chars[i] = (char) (alphabet.indexOf(chars[i]));
  357. chars[i] += ('a' - 'A');
  358. }
  359. }
  360. return new String(chars);
  361. }
  362.  
  363. /**
  364. * Método que devolve o alfabeto da encriptação.
  365. *
  366. * @return alfabeto encriptação
  367. */
  368. public List<Character> getAlphabet() {
  369. char[] keyChars = keyword.toCharArray();
  370. List<Character> list = new ArrayList<>();
  371. for (char c : keyChars) {
  372. list.add(c);
  373. }
  374. for (int i = 'a'; i <= 'z'; i++) {
  375. char ch = (char) i;
  376. if (!list.contains(ch)) {
  377. list.add(ch);
  378. }
  379. }
  380. return list;
  381. }
  382.  
  383. /**
  384. * Método que compara usernames ou emails do utilizador.
  385. *
  386. * @param obj
  387. * @return boolean com resultado da comparação
  388. */
  389. @Override
  390. public boolean equals(Object obj) {
  391. if (this == obj) {
  392. return true;
  393. }
  394. if (obj instanceof Utilizador) {
  395. Utilizador ut = (Utilizador) obj;
  396. return ut.username.equals(this.username) || ut.email.equals(this.email);
  397. }
  398. return false;
  399. }
  400.  
  401. /**
  402. * Método de alteração do código de hash para garantir códigos diferentes
  403. * para objetos diferentes.
  404. *
  405. * @return hash
  406. */
  407. @Override
  408. public int hashCode() {
  409. int hash = 7;
  410. hash = 79 * hash + Objects.hashCode(this.nome);
  411. hash = 79 * hash + Objects.hashCode(this.username);
  412. hash = 79 * hash + Objects.hashCode(this.password);
  413. hash = 79 * hash + Objects.hashCode(this.email);
  414. hash = 79 * hash + (this.confirmado ? 1 : 0);
  415. return hash;
  416. }
  417.  
  418. /**
  419. *
  420. * @param id
  421. * @return
  422. */
  423. public boolean hasID(String id) {
  424. return this.getUsername().equals(id) || this.getEmail().equals(id);
  425. }
  426.  
  427. /**
  428. * Devolve a descrição textual do utilizador.
  429. *
  430. * @return username
  431. */
  432. @Override
  433. public String toString() {
  434. return username;
  435. }
  436.  
  437. /**
  438. * Método que apresenta a informação do utilizador.
  439. *
  440. * @return
  441. */
  442. public String getInfo() {
  443. StringBuilder sb = new StringBuilder();
  444. sb.append("Nome: ").append(nome).append("\n");
  445. sb.append("Username: ").append(username).append("\n");
  446. sb.append("Email: ").append(email).append("\n");
  447. return sb.toString();
  448. }
  449.  
  450. /**
  451. * Exporta o conteúdo para um nó de XML.
  452. *
  453. * @return nó de texto contendo os dados referentes ao objeto
  454. */
  455. @Override
  456. public Node exportContentToXMLNode() {
  457. Node rootNode = null;
  458.  
  459. try {
  460. DocumentBuilderFactory factory
  461. = DocumentBuilderFactory.newInstance();
  462. //Create document builder
  463. DocumentBuilder builder = factory.newDocumentBuilder();
  464.  
  465. //Obtain a new document
  466. Document document = builder.newDocument();
  467.  
  468. Element elementUtilizador = document.createElement(ROOT_ELEMENT_NAME);
  469.  
  470. Element elementNome = document.createElement(NOME_ELEMENT_NAME);
  471. elementNome.setTextContent(nome);
  472. elementUtilizador.appendChild(elementNome);
  473.  
  474. Element elementUsername = document.createElement(USERNAME_ELEMENT_NAME);
  475. elementUsername.setTextContent(encryptData(username));
  476. elementUtilizador.appendChild(elementUsername);
  477.  
  478. Element elementEmail = document.createElement(EMAIL_ELEMENT_NAME);
  479. elementEmail.setTextContent(encryptData(email));
  480. elementUtilizador.appendChild(elementEmail);
  481.  
  482. Element elementConfirmado = document.createElement(CONFIRMADO_ELEMENT_NAME);
  483. elementConfirmado.setTextContent(Boolean.toString(confirmado));
  484. elementUtilizador.appendChild(elementConfirmado);
  485.  
  486. Element elementPassword = document.createElement(PASS_ELEMENT_NAME);
  487. elementPassword.setTextContent(password);
  488. elementUtilizador.appendChild(elementPassword);
  489.  
  490. Element elementShift = document.createElement(SHIFT_ELEMENT_NAME);
  491. elementShift.setTextContent(Integer.toString(encryptShift(shift)));
  492. elementUtilizador.appendChild(elementShift);
  493.  
  494. Element elementKey = document.createElement(KEYWORD_ELEMENT_NAME);
  495. elementKey.setTextContent(encryptPassword(keyword));
  496. elementUtilizador.appendChild(elementKey);
  497.  
  498. //Add root element to document
  499. document.appendChild(elementUtilizador);
  500.  
  501. //It exports only the element representation to XMÇ, ommiting the XML header
  502. rootNode = elementUtilizador;
  503.  
  504. } catch (ParserConfigurationException e) {
  505. e.printStackTrace();
  506. throw new RuntimeException(e);
  507. }
  508. return rootNode;
  509. }
  510.  
  511. /**
  512. * Importa o conteúdo de um nó de XML.
  513. *
  514. * @param node
  515. * @return o objeto se importar; caso contrário dá erro.
  516. */
  517. @Override
  518. public Utilizador importContentFromXMLNode(Node node) {
  519. try {
  520. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  521.  
  522. //Create document builder
  523. DocumentBuilder builder = factory.newDocumentBuilder();
  524.  
  525. //Obtain a new document
  526. Document document = builder.newDocument();
  527. document.appendChild(document.importNode(node, true));
  528.  
  529. NodeList elementsUtilizador = document.getElementsByTagName(ROOT_ELEMENT_NAME);
  530.  
  531. Node elementUtilizador = elementsUtilizador.item(0);
  532.  
  533. this.shift = decryptShift(Integer.parseInt(elementUtilizador.getChildNodes().item(5).getTextContent()));
  534. this.keyword = decrypt(elementUtilizador.getChildNodes().item(6).getTextContent());
  535. this.nome = elementUtilizador.getChildNodes().item(0).getTextContent();
  536. this.username = decryptData(elementUtilizador.getChildNodes().item(1).getTextContent());
  537. this.email = decryptData(elementUtilizador.getChildNodes().item(2).getTextContent());
  538. this.confirmado = Boolean.valueOf(elementUtilizador.getChildNodes().item(3).getTextContent());
  539. this.password = elementUtilizador.getChildNodes().item(4).getTextContent();
  540.  
  541. } catch (ParserConfigurationException e) {
  542. e.printStackTrace();
  543. throw new RuntimeException(e);
  544. }
  545.  
  546. return this;
  547. }
  548.  
  549. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement