public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { String redirectFrom = StringUtils.lowerCase( ServletRequestUtils.getRequiredStringParameter(request, "redirectFrom")); Redirection redirection = redirectionDao.getRedirection(redirectFrom); if (redirection == null) { response.sendError( HttpServletResponse.SC_BAD_REQUEST, "Web address " + redirectFrom + ".subsonic.org not registered."); return; } PrintWriter writer = response.getWriter(); String url = redirection.getRedirectTo(); if (!url.endsWith("/")) { url += "/"; } writer.println(url); url = redirection.getLocalRedirectTo(); if (!url.endsWith("/")) { url += "/"; } writer.println(url); }
public void register(HttpServletRequest request, HttpServletResponse response) throws Exception { String redirectFrom = StringUtils.lowerCase( ServletRequestUtils.getRequiredStringParameter(request, "redirectFrom")); String licenseHolder = StringUtils.lowerCase( StringUtils.trimToNull( ServletRequestUtils.getStringParameter(request, "licenseHolder"))); String serverId = ServletRequestUtils.getRequiredStringParameter(request, "serverId"); String host = ServletRequestUtils.getStringParameter(request, "host", request.getRemoteAddr()); int port = ServletRequestUtils.getRequiredIntParameter(request, "port"); Integer localPort = ServletRequestUtils.getIntParameter(request, "localPort"); String localIp = ServletRequestUtils.getStringParameter(request, "localIp"); String contextPath = ServletRequestUtils.getRequiredStringParameter(request, "contextPath"); boolean trial = ServletRequestUtils.getBooleanParameter(request, "trial", false); Date now = new Date(); Date trialExpires = null; if (trial) { trialExpires = new Date(ServletRequestUtils.getRequiredLongParameter(request, "trialExpires")); } else if (licenseHolder == null) { sendError(response, "Invalid license."); } if (RESERVED_REDIRECTS.containsKey(redirectFrom)) { sendError(response, "\"" + redirectFrom + "\" is a reserved address. Please select another."); return; } if (!redirectFrom.matches("(\\w|\\-)+")) { sendError( response, "Illegal characters present in \"" + redirectFrom + "\". Please select another."); return; } URL url = new URL("http", host, port, "/" + contextPath); String redirectTo = url.toExternalForm(); String localRedirectTo = null; if (localIp != null && localPort != null) { URL localUrl = new URL("http", localIp, localPort, "/" + contextPath); localRedirectTo = localUrl.toExternalForm(); } Redirection redirection = redirectionDao.getRedirection(redirectFrom); if (redirection == null) { // Delete other redirects for same server ID. redirectionDao.deleteRedirectionsByServerId(serverId); redirection = new Redirection( 0, licenseHolder, serverId, redirectFrom, redirectTo, localRedirectTo, trial, trialExpires, now, null, 0); redirectionDao.createRedirection(redirection); LOG.info("Created " + redirection); } else { boolean sameServerId = serverId.equals(redirection.getServerId()); boolean sameLicenseHolder = licenseHolder != null && licenseHolder.equalsIgnoreCase(redirection.getLicenseHolder()); // Note: A licensed user can take over any expired trial domain. boolean existingTrialExpired = redirection.getTrialExpires() != null && redirection.getTrialExpires().before(now); if (sameServerId || sameLicenseHolder || (existingTrialExpired && !trial)) { redirection.setLicenseHolder(licenseHolder); redirection.setServerId(serverId); redirection.setRedirectFrom(redirectFrom); redirection.setRedirectTo(redirectTo); redirection.setLocalRedirectTo(localRedirectTo); redirection.setTrial(trial); redirection.setTrialExpires(trialExpires); redirection.setLastUpdated(now); redirectionDao.updateRedirection(redirection); LOG.info("Updated " + redirection); } else { sendError( response, "The web address \"" + redirectFrom + "\" is already in use. Please select another."); } } }
public void test(HttpServletRequest request, HttpServletResponse response) throws Exception { String redirectFrom = StringUtils.lowerCase(ServletRequestUtils.getStringParameter(request, "redirectFrom")); String customUrl = ServletRequestUtils.getStringParameter(request, "customUrl"); PrintWriter writer = response.getWriter(); String webAddress; String url; if (redirectFrom != null) { Redirection redirection = redirectionDao.getRedirection(redirectFrom); webAddress = redirectFrom + ".subsonic.org"; if (redirection == null) { writer.print("Web address " + webAddress + " not registered."); return; } if (redirection.getTrialExpires() != null && redirection.getTrialExpires().before(new Date())) { writer.print( "Trial period expired. Please upgrade to Subsonic Premium to activate web address."); return; } url = redirection.getRedirectTo(); } else { webAddress = customUrl; url = customUrl; } if (!url.endsWith("/")) { url += "/"; } url += "crossdomain.xml"; HttpClient client = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000); HttpConnectionParams.setSoTimeout(client.getParams(), 15000); HttpGet method = new HttpGet(url); try { HttpResponse resp = client.execute(method); StatusLine status = resp.getStatusLine(); if (status.getStatusCode() == HttpStatus.SC_OK) { String content = IOUtils.toString(resp.getEntity().getContent()); if (!content.contains("cross-domain-policy")) { String msg = webAddress + " responded, but with unexpected content."; writer.print(msg); LOG.info(msg); } else { String msg = webAddress + " responded successfully."; writer.print(msg); LOG.info(msg); } } else { String msg = webAddress + " returned HTTP error code " + status.getStatusCode() + " " + status.getReasonPhrase(); writer.print(msg); LOG.info(msg); } } catch (SSLPeerUnverifiedException x) { String msg = webAddress + " responded successfully, but could not authenticate it."; writer.print(msg); LOG.info(msg); } catch (Throwable x) { String msg = "Could not connect to " + webAddress + ". (" + x.getClass().getSimpleName() + ")"; writer.print(msg); LOG.info(msg); } finally { client.getConnectionManager().shutdown(); } }