Changeset 6122

Show
Ignore:
Timestamp:
09/20/08 22:12:42 (4 months ago)
Author:
morris
Message:

Add support for editing the banlist remotely, both permanent bans stored in the banlist file and temporary bans with an expiration time

When banning a user, you can now specify the ban time

Adds three new privileges: get bans, add bans, delete bans

Protocol updated to 2.0b4

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/P7/wired/run/wired.xml

    r5867 r6122  
    44                         xsi:schemaLocation="http://www.zankasoftware.com/P7/Specification p7.xsd" 
    55                         name="Wired" 
    6                          version="2.0b3"> 
     6                         version="2.0b4"> 
    77        <p7:fields> 
    88                <p7:field name="wired.transaction" type="uint32" id="1000" /> 
     
    1414                        <p7:enum name="wired.error.message_out_of_sequence" value="3" /> 
    1515                        <p7:enum name="wired.error.login_failed" value="4" /> 
    16                         <p7:enum name="wired.error.banned" value="5" /> 
    17                         <p7:enum name="wired.error.permission_denied" value="6" /> 
    18                         <p7:enum name="wired.error.chat_not_found" value="7" /> 
    19                         <p7:enum name="wired.error.user_not_found" value="8" /> 
    20                         <p7:enum name="wired.error.user_cannot_be_disconnected" value="9" /> 
    21                         <p7:enum name="wired.error.file_not_found" value="10" /> 
    22                         <p7:enum name="wired.error.file_exists" value="11" /> 
    23                         <p7:enum name="wired.error.account_not_found" value="12" /> 
    24                         <p7:enum name="wired.error.account_exists" value="13" /> 
    25                         <p7:enum name="wired.error.tracker_not_enabled" value="14" /> 
     16                        <p7:enum name="wired.error.permission_denied" value="5" /> 
     17                        <p7:enum name="wired.error.chat_not_found" value="6" /> 
     18                        <p7:enum name="wired.error.user_not_found" value="7" /> 
     19                        <p7:enum name="wired.error.user_cannot_be_disconnected" value="8" /> 
     20                        <p7:enum name="wired.error.file_not_found" value="9" /> 
     21                        <p7:enum name="wired.error.file_exists" value="10" /> 
     22                        <p7:enum name="wired.error.account_not_found" value="11" /> 
     23                        <p7:enum name="wired.error.account_exists" value="12" /> 
     24                        <p7:enum name="wired.error.tracker_not_enabled" value="13" /> 
     25                        <p7:enum name="wired.error.ban_not_found" value="14" /> 
     26                        <p7:enum name="wired.error.ban_exists" value="15" /> 
    2627                </p7:field> 
    2728                 
     
    161162                <p7:field name="wired.account.settings.get_settings" type="bool" id="8052" /> 
    162163                <p7:field name="wired.account.settings.set_settings" type="bool" id="8053" /> 
    163                 <p7:field name="wired.account.tracker.list_servers" type="bool" id="8054" /> 
    164                 <p7:field name="wired.account.tracker.register_servers" type="bool" id="8055" /> 
     164                <p7:field name="wired.account.banlist.get_bans" type="bool" id="8054" /> 
     165                <p7:field name="wired.account.banlist.add_bans" type="bool" id="8055" /> 
     166                <p7:field name="wired.account.banlist.delete_bans" type="bool" id="8056" /> 
     167                <p7:field name="wired.account.tracker.list_servers" type="bool" id="8057" /> 
     168                <p7:field name="wired.account.tracker.register_servers" type="bool" id="8058" /> 
    165169 
    166170                <p7:field name="wired.transfer.type" type="enum" id="9000"> 
     
    184188                <p7:field name="wired.settings.register_with_trackers" type="bool" id="10003" /> 
    185189                <p7:field name="wired.settings.trackers" type="list" listtype="string" id="10004" /> 
     190                <p7:field name="wired.banlist.ip" type="string" id="10005" /> 
     191                <p7:field name="wired.banlist.expiration_date" type="date" id="10006" /> 
    186192                 
    187193                <p7:field name="wired.tracker.tracker" type="bool" id="11000" /> 
     
    279285                        <p7:member field="wired.account.settings.get_settings" /> 
    280286                        <p7:member field="wired.account.settings.set_settings" /> 
     287                        <p7:member field="wired.account.banlist.get_bans" /> 
     288                        <p7:member field="wired.account.banlist.add_bans" /> 
     289                        <p7:member field="wired.account.banlist.delete_bans" /> 
    281290                        <p7:member field="wired.account.tracker.list_servers" /> 
    282291                        <p7:member field="wired.account.tracker.register_servers" /> 
     
    308317                        <p7:parameter field="wired.transaction" /> 
    309318                        <p7:parameter field="wired.user.id" use="required" /> 
     319                </p7:message> 
     320                 
     321                <p7:message name="wired.banned" id="1005"> 
     322                        <p7:parameter field="wired.transaction" /> 
     323                        <p7:parameter field="wired.banlist.expiration_date" /> 
    310324                </p7:message> 
    311325                 
     
    489503                        <p7:parameter field="wired.user.id" use="required" /> 
    490504                        <p7:parameter field="wired.user.disconnect_message" use="required" /> 
     505                        <p7:parameter field="wired.banlist.expiration_date" /> 
    491506                </p7:message> 
    492507 
     
    878893                </p7:message> 
    879894                 
     895                <p7:message name="wired.banlist.get_bans" id="10006"> 
     896                        <p7:parameter field="wired.transaction" /> 
     897                </p7:message> 
     898                 
     899                <p7:message name="wired.banlist.ban_list" id="10007"> 
     900                        <p7:parameter field="wired.transaction" /> 
     901                        <p7:parameter field="wired.banlist.ip" use="required" /> 
     902                        <p7:parameter field="wired.banlist.expiration_date" /> 
     903                </p7:message> 
     904                 
     905                <p7:message name="wired.banlist.ban_list.done" id="10008"> 
     906                        <p7:parameter field="wired.transaction" /> 
     907                </p7:message> 
     908                 
     909                <p7:message name="wired.banlist.add_ban" id="10009"> 
     910                        <p7:parameter field="wired.transaction" /> 
     911                        <p7:parameter field="wired.banlist.ip" use="required" /> 
     912                        <p7:parameter field="wired.banlist.expiration_date" /> 
     913                </p7:message> 
     914                 
     915                <p7:message name="wired.banlist.delete_ban" id="10010"> 
     916                        <p7:parameter field="wired.transaction" /> 
     917                        <p7:parameter field="wired.banlist.ip" use="required" /> 
     918                        <p7:parameter field="wired.banlist.expiration_date" /> 
     919                </p7:message> 
     920                 
    880921                <p7:message name="wired.tracker.get_categories" id="11000"> 
    881922                        <p7:parameter field="wired.transaction" /> 
     
    948989                                </p7:and> 
    949990                                <p7:reply message="wired.error" count="1" use="required" /> 
     991                                <p7:reply message="wired.banned" count="1" use="required" /> 
    950992                        </p7:or> 
    951993                </p7:transaction> 
     
    12021244                                <p7:reply message="wired.error" count="1" use="required" /> 
    12031245                        </p7:or> 
     1246                </p7:transaction> 
     1247 
     1248                <p7:transaction message="wired.banlist.get_bans" originator="client"> 
     1249                        <p7:or> 
     1250                                <p7:and> 
     1251                                        <p7:reply message="wired.banlist.ban_list" count="*" use="required" /> 
     1252                                        <p7:reply message="wired.banlist.ban_list.done" count="1" use="required" /> 
     1253                                </p7:and> 
     1254                                <p7:reply message="wired.error" count="1" use="required" /> 
     1255                        </p7:or> 
     1256                </p7:transaction> 
     1257 
     1258                <p7:transaction message="wired.banlist.add_ban" originator="client"> 
     1259                        <p7:reply message="wired.error" count="?" use="required" /> 
     1260                </p7:transaction> 
     1261 
     1262                <p7:transaction message="wired.banlist.delete_ban" originator="client"> 
     1263                        <p7:reply message="wired.error" count="?" use="required" /> 
    12041264                </p7:transaction> 
    12051265 
  • branches/P7/wired/wired/accounts.c

    r5867 r6122  
    724724        account->settings_get_settings                          = wd_account_next_bool(array, false, &i); 
    725725        account->settings_set_settings                          = wd_account_next_bool(array, false, &i); 
     726        account->banlist_get_bans                                       = wd_account_next_bool(array, false, &i); 
     727        account->banlist_add_bans                                       = wd_account_next_bool(array, false, &i); 
     728        account->banlist_delete_bans                            = wd_account_next_bool(array, false, &i); 
    726729        account->tracker_list_servers                           = wd_account_next_bool(array, false, &i); 
    727730        account->tracker_register_servers                       = wd_account_next_bool(array, false, &i); 
     
    792795        account->settings_get_settings                          = wd_account_next_bool(array, false, &i); 
    793796        account->settings_set_settings                          = wd_account_next_bool(array, false, &i); 
     797        account->banlist_get_bans                                       = wd_account_next_bool(array, false, &i); 
     798        account->banlist_add_bans                                       = wd_account_next_bool(array, false, &i); 
     799        account->banlist_delete_bans                            = wd_account_next_bool(array, false, &i); 
    794800        account->tracker_list_servers                           = wd_account_next_bool(array, false, &i); 
    795801        account->tracker_register_servers                       = wd_account_next_bool(array, false, &i); 
     
    934940        WD_ACCOUNT_GET_BOOL(&account->settings_get_settings, WI_STR("wired.account.settings.get_settings")); 
    935941        WD_ACCOUNT_GET_BOOL(&account->settings_set_settings, WI_STR("wired.account.settings.set_settings")); 
     942        WD_ACCOUNT_GET_BOOL(&account->banlist_get_bans, WI_STR("wired.account.banlist.get_bans")); 
     943        WD_ACCOUNT_GET_BOOL(&account->banlist_add_bans, WI_STR("wired.account.banlist.add_bans")); 
     944        WD_ACCOUNT_GET_BOOL(&account->banlist_delete_bans, WI_STR("wired.account.banlist.delete_bans")); 
    936945        WD_ACCOUNT_GET_BOOL(&account->tracker_list_servers, WI_STR("wired.account.tracker.list_servers")); 
    937946        WD_ACCOUNT_GET_BOOL(&account->tracker_register_servers, WI_STR("wired.account.tracker.register_servers")); 
     
    9991008        WD_ACCOUNT_SET_BOOL(account->settings_get_settings, WI_STR("wired.account.settings.get_settings")); 
    10001009        WD_ACCOUNT_SET_BOOL(account->settings_set_settings, WI_STR("wired.account.settings.set_settings")); 
     1010        WD_ACCOUNT_SET_BOOL(account->banlist_get_bans, WI_STR("wired.account.banlist.get_bans")); 
     1011        WD_ACCOUNT_SET_BOOL(account->banlist_add_bans, WI_STR("wired.account.banlist.add_bans")); 
     1012        WD_ACCOUNT_SET_BOOL(account->banlist_delete_bans, WI_STR("wired.account.banlist.delete_bans")); 
    10011013        WD_ACCOUNT_SET_BOOL(account->tracker_list_servers, WI_STR("wired.account.tracker.list_servers")); 
    10021014        WD_ACCOUNT_SET_BOOL(account->tracker_register_servers, WI_STR("wired.account.tracker.register_servers")); 
     
    10041016 
    10051017 
     1018 
     1019#define WD_ACCOUNT_ADD_BOOL(value) \ 
     1020        wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), (value))) 
    10061021 
    10071022static wi_array_t * wd_account_user_array(wd_account_t *account) { 
     
    10121027        wi_array_add_data(array, account->password); 
    10131028        wi_array_add_data(array, account->group); 
    1014         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_get_info)); 
    1015         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->message_broadcast)); 
    1016         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_post_news)); 
    1017         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_clear_news)); 
    1018         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_files)); 
    1019         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_files)); 
    1020         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_anywhere)); 
    1021         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_create_directories)); 
    1022         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_move_files)); 
    1023         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_delete_files)); 
    1024         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_access_all_dropboxes)); 
    1025         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_create_accounts)); 
    1026         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_edit_accounts)); 
    1027         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_delete_accounts)); 
    1028         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_raise_account_privileges)); 
    1029         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_kick_users)); 
    1030         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_ban_users)); 
    1031         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_cannot_be_disconnected)); 
    1032         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_speed_limit)); 
    1033         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_speed_limit)); 
    1034         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_limit)); 
    1035         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_limit)); 
    1036         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->chat_set_topic)); 
     1029        WD_ACCOUNT_ADD_BOOL(account->user_get_info); 
     1030        WD_ACCOUNT_ADD_BOOL(account->message_broadcast); 
     1031        WD_ACCOUNT_ADD_BOOL(account->news_post_news); 
     1032        WD_ACCOUNT_ADD_BOOL(account->news_clear_news); 
     1033        WD_ACCOUNT_ADD_BOOL(account->transfer_download_files); 
     1034        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_files); 
     1035        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_anywhere); 
     1036        WD_ACCOUNT_ADD_BOOL(account->file_create_directories); 
     1037        WD_ACCOUNT_ADD_BOOL(account->file_move_files); 
     1038        WD_ACCOUNT_ADD_BOOL(account->file_delete_files); 
     1039        WD_ACCOUNT_ADD_BOOL(account->file_access_all_dropboxes); 
     1040        WD_ACCOUNT_ADD_BOOL(account->account_create_accounts); 
     1041        WD_ACCOUNT_ADD_BOOL(account->account_edit_accounts); 
     1042        WD_ACCOUNT_ADD_BOOL(account->account_delete_accounts); 
     1043        WD_ACCOUNT_ADD_BOOL(account->account_raise_account_privileges); 
     1044        WD_ACCOUNT_ADD_BOOL(account->user_kick_users); 
     1045        WD_ACCOUNT_ADD_BOOL(account->user_ban_users); 
     1046        WD_ACCOUNT_ADD_BOOL(account->user_cannot_be_disconnected); 
     1047        WD_ACCOUNT_ADD_BOOL(account->transfer_download_speed_limit); 
     1048        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_speed_limit); 
     1049        WD_ACCOUNT_ADD_BOOL(account->transfer_download_limit); 
     1050        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_limit); 
     1051        WD_ACCOUNT_ADD_BOOL(account->chat_set_topic); 
    10371052        wi_array_add_data(array, account->files); 
    10381053        wi_array_add_data(array, account->full_name); 
     
    10451060        wi_array_add_data(array, account->edited_by); 
    10461061        wi_array_add_data(array, wi_array_components_joined_by_string(account->groups, WI_STR(","))); 
    1047         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->chat_create_chats)); 
    1048         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->message_send_messages)); 
    1049         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_read_news)); 
    1050         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_list_files)); 
    1051         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_get_info)); 
    1052         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_create_links)); 
    1053         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_rename_files)); 
    1054         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_type)); 
    1055         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_comment)); 
    1056         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_permissions)); 
    1057         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_executable)); 
    1058         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_recursive_list_depth_limit)); 
    1059         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_directories)); 
    1060         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_change_password)); 
    1061         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_list_accounts)); 
    1062         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_read_accounts)); 
    1063         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_cannot_set_nick)); 
    1064         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_get_users)); 
    1065         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->log_view_log)); 
    1066         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->settings_get_settings)); 
    1067         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->settings_set_settings)); 
    1068         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->tracker_list_servers)); 
    1069         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->tracker_register_servers)); 
     1062        WD_ACCOUNT_ADD_BOOL(account->chat_create_chats); 
     1063        WD_ACCOUNT_ADD_BOOL(account->message_send_messages); 
     1064        WD_ACCOUNT_ADD_BOOL(account->news_read_news); 
     1065        WD_ACCOUNT_ADD_BOOL(account->file_list_files); 
     1066        WD_ACCOUNT_ADD_BOOL(account->file_get_info); 
     1067        WD_ACCOUNT_ADD_BOOL(account->file_create_links); 
     1068        WD_ACCOUNT_ADD_BOOL(account->file_rename_files); 
     1069        WD_ACCOUNT_ADD_BOOL(account->file_set_type); 
     1070        WD_ACCOUNT_ADD_BOOL(account->file_set_comment); 
     1071        WD_ACCOUNT_ADD_BOOL(account->file_set_permissions); 
     1072        WD_ACCOUNT_ADD_BOOL(account->file_set_executable); 
     1073        WD_ACCOUNT_ADD_BOOL(account->file_recursive_list_depth_limit); 
     1074        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_directories); 
     1075        WD_ACCOUNT_ADD_BOOL(account->account_change_password); 
     1076        WD_ACCOUNT_ADD_BOOL(account->account_list_accounts); 
     1077        WD_ACCOUNT_ADD_BOOL(account->account_read_accounts); 
     1078        WD_ACCOUNT_ADD_BOOL(account->user_cannot_set_nick); 
     1079        WD_ACCOUNT_ADD_BOOL(account->user_get_users); 
     1080        WD_ACCOUNT_ADD_BOOL(account->log_view_log); 
     1081        WD_ACCOUNT_ADD_BOOL(account->settings_get_settings); 
     1082        WD_ACCOUNT_ADD_BOOL(account->settings_set_settings); 
     1083        WD_ACCOUNT_ADD_BOOL(account->banlist_get_bans); 
     1084        WD_ACCOUNT_ADD_BOOL(account->banlist_add_bans); 
     1085        WD_ACCOUNT_ADD_BOOL(account->banlist_delete_bans); 
     1086        WD_ACCOUNT_ADD_BOOL(account->tracker_list_servers); 
     1087        WD_ACCOUNT_ADD_BOOL(account->tracker_register_servers); 
    10701088 
    10711089        return array; 
     
    10801098         
    10811099        wi_array_add_data(array, account->name); 
    1082         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_get_info)); 
    1083         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->message_broadcast)); 
    1084         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_post_news)); 
    1085         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_clear_news)); 
    1086         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_files)); 
    1087         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_files)); 
    1088         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_anywhere)); 
    1089         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_create_directories)); 
    1090         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_move_files)); 
    1091         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_delete_files)); 
    1092         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_access_all_dropboxes)); 
    1093         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_create_accounts)); 
    1094         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_edit_accounts)); 
    1095         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_delete_accounts)); 
    1096         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_raise_account_privileges)); 
    1097         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_kick_users)); 
    1098         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_ban_users)); 
    1099         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_cannot_be_disconnected)); 
    1100         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_speed_limit)); 
    1101         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_speed_limit)); 
    1102         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_download_limit)); 
    1103         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_limit)); 
    1104         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->chat_set_topic)); 
     1100        WD_ACCOUNT_ADD_BOOL(account->user_get_info); 
     1101        WD_ACCOUNT_ADD_BOOL(account->message_broadcast); 
     1102        WD_ACCOUNT_ADD_BOOL(account->news_post_news); 
     1103        WD_ACCOUNT_ADD_BOOL(account->news_clear_news); 
     1104        WD_ACCOUNT_ADD_BOOL(account->transfer_download_files); 
     1105        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_files); 
     1106        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_anywhere); 
     1107        WD_ACCOUNT_ADD_BOOL(account->file_create_directories); 
     1108        WD_ACCOUNT_ADD_BOOL(account->file_move_files); 
     1109        WD_ACCOUNT_ADD_BOOL(account->file_delete_files); 
     1110        WD_ACCOUNT_ADD_BOOL(account->file_access_all_dropboxes); 
     1111        WD_ACCOUNT_ADD_BOOL(account->account_create_accounts); 
     1112        WD_ACCOUNT_ADD_BOOL(account->account_edit_accounts); 
     1113        WD_ACCOUNT_ADD_BOOL(account->account_delete_accounts); 
     1114        WD_ACCOUNT_ADD_BOOL(account->account_raise_account_privileges); 
     1115        WD_ACCOUNT_ADD_BOOL(account->user_kick_users); 
     1116        WD_ACCOUNT_ADD_BOOL(account->user_ban_users); 
     1117        WD_ACCOUNT_ADD_BOOL(account->user_cannot_be_disconnected); 
     1118        WD_ACCOUNT_ADD_BOOL(account->transfer_download_speed_limit); 
     1119        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_speed_limit); 
     1120        WD_ACCOUNT_ADD_BOOL(account->transfer_download_limit); 
     1121        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_limit); 
     1122        WD_ACCOUNT_ADD_BOOL(account->chat_set_topic); 
    11051123        wi_array_add_data(array, account->files); 
    11061124        wi_array_add_data(array, wi_string_by_replacing_string_with_string(wi_date_rfc3339_string(account->creation_time), 
     
    11091127                WI_STR(":"), WI_STR(";"), 0)); 
    11101128        wi_array_add_data(array, account->edited_by); 
    1111         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->chat_create_chats)); 
    1112         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->message_send_messages)); 
    1113         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->news_read_news)); 
    1114         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_list_files)); 
    1115         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_get_info)); 
    1116         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_create_links)); 
    1117         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_rename_files)); 
    1118         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_type)); 
    1119         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_comment)); 
    1120         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_permissions)); 
    1121         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_set_executable)); 
    1122         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->file_recursive_list_depth_limit)); 
    1123         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->transfer_upload_directories)); 
    1124         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_change_password)); 
    1125         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_list_accounts)); 
    1126         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->account_read_accounts)); 
    1127         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_cannot_set_nick)); 
    1128         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->user_get_users)); 
    1129         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->log_view_log)); 
    1130         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->settings_get_settings)); 
    1131         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->settings_set_settings)); 
    1132         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->tracker_list_servers)); 
    1133         wi_array_add_data(array, wi_string_with_format(WI_STR("%u"), account->tracker_register_servers)); 
     1129        WD_ACCOUNT_ADD_BOOL(account->chat_create_chats); 
     1130        WD_ACCOUNT_ADD_BOOL(account->message_send_messages); 
     1131        WD_ACCOUNT_ADD_BOOL(account->news_read_news); 
     1132        WD_ACCOUNT_ADD_BOOL(account->file_list_files); 
     1133        WD_ACCOUNT_ADD_BOOL(account->file_get_info); 
     1134        WD_ACCOUNT_ADD_BOOL(account->file_create_links); 
     1135        WD_ACCOUNT_ADD_BOOL(account->file_rename_files); 
     1136        WD_ACCOUNT_ADD_BOOL(account->file_set_type); 
     1137        WD_ACCOUNT_ADD_BOOL(account->file_set_comment); 
     1138        WD_ACCOUNT_ADD_BOOL(account->file_set_permissions); 
     1139        WD_ACCOUNT_ADD_BOOL(account->file_set_executable); 
     1140        WD_ACCOUNT_ADD_BOOL(account->file_recursive_list_depth_limit); 
     1141        WD_ACCOUNT_ADD_BOOL(account->transfer_upload_directories); 
     1142        WD_ACCOUNT_ADD_BOOL(account->account_change_password); 
     1143        WD_ACCOUNT_ADD_BOOL(account->account_list_accounts); 
     1144        WD_ACCOUNT_ADD_BOOL(account->account_read_accounts); 
     1145        WD_ACCOUNT_ADD_BOOL(account->user_cannot_set_nick); 
     1146        WD_ACCOUNT_ADD_BOOL(account->user_get_users); 
     1147        WD_ACCOUNT_ADD_BOOL(account->log_view_log); 
     1148        WD_ACCOUNT_ADD_BOOL(account->settings_get_settings); 
     1149        WD_ACCOUNT_ADD_BOOL(account->settings_set_settings); 
     1150        WD_ACCOUNT_ADD_BOOL(account->banlist_get_bans); 
     1151        WD_ACCOUNT_ADD_BOOL(account->banlist_add_bans); 
     1152        WD_ACCOUNT_ADD_BOOL(account->banlist_delete_bans); 
     1153        WD_ACCOUNT_ADD_BOOL(account->tracker_list_servers); 
     1154        WD_ACCOUNT_ADD_BOOL(account->tracker_register_servers); 
    11341155         
    11351156        return array; 
     
    12421263                if(account->settings_get_settings && !user_account->settings_get_settings) return false; 
    12431264                if(account->settings_set_settings && !user_account->settings_set_settings) return false; 
     1265                if(account->banlist_get_bans && !user_account->banlist_get_bans) return false; 
     1266                if(account->banlist_add_bans && !user_account->banlist_add_bans) return false; 
     1267                if(account->banlist_delete_bans && !user_account->banlist_delete_bans) return false; 
    12441268                if(account->tracker_list_servers && !user_account->tracker_list_servers) return false; 
    12451269                if(account->tracker_register_servers && !user_account->tracker_register_servers) return false; 
  • branches/P7/wired/wired/accounts.h

    r5853 r6122  
    9191        wi_boolean_t                                    settings_get_settings; 
    9292        wi_boolean_t                                    settings_set_settings; 
     93        wi_boolean_t                                    banlist_get_bans; 
     94        wi_boolean_t                                    banlist_add_bans; 
     95        wi_boolean_t                                    banlist_delete_bans; 
    9396        wi_boolean_t                                    tracker_list_servers; 
    9497        wi_boolean_t                                    tracker_register_servers; 
  • branches/P7/wired/wired/banlist.c

    r5841 r6122  
    3232 
    3333#include "banlist.h" 
     34#include "server.h" 
    3435#include "settings.h" 
    3536 
    36 #define WD_TEMPBAN_BAN_TIME                             1800.0 
    37  
    38  
    39 struct _wd_tempban { 
     37struct _wd_ban { 
    4038        wi_runtime_base_t                                       base; 
    4139         
    4240        wi_string_t                                                     *ip; 
    43         wi_time_interval_t                                      interval; 
     41        wi_date_t                                                       *expiration_date; 
     42 
    4443        wi_timer_t                                                      *timer; 
    4544}; 
    46 typedef struct _wd_tempban                              wd_tempban_t; 
    47  
    48  
    49 static wd_tempban_t *                                   wd_tempban_with_ip(wi_string_t *); 
    50 static wd_tempban_t *                                   wd_tempban_alloc(void); 
    51 static wd_tempban_t *                                   wd_tempban_init_with_ip(wd_tempban_t *, wi_string_t *); 
    52 static void                                                             wd_tempban_dealloc(wi_runtime_instance_t *); 
    53 static wi_string_t *                                    wd_tempban_description(wi_runtime_instance_t *); 
    54  
    55 static void                                                             wd_tempban_expire_timer(wi_timer_t *); 
    56  
    57  
     45typedef struct _wd_ban                                  wd_ban_t; 
     46 
     47 
     48static wi_boolean_t                                             wd_banlist_file_contains_ip(wi_file_t *, wi_string_t *); 
     49static wi_boolean_t                                             wd_banlist_delete_ban_from_file(wi_file_t *, wi_string_t *); 
     50 
     51static wd_ban_t *                                               wd_ban_alloc(void); 
     52static wd_ban_t *                                               wd_ban_init_with_ip(wd_ban_t *, wi_string_t *, wi_date_t *); 
     53static void                                                             wd_ban_dealloc(wi_runtime_instance_t *); 
     54static wi_string_t *                                    wd_ban_description(wi_runtime_instance_t *); 
     55 
     56static void                                                             wd_ban_expire_timer(wi_timer_t *); 
     57 
     58 
     59static wi_rwlock_t                                              *wd_banlist_lock; 
    5860static wi_string_t                                              *wd_banlist_path; 
    59 static wi_dictionary_t                                  *wd_tempbans; 
    60  
    61 static wi_runtime_id_t                                  wd_tempban_runtime_id = WI_RUNTIME_ID_NULL; 
    62 static wi_runtime_class_t                               wd_tempban_runtime_class = { 
    63         "wd_tempban_t", 
    64         wd_tempban_dealloc, 
     61static wi_dictionary_t                                  *wd_bans; 
     62 
     63static wi_runtime_id_t                                  wd_ban_runtime_id = WI_RUNTIME_ID_NULL; 
     64static wi_runtime_class_t                               wd_ban_runtime_class = { 
     65        "wd_ban_t", 
     66        wd_ban_dealloc, 
    6567        NULL, 
    6668        NULL, 
    67         wd_tempban_description, 
     69        wd_ban_description, 
    6870        NULL 
    6971}; 
     
    7173 
    7274void wd_banlist_init(void) { 
    73         wd_tempban_runtime_id = wi_runtime_register_class(&wd_tempban_runtime_class); 
     75        wd_ban_runtime_id = wi_runtime_register_class(&wd_ban_runtime_class); 
    7476 
    7577        wd_banlist_path = WI_STR("banlist"); 
    76  
    77         wd_tempbans = wi_dictionary_init(wi_dictionary_alloc()); 
    78 
    79  
    80  
    81  
    82 #pragma mark - 
    83  
    84 wi_boolean_t wd_banlist_ip_is_banned(wi_string_t *ip) { 
     78        wd_banlist_lock = wi_rwlock_init(wi_rwlock_alloc()); 
     79 
     80        wd_bans = wi_dictionary_init(wi_dictionary_alloc()); 
     81
     82 
     83 
     84 
     85#pragma mark - 
     86 
     87wi_boolean_t wd_banlist_ip_is_banned(wi_string_t *ip, wi_date_t **expiration_date) { 
     88        wi_file_t                       *file; 
     89        wd_ban_t                        *ban; 
     90        wi_boolean_t            banned = false; 
     91 
     92        wi_dictionary_rdlock(wd_bans); 
     93        ban = wi_autorelease(wi_retain(wi_dictionary_data_for_key(wd_bans, ip))); 
     94        wi_dictionary_unlock(wd_bans); 
     95         
     96        if(ban) { 
     97                *expiration_date = ban->expiration_date; 
     98 
     99                return true; 
     100        } 
     101         
     102        wi_rwlock_rdlock(wd_banlist_lock); 
     103 
     104        file = wi_file_for_reading(wd_banlist_path); 
     105         
     106        if(file) 
     107                banned = wd_banlist_file_contains_ip(file, ip); 
     108        else 
     109                wi_log_err(WI_STR("Could not open %@: %m"), wd_banlist_path); 
     110         
     111        wi_rwlock_unlock(wd_banlist_lock); 
     112         
     113        *expiration_date = NULL; 
     114 
     115        return banned; 
     116
     117 
     118 
     119 
     120#pragma mark - 
     121 
     122void wd_banlist_reply_bans(wd_user_t *user, wi_p7_message_t *message) { 
     123        wi_p7_message_t         *reply; 
     124        wi_enumerator_t         *enumerator; 
    85125        wi_file_t                       *file; 
    86126        wi_string_t                     *string; 
    87         wi_boolean_t            banned = false; 
    88  
    89         wi_dictionary_rdlock(wd_tempbans); 
    90         banned = (wi_dictionary_data_for_key(wd_tempbans, ip) != NULL); 
    91         wi_dictionary_unlock(wd_tempbans); 
    92          
    93         if(banned) 
    94                 return banned; 
    95  
     127        wd_ban_t                        *ban; 
     128         
     129        wi_rwlock_rdlock(wd_banlist_lock); 
     130         
    96131        file = wi_file_for_reading(wd_banlist_path); 
    97132         
     
    100135        } else { 
    101136                while((string = wi_file_read_config_line(file))) { 
    102                         if(wi_ip_matches_string(ip, string)) { 
    103                                 banned = true; 
    104                                  
    105                                 break; 
     137                        reply = wi_p7_message_with_name(WI_STR("wired.banlist.ban_list"), wd_p7_spec); 
     138                        wi_p7_message_set_string_for_name(reply, string, WI_STR("wired.banlist.ip")); 
     139                        wd_user_reply_message(user, reply, message); 
     140                } 
     141        } 
     142         
     143        wi_rwlock_unlock(wd_banlist_lock); 
     144         
     145        wi_dictionary_rdlock(wd_bans); 
     146         
     147        enumerator = wi_dictionary_data_enumerator(wd_bans); 
     148         
     149        while((ban = wi_enumerator_next_data(enumerator))) { 
     150                reply = wi_p7_message_with_name(WI_STR("wired.banlist.ban_list"), wd_p7_spec); 
     151                wi_p7_message_set_string_for_name(reply, ban->ip, WI_STR("wired.banlist.ip")); 
     152                wi_p7_message_set_date_for_name(reply, ban->expiration_date, WI_STR("wired.banlist.expiration_date")); 
     153                wd_user_reply_message(user, reply, message); 
     154        } 
     155 
     156        wi_dictionary_unlock(wd_bans); 
     157 
     158        reply = wi_p7_message_with_name(WI_STR("wired.banlist.ban_list.done"), wd_p7_spec); 
     159        wd_user_reply_message(user, reply, message); 
     160
     161 
     162 
     163 
     164void wd_banlist_add_ban(wd_user_t *user, wi_p7_message_t *message, wi_string_t *ip, wi_date_t *expiration_date) { 
     165        wi_file_t               *file; 
     166        wd_ban_t                *ban; 
     167         
     168        if(expiration_date) { 
     169                if(wi_date_time_interval(expiration_date) - wi_time_interval() > 1.0) { 
     170                        wi_dictionary_wrlock(wd_bans); 
     171                         
     172                        if(!wi_dictionary_contains_key(wd_bans, ip)) { 
     173                                ban = wd_ban_init_with_ip(wd_ban_alloc(), ip, expiration_date); 
     174                                wi_timer_schedule(ban->timer); 
     175                                wi_dictionary_set_data_for_key(wd_bans, ban, ip); 
     176                                wi_release(ban); 
     177                        } else { 
     178                                wd_user_reply_error(user, WI_STR("wired.error.ban_exists"), message); 
    106179                        } 
    107                 } 
    108         } 
    109          
    110         return banned; 
    111 
    112  
    113  
    114  
    115 void wd_banlist_add_temporary_ban_for_ip(wi_string_t *ip) { 
    116         wd_tempban_t    *tempban; 
    117          
    118         tempban = wd_tempban_with_ip(ip); 
    119         tempban->timer = wi_timer_init_with_function(wi_timer_alloc(), 
    120                                                                                 wd_tempban_expire_timer, 
    121                                                                                 WD_TEMPBAN_BAN_TIME, 
    122                                                                                 false); 
    123  
    124         wi_timer_set_data(tempban->timer, tempban); 
    125         wi_timer_schedule(tempban->timer); 
    126          
    127         wi_dictionary_wrlock(wd_tempbans); 
    128         wi_dictionary_set_data_for_key(wd_tempbans, tempban, tempban->ip); 
    129         wi_dictionary_unlock(wd_tempbans); 
    130 
    131  
    132  
    133  
    134 #pragma mark - 
    135  
    136 static wd_tempban_t * wd_tempban_with_ip(wi_string_t *ip) { 
    137         return wi_autorelease(wd_tempban_init_with_ip(wd_tempban_alloc(), ip)); 
    138 
    139  
    140  
    141  
    142 static wd_tempban_t * wd_tempban_alloc(void) { 
    143         return wi_runtime_create_instance(wd_tempban_runtime_id, sizeof(wd_tempban_t)); 
    144 
    145  
    146  
    147  
    148 static wd_tempban_t * wd_tempban_init_with_ip(wd_tempban_t *tempban, wi_string_t *ip) { 
    149         tempban->ip                     = wi_retain(ip); 
    150         tempban->interval       = wi_time_interval(); 
    151          
    152         return tempban; 
    153 
    154  
    155  
    156  
    157 static void wd_tempban_dealloc(wi_runtime_instance_t *instance) { 
    158         wd_tempban_t            *tempban = instance; 
    159          
    160         wi_release(tempban->ip); 
    161         wi_release(tempban->timer); 
    162 
    163  
    164  
    165  
    166 static wi_string_t * wd_tempban_description(wi_runtime_instance_t *instance) { 
    167         wd_tempban_t            *tempban = instance; 
    168          
    169         return wi_string_with_format(WI_STR("<%@ %p>{ip = %@, time_remaining = %.0f}"), 
    170                 wi_runtime_class_name(tempban), 
    171                 tempban, 
    172                 tempban->ip, 
    173                 wi_time_interval() - tempban->interval); 
    174 
    175  
    176  
    177  
    178 #pragma mark - 
    179  
    180 static void wd_tempban_expire_timer(wi_timer_t *timer) { 
    181         wd_tempban_t            *tempban; 
    182          
    183         tempban = wi_timer_data(timer); 
    184          
    185         wi_dictionary_rdlock(wd_tempbans); 
    186         wi_dictionary_remove_data_for_key(wd_tempbans, tempban->ip); 
    187         wi_dictionary_unlock(wd_tempbans); 
    188 
     180                         
     181                        wi_dictionary_unlock(wd_bans); 
     182                } else { 
     183                        wi_log_err(WI_STR("Ban has negative expiration date"), wd_banlist_path); 
     184                        wd_user_reply_error(user, WI_STR("wired.error.internal_error"), message); 
     185                } 
     186        } else { 
     187                wi_rwlock_wrlock(wd_banlist_lock); 
     188                 
     189                file = wi_file_for_updating(wd_banlist_path); 
     190                 
     191                if(file) { 
     192                        if(!wd_banlist_file_contains_ip(file, ip)) 
     193                                wi_file_write_format(file, WI_STR("%@\n"), ip); 
     194                        else 
     195                                wd_user_reply_error(user, WI_STR("wired.error.ban_exists"), message); 
     196                } else { 
     197                        wi_log_err(WI_STR("Could not open %@: %m"), wd_banlist_path); 
     198                        wd_user_reply_error(user, WI_STR("wired.error.internal_error"), message); 
     199                } 
     200                 
     201                wi_rwlock_unlock(wd_banlist_lock); 
     202        } 
     203
     204 
     205 
     206 
     207void wd_banlist_delete_ban(wd_user_t *user, wi_p7_message_t *message, wi_string_t *ip, wi_date_t *expiration_date) { 
     208        wi_file_t               *file; 
     209         
     210        if(expiration_date) { 
     211                wi_dictionary_wrlock(wd_bans); 
     212                 
     213                if(wi_dictionary_contains_key(wd_bans, ip)) 
     214                        wi_dictionary_remove_data_for_key(wd_bans, ip); 
     215                else 
     216                        wd_user_reply_error(user, WI_STR("wired.error.ban_not_found"), message); 
     217                 
     218                wi_dictionary_unlock(wd_bans); 
     219        } else { 
     220                wi_rwlock_wrlock(wd_banlist_lock); 
     221                 
     222                file = wi_file_for_updating(wd_banlist_path); 
     223                 
     224                if(file) { 
     225                        if(!wd_banlist_delete_ban_from_file(file, ip)) 
     226                                wd_user_reply_error(user, WI_STR("wired.error.ban_not_found"), message); 
     227                } else { 
     228                        wi_log_err(WI_STR("Could not open %@: %m"), wd_banlist_path); 
     229                        wd_user_reply_error(user, WI_STR("wired.error.internal_error"), message); 
     230                } 
     231                 
     232                wi_rwlock_unlock(wd_banlist_lock); 
     233        } 
     234
     235 
     236 
     237 
     238#pragma mark - 
     239 
     240static wi_boolean_t wd_banlist_file_contains_ip(wi_file_t *file, wi_string_t *ip) { 
     241        wi_string_t             *string; 
     242         
     243        while((string = wi_file_read_config_line(file))) { 
     244                if(wi_ip_matches_string(ip, string)) 
     245                        return true; 
     246        } 
     247         
     248        return false; 
     249
     250 
     251 
     252 
     253static wi_boolean_t wd_banlist_delete_ban_from_file(wi_file_t *file, wi_string_t *ip) { 
     254        wi_file_t               *tmpfile; 
     255        wi_string_t             *string; 
     256        wi_boolean_t    result = false; 
     257         
     258        tmpfile = wi_file_temporary_file(); 
     259         
     260        if(!tmpfile) { 
     261                wi_log_err(WI_STR("Could not create a temporary file: %m")); 
     262 
     263                return false; 
     264        } 
     265