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