Quellcode durchsuchen

Update version to work with Labkey17.3 and beyond without the login/cookie exchange but with authorization send with each request

Andrej Studen vor 6 Jahren
Ursprung
Commit
b0508e7c76

+ 22 - 5
labkeySlicerPythonExtension/labkeySlicerPythonExtension.py

@@ -78,12 +78,21 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
 
     connectionFormLayout.addRow("CA certificate:",self.caCertButton)
 
-    self.auth_pwd=''
-    self.connectButton=qt.QPushButton("Connect")
-    self.connectButton.toolTip="Connect to the server"
-    self.connectButton.connect('clicked(bool)',self.onConnectButtonClicked)
 
-    connectionFormLayout.addRow("Connection:",self.connectButton)
+    #self.auth_pwd=''
+    #self.connectButton=qt.QPushButton("Connect")
+    #self.connectButton.toolTip="Connect to the server"
+    #self.connectButton.connect('clicked(bool)',self.onConnectButtonClicked)
+    #connectionFormLayout.addRow("Connection:",self.connectButton)
+
+    self.authName=qt.QLineEdit("email")
+    self.authName.connect('textChanged()',self.updateAuthName)
+    connectionFormLayout.addRow("Labkey username: ", self.authName)
+
+    self.authPass=qt.QLineEdit("")
+    self.authPass.setEchoMode(qt.QLineEdit.PasswordEchoOnEdit)
+    self.authName.connect('textChanged()',self.updateAuthPass)
+    connectionFormLayout.addRow("Labkey password: ", self.authPass)
 
     fileDialogCollapsibleButton = ctk.ctkCollapsibleButton()
     fileDialogCollapsibleButton.text = "Remote files"
@@ -182,6 +191,7 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
      self.logic.cert=qt.QSslCertificate(f)
      print "cert.isNull()={0}".format(self.logic.cert.isNull())
      self.userCertButton.setText(filename)
+     self.authName.setText(self.logic.cert.subjectInfo("emailAddress"))
 
   def onPrivateKeyButtonClicked(self):
       filename=qt.QFileDialog.getOpenFileName(None,'Open private key',
@@ -239,6 +249,13 @@ 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 updateAuthPass(self):
+      self.network.auth_pass=self.authPass.getText()
+
+
   def onFileListDoubleClicked(self,item):
         if item == None:
             print "Selected items: None"

+ 16 - 14
labkeySlicerPythonExtension/slicerNetwork.py

@@ -9,6 +9,7 @@ import slicer
 import shutil
 import distutils
 import os
+import base64
 
 class slicerNetwork:
     def __init__(self,parent):
@@ -21,12 +22,11 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         self.className="labkeyURIHandler"
         slicer.mrmlScene.AddURIHandler(self)
         try:
-	   self.localCacheDirectory=os.path.join(
-	     os.environ["HOME"],"labkeyCache")
-	except:
-	   #in windows, the variable is called HOMEPATH
-	   fhome=os.environ['HOMEDRIVE']+os.environ['HOMEPATH']
-	   self.localCacheDirectory=os.path.join(fhome,"labkeyCache")
+	       self.localCacheDirectory=os.path.join(os.environ["HOME"],"labkeyCache")
+        except:
+	    #in windows, the variable is called HOMEPATH
+	       fhome=os.environ['HOMEDRIVE']+os.environ['HOMEPATH']
+	       self.localCacheDirectory=os.path.join(fhome,"labkeyCache")
 
     def CanHandleURI(self,uri):
         print "labkeyURIHandler::CanHandleURI({0})".format(uri)
@@ -51,9 +51,9 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
     def GetLocalPath(self,source):
         relativePath=re.sub('labkey://','',source)
-	sp=os.sep.encode('string-escape')
+        sp=os.sep.encode('string-escape')
         print "Substituting / with {0} in {1}".format(sp,relativePath)
-	relativePath=re.sub('/',sp,relativePath)
+        relativePath=re.sub('/',sp,relativePath)
         return os.path.join(self.localCacheDirectory,relativePath)
 
     def GetFile(self,source):
@@ -65,8 +65,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         return localPath
 
     def StageFileRead(self,source,dest):
-        print "labkeyURIHandler::StageFileRead({0},{1})".format(
-            source,dest)
+        print "labkeyURIHandler::StageFileRead({0},{1})".format(source,dest)
         labkeyPath=re.sub('labkey://','',source)
         remote=self.readFile(self.hostname,labkeyPath)
         #make all necessary directories
@@ -78,12 +77,12 @@ class labkeyURIHandler(slicer.vtkURIHandler):
                 raise
         local=open(dest,'wb')
         #make sure we are at the begining of the file
-        
+
 	#check file size
 	remote.seek(0,2)
 	sz=remote.tell()
 	print "Remote size: {0}".format(sz)
-	
+
 	remote.seek(0)
         shutil.copyfileobj(remote,local)
 	print "Local size: {0}".format(local.tell())
@@ -134,13 +133,13 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         #cookie part
         cj=cookielib.CookieJar()
         cookie_handler=urllib2.HTTPCookieProcessor(cj)
-
         self.opener=urllib2.build_opener(https_handler,cookie_handler)
         loginUrl=serverUrl+"/labkey/login/login.post"
         r=urllib2.Request(str(loginUrl))
         print "Connecting to {0}".format(loginUrl)
         r.add_header('ContentType','application/x-www-form-urlencoded')
         data="email="+uname+"&password="+pwd
+        #print "Data: '{0}".format(data)
         r.add_data(data)
 
         self.opener.open(r)
@@ -149,8 +148,9 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
     def get(self,url):
 
-        #r1=urllib2.Request('https://merlin.fmf.uni-lj.si/labkey/query/motionData/selectRows.api?schemaName=core&query.queryName=Users')
         r=urllib2.Request(url)
+        base64string = base64.b64encode('%s:%s' % (self.auth_uname, self.auth_pass))
+        r.add_header("Authorization", "Basic %s" % base64string)
         return self.opener.open(r)
         #f contains json as a return value
 
@@ -160,6 +160,8 @@ 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))
+        r.add_header("Authorization", "Basic %s" % base64string)
 
         f=self.opener.open(r)
         #f contains json as a return value