view 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 source

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;
		}

	};

}