Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/lib/privileges.c

    r414 r740  
    2323
    2424#include "includes.h"
     25#include "lib/privileges.h"
     26#include "dbwrap.h"
     27#include "libcli/security/privileges_private.h"
     28#include "../libcli/security/security.h"
     29#include "passdb.h"
    2530
    2631#define PRIVPREFIX              "PRIV_"
    2732
    2833typedef struct {
    29         size_t count;
    30         DOM_SID *list;
     34        uint32_t count;
     35        struct dom_sid *list;
    3136} SID_LIST;
    3237
    3338typedef struct {
    3439        TALLOC_CTX *mem_ctx;
    35         SE_PRIV privilege;
     40        uint64_t privilege;
    3641        SID_LIST sids;
    3742} PRIV_SID_LIST;
    3843
    39 
    40 static bool get_privileges( const DOM_SID *sid, SE_PRIV *mask )
     44/*
     45  interpret an old style SE_PRIV structure
     46 */
     47static uint64_t map_old_SE_PRIV(unsigned char *dptr)
     48{
     49        uint32_t *old_masks = (uint32_t *)dptr;
     50        /*
     51         * the old privileges code only ever used up to 0x800, except
     52         * for a special case of 'SE_ALL_PRIVS' which was 0xFFFFFFFF
     53         */
     54        if (old_masks[0] == 0xFFFFFFFF) {
     55                /* they set all privileges */
     56                return SE_ALL_PRIVS;
     57        }
     58
     59        /* the old code used the machine byte order, but we don't know
     60         * the byte order of the machine that wrote it. However we can
     61         * tell what byte order it was by taking advantage of the fact
     62         * that it only ever use up to 0x800
     63         */
     64        if (dptr[0] || dptr[1]) {
     65                /* it was little endian */
     66                return IVAL(dptr, 0);
     67        }
     68
     69        /* it was either zero or big-endian */
     70        return RIVAL(dptr, 0);
     71}
     72
     73
     74static bool get_privileges( const struct dom_sid *sid, uint64_t *mask )
    4175{
    4276        struct db_context *db = get_account_pol_db();
     
    6094
    6195        if ( !data.dptr ) {
    62                 DEBUG(3, ("get_privileges: No privileges assigned to SID "
     96                DEBUG(4, ("get_privileges: No privileges assigned to SID "
    6397                          "[%s]\n", sid_string_dbg(sid)));
    6498                return False;
    6599        }
    66100
    67         SMB_ASSERT( data.dsize == sizeof( SE_PRIV ) );
    68 
    69         se_priv_copy( mask, (SE_PRIV*)data.dptr );
     101        if (data.dsize == 4*4) {
     102                /* it's an old style SE_PRIV structure. */
     103                *mask = map_old_SE_PRIV(data.dptr);
     104        } else {
     105                if (data.dsize != sizeof( uint64_t ) ) {
     106                        DEBUG(3, ("get_privileges: Invalid privileges record assigned to SID "
     107                                  "[%s]\n", sid_string_dbg(sid)));
     108                        return False;
     109                }
     110
     111                *mask = BVAL(data.dptr, 0);
     112        }
     113
    70114        TALLOC_FREE(data.dptr);
    71115
     
    77121****************************************************************************/
    78122
    79 static bool set_privileges( const DOM_SID *sid, SE_PRIV *mask )
     123static bool set_privileges( const struct dom_sid *sid, uint64_t mask )
    80124{
    81125        struct db_context *db = get_account_pol_db();
     126        uint8_t privbuf[8];
    82127        fstring tmp, keystr;
    83128        TDB_DATA data;
     
    98143        fstr_sprintf(keystr, "%s%s", PRIVPREFIX, sid_to_fstring(tmp, sid));
    99144
    100         /* no packing.  static size structure, just write it out */
    101 
    102         data.dptr  = (uint8 *)mask;
    103         data.dsize = sizeof(SE_PRIV);
     145        /* This writes the 64 bit bitmask out in little endian format */
     146        SBVAL(privbuf,0,mask);
     147
     148        data.dptr  = privbuf;
     149        data.dsize = sizeof(privbuf);
    104150
    105151        return NT_STATUS_IS_OK(dbwrap_store_bystring(db, keystr, data,
     
    111157*********************************************************************/
    112158
    113 bool get_privileges_for_sids(SE_PRIV *privileges, DOM_SID *slist, int scount)
    114 {
    115         SE_PRIV mask;
     159bool get_privileges_for_sids(uint64_t *privileges, struct dom_sid *slist, int scount)
     160{
     161        uint64_t mask;
    116162        int i;
    117163        bool found = False;
    118164
    119         se_priv_copy( privileges, &se_priv_none );
     165        *privileges = 0;
    120166
    121167        for ( i=0; i<scount; i++ ) {
     
    126172
    127173                DEBUG(5,("get_privileges_for_sids: sid = %s\nPrivilege "
    128                          "set:\n", sid_string_dbg(&slist[i])));
    129                 dump_se_priv( DBGC_ALL, 5, &mask );
    130 
    131                 se_priv_add( privileges, &mask );
     174                         "set: 0x%llx\n", sid_string_dbg(&slist[i]),
     175                         (unsigned long long)mask));
     176
     177                *privileges |= mask;
    132178                found = True;
    133179        }
     
    136182}
    137183
     184NTSTATUS get_privileges_for_sid_as_set(TALLOC_CTX *mem_ctx, PRIVILEGE_SET **privileges, struct dom_sid *sid)
     185{
     186        uint64_t mask;
     187        if (!get_privileges(sid, &mask)) {
     188                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
     189        }
     190
     191        *privileges = talloc_zero(mem_ctx, PRIVILEGE_SET);
     192        if (!*privileges) {
     193                return NT_STATUS_NO_MEMORY;
     194        }
     195
     196        if (!se_priv_to_privilege_set(*privileges, mask)) {
     197                return NT_STATUS_NO_MEMORY;
     198        }
     199        return NT_STATUS_OK;
     200}
    138201
    139202/*********************************************************************
     
    145208        PRIV_SID_LIST *priv = (PRIV_SID_LIST *)state;
    146209        int  prefixlen = strlen(PRIVPREFIX);
    147         DOM_SID sid;
     210        struct dom_sid sid;
    148211        fstring sid_string;
    149 
    150         /* easy check first */
    151 
    152         if (rec->value.dsize != sizeof(SE_PRIV) )
    153                 return 0;
    154212
    155213        /* check we have a PRIV_+SID entry */
     
    160218        /* check to see if we are looking for a particular privilege */
    161219
    162         if ( !se_priv_equal(&priv->privilege, &se_priv_none) ) {
    163                 SE_PRIV mask;
    164 
    165                 se_priv_copy( &mask, (SE_PRIV*)rec->value.dptr );
     220        fstrcpy( sid_string, (char *)&(rec->key.dptr[strlen(PRIVPREFIX)]) );
     221
     222        if (priv->privilege != 0) {
     223                uint64_t mask;
     224
     225                if (rec->value.dsize == 4*4) {
     226                        mask = map_old_SE_PRIV(rec->value.dptr);
     227                } else {
     228                        if (rec->value.dsize != sizeof( uint64_t ) ) {
     229                                DEBUG(3, ("get_privileges: Invalid privileges record assigned to SID "
     230                                          "[%s]\n", sid_string));
     231                                return 0;
     232                        }
     233                        mask = BVAL(rec->value.dptr, 0);
     234                }
    166235
    167236                /* if the SID does not have the specified privilege
    168237                   then just return */
    169238
    170                 if ( !is_privilege_assigned( &mask, &priv->privilege) )
     239                if ((mask & priv->privilege) == 0) {
    171240                        return 0;
    172         }
    173 
    174         fstrcpy( sid_string, (char *)&(rec->key.dptr[strlen(PRIVPREFIX)]) );
     241                }
     242        }
    175243
    176244        /* this is a last ditch safety check to preventing returning
     
    200268*********************************************************************/
    201269
    202 NTSTATUS privilege_enumerate_accounts(DOM_SID **sids, int *num_sids)
     270NTSTATUS privilege_enumerate_accounts(struct dom_sid **sids, int *num_sids)
    203271{
    204272        struct db_context *db = get_account_pol_db();
     
    211279        ZERO_STRUCT(priv);
    212280
    213         se_priv_copy( &priv.privilege, &se_priv_none );
    214 
    215281        db->traverse_read(db, priv_traverse_fn, &priv);
    216282
     
    227293*********************************************************************/
    228294
    229 NTSTATUS privilege_enum_sids(const SE_PRIV *mask, TALLOC_CTX *mem_ctx,
    230                              DOM_SID **sids, int *num_sids)
     295NTSTATUS privilege_enum_sids(enum sec_privilege privilege, TALLOC_CTX *mem_ctx,
     296                             struct dom_sid **sids, int *num_sids)
    231297{
    232298        struct db_context *db = get_account_pol_db();
     
    239305        ZERO_STRUCT(priv);
    240306
    241         se_priv_copy(&priv.privilege, mask);
     307        priv.privilege = sec_privilege_mask(privilege);
    242308        priv.mem_ctx = mem_ctx;
    243309
     
    256322****************************************************************************/
    257323
    258 bool grant_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask)
    259 {
    260         SE_PRIV old_mask, new_mask;
     324static bool grant_privilege_bitmap(const struct dom_sid *sid, const uint64_t priv_mask)
     325{
     326        uint64_t old_mask, new_mask;
    261327
    262328        ZERO_STRUCT( old_mask );
     
    264330
    265331        if ( get_privileges( sid, &old_mask ) )
    266                 se_priv_copy( &new_mask, &old_mask );
     332                new_mask = old_mask;
    267333        else
    268                 se_priv_copy( &new_mask, &se_priv_none );
    269 
    270         se_priv_add( &new_mask, priv_mask );
     334                new_mask = 0;
     335
     336        new_mask |= priv_mask;
    271337
    272338        DEBUG(10,("grant_privilege: %s\n", sid_string_dbg(sid)));
    273339
    274         DEBUGADD( 10, ("original privilege mask:\n"));
    275         dump_se_priv( DBGC_ALL, 10, &old_mask );
    276 
    277         DEBUGADD( 10, ("new privilege mask:\n"));
    278         dump_se_priv( DBGC_ALL, 10, &new_mask );
    279 
    280         return set_privileges( sid, &new_mask );
     340        DEBUGADD( 10, ("original privilege mask: 0x%llx\n", (unsigned long long)new_mask));
     341
     342        DEBUGADD( 10, ("new privilege mask:      0x%llx\n", (unsigned long long)new_mask));
     343
     344        return set_privileges( sid, new_mask );
    281345}
    282346
     
    285349*********************************************************************/
    286350
    287 bool grant_privilege_by_name(DOM_SID *sid, const char *name)
    288 {
    289         SE_PRIV mask;
     351bool grant_privilege_by_name(const struct dom_sid *sid, const char *name)
     352{
     353        uint64_t mask;
    290354
    291355        if (! se_priv_from_name(name, &mask)) {
     
    295359        }
    296360
    297         return grant_privilege( sid, &mask );
     361        return grant_privilege_bitmap( sid, mask );
     362}
     363
     364/***************************************************************************
     365 Grant a privilege set (list of LUID values) from a sid
     366****************************************************************************/
     367
     368bool grant_privilege_set(const struct dom_sid *sid, struct lsa_PrivilegeSet *set)
     369{
     370        uint64_t privilege_mask;
     371        if (!privilege_set_to_se_priv(&privilege_mask, set)) {
     372                return false;
     373        }
     374        return grant_privilege_bitmap(sid, privilege_mask);
    298375}
    299376
     
    302379****************************************************************************/
    303380
    304 bool revoke_privilege(const DOM_SID *sid, const SE_PRIV *priv_mask)
    305 {
    306         SE_PRIV mask;
     381static bool revoke_privilege_bitmap(const struct dom_sid *sid, const uint64_t priv_mask)
     382{
     383        uint64_t mask;
    307384
    308385        /* if the user has no privileges, then we can't revoke any */
     
    313390        DEBUG(10,("revoke_privilege: %s\n", sid_string_dbg(sid)));
    314391
    315         DEBUGADD( 10, ("original privilege mask:\n"));
    316         dump_se_priv( DBGC_ALL, 10, &mask );
    317 
    318         se_priv_remove( &mask, priv_mask );
    319 
    320         DEBUGADD( 10, ("new privilege mask:\n"));
    321         dump_se_priv( DBGC_ALL, 10, &mask );
    322 
    323         return set_privileges( sid, &mask );
     392        DEBUGADD( 10, ("original privilege mask: 0x%llx\n", (unsigned long long)mask));
     393
     394        mask &= ~priv_mask;
     395
     396        DEBUGADD( 10, ("new privilege mask:      0x%llx\n", (unsigned long long)mask));
     397
     398        return set_privileges( sid, mask );
     399}
     400
     401/***************************************************************************
     402 Remove a privilege set (list of LUID values) from a sid
     403****************************************************************************/
     404
     405bool revoke_privilege_set(const struct dom_sid *sid, struct lsa_PrivilegeSet *set)
     406{
     407        uint64_t privilege_mask;
     408        if (!privilege_set_to_se_priv(&privilege_mask, set)) {
     409                return false;
     410        }
     411        return revoke_privilege_bitmap(sid, privilege_mask);
    324412}
    325413
     
    328416*********************************************************************/
    329417
    330 bool revoke_all_privileges( DOM_SID *sid )
    331 {
    332         return revoke_privilege( sid, &se_priv_all );
     418bool revoke_all_privileges( const struct dom_sid *sid )
     419{
     420        return revoke_privilege_bitmap( sid, SE_ALL_PRIVS);
    333421}
    334422
     
    337425*********************************************************************/
    338426
    339 bool revoke_privilege_by_name(DOM_SID *sid, const char *name)
    340 {
    341         SE_PRIV mask;
     427bool revoke_privilege_by_name(const struct dom_sid *sid, const char *name)
     428{
     429        uint64_t mask;
    342430
    343431        if (! se_priv_from_name(name, &mask)) {
     
    347435        }
    348436
    349         return revoke_privilege(sid, &mask);
     437        return revoke_privilege_bitmap(sid, mask);
    350438
    351439}
     
    355443****************************************************************************/
    356444
    357 NTSTATUS privilege_create_account(const DOM_SID *sid )
    358 {
    359         return ( grant_privilege(sid, &se_priv_none) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL);
     445NTSTATUS privilege_create_account(const struct dom_sid *sid )
     446{
     447        return ( grant_privilege_bitmap(sid, 0) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL);
    360448}
    361449
     
    388476}
    389477
    390 /****************************************************************************
    391  initialise a privilege list and set the talloc context
    392  ****************************************************************************/
    393 
    394 NTSTATUS privilege_set_init(PRIVILEGE_SET *priv_set)
    395 {
    396         TALLOC_CTX *mem_ctx;
    397 
    398         ZERO_STRUCTP( priv_set );
    399 
    400         mem_ctx = talloc_init("privilege set");
    401         if ( !mem_ctx ) {
    402                 DEBUG(0,("privilege_set_init: failed to initialize talloc ctx!\n"));
    403                 return NT_STATUS_NO_MEMORY;
    404         }
    405 
    406         priv_set->mem_ctx = mem_ctx;
    407 
    408         return NT_STATUS_OK;
    409 }
    410 
    411 /****************************************************************************
    412   initialise a privilege list and with someone else's talloc context
    413 ****************************************************************************/
    414 
    415 NTSTATUS privilege_set_init_by_ctx(TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set)
    416 {
    417         ZERO_STRUCTP( priv_set );
    418 
    419         priv_set->mem_ctx = mem_ctx;
    420         priv_set->ext_ctx = True;
    421 
    422         return NT_STATUS_OK;
    423 }
    424 
    425 /****************************************************************************
    426  Free all memory used by a PRIVILEGE_SET
    427 ****************************************************************************/
    428 
    429 void privilege_set_free(PRIVILEGE_SET *priv_set)
    430 {
    431         if ( !priv_set )
    432                 return;
    433 
    434         if ( !( priv_set->ext_ctx ) )
    435                 talloc_destroy( priv_set->mem_ctx );
    436 
    437         ZERO_STRUCTP( priv_set );
    438 }
    439 
    440 /****************************************************************************
    441  duplicate alloc luid_attr
    442  ****************************************************************************/
    443 
    444 NTSTATUS dup_luid_attr(TALLOC_CTX *mem_ctx, LUID_ATTR **new_la, LUID_ATTR *old_la, int count)
    445 {
    446         int i;
    447 
    448         if ( !old_la )
    449                 return NT_STATUS_OK;
    450 
    451         if (count) {
    452                 *new_la = TALLOC_ARRAY(mem_ctx, LUID_ATTR, count);
    453                 if ( !*new_la ) {
    454                         DEBUG(0,("dup_luid_attr: failed to alloc new LUID_ATTR array [%d]\n", count));
    455                         return NT_STATUS_NO_MEMORY;
    456                 }
    457         } else {
    458                 *new_la = NULL;
    459         }
    460 
    461         for (i=0; i<count; i++) {
    462                 (*new_la)[i].luid.high = old_la[i].luid.high;
    463                 (*new_la)[i].luid.low = old_la[i].luid.low;
    464                 (*new_la)[i].attr = old_la[i].attr;
    465         }
    466 
    467         return NT_STATUS_OK;
    468 }
    469 
    470478/*******************************************************************
    471479*******************************************************************/
    472480
    473 bool is_privileged_sid( const DOM_SID *sid )
    474 {
    475         SE_PRIV mask;
     481bool is_privileged_sid( const struct dom_sid *sid )
     482{
     483        uint64_t mask;
    476484
    477485        return get_privileges( sid, &mask );
     
    481489*******************************************************************/
    482490
    483 bool grant_all_privileges( const DOM_SID *sid )
    484 {
    485         SE_PRIV mask;
    486 
    487         if (!se_priv_put_all_privileges(&mask)) {
    488                 return False;
    489         }
    490 
    491         return grant_privilege( sid, &mask );
    492 }
     491bool grant_all_privileges( const struct dom_sid *sid )
     492{
     493        uint64_t mask;
     494
     495        se_priv_put_all_privileges(&mask);
     496
     497        return grant_privilege_bitmap( sid, mask );
     498}
Note: See TracChangeset for help on using the changeset viewer.