<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[14750] CalDAVClientLibrary/trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/14750">14750</a></dd>
<dt>Author</dt> <dd>cdaboo@apple.com</dd>
<dt>Date</dt> <dd>2015-05-05 07:11:40 -0700 (Tue, 05 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow connecting to a server via a unix socket (use --unix &lt;&lt;path&gt;&gt;).</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibrarybrowsershellpy">CalDAVClientLibrary/trunk/caldavclientlibrary/browser/shell.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryclientaccountpy">CalDAVClientLibrary/trunk/caldavclientlibrary/client/account.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryclientclientsessionpy">CalDAVClientLibrary/trunk/caldavclientlibrary/client/clientsession.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryclienthttpshandlerpy">CalDAVClientLibrary/trunk/caldavclientlibrary/client/httpshandler.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryclientsimplepy">CalDAVClientLibrary/trunk/caldavclientlibrary/client/simple.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryprotocolhttpsessionpy">CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/http/session.py</a></li>
<li><a href="#CalDAVClientLibrarytrunkcaldavclientlibraryprotocolwebdavsessionpy">CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/webdav/session.py</a></li>
<li><a href="#CalDAVClientLibrarytrunksetuppy">CalDAVClientLibrary/trunk/setup.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalDAVClientLibrarytrunkcaldavclientlibrarybrowsershellpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/browser/shell.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/browser/shell.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/browser/shell.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> class Shell(BaseShell):
</span><span class="cx"> 
</span><del>-    def __init__(self, server, path, user, pswd, logging):
</del><ins>+    def __init__(self, server, path, user, pswd, logging, afunix=None):
</ins><span class="cx"> 
</span><span class="cx">         super(Shell, self).__init__(&quot;caldav_client&quot;)
</span><span class="cx">         self.prefix = self.wd = &quot;/&quot;
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx">         # Create the account
</span><span class="cx">         ssl = server.startswith(&quot;https://&quot;)
</span><span class="cx">         server = server[8:] if ssl else server[7:]
</span><del>-        self.account = CalDAVAccount(server, ssl=ssl, user=self.user, pswd=self.pswd, root=path, principal=None, logging=logging)
</del><ins>+        self.account = CalDAVAccount(server, ssl=ssl, afunix=afunix, user=self.user, pswd=self.pswd, root=path, principal=None, logging=logging)
</ins><span class="cx"> 
</span><span class="cx">         atexit.register(self.saveHistory)
</span><span class="cx"> 
</span><span class="lines">@@ -78,6 +78,7 @@
</span><span class="cx"> Options:
</span><span class="cx"> -l              start with HTTP logging on.
</span><span class="cx"> --server=HOST   url of the server include http/https scheme and port [REQUIRED].
</span><ins>+--unix=PATH     path to unix socket to connect to server [OPTIONAL]
</ins><span class="cx"> --user=USER     user name to login as - will be prompted if not prsent [OPTIONAL].
</span><span class="cx"> --pswd=PSWD     password for user - will be prompted if not prsent [OPTIONAL].
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -87,10 +88,11 @@
</span><span class="cx"> def runit():
</span><span class="cx">     logging = False
</span><span class="cx">     server = None
</span><ins>+    afunix = None
</ins><span class="cx">     user = None
</span><span class="cx">     pswd = None
</span><span class="cx"> 
</span><del>-    opts, _ignore_args = getopt.getopt(sys.argv[1:], 'lh', [&quot;help&quot;, &quot;server=&quot;, &quot;user=&quot;, &quot;pswd=&quot;])
</del><ins>+    opts, _ignore_args = getopt.getopt(sys.argv[1:], 'lh', [&quot;help&quot;, &quot;server=&quot;, &quot;unix=&quot;, &quot;user=&quot;, &quot;pswd=&quot;])
</ins><span class="cx"> 
</span><span class="cx">     for name, value in opts:
</span><span class="cx"> 
</span><span class="lines">@@ -98,6 +100,8 @@
</span><span class="cx">             logging = True
</span><span class="cx">         elif name == &quot;--server&quot;:
</span><span class="cx">             server = value
</span><ins>+        elif name == &quot;--unix&quot;:
+            afunix = value
</ins><span class="cx">         elif name == &quot;--user&quot;:
</span><span class="cx">             user = value
</span><span class="cx">         elif name == &quot;--pswd&quot;:
</span><span class="lines">@@ -120,7 +124,7 @@
</span><span class="cx">     if not pswd:
</span><span class="cx">         pswd = getpass(&quot;Password: &quot;)
</span><span class="cx"> 
</span><del>-    shell = Shell(server, path, user, pswd, logging)
</del><ins>+    shell = Shell(server, path, user, pswd, logging, afunix=afunix)
</ins><span class="cx">     shell.run()
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryclientaccountpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/client/account.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/client/account.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/client/account.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -19,8 +19,8 @@
</span><span class="cx"> 
</span><span class="cx"> class CalDAVAccount(object):
</span><span class="cx"> 
</span><del>-    def __init__(self, server, port=None, ssl=False, user=&quot;&quot;, pswd=&quot;&quot;, principal=None, root=None, logging=False):
-        self.session = CalDAVSession(server, port, ssl, user, pswd, principal, root, logging)
</del><ins>+    def __init__(self, server, port=None, ssl=False, afunix=None, user=&quot;&quot;, pswd=&quot;&quot;, principal=None, root=None, logging=False):
+        self.session = CalDAVSession(server, port, ssl, afunix, user, pswd, principal, root, logging)
</ins><span class="cx">         self.principal = principalCache.getPrincipal(self.session, self.session.principalPath)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryclientclientsessionpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/client/clientsession.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/client/clientsession.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/client/clientsession.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -62,8 +62,8 @@
</span><span class="cx">             print data.replace(&quot;\r\n&quot;, &quot;\n&quot;),
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def __init__(self, server, port=None, ssl=False, user=&quot;&quot;, pswd=&quot;&quot;, principal=None, root=None, logging=False):
-        super(CalDAVSession, self).__init__(server, port, ssl, log=CalDAVSession.logger())
</del><ins>+    def __init__(self, server, port=None, ssl=False, afunix=None, user=&quot;&quot;, pswd=&quot;&quot;, principal=None, root=None, logging=False):
+        super(CalDAVSession, self).__init__(server, port, ssl, afunix, log=CalDAVSession.logger())
</ins><span class="cx"> 
</span><span class="cx">         self.loghttp = logging
</span><span class="cx"> 
</span><span class="lines">@@ -960,7 +960,7 @@
</span><span class="cx"> 
</span><span class="cx">     def openSession(self):
</span><span class="cx">         # Create connection
</span><del>-        self.connect = SmartHTTPConnection(self.server, self.port, self.ssl)
</del><ins>+        self.connect = SmartHTTPConnection(self.server, self.port, self.ssl, self.afunix)
</ins><span class="cx"> 
</span><span class="cx">         # Write to log file
</span><span class="cx">         if self.loghttp and self.log:
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryclienthttpshandlerpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/client/httpshandler.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/client/httpshandler.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/client/httpshandler.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -19,7 +19,9 @@
</span><span class="cx"> import ssl as sslmodule
</span><span class="cx"> 
</span><span class="cx"> class HTTPSVersionConnection(httplib.HTTPSConnection):
</span><del>-    &quot;This class allows communication via SSL.&quot;
</del><ins>+    &quot;&quot;&quot;
+    An L{httplib.HTTPSConnection} class that allows the TLS protocol version to be set.
+    &quot;&quot;&quot;
</ins><span class="cx"> 
</span><span class="cx">     def __init__(self, host, port, ssl_version=sslmodule.PROTOCOL_TLSv1):
</span><span class="cx">         httplib.HTTPSConnection.__init__(self, host, port)
</span><span class="lines">@@ -39,14 +41,46 @@
</span><span class="cx">     (set(), sslmodule.PROTOCOL_SSLv23),
</span><span class="cx"> )
</span><span class="cx"> 
</span><del>-def SmartHTTPConnection(host, port, ssl):
</del><ins>+class UnixSocketHTTPConnection(httplib.HTTPConnection):
+    &quot;&quot;&quot;
+    An L{httplib.HTTPConnection} class that uses a unix socket rather than TCP.
+    &quot;&quot;&quot;
</ins><span class="cx"> 
</span><ins>+    def __init__(self, path):
+        httplib.HTTPConnection.__init__(self, &quot;http.sock&quot;, port=None)
+        self.path = path
+
+
+    def connect(self):
+        &quot;&quot;&quot;
+        Connect using the supplied unix socket file path
+        &quot;&quot;&quot;
+        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+        self.sock.connect(self.path)
+
+
+
+def SmartHTTPConnection(host, port, ssl, afunix):
+    &quot;&quot;&quot;
+    Create the appropriate L{httplib.HTTPConnection} derived class for the supplied arguments.
+
+    @param host: TCP host name
+    @type host: L{str}
+    @param port: TCP port number
+    @type port: L{int}
+    @param ssl: indicates if SSL is to be used
+    @type ssl: L{bool}
+    @param afunix: unix socket to use or L{None}
+    @type afunix: L{str}
+    &quot;&quot;&quot;
+
</ins><span class="cx">     def trySSL(version):
</span><span class="cx">         connect = HTTPSVersionConnection(host, port, ssl_version=version)
</span><span class="cx">         connect.connect()
</span><span class="cx">         return connect
</span><span class="cx"> 
</span><span class="cx">     if ssl:
</span><ins>+        # Iterate over the TL:S versions and find one that works and cache it for future use.
</ins><span class="cx">         for cached, connection_type in cached_types:
</span><span class="cx">             if (host, port) in cached:
</span><span class="cx">                 try:
</span><span class="lines">@@ -62,7 +96,9 @@
</span><span class="cx">                 cached.remove((host, port))
</span><span class="cx"> 
</span><span class="cx">         raise RuntimeError(&quot;Cannot connect via with TLSv1, SSLv3 or SSLv23&quot;)
</span><ins>+    elif afunix is None:
+        connect = httplib.HTTPConnection(host, port)
</ins><span class="cx">     else:
</span><del>-        connect = httplib.HTTPConnection(host, port)
-        connect.connect()
-        return connect
</del><ins>+        connect = UnixSocketHTTPConnection(afunix)
+    connect.connect()
+    return connect
</ins></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryclientsimplepy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/client/simple.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/client/simple.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/client/simple.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> def run(session, request):
</span><span class="cx"> 
</span><span class="cx">     # Create connection
</span><del>-    connect = SmartHTTPConnection(session.server, session.port, session.ssl)
</del><ins>+    connect = SmartHTTPConnection(session.server, session.port, session.ssl, session.afunix)
</ins><span class="cx">     connect.set_debuglevel(1)
</span><span class="cx"> 
</span><span class="cx">     # Do headers
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryprotocolhttpsessionpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/http/session.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/http/session.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/http/session.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -22,11 +22,12 @@
</span><span class="cx">     STATE_OPEN = 0
</span><span class="cx">     STATE_CLOSED = 1
</span><span class="cx"> 
</span><del>-    def __init__(self, server, port=None, ssl=False, log=None):
</del><ins>+    def __init__(self, server, port=None, ssl=False, afunix=None, log=None):
</ins><span class="cx"> 
</span><span class="cx">         self.server = server
</span><span class="cx">         self.port = port
</span><span class="cx">         self.ssl = ssl
</span><ins>+        self.afunix = afunix
</ins><span class="cx">         if not self.port:
</span><span class="cx">             self.port = httplib.HTTPS_PORT if ssl else httplib.HTTP_PORT
</span><span class="cx">         self.authorization = None
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunkcaldavclientlibraryprotocolwebdavsessionpy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/webdav/session.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/webdav/session.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/caldavclientlibrary/protocol/webdav/session.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -23,8 +23,8 @@
</span><span class="cx"> 
</span><span class="cx"> class Session(HTTPSession):
</span><span class="cx"> 
</span><del>-    def __init__(self, server, port=None, ssl=False, log=None):
-        super(Session, self).__init__(server, port, ssl, log)
</del><ins>+    def __init__(self, server, port=None, ssl=False, afunix=None, log=None):
+        super(Session, self).__init__(server, port, ssl, afunix, log)
</ins><span class="cx">         self.initialised = False
</span><span class="cx">         self.version = ()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalDAVClientLibrarytrunksetuppy"></a>
<div class="modfile"><h4>Modified: CalDAVClientLibrary/trunk/setup.py (14749 => 14750)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVClientLibrary/trunk/setup.py        2015-05-05 03:35:07 UTC (rev 14749)
+++ CalDAVClientLibrary/trunk/setup.py        2015-05-05 14:11:40 UTC (rev 14750)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx">     data_files.append(&quot;caldavclientlibrary/ui/WebDAVBrowser.nib&quot;)
</span><span class="cx">     package_data['caldavclientlibrary'] = [
</span><span class="cx">         'ui/WebDAVBrowser.nib/*',
</span><del>-        ]
</del><ins>+    ]
</ins><span class="cx"> 
</span><span class="cx"> packages = []
</span><span class="cx"> for dirpath, dirnames, filenames in os.walk('caldavclientlibrary'):
</span></span></pre>
</div>
</div>

</body>
</html>