Ver código fonte

Adjusting to new Labkey login interface

Eager Beaver 6 anos atrás
pai
commit
8ba738d1ad

+ 30 - 8
labkeySlicerPythonExtension/labkeySlicerPythonExtension.py

@@ -50,8 +50,10 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
     connectionFormLayout = qt.QFormLayout(connectionCollapsibleButton)
 
     self.serverURL=qt.QLineEdit("https://merlin.fmf.uni-lj.si")
-
+    self.serverURL.textChanged.connect(self.updateServerURL)
     connectionFormLayout.addRow("Server: ", self.serverURL)
+    #copy initial setting
+    self.updateServerURL(self.serverURL.text);
 
     try:
       self.startDir=os.path.join(os.environ['HOME'],"temp/crt")
@@ -85,13 +87,18 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
     #self.connectButton.connect('clicked(bool)',self.onConnectButtonClicked)
     #connectionFormLayout.addRow("Connection:",self.connectButton)
 
+    self.initButton=qt.QPushButton("Init")
+    self.initButton.toolTip="Initialize connection to the server"
+    self.initButton.connect('clicked(bool)',self.onInitButtonClicked)
+    connectionFormLayout.addRow("Connection:",self.initButton)
+
     self.authName=qt.QLineEdit("email")
-    self.authName.connect('textChanged()',self.updateAuthName)
+    self.authName.textChanged.connect(self.updateAuthName)
     connectionFormLayout.addRow("Labkey username: ", self.authName)
 
     self.authPass=qt.QLineEdit("")
-    self.authPass.setEchoMode(qt.QLineEdit.PasswordEchoOnEdit)
-    self.authName.connect('textChanged()',self.updateAuthPass)
+    self.authPass.setEchoMode(qt.QLineEdit.Password)
+    self.authPass.textChanged.connect(self.updateAuthPass)
     connectionFormLayout.addRow("Labkey password: ", self.authPass)
 
     fileDialogCollapsibleButton = ctk.ctkCollapsibleButton()
@@ -249,12 +256,27 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
 
       self.network.connectRemote(str(self.serverURL.text),uname,self.auth_pwd)
 
-  def updateAuthName(self):
-      self.network.auth_uname=self.authName.getText()
+  def onInitButtonClicked(self):
+      self.network.configureSSL(
+        self.userCertButton.text,
+        self.privateKeyButton.text,
+        self.pwd,
+        self.caCertButton.text
+      )
+
+      self.network.initRemote()
+
+  def updateAuthName(self,txt):
+      self.network.auth_name=txt
+      print "Setting username to {0}".format(self.network.auth_name);
 
-  def updateAuthPass(self):
-      self.network.auth_pass=self.authPass.getText()
+  def updateAuthPass(self,txt):
+      self.network.auth_pass=txt
+      print "Setting password."
 
+  def updateServerURL(self,txt):
+      self.network.hostname=txt
+      print "Setting hostname to {0}".format(self.network.hostname);
 
   def onFileListDoubleClicked(self,item):
         if item == None:

+ 32 - 11
labkeySlicerPythonExtension/slicerNetwork.py

@@ -122,10 +122,15 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
     def configureSSL(self,cert,key,pwd,cacert):
         #do this first
-        self.ctx=ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-        self.ctx.load_cert_chain(cert,key,pwd)
-        self.ctx.verify_mode=ssl.CERT_REQUIRED
-        self.ctx.load_verify_locations(cacert)
+        try:
+            self.ctx=ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+            self.ctx.load_cert_chain(cert,key,pwd)
+            self.ctx.verify_mode=ssl.CERT_REQUIRED
+            self.ctx.load_verify_locations(cacert)
+        except ssl.SSLError as err:
+            print " Failed to configure SSL: {0}".format(str(err))
+
+
 
     def connectRemote(self,serverUrl,uname,pwd):
         https_handler=urllib2.HTTPSHandler(context=self.ctx)
@@ -144,12 +149,20 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
         self.opener.open(r)
 
-        #cj in opener contains the cookies
+    def initRemote(self):
+        https_handler=urllib2.HTTPSHandler(context=self.ctx)
+        #cookie part
+        cj=cookielib.CookieJar()
+        cookie_handler=urllib2.HTTPCookieProcessor(cj)
+        self.opener=urllib2.build_opener(https_handler,cookie_handler)
+
+    #cj in opener contains the cookies
 
     def get(self,url):
 
+        print "GET: {0}".format(url)
         r=urllib2.Request(url)
-        base64string = base64.b64encode('%s:%s' % (self.auth_uname, self.auth_pass))
+        base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
         r.add_header("Authorization", "Basic %s" % base64string)
         return self.opener.open(r)
         #f contains json as a return value
@@ -160,7 +173,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         #makes it a post
         r.add_data(data)
         r.add_header("content-type","application/json")
-        base64string = base64.b64encode('%s:%s' % (self.auth_uname, self.auth_pass))
+        base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
         r.add_header("Authorization", "Basic %s" % base64string)
 
         f=self.opener.open(r)
@@ -180,10 +193,17 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         r.add_header('content-length',str(len(PROPFIND)))
         r.add_header('Depth','1')
         r.add_data(PROPFIND)
-        f=self.opener.open(r)
+        base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
+        r.add_header("Authorization", "Basic %s" % base64string)
+        print "PROPFIND: {0}".format(dirUrl)
+        dirs=[]
+        try:
+            f=self.opener.open(r)
+        except:
+            print "No data"
+            return dirs
         tree=ET.XML(f.read())
         rps=tree.findall('{DAV:}response')
-        dirs=[]
         for r in rps:
             hr=r.find('{DAV:}href')
             dirent=hr.text
@@ -210,14 +230,15 @@ class labkeyURIHandler(slicer.vtkURIHandler):
     def loadDir(self, path):
         #dirURL=serverUrl+"/labkey/_webdav/"+path
         files=self.listDir(path)
+        fdir="NONE"
         for f in files:
             #returns local path
             try:
-                self.GetFile(f)
+                fdir=os.path.dirname(self.GetFile(f))
             except:
                 #fails if there is a subdirectory; go recursively
                 self.readDir(f)
-
+        return fdir
 
 class propfindRequest(urllib2.Request):
     """