[CalendarServer-changes] [13967] CalendarServer/trunk/calendarserver/tap

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 16 12:33:31 PDT 2014


Revision: 13967
          http://trac.calendarserver.org//changeset/13967
Author:   sagen at apple.com
Date:     2014-09-16 12:33:31 -0700 (Tue, 16 Sep 2014)
Log Message:
-----------
Pre-flight the APNS certificates, and the EnableCalDAV/EnableCardDAV values.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tap/caldav.py
    CalendarServer/trunk/calendarserver/tap/util.py

Modified: CalendarServer/trunk/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/caldav.py	2014-09-16 02:00:47 UTC (rev 13966)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py	2014-09-16 19:33:31 UTC (rev 13967)
@@ -428,15 +428,6 @@
 
     def checkConfiguration(self):
 
-        # Having CalDAV *and* CardDAV both disabled is an illegal configuration
-        # for a running server (but is fine for command-line utilities)
-        if config.ProcessType not in ["Agent", "Utility"]:
-            if not config.EnableCalDAV and not config.EnableCardDAV:
-                print(
-                    "Neither EnableCalDAV nor EnableCardDAV are set to True."
-                )
-                sys.exit(1)
-
         uid, gid = None, None
 
         if self.parent["uid"] or self.parent["gid"]:

Modified: CalendarServer/trunk/calendarserver/tap/util.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/util.py	2014-09-16 02:00:47 UTC (rev 13966)
+++ CalendarServer/trunk/calendarserver/tap/util.py	2014-09-16 19:33:31 UTC (rev 13967)
@@ -1147,8 +1147,14 @@
     Otherwise exits.
     """
 
-    success, reason = verifyTLSCertificate(config)
+    success, reason = verifyConfig(config)
 
+    if success:
+        success, reason = verifyTLSCertificate(config)
+
+    if success:
+        success, reason = verifyAPNSCertificate(config)
+
     if not success:
         if config.ServiceDisablingProgram:
             # If pre-flight checks fail, we don't want launchd to
@@ -1170,6 +1176,17 @@
     return True
 
 
+def verifyConfig(config):
+    """
+    At least one of EnableCalDAV or EnableCardDAV must be True
+    """
+
+    if config.EnableCalDAV or config.EnableCardDAV:
+        return True, "A protocol is enabled"
+
+    return False, "Neither CalDAV nor CardDAV are enabled"
+
+
 def verifyTLSCertificate(config):
     """
     If a TLS certificate is configured, make sure it exists, is non empty,
@@ -1217,6 +1234,54 @@
     return True, "TLS enabled"
 
 
+def verifyAPNSCertificate(config):
+    """
+    If APNS certificates are configured, make sure they're valid.
+    """
+
+    if config.Notifications.Services.APNS.Enabled:
+
+        for protocol in ("CalDAV", "CardDAV"):
+            protoConfig = config.Notifications.Services.APNS[protocol]
+
+            if not os.path.exists(protoConfig.CertificatePath):
+                message = (
+                    "The {proto} APNS certificate ({cert}) is missing".format(
+                        proto=protocol,
+                        cert=protoConfig.CertificatePath
+                    )
+                )
+                return False, message
+
+            try:
+                if protoConfig.Passphrase:
+                    passwdCallback = lambda *ignored: protoConfig.Passphrase
+                else:
+                    passwdCallback = None
+
+                ChainingOpenSSLContextFactory(
+                    protoConfig.PrivateKeyPath,
+                    protoConfig.CertificatePath,
+                    certificateChainFile=protoConfig.AuthorityChainPath,
+                    passwdCallback=passwdCallback,
+                    sslmethod=getattr(OpenSSL.SSL, "TLSv1_METHOD"),
+                )
+            except Exception as e:
+                message = (
+                    "The {proto} APNS certificate ({cert}) cannot be used: {reason}".format(
+                        proto=protocol,
+                        cert=protoConfig.CertificatePath,
+                        reason=str(e)
+                    )
+                )
+                return False, message
+
+        return True, "APNS enabled"
+
+    else:
+        return True, "APNS disabled"
+
+
 def getSSLPassphrase(*ignored):
 
     if not config.SSLPrivateKey:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140916/6d560ca3/attachment.html>


More information about the calendarserver-changes mailing list