Changeset 1073


Ignore:
Timestamp:
31/05/06 15:02:55 (13 years ago)
Author:
spascoe
Message:

The embedded bbftpd server now performs a callback to python to check
authentication. The callback works but it can't do anything at the moment.

Location:
TI05-delivery/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/trunk/src/bbftp-server-3.2.0/bbftpd/bbftpd_private_user.c

    r1064 r1073  
    3939extern char currentusername[MAXLEN] ; 
    4040 
    41  
     41#ifdef NDG_PYTHON_EMBED 
     42int bbftpd_private_auth_callback(char *logmessage); 
     43#endif 
    4244 
    4345/******************************************************************************* 
     
    104106  } 
    105107 
     108#ifdef NDG_PYTHON_EMBED 
     109  return bbftpd_private_auth_callback(logmessage); 
     110#else 
    106111  return 0 ; 
     112#endif 
    107113} 
    108114 
  • TI05-delivery/trunk/src/python_ext/bbftpd.c

    r1070 r1073  
    2222int bbftpd_main(int argc, char **argv, char **envp); 
    2323 
     24/* 
     25 * Static variables. 
     26 */ 
     27static PyObject *authContext = NULL; 
     28static PyObject *authzContext = NULL; 
     29 
     30/*--------------------------------------------------------------------------------------------------- 
     31 * The following functions interact with bbftpd_private_user.  They are placed here to separate 
     32 * python and bbftp APIs. 
     33 * 
     34 */ 
     35 
     36/** 
     37 * Make a callback bbftpd->python to handle authentication. 
     38 * 
     39 * @param[out] logmessage filled with an error message on failure 
     40 * @return 0 on success, -1 on failure 
     41 */ 
     42int bbftpd_private_auth_callback(char *logmessage) { 
     43 
     44  if (authzContext != NULL) { 
     45    sprintf(logmessage, "bbftpd_private_auth_callback: authzContext already present"); 
     46    return -1; 
     47  } 
     48   
     49  if (authContext == NULL) { 
     50    sprintf(logmessage, "bbftpd_private_auth_callback: no authContext set"); 
     51    return -1; 
     52  } 
     53 
     54  if ((authzContext = PyObject_CallMethod(authContext, "authorise", "")) == NULL) { 
     55    //!TODO: should probably read the exception object to fill logmessage. 
     56    sprintf(logmessage, "bbftpd_private_auth_callback: authContext.authorise() failed"); 
     57    return -1; 
     58  } 
     59 
     60  /* If authContext.authorise() returned None then authorisation failed.  */ 
     61  if (authzContext == Py_None) { 
     62    sprintf(logmessage, "bbftpd_private_auth_callback: python authorisation failed"); 
     63    return -1; 
     64  } 
     65 
     66  return 0; 
     67} 
     68 
     69/** 
     70 * retrieve the username from authzContext. 
     71 * 
     72 * @param[out] logmessage filled with an error message on failure 
     73 * @return pointer to the username or NULL on failure 
     74 */ 
     75char *bbftpd_private_auth_getusername(char *logmessage) { 
     76  char *username; 
     77  PyObject *str_obj; 
     78 
     79  if (authzContext == NULL) { 
     80    sprintf(logmessage, "bbftpd_private_auth_getusername: no authzContext set"); 
     81    return NULL; 
     82  } 
     83 
     84  if ((str_obj = PyObject_GetAttrString(authzContext, "username")) == NULL) { 
     85    sprintf(logmessage, "bbftpd_private_auth_getusername: authzContext.username lookup failed"); 
     86    return NULL; 
     87  } 
     88 
     89  if ((username = PyString_AsString(str_obj)) == NULL) { 
     90    Py_DECREF(str_obj); 
     91    sprintf(logmessage, "bbftpd_private_auth_getusername: authzContext.username not a string"); 
     92    return NULL; 
     93  } 
     94 
     95  return username; 
     96} 
     97       
     98/*------------------------------------------------------------------------------------------------- 
     99 * Functions exported to python 
     100 * 
     101 */ 
     102 
     103/** 
     104 * Main entry point for the python module. 
     105 */ 
    24106static PyObject *bbftpd_run(PyObject *self, PyObject *args) { 
    25107  int argc, i; 
     
    29111  PyObject *daemon_args, *item; 
    30112 
    31   if (!PyArg_ParseTuple(args, "O", &daemon_args)) { 
     113  if (!PyArg_ParseTuple(args, "OO", &authContext, &daemon_args)) { 
    32114    return NULL; 
    33115  } 
     116  Py_INCREF(authContext); 
    34117  Py_INCREF(daemon_args); 
    35118 
     
    51134  for (i=0; i<argc; i++) { 
    52135    if ((item = PySequence_GetItem(daemon_args, i)) == NULL) { 
     136      Py_DECREF(authContext); 
    53137      Py_DECREF(daemon_args); 
    54138      return NULL; 
     
    57141      free(argv); 
    58142      Py_DECREF(item); 
     143      Py_DECREF(authContext); 
    59144      Py_DECREF(daemon_args); 
    60145      return NULL; 
     
    72157 
    73158  free(argv); 
     159  Py_DECREF(authContext); authContext = NULL; 
    74160  Py_DECREF(daemon_args); 
     161 
    75162  return Py_BuildValue("i", pid); 
    76163} 
  • TI05-delivery/trunk/test/test_embedded.py

    r1070 r1073  
    1919import bbftpd 
    2020         
     21class AuthContext(object): 
     22    def authorise(self): 
     23        # Return a dummy authzContext 
     24        return "authorised :-)" 
     25 
    2126class EmbeddedServerTestCase(unittest.TestCase): 
    2227    """Test the bbftpd module. 
     
    5863 
    5964 
     65    def testRetr(self): 
     66        """Try retrieving a file. 
     67        """ 
     68 
     69        tmp = tempfile.mktemp('test_bbftpd') 
     70        fh = self._runClient('-e "get %s/foo %s"' % (DATADIR, tmp)) 
     71 
     72        # Check the client output 
     73        output = fh.read() 
     74        self.assert_(self._findLines(['get.*nogzip'], output)) 
     75 
     76        # Check retrieved file 
     77        self.assert_(os.system('diff --brief %s/foo %s' % (DATADIR, tmp)) == 0) 
     78        os.remove(tmp) 
     79 
     80        # Check syslog 
     81        lines = self._readSyslog() 
     82        self.assert_(self._findLines(['.*Authz: RETR .*/foo', '.*GET .*/foo.*'], lines)) 
     83 
     84    def testStore(self): 
     85        """Try storing a file. 
     86        """ 
     87 
     88 
     89        src = '%s/bar' % (DATADIR) 
     90        dest = '%s/new_bar' % (DATADIR) 
     91        os.system('cp %s %s' % (src, dest)) 
     92        fh = self._runClient('-e "put %s %s"' % (src, dest)) 
     93 
     94        # Check the client output 
     95        output = fh.read() 
     96        self.assert_(self._findLines(['put .* nogzip'], output)) 
     97 
     98 
     99        # Check sent file 
     100        self.assert_(os.system('diff --brief %s %s' % (dest, src)) == 0) 
     101        os.remove(dest) 
     102 
     103        # Check syslog 
     104        lines = self._readSyslog() 
     105        self.assert_(self._findLines(['.*Authz: STORE .*/new_bar', '.*PUT .*/new_bar.*'], lines)) 
     106 
     107 
    60108    #---------------------------------------------------------------------------------- 
    61109 
     
    63111    def _startServer(self): 
    64112        # Start the server and store it's PID 
    65         self.pid = bbftpd.run(['-l', 'DEBUG']) 
     113        self.pid = bbftpd.run(AuthContext(), ['-l', 'DEBUG']) 
    66114 
    67115    def _stopServer(self): 
Note: See TracChangeset for help on using the changeset viewer.