Ignore:
Timestamp:
Jun 4, 2008, 5:14:58 PM (14 years ago)
Author:
charles
Message:

RPC ACL: (1) add a new call for testing ACLs (2) add wildcard notation support (3) add regression tests for the ACL tester and wildcard handler

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/rpc-server.c

    r6026 r6031  
    1212
    1313#include <assert.h>
     14#include <ctype.h> /* isdigit */
     15#include <errno.h>
     16#include <stdlib.h> /* strtol */
    1417#include <string.h>
    1518
     
    219222}
    220223
     224/* 192.*.*.* --> 192.0.0.0/8
     225   192.64.*.* --> 192.64.0.0/16
     226   192.64.1.* --> 192.64.1.0/24
     227   192.64.1.2 --> 192.64.1.2/32 */
     228static void
     229cidrizeOne( const char * in, int len, struct evbuffer * out )
     230{
     231    int stars = 0;
     232    const char * pch;
     233    const char * end;
     234    char zero = '0';
     235    char huh = '?';
     236
     237    for( pch=in, end=pch+len; pch!=end; ++pch ) {
     238        if( stars && isdigit(*pch) )
     239            evbuffer_add( out, &huh, 1 );
     240        else if( *pch!='*' )
     241            evbuffer_add( out, pch, 1 );
     242        else {
     243            evbuffer_add( out, &zero, 1 );
     244            ++stars;
     245        }
     246    }
     247
     248    evbuffer_add_printf( out, "/%d", (32-(stars*8)));
     249}
     250
     251char*
     252cidrize( const char * acl )
     253{
     254    int len;
     255    const char * walk = acl;
     256    char * ret;
     257    struct evbuffer * out = evbuffer_new( );
     258
     259    FOR_EACH_WORD_IN_LIST( walk, len )
     260    {
     261        cidrizeOne( walk, len, out );
     262        evbuffer_add_printf( out, ", " );
     263    }
     264
     265    /* the -2 is to eat the final ", " */
     266    ret = tr_strndup( (char*) EVBUFFER_DATA(out), EVBUFFER_LENGTH(out)-2 );
     267    evbuffer_free( out );
     268    return ret;
     269}
     270
    221271int
    222 tr_rpcSetACL( tr_rpc_server * server, const char * acl, char ** setme_errmsg )
    223 {
    224     const int isRunning = server->ctx != NULL;
     272tr_rpcTestACL( const tr_rpc_server  * server UNUSED,
     273               const char           * acl,
     274               char                ** setme_errmsg )
     275{
    225276    int ret = 0;
    226     char * errmsg = testACL( acl );
    227 
     277    char * cidr = cidrize( acl );
     278    char * errmsg = testACL( cidr );
    228279    if( errmsg )
    229280    {
     
    234285        ret = -1;
    235286    }
    236     else
    237     {
     287    tr_free( cidr );
     288    return ret;
     289}
     290
     291int
     292tr_rpcSetACL( tr_rpc_server   * server,
     293              const char      * acl,
     294              char           ** setme_errmsg )
     295{
     296    char * cidr = cidrize( acl );
     297    const int ret = tr_rpcTestACL( server, cidr, setme_errmsg );
     298
     299    if( ret )
     300    {
     301        const int isRunning = server->ctx != NULL;
     302
    238303        if( isRunning )
    239304            stopServer( server );
    240305
    241306        tr_free( server->acl );
    242         server->acl = tr_strdup( acl );
     307        server->acl = tr_strdup( cidr );
    243308
    244309        if( isRunning )
Note: See TracChangeset for help on using the changeset viewer.