diff src/nabble/model/ListServer.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/model/ListServer.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,698 @@
+package nabble.model;
+
+import fschmidt.util.mail.Mail;
+import fschmidt.util.mail.MailAddress;
+import fschmidt.util.mail.MailHome;
+import fschmidt.util.mail.PlainTextContent;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public abstract class ListServer {
+
+	private final static Map<String, ListServer> servers = new HashMap<String, ListServer>();
+
+	public static ListServer getServer(String type) {
+		ListServer listServer = servers.get(type);
+		return listServer==null?unknown:listServer;
+	}
+
+	public static String[] getAllServerTypes() {
+		String[] s = servers.keySet().toArray(new String[servers.keySet().size()]);
+		Arrays.sort(s);
+		return s;
+	}
+
+	private String type;
+
+	private ListServer(String type) {
+		servers.put(type, this);
+		this.type = type;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getViewName() {
+		return getType();
+	}
+
+	public abstract boolean supportsDeliveryOff();
+	public abstract boolean needsDefaults();
+	
+	abstract Mail defaultsMail(MailAddress emailAddress, String listAddress, String password);
+	abstract Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList);
+	abstract Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password);
+
+	public boolean canSubscribe() {
+		return true;
+	}
+
+	public boolean showInInitialSetup() {
+		return true;
+	}
+
+	String getEnvelopeFrom(Mail mail, MailingList mailingList) {
+		return mailingList.getSubscriberAddress().getAddrSpec();
+	}
+
+	protected Mail adminMail(MailAddress emailAddress, String adminAddress, String command) {
+		Mail mail = MailHome.newMail();
+		mail.setFrom(emailAddress);
+		mail.setTo(new MailAddress(adminAddress));
+		mail.setSentDate(new Date());
+		mail.setContent(new PlainTextContent(command));
+		return mail;
+	}
+
+	protected Mail subjectAdminMail(MailAddress emailAddress, String adminAddress, String subject) {
+		Mail mail = MailHome.newMail();
+		mail.setFrom(emailAddress);
+		mail.setTo(new MailAddress(adminAddress));
+		mail.setSentDate(new Date());
+		mail.setSubject(subject);
+		mail.setContent(new PlainTextContent(""));
+		return mail;
+	}
+
+	protected String listName(String listAddress) {
+		return listAddress.substring(0, listAddress.indexOf('@'));
+	}
+
+	protected String listDomain(String listAddress) {
+		return listAddress.substring(listAddress.indexOf('@')+1);
+	}
+
+	static abstract class Mailman extends ListServer {
+
+		protected Mailman(String type) {
+			super(type);
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, getAdminAddress(listAddress), "subscribe "+(password==null?"":password));
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, getAdminAddress(listAddress), "unsubscribe "+(password==null?"":password));
+		}
+
+		protected String getAdminAddress(String listAddress) {
+			return listAddress.replaceFirst("@", "-request@");
+		}
+	}
+
+	public static final ListServer mailman20 = new Mailman("mailman20") {
+
+		public String getViewName() {
+			return "Mailman 2.0.*";
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("set ack off ");
+			buf.append(password);
+			buf.append("\n");
+			buf.append("set nomail on ");
+			buf.append(password);
+			buf.append("\n");
+			buf.append("set notmetoo on ");
+			buf.append(password);
+			buf.append("\n");
+			buf.append("end\n");
+			return adminMail(emailAddress, getAdminAddress(listAddress), buf.toString());
+		}
+
+	};
+
+	public static final ListServer mailman21 = new Mailman("mailman21") {
+
+		public String getViewName() {
+			return "Mailman 2.1.*";
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("set authenticate ");
+			buf.append(password);
+			buf.append("\n");
+			buf.append("set delivery off\n");
+			buf.append("set ack off\n");
+			buf.append("set myposts off\n");
+			buf.append("set duplicates off\n");
+			buf.append("set reminders off\n");
+			buf.append("end\n");
+			return adminMail(emailAddress, getAdminAddress(listAddress), buf.toString());
+		}
+
+	};
+
+	public static final ListServer ezmlm = new ListServer("ezmlm") {
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			String suffix = useMainList?"-subscribe-":"-allow-subscribe-";
+			suffix += emailAddress.getAddrSpec().replace('@','=') + '@';
+			return adminMail(emailAddress, listAddress.replaceFirst("@", suffix), "");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			String suffix = "-unsubscribe-" + emailAddress.getAddrSpec().replace('@','=') + '@';
+			return adminMail(emailAddress, listAddress.replaceFirst("@", suffix), "");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer mlmmj = new ListServer("mlmmj") {
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			String suffix = useMainList?"+subscribe@":"+subscribe-nomail@";
+			return adminMail(emailAddress, listAddress.replaceFirst("@", suffix), "");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "+unsubscribe@"), "");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer yahoo = new ListServer("yahoo") {
+
+		public String getViewName() {
+			return "Yahoo! Groups";
+		}
+
+		String getEnvelopeFrom(Mail mail, MailingList mailingList) {
+			//  for yahoogroups it should be the users address
+			return mail.getFrom().getAddrSpec();
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "-subscribe@"), "");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "-unsubscribe@"), "");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "-nomail@"), "");
+		}
+
+	};
+
+	private abstract static class ListProc extends ListServer {
+
+		protected ListProc(String type) {
+			super(type);
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		public boolean showInInitialSetup() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("subscribe ");
+			buf.append(listName(listAddress));
+			buf.append(" ");
+			buf.append(emailAddress.getDisplayName());
+			return adminMail(emailAddress, "listproc@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("unsubscribe ");
+			buf.append(listName(listAddress));
+			return adminMail(emailAddress, "listproc@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("set ");
+			buf.append(listName(listAddress));
+			buf.append(" mail postpone");
+			return adminMail(emailAddress, "listproc@"+listDomain(listAddress), buf.toString());
+		}
+
+	}
+
+	// cren listproc 
+	public final static ListServer listproc = new ListProc("listproc") {
+	};
+
+	// old listproc broken - uses smtp from only
+	public final static ListServer oldlistproc = new ListProc("oldlistproc") {
+		public boolean canSubscribe() {
+			return false;
+		}
+	};
+
+	// l-soft listserv
+	public static final ListServer listserv = new ListServer("listserv") {
+
+		public String getViewName() {
+			return "LISTSERV";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		public boolean showInInitialSetup() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("subscribe ");
+			buf.append(listName(listAddress));
+			buf.append(" ");
+			buf.append("anonymous");
+			if (!useMainList)
+				buf.append(" with noack nomail norepro");
+			return adminMail(emailAddress, "listserv@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("unsubscribe ");
+			buf.append(listName(listAddress));
+			return adminMail(emailAddress, "listserv@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer lyris = new ListServer("lyris") {
+
+		public String getViewName() {
+			return "Lyris";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("join ");
+			buf.append(listName(listAddress));
+			buf.append(" ");
+			buf.append(emailAddress.getDisplayName());
+			return adminMail(emailAddress, "lyris@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("leave ");
+			buf.append(listName(listAddress));
+			return adminMail(emailAddress, "lyris@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("set ");
+			buf.append(listName(listAddress));
+			buf.append(" noack nomail norepro");
+			return adminMail(emailAddress, "lyris@"+listDomain(listAddress), buf.toString());
+		}
+
+	};
+
+	public static final ListServer listserver = new ListServer("listserver") {
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		public boolean showInInitialSetup() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, "listserver@"+listDomain(listAddress),
+					"subscribe "+listName(listAddress)
+					);
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, "listserver@"+listDomain(listAddress),
+					"unsubscribe "+listName(listAddress)
+					);
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, "listserver@"+listDomain(listAddress), "nomail "+listName(listAddress));
+		}
+
+	};
+
+	public static final ListServer communigate = new ListServer("communigate") {
+
+		public String getViewName() {
+			return "CommuniGate";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			String suffix = useMainList?"-subscribe@":"-null@";
+			return adminMail(emailAddress, listAddress.replaceFirst("@", suffix), "");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "-unsubscribe@"), "");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer smartlist = new ListServer("smartlist") {
+
+		public String getViewName() {
+			return "SmartList";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return false;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return subjectAdminMail(emailAddress, listAddress.replaceFirst("@", "-request@"), "subscribe");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return subjectAdminMail(emailAddress, listAddress.replaceFirst("@", "-request@"), "unsubscribe");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer ecartis = new ListServer("ecartis") {
+
+		public String getViewName() {
+			return "Ecartis";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return subjectAdminMail(emailAddress, "ecartis@"+listDomain(listAddress), "subscribe "+listName(listAddress));
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return subjectAdminMail(emailAddress, "ecartis@"+listDomain(listAddress), "unsubscribe "+listName(listAddress));
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			return subjectAdminMail(emailAddress, "ecartis@"+listDomain(listAddress), "set "+listName(listAddress)+" vacation");
+		}
+
+	};
+
+	public static final ListServer majordomo = new ListServer("majordomo") {
+
+		public String getViewName() {
+			return "Majordomo";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return false;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, "majordomo@"+listDomain(listAddress), "subscribe "+listName(listAddress));
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, "majordomo@"+listDomain(listAddress), "unsubscribe "+listName(listAddress));
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer majordomo2 = new ListServer("majordomo2") {
+
+		public String getViewName() {
+			return "Majordomo 2";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return false;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, "majordomo@"+listDomain(listAddress),
+					"subscribe-set-welcome "+listName(listAddress)+(useMainList?" ":" nomail,")+"noselfcopy,noackpost");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, "majordomo@"+listDomain(listAddress), "unsubscribe "+listName(listAddress));
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+	};
+
+	public static final ListServer sympa = new ListServer("sympa") {
+
+		public String getViewName() {
+			return "Sympa";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("subscribe ");
+			buf.append(listName(listAddress));
+			buf.append(" ");
+			buf.append(emailAddress.getDisplayName());
+			return adminMail(emailAddress, "sympa@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			StringBuilder buf = new StringBuilder();
+			buf.append("unsubscribe ");
+			buf.append(listName(listAddress));
+			return adminMail(emailAddress, "sympa@"+listDomain(listAddress), buf.toString());
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			String listname = listName(listAddress);
+			StringBuilder buf = new StringBuilder();
+			buf.append("set ");
+			buf.append(listname);
+			buf.append(" nomail\n");
+			buf.append("set ");
+			buf.append(listname);
+			buf.append(" not_me\n");
+			return adminMail(emailAddress, "sympa@"+listDomain(listAddress), buf.toString());
+		}
+
+	};
+
+	public static final ListServer google = new ListServer("google") {
+
+		public String getViewName() {
+			return "Google Groups";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean needsDefaults() {
+			return true;
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "+subscribe@"), "");
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			return adminMail(emailAddress, listAddress.replaceFirst("@", "+unsubscribe@"), "");
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException(); // set nomail only via google website
+		}
+
+		public boolean canSubscribe() {
+			return true;
+		}
+
+	};
+
+	private static abstract class Unsupported extends ListServer {
+
+		protected Unsupported(String type) {
+			super(type);
+		}
+
+		public boolean needsDefaults() {
+			throw new UnsupportedOperationException();
+		}
+
+		Mail subscribeMail(MailAddress emailAddress, String listAddress, String password, boolean useMainList) {
+			throw new UnsupportedOperationException();
+		}
+
+		Mail unsubscribeMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+		Mail defaultsMail(MailAddress emailAddress, String listAddress, String password) {
+			throw new UnsupportedOperationException();
+		}
+
+		public boolean canSubscribe() {
+			return false;
+		}
+
+	}
+
+	public static final ListServer websitenomail = new Unsupported("websitenomail") {
+
+		public boolean supportsDeliveryOff() {
+			return true;
+		}
+
+		public boolean showInInitialSetup() {
+			return false;
+		}
+	};
+
+	public static final ListServer websitemail = new Unsupported("websitemail") {
+
+		public boolean supportsDeliveryOff() {
+			return false;
+		}
+
+		public boolean showInInitialSetup() {
+			return false;
+		}
+
+	};
+
+	public static final ListServer unknown = new Unsupported("unknown") {
+
+		public String getViewName() {
+			return "Unknown or Other";
+		}
+
+		public boolean supportsDeliveryOff() {
+			return false;
+		}
+
+	};
+
+}