Changeset 4786

Show
Ignore:
Timestamp:
05/24/07 23:59:36 (1 year ago)
Author:
morris
Message:

Fix overwriting of privileges that are in the struct, but not in the wire format

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/accounts.c

    r4750 r4786  
    5353static void                                                     wd_accounts_reload_account_for_user(wd_user_t *); 
    5454static void                                                     wd_accounts_sreply_privileges(wd_user_t *); 
     55static void                                                     wd_accounts_copy_privileges(wd_account_t *, wd_account_t *); 
    5556 
    5657static void                                                     wd_account_dealloc(wi_runtime_instance_t *); 
     
    9394                group = wd_accounts_read_group(user->group); 
    9495                 
    95                 if(group) { 
    96                         user->get_user_info                     = group->get_user_info; 
    97                         user->broadcast                         = group->broadcast; 
    98                         user->post_news                         = group->post_news; 
    99                         user->clear_news                        = group->clear_news; 
    100                         user->download                          = group->download; 
    101                         user->upload                            = group->upload; 
    102                         user->upload_anywhere           = group->upload_anywhere; 
    103                         user->create_folders            = group->create_folders; 
    104                         user->alter_files                       = group->alter_files; 
    105                         user->delete_files                      = group->delete_files; 
    106                         user->view_dropboxes            = group->view_dropboxes; 
    107                         user->create_accounts           = group->create_accounts; 
    108                         user->edit_accounts                     = group->edit_accounts; 
    109                         user->delete_accounts           = group->delete_accounts; 
    110                         user->elevate_privileges        = group->elevate_privileges; 
    111                         user->kick_users                        = group->kick_users; 
    112                         user->ban_users                         = group->ban_users; 
    113                         user->cannot_be_kicked          = group->cannot_be_kicked; 
    114                         user->download_speed            = group->download_speed; 
    115                         user->upload_speed                      = group->upload_speed; 
    116                         user->download_limit            = group->download_limit; 
    117                         user->upload_limit                      = group->upload_limit; 
    118                         user->set_topic                         = group->set_topic; 
    119  
    120                         wi_release(user->files); 
    121                         user->files                                     = wi_retain(group->files); 
    122                 } 
     96                if(group) 
     97                        wd_accounts_copy_privileges(group, user); 
    12398        } 
    12499         
     
    301276 
    302277wi_boolean_t wd_accounts_edit_user(wd_account_t *account) { 
    303         if(!wd_accounts_delete_user(account->name)) 
     278        wi_string_t             *name; 
     279        wd_account_t    *existing_account; 
     280         
     281        name = account->name; 
     282        existing_account = wd_accounts_read_user(name); 
     283         
     284        if(!existing_account) 
    304285                return false; 
    305286         
    306         if(!wd_accounts_create_user(account)) 
     287        if(!wd_accounts_delete_user(name)) 
    307288                return false; 
    308289         
    309         wd_accounts_reload_account_with_user(account->name); 
     290        wd_accounts_copy_privileges(account, existing_account); 
     291 
     292        if(!wd_accounts_create_user(existing_account)) 
     293                return false; 
     294         
     295        wd_accounts_reload_account_with_user(name); 
    310296 
    311297        return true; 
     
    315301 
    316302wi_boolean_t wd_accounts_edit_group(wd_account_t *account) { 
    317         if(!wd_accounts_delete_group(account->name)) 
     303        wi_string_t             *name; 
     304        wd_account_t    *existing_account; 
     305         
     306        name = account->name; 
     307        existing_account = wd_accounts_read_group(name); 
     308         
     309        if(!existing_account) 
    318310                return false; 
    319311         
    320         if(!wd_accounts_create_group(account)) 
     312        if(!wd_accounts_delete_group(name)) 
    321313                return false; 
    322314         
    323         wd_accounts_reload_account_with_group(account->name); 
     315        wd_accounts_copy_privileges(account, existing_account); 
     316 
     317        if(!wd_accounts_create_group(existing_account)) 
     318                return false; 
     319         
     320        wd_accounts_reload_account_with_group(name); 
    324321 
    325322        return true; 
     
    659656                          account->set_topic); 
    660657        wd_user_unlock_socket(user); 
     658} 
     659 
     660 
     661 
     662static void wd_accounts_copy_privileges(wd_account_t *src_account, wd_account_t *dst_account) { 
     663        if(src_account->group) { 
     664                wi_release(dst_account->group); 
     665                dst_account->group                      = wi_retain(src_account->group); 
     666        } 
     667         
     668        dst_account->get_user_info              = src_account->get_user_info; 
     669        dst_account->broadcast                  = src_account->broadcast; 
     670        dst_account->post_news                  = src_account->post_news; 
     671        dst_account->clear_news                 = src_account->clear_news; 
     672        dst_account->download                   = src_account->download; 
     673        dst_account->upload                             = src_account->upload; 
     674        dst_account->upload_anywhere    = src_account->upload_anywhere; 
     675        dst_account->create_folders             = src_account->create_folders; 
     676        dst_account->alter_files                = src_account->alter_files; 
     677        dst_account->delete_files               = src_account->delete_files; 
     678        dst_account->view_dropboxes             = src_account->view_dropboxes; 
     679        dst_account->create_accounts    = src_account->create_accounts; 
     680        dst_account->edit_accounts              = src_account->edit_accounts; 
     681        dst_account->delete_accounts    = src_account->delete_accounts; 
     682        dst_account->elevate_privileges = src_account->elevate_privileges; 
     683        dst_account->kick_users                 = src_account->kick_users; 
     684        dst_account->ban_users                  = src_account->ban_users; 
     685        dst_account->cannot_be_kicked   = src_account->cannot_be_kicked; 
     686        dst_account->download_speed             = src_account->download_speed; 
     687        dst_account->upload_speed               = src_account->upload_speed; 
     688        dst_account->download_limit             = src_account->download_limit; 
     689        dst_account->upload_limit               = src_account->upload_limit; 
     690        dst_account->set_topic                  = src_account->set_topic; 
     691         
     692        if(src_account->files) { 
     693                wi_release(dst_account->files); 
     694                dst_account->files                      = wi_retain(src_account->files); 
     695        } 
    661696} 
    662697 
     
    892927        account->upload_limit           = WD_ACCOUNT_GET_UINT32(array, count, 22); 
    893928        account->set_topic                      = WD_ACCOUNT_GET_BOOL(array, count, 23); 
    894         account->files                          = WD_ACCOUNT_GET_INSTANCE(array, count, 25); 
     929        account->files                          = WD_ACCOUNT_GET_INSTANCE(array, count, 24); 
    895930 
    896931        return account;