view src/nabble/view/web/more/ForumStart.jtp @ 47:72765b66e2c3

remove mailing list code
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 18 Jun 2021 17:44:24 -0600
parents 40e282462f2e
children
line wrap: on
line source

<%
package nabble.view.web.more;

import fschmidt.db.DbDatabase;
import fschmidt.util.mail.MailAddress;
import fschmidt.util.servlet.CanonicalUrl;
import nabble.model.Db;
import nabble.model.Message;
import nabble.model.ModelException;
import nabble.model.ModelHome;
import nabble.model.Site;
import nabble.model.User;
import nabble.model.Init;
import nabble.naml.compiler.Template;
import nabble.naml.compiler.TemplatePrintWriter;
import nabble.naml.namespaces.BasicNamespace;
import nabble.view.lib.Jtp;
import nabble.view.lib.NewSiteMail;
import nabble.view.lib.Permissions;
import nabble.view.lib.Shared;
import nabble.view.lib.UrlMappable;
import nabble.view.lib.Recaptcha;
import nabble.view.web.app.Languages;
import nabble.view.web.template.NabbleNamespace;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public final class ForumStart extends HttpServlet implements UrlMappable, CanonicalUrl {
	private static final Logger logger = LoggerFactory.getLogger(ForumStart.class);

	private static final Pattern URL_PATTERN = Pattern.compile("/free-(forum|gallery|newspaper|blog)\\.html$");

	public static String url(String what) {
		return Jtp.defaultContextUrl() + path(what);
	}

	public static String path(String what) {
		return "/free-" + what + ".html";
	}

	public String getCanonicalUrl(HttpServletRequest request) {
		return url( request.getParameter("what") );
	}

	public Map<String,String[]> getParameterMapFromUrl(HttpServletRequest request,String mappedUrl) {
		Matcher m = URL_PATTERN.matcher(mappedUrl);
		if( !m.find() )
			throw new RuntimeException();
		Map<String,String[]> params = new HashMap<String,String[]>();
		String what = m.group(1);
		params.put("what",new String[]{what});
		return params;
	}

	public Pattern getUrlPattern() {
		return URL_PATTERN;
	}

	protected void service(HttpServletRequest request,HttpServletResponse response)
		throws ServletException, IOException
	{
		build(request, response, Collections.<String,String>emptyMap(), Collections.<String,String>emptyMap());
	}

	private static void build(HttpServletRequest request,HttpServletResponse response, Map<String,String> values, Map<String,String> errors)
		throws ServletException, IOException
	{
		PrintWriter out = response.getWriter();
		String what = request.getParameter("what");
		if (what == null)
			what = "Forum";
		else
			what = Jtp.capitalize(what);

		String imgName = what.toLowerCase();

		%>
		<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
		<html>
			<head>
				<% Shared.head(request,response); %>
				<title>Nabble - Free <%=what%> Setup</title>
				<meta name="robots" content="noindex"/>
				<META NAME="description" CONTENT="Setting up a free <%=what.toLowerCase()%> on Nabble is quick and easy. Fill in one simple form and you are done.">
				<META NAME="keywords" CONTENT="free <%=what.toLowerCase()%>, hosted <%=what.toLowerCase()%>, simple, embeddable <%=what.toLowerCase()%>, customizable">
				<style type="text/css">
					div.center-content {
						margin: 0px auto;
						margin-bottom: 3em;
					}
					td.column1 {
						text-align: right;
						width: 7em;
						white-space: nowrap;
					}
					input[type=text],input[type=password] {
						padding: .4em 0;
					}
					div.field-title {
						margin-top: .3em;
					}
					.important {
						font-weight: bold;
					}
					label {
						vertical-align: -15%;
					}
					#submit-btn {
						padding: .5em .8em;
						font-size: 110%;
						font-weight: bold;
					}
				</style>
				<script type="text/javascript">

					function singleFormSubmit(f) {
						if (f.done)
							return false;
						f.done = true;
						$('#submit-btn').hide();
						var $div = $('#wait-message');
						function loading1() { $div.fadeTo(300,0.3,loading2);  };
						function loading2() { $div.fadeTo(300,1,loading1);  };
						loading1();
						return true;
					};

				</script>
				<%= Recaptcha.JS %>
			</head>
			<body style="text-align:center">
				<% Shared.minHeaderGlobal(request,response); %>

				<div class="center-content">
					<img src="/images/logo_nabble_home.png" border="0" alt="Nabble - free forums for everyone"/><br />
					<h1 style="color:#979797">Start Your <%=what%></h1>

					<% if (errors.size() > 0) { %>
						<div class="error-message important" style="margin:1em;padding:.5em 0">
							<% String generic = errors.get("generic"); %>
							<%=generic != null? generic : errors.size() > 0? "Please check the errors below" : ""%>
						</div>
					<% } %>

					<form action="/more/ForumStart$Save.jtp" method="post" accept-charset="UTF-8" onsubmit="return singleFormSubmit(this)">
						<input type="hidden" name="type" value="<%=what.toLowerCase().replace(" ","")%>" />
						<input type="hidden" name="what" value="<%=what%>" />

						<div style="text-align:left;width:50em;margin:0 auto">
							<div style="border-bottom:2px solid #eeeeee;padding:1em">
								<div class="weak-color" style="width:12em;text-align:center;float:left">
									<div style="font-weight:bold">Account</div>
									<img src="/images/account.png" width="84" height="45"/>
									<div style="margin-top:1em;font-size:80%">
										You will receive an email with a link to activate your account
									</div>
								</div>
								<table>
									<tr>
										<td class="column1"><div class="second-font field-title">User Name</div></td>
										<td><input type="text" autofocus size="35" maxlength="30" name="username" value="<%=Jtp.hideNull(values.get("username"))%>" /></td>
										<td class="important"><%=errors.containsKey("username")? errors.get("username"):""%></td>
									</tr>
									<tr>
										<td class="column1"><div class="second-font field-title">Email</div></td>
										<td><input type="text" size="35" maxlength="60" name="email" value="<%=Jtp.hideNull(values.get("email"))%>"/></td>
										<td class="important"><%=errors.containsKey("email")? errors.get("email"):""%></td>
									</tr>
									<tr>
										<td class="column1"><div class="second-font field-title">Password</div></td>
										<td><input type="password" size="35" maxlength="15" name="password" value="<%=Jtp.hideNull(values.get("password"))%>"/></td>
										<td class="important"><%=errors.containsKey("password")? errors.get("password"):""%></td>
									</tr>
									<tr>
										<td class="column1"><input type="checkbox" id="terms" name="terms" value="y" <%="y".equals(values.get("terms"))?"checked":""%> /></td>
										<td colspan=2><label for="terms">I have read and I agree to Nabble's <a href="<%=Jtp.termsUrl(true)%>">Terms of Use</a>.</label></td>
									</tr>
								</table>
							</div>

							<div style="padding:1em;overflow:hidden">
								<div class="weak-color" style="width:12em;text-align:center;float:left;height:15em">
									<div style="font-weight:bold"><%=what%></div>
									<img src="/images/homepage/<%=imgName%>.png" alt="Free <%=what.toLowerCase()%>">
								</div>
								<table>
									<tr>
										<td class="column1"><div class="second-font field-title">Language</div></td>
										<td>
											<select name="lang">
												<% for( Map.Entry<String,String> entry : Languages.languages.entrySet() ) { %>
												<% String lang = request.getParameter("lang"); %>
												<% boolean isEnglish = entry.getKey().equals("none"); %>
												<% boolean isSelected = (lang == null && isEnglish) || entry.getKey().equals(lang); %>
												<option value="<%=entry.getKey()%>" <%=isSelected?"selected=\"true\"":""%>><%=entry.getValue()%></option>
												<% } %>
											</select>
										</td>
										<td></td>
									</tr>
									<tr>
										<td colspan="3" style="height:.6em"></td>
									</tr>
									<tr>
										<td class="column1"><div class="second-font field-title"><%=what%> Name</div></td>
										<td><input type="text" name="subject" size="30" maxlength="80" value="<%=Jtp.hideNull(values.get("subject"))%>"/></td>
										<td class="important"><%=errors.containsKey("subject")? errors.get("subject"):""%></td>
									</tr>
									<tr>
										<td colspan=3 style="padding:.4em 0 0 .6em">
											<div class="second-font field-title">Description &nbsp;<span class="weak-color" style="font-weight:normal;">(optional)</span></div>
											<textarea rows="7" name="message" wrap="SOFT" style="width:28em"><%=Jtp.hideNull(values.get("message"))%></textarea>
											<br><%= Recaptcha.DIV %>
										</td>
									</tr>
								</table>
							</div>
							<div class="weak-color" style="margin-top:.5em;text-align:center;">
								<input id="submit-btn" type="submit" value="Create <%=what%>" />
								<div id="wait-message" class="important invisible" style="margin:.1em 0">Creating <%=what%>... Please wait</div>
							</div>
						</div>
                    </form>
				</div>

				<% Shared.footer(request,response); %>
				<% Shared.analytics(request,response); %>
			</body>
		</html>
		<%
	}


	private static final String newSitePassword = (String)Init.get("new_site_password");

	public static class Save extends HttpServlet {

		private static String get(String name, HttpServletRequest request) {
			String s = request.getParameter(name);
			return s == null ? null : s.trim();
		}

		protected void service(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException
		{
			String username = get("username", request);
			String email = get("email", request);
			String password = get("password", request);
			boolean agreed = "y".equals(get("terms", request));
			String subject = get("subject", request);
			String message = get("message", request);

			Map<String,String> errors = new HashMap<String,String>();
			if (username == null || username.trim().length() == 0)
				errors.put("username", "required");
			if (email == null || email.length() == 0)
				errors.put("email", "required");
			else if (!new MailAddress(email).isValid())
				errors.put("email", "invalid email");
			if (password == null || password.length() < 4)
				errors.put("password", "too short");
			if (!agreed)
				errors.put("generic", "You must agree to the Terms and Conditions");
			if (subject == null || subject.length() == 0)
				errors.put("subject", "required");

			String type = get("type", request);
			type = "newspaper".equals(type)? "news" : type;

			if (errors.isEmpty()) {
				if( newSitePassword!=null && !newSitePassword.equals(password) ) {
					logger.info("ignoring "+email);
					return;
				}

				DbDatabase db = Db.dbGlobal();
				db.beginTransaction();
				try {
					Recaptcha.check(request);
					Site site = ModelHome.newSite(type,subject, message, Message.Format.TEXT, email, username);
					Permissions.addToGroup( (User)site.getRootNode().getOwner(), Permissions.ADMINISTRATORS_GROUP );
					String key = site.newRegistration(email,password,username,"/");
					db.commitTransaction();

					// Track spam activities by IP
					ModelHome.setRemoteAddr(site, Jtp.getClientIpAddr(request));

					site = site.getGoodCopy();

					String lang = request.getParameter("lang");
					if (!"none".equals(lang)) {
						site.setModuleEnabled(lang, true);
						site = site.getGoodCopy();
					}

					sendRegisterMail(site, email, key);
					NewSiteMail.send(site, request, response);
					response.sendRedirect(site.getBaseUrl()+"/more/ForumStart$Redirection.jtp");
					return;
				} catch(ModelException e) {
					errors.put("generic", e.getMessage());
				} finally {
					db.endTransaction();
				}
			}

			Map<String,String> values = new HashMap<String,String>();
			values.put("username", username);
			values.put("email", email);
			values.put("password", password);
			values.put("terms", agreed?"y":"");
			values.put("subject", subject);
			values.put("message", message);
			build(request, response, values, errors);
		}
	}

	/** Sets cookies in the site domain  */
	public static class Redirection extends HttpServlet {

		protected void service(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException
		{
			Site site = Jtp.getSite(request);
			Shared.javascriptRedirect(request, response, Jtp.url(site.getRootNode()), "Nabble.setVar('appnotice','true');");
		}
	}

	public static void sendRegisterMail(Site site, String email, String key) {
		Map<String,Object> args = new HashMap<String,Object>();
		args.put("email",email);
		args.put("next_url","/");
		args.put("key",key);
		Template template = site.getTemplate( "send_registration_email",
			BasicNamespace.class, NabbleNamespace.class
		);
		template.run( TemplatePrintWriter.NULL, args,
			new BasicNamespace(template), new NabbleNamespace(site)
		);
	}
}
%>