@RequestMapping(value = "/link", method = RequestMethod.POST) public ResponseEntity<?> shortener( @RequestParam("url") String url, @RequestParam(value = "custom", required = false) String custom, @RequestParam(value = "expire", required = false) String expireDate, @RequestParam(value = "hasToken", required = false) String hasToken, @RequestParam(value = "emails[]", required = false) String[] emails, @RequestParam(value = "days", required = false) String days, HttpServletRequest request, Principal principal) throws Exception { JSONObject jn = getFreegeoip(request); String country = jn.getString("country_name"); ShortURL su = createAndSaveIfValid( url, custom, hasToken, expireDate, extractIP(request), emails, principal, country); if (su != null) { /* If there is an expire date, it sets an alert */ if (!expireDate.equals("")) { Date alertDate = processAlertDate(expireDate, days); logger.info("New alert date: " + alertDate); String mail = UrlShortenerControllerWithLogs.getOwnerMail(); Alert alert = new Alert(mail, su.getHash(), alertDate); alertRepository.save(alert); } HttpHeaders h = new HttpHeaders(); h.setLocation(su.getUri()); return new ResponseEntity<>(su, h, HttpStatus.CREATED); } else { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } }
/** * Execute the rule and return true or false. * * @param rules * @param l * @return */ public Boolean executeS(String rule, ShortURL l) { try { if (rule.contains("<")) { String[] partes = rule.split("<"); if (partes[0].equals("created")) { if (l.getCreated().before(new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) { return true; } else { return false; } } else if (partes[0].equals("expire")) { if (l.getExpire().before(new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) { return true; } else { return false; } } else if (partes[0].equals("token")) { return null; } else if (partes[0].equals("country")) { return null; } else if (partes[0].equals("clicks")) { if (clickRepository.clicksByHash(l.getHash(), null, null, null, null, null, null) < Long.valueOf(partes[1])) { return true; } else { return false; } } return null; } else if (rule.contains(">")) { String[] partes = rule.split(">"); if (partes[0].equals("created")) { if (l.getCreated().after(new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) { return true; } else { return false; } } else if (partes[0].equals("expire")) { if (l.getExpire().after(new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) { return true; } else { return false; } } else if (partes[0].equals("token")) { return null; } else if (partes[0].equals("country")) { return null; } else if (partes[0].equals("clicks")) { if (clickRepository.clicksByHash(l.getHash(), null, null, null, null, null, null) > Long.valueOf(partes[1])) { return true; } else { return false; } } return null; } else if (rule.contains("==")) { String[] partes = rule.split("=="); if (partes[0].equals("created")) { if (l.getCreated().compareTo((new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) == 0) { return true; } else { return false; } } else if (partes[0].equals("expire")) { if (l.getExpire().compareTo((new SimpleDateFormat("yyyy-MM-dd").parse(partes[1]))) == 0) { return true; } else { return false; } } else if (partes[0].equals("token")) { if (partes[1].equals("true")) { return l.getToken() != null; } else if (partes[1].equals("false")) { return l.getToken() == null; } else { return false; } } else if (partes[0].equals("country")) { return l.getCountry().equals(partes[1]); } else if (partes[0].equals("clicks")) { if (clickRepository.clicksByHash(l.getHash(), null, null, null, null, null, null) == Long.valueOf(partes[1])) { return true; } else { return false; } } return null; } else { return null; } } catch (Exception e) { return null; } }
@RequestMapping(value = "/{id:(?!link|index|profile).*}", method = RequestMethod.GET) public Object redirectTo( @PathVariable String id, @RequestParam(value = "token", required = false) String token, HttpServletResponse response, HttpServletRequest request, Model model) { logger.info("Requested redirection with hash " + id); ShortURL l = shortURLRepository.findByHash(id); logger.info("su: " + l); logger.info(l == null ? "null" : "not null"); if (l != null) { /* * Check Token */ if (l.getToken() != null && (token == null || !l.getToken().equals(token))) { /* * Wrong Token */ response.setStatus(HttpStatus.BAD_REQUEST.value()); throw new CustomException("400", "It is need a token"); } else { Date d = new Date(System.currentTimeMillis()); if (l.getExpire() != null && d.after(l.getExpire())) { /* * Date has expired */ response.setStatus(HttpStatus.BAD_REQUEST.value()); throw new CustomException("400", "Link has expired"); } else { ArrayList<String> rules = l.getRules(); if (rules != null && !rules.isEmpty()) { /* * Execute javascript */ for (int i = 0; i < rules.size(); i++) { Boolean resul = executeS(rules.get(i), l); if (resul != null) { if (resul == true) { response.setStatus(HttpStatus.BAD_REQUEST.value()); throw new CustomException("400", "Link has expired"); } } else { response.setStatus(HttpStatus.BAD_REQUEST.value()); throw new CustomException("400", "Bad rule"); } } } List<String> authorizedMails = l.getAllowedUsers(); if (authorizedMails != null && !authorizedMails.isEmpty()) { if (!authentication(authorizedMails)) { request.getSession().setAttribute("redirect", id); // model.addAttribute("hash", id); return "login_special"; } } createAndSaveClick(id, request); long click = clickRepository.clicksByHash(l.getHash(), null, null, null, null, null, null); /* Data from countries */ DBObject groupObject = clickRepository.getClicksByCountry(id, null, null).getRawResults(); String list = groupObject.get("retval").toString(); String countryData = StatsController.processCountryJSON(list); /* Data from cities */ DBObject groupObjectCity = clickRepository .getClicksByCity(id, null, null, null, null, null, null) .getRawResults(); String listCities = groupObjectCity.get("retval").toString(); String cityData = StatsController.processCityJSON(listCities); WebSocketsData wb = new WebSocketsData(false, click, countryData, cityData); this.template.convertAndSend("/topic/" + id, wb); return createSuccessfulRedirectToResponse(l); } } } else { response.setStatus(HttpStatus.BAD_REQUEST.value()); throw new CustomException("400", "BAD_REQUEST\nURL SHORTENED DOESN'T EXISTS"); } }