Changeset 1144 for TI05-delivery


Ignore:
Timestamp:
08/06/06 15:28:07 (14 years ago)
Author:
spascoe
Message:

Authorisation in python is confirmed as working with 2 test cases.

Location:
TI05-delivery/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/trunk/lib/python/delivery/server.py

    r1141 r1144  
    2323     
    2424    return bbftpd.run(authHandler, args) 
     25 
     26 
     27class AuthenticationFailure(Exception): 
     28    """Signals authentication failed. 
     29    """ 
     30    pass 
     31 
     32class AuthorisationFailure(Exception): 
     33    """Signals authorisation failed. 
     34    """ 
     35    pass 
     36 
    2537 
    2638 
     
    5769            see the state of the python interpreter as it was when start() was called. 
    5870 
    59         @return an AuthzHandler instance if authentication succeeds, else None. 
     71        @return an AuthzHandler instance if authentication succeeds.  Any false value is considered 
     72            an authorisation failure. 
    6073        """ 
    6174 
     
    7588        @param transferoption: extra options specified in the command. 
    7689        @param path: the file or directory to which the command applies. 
    77         @return: 0 on success or -1 on failure. 
     90        @return: bool for success or failure. 
    7891        """ 
    7992 
     
    8497 
    8598        @param path: the file being retrieved. 
    86         @return: 0 on success or -1 on failure. 
     99        @return: bool for success or failure. 
    87100        """ 
    88101 
     
    93106 
    94107        @param path: the destination file. 
    95         @return: 0 on success or -1 on failure. 
     108        @return: bool for success or failure. 
    96109        """ 
    97110 
     
    138151 
    139152    def authzControl(self, m, t, p): 
    140         return 0; 
     153        return True; 
    141154 
    142155    def authzRetr(self, p): 
    143         return 0; 
     156        return True; 
    144157 
    145158    def authzStore(self, p): 
    146         return 0; 
     159        return True; 
    147160     
  • TI05-delivery/trunk/src/python_ext/bbftpd.c

    r1141 r1144  
    9191  } 
    9292 
     93  /** @todo exceptions of type delivery.server.AuthenticationFailure should be logged as 
     94   *      failure rather than error. 
     95   */ 
    9396  if ((authzHandler = PyObject_CallMethod(authHandler, "authorise", "")) == NULL) { 
    9497    ndg_pyerr_to_logmessage(logmessage, "ndg_auth"); 
     
    9699  } 
    97100 
    98   /* If authHandler.authorise() returned None then authorisation failed.  */ 
    99   if (authzHandler == Py_None) { 
     101  /* Authorisation is considered failed if the return value isn't True.  */ 
     102  if (!PyObject_IsTrue(authzHandler)) { 
    100103    sprintf(logmessage, "ndg_auth: python authorisation failed"); 
    101104    return -1; 
     
    143146int ndg_authz_control(int msgcode, int transferoption, char *path, char *logmessage) { 
    144147  PyObject *ret_obj; 
    145   int ret; 
    146148 
    147149  if (authzHandler == NULL) { 
     
    155157  } 
    156158   
    157   if (!PyInt_Check(ret_obj)) { 
     159  /* Authorisation fails if ret_obj is false. */ 
     160  if (!PyObject_IsTrue(ret_obj)) { 
    158161    ndg_pyerr_to_logmessage(logmessage, "ndg_authz_control"); 
    159162    Py_DECREF(ret_obj); 
     
    161164  } 
    162165 
    163   ret = (int)PyInt_AsLong(ret_obj); 
    164   Py_DECREF(ret_obj); 
    165   return ret; 
     166  return 0; 
    166167} 
    167168 
     
    169170 * Make a callback to do authorisation of a retr command. 
    170171 * 
    171  * @see bbftpd_private_authz_store() 
     172 * @see bbftpd_private_authz_retr() 
    172173 */ 
    173174int ndg_authz_retr(char *path, char *logmessage) { 
    174175  PyObject *ret_obj; 
    175   int ret; 
    176176 
    177177  if (authzHandler == NULL) { 
     
    185185  } 
    186186   
    187   if (!PyInt_Check(ret_obj)) { 
     187  /* Authorisation fails if ret_obj is false. */ 
     188  if (!PyObject_IsTrue(ret_obj)) { 
    188189    ndg_pyerr_to_logmessage(logmessage, "ndg_authz_retr"); 
    189190    Py_DECREF(ret_obj); 
     
    191192  } 
    192193 
    193   ret = (int)PyInt_AsLong(ret_obj); 
    194   Py_DECREF(ret_obj); 
    195   return ret; 
     194  return 0; 
    196195} 
    197196 
     
    204203int ndg_authz_store(char *path, char *logmessage) { 
    205204  PyObject *ret_obj; 
    206   int ret; 
    207205 
    208206  if (authzHandler == NULL) { 
     
    216214  } 
    217215   
    218   if (!PyInt_Check(ret_obj)) { 
     216  /* Authorisation fails if ret_obj is false. */ 
     217  if (!PyObject_IsTrue(ret_obj)) { 
    219218    ndg_pyerr_to_logmessage(logmessage, "ndg_authz_store"); 
    220219    Py_DECREF(ret_obj); 
     
    222221  } 
    223222 
    224   ret = (int)PyInt_AsLong(ret_obj); 
    225   Py_DECREF(ret_obj); 
    226   return ret; 
     223  return 0; 
    227224} 
    228225  
  • TI05-delivery/trunk/test/test_embedded.py

    r1141 r1144  
    88 
    99import unittest 
    10 import sys, os, signal, time, syslog 
     10import sys, os, signal, time, syslog, stat 
    1111from glob import glob 
    1212import re, tempfile 
     
    2727 
    2828class TestAuthHandler(server.BasicClientAuthHandler): 
     29     
    2930    def authorise(self): 
    3031        msg = self.recvCStr() 
     
    3738        syslog.syslog(syslog.LOG_DEBUG, "AuthContext received privatestr: %s" % privatestr) 
    3839 
     40        return self.makeAuthzHandler(msg, "TestCaseUser") 
     41 
     42    def makeAuthzHandler(self, msg, user): 
    3943        return TestAuthzHandler(msg, "TestCaseUser") 
    4044 
     
    4549 
    4650 
     51 
     52 
    4753class TestFailAuthHandler(server.AuthHandler): 
    4854    def authorise(self): 
    49         return None 
     55        raise server.AuthenticationFailure, "TestFailAuthHandler" 
     56 
     57 
     58class TestPermAuthHandler(TestAuthHandler): 
     59    def makeAuthzHandler(self, msg, user): 
     60        return TestPermAuthzHandler(msg, "TestCaseUser") 
     61 
     62class TestPermAuthzHandler(TestAuthzHandler): 
     63    """Check's the path's other read permission and authorises accordingly. 
     64    """ 
     65 
     66    def authzControl(self, msgcode, transferopt, path): 
     67        # Ignore what is being authorised for now, just authorise if read allowed 
     68        return self.authzPath(path) 
     69 
     70    def authzRetr(self, path): 
     71        return self.authzPath(path) 
     72 
     73    def authzSend(self, path): 
     74        return self.authzPath(path) 
     75 
     76    def authzPath(self, path): 
     77        mode = stat.S_IMODE(os.stat(path)[stat.ST_MODE]) 
     78        if (mode & 0004): 
     79            syslog.syslog(syslog.LOG_DEBUG, 'TestPermAuthzHandler OK') 
     80            return True 
     81        else: 
     82            syslog.syslog(syslog.LOG_DEBUG, 'TestPermAuthzHandler FAIL') 
     83            raise server.AuthorisationFailure, "TestPermAuthzHandler: no read perms" 
     84 
    5085 
    5186class BaseFixture(unittest.TestCase): 
     87 
     88    authContext = TestAuthHandler() 
     89 
    5290    def setUp(self): 
    5391        # We want to mark the beginning of this test case in syslog 
    5492        syslog.openlog('test_embedded.py', 0, syslog.LOG_LOCAL0) 
    55         syslog.syslog(syslog.LOG_DEBUG, 'Starting EmbeddedServerTestCase') 
     93        syslog.syslog(syslog.LOG_DEBUG, 'Starting TestCase') 
    5694 
    5795        self._startServer() 
     
    5997    def tearDown(self): 
    6098        self._stopServer() 
    61         syslog.syslog(syslog.LOG_DEBUG, 'Ended EmbeddedServerTestCase') 
     99        syslog.syslog(syslog.LOG_DEBUG, 'Ended TestCase') 
    62100        syslog.closelog() 
    63101 
     
    65103 
    66104 
    67     def _startServer(self, authContext=None): 
    68         if not authContext: 
    69             authContext = TestAuthHandler() 
     105    def _startServer(self): 
    70106        # Start the server and store it's PID 
    71         self.pid = server.start(authContext, ['-l', 'DEBUG']) 
     107        self.pid = server.start(self.authContext, ['-l', 'DEBUG']) 
    72108 
    73109    def _stopServer(self): 
     
    108144        start_i = 0 
    109145        for i in xrange(len(log)-1, -1, -1): 
    110             if re.search('test_embedded.py: Starting EmbeddedServerTestCase', log[i]): 
     146            if re.search('test_embedded.py: Starting TestCase', log[i]): 
    111147                start_i = i+1 
    112148                break 
     
    144180 
    145181 
    146 class EmbeddedServerTestCase(BaseFixture): 
     182class AuthOK(BaseFixture): 
    147183    """Test the bbftpd module. 
    148184    """ 
     
    239275 
    240276 
    241 class AuthFailure(BaseFixture): 
    242     def setUp(self): 
    243         # We want to mark the beginning of this test case in syslog 
    244         syslog.openlog('test_embedded.py', 0, syslog.LOG_LOCAL0) 
    245         syslog.syslog(syslog.LOG_DEBUG, 'Starting EmbeddedServerTestCase') 
    246  
    247         self._startServer(authContext=TestFailAuthHandler()) 
     277class AuthFail(BaseFixture): 
     278    authContext = TestFailAuthHandler() 
    248279 
    249280    def test(self): 
     
    259290        self.assertLines(['.*bbftpd_private_auth failed.*'], lines) 
    260291 
     292 
     293class Authz(BaseFixture): 
     294    authContext = TestPermAuthHandler() 
     295 
     296    def setUp(self): 
     297        super(Authz, self).setUp() 
     298 
     299        # Set modes on test files 
     300        os.chmod('%s/bar' % (DATADIR), 0640) 
     301        os.chmod('%s/foo' % (DATADIR), 0655) 
     302 
     303    def testOK(self): 
     304        """Test dir of a readable file. 
     305        """ 
     306 
     307        fh = self._runClient("stat %s/foo" % (DATADIR), debug=True) 
     308        output = fh.read() 
     309 
     310        lines = self._readSyslog() 
     311 
     312 
     313        self.assertLines(['Connection and authentication correct', 'stat /.*/foo OK'], output) 
     314        self.assertLines(['.*Authz: MSG_STAT .*/foo', '.*TestPermAuthzHandler OK'], lines) 
     315 
     316    def testFail(self): 
     317        """Test dir of a non-readable file. 
     318        """ 
     319 
     320        fh = self._runClient("stat %s/bar" % (DATADIR), debug=True) 
     321        output = fh.read() 
     322 
     323        lines = self._readSyslog() 
     324 
     325        self.assertLines(['BBFTP-ERROR.* ndg_authz_control: AuthorisationFailure.* no read perms', 
     326                          'stat /.*/bar FAILED'], output) 
     327        self.assertLines(['.*Authz: MSG_STAT .*/bar', '.* TestPermAuthzHandler FAIL', 
     328                          '.* ndg_authz_control: AuthorisationFailure.* no read perms'], lines) 
     329 
     330 
    261331if __name__ == '__main__': 
    262332    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.