Mercurial Hosting > nabble
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; } }; }