void secure_buffer_display () { int line, count, count_encrypted; if (!secure_buffer) return; gui_buffer_clear (secure_buffer); /* set title buffer */ gui_buffer_set_title (secure_buffer, _("WeeChat secured data (sec.conf) | " "Keys: [alt-v] Toggle values")); line = 0; gui_chat_printf_y (secure_buffer, line++, "Hash algo: %s Cipher: %s Salt: %s", secure_hash_algo_string[CONFIG_INTEGER(secure_config_crypt_hash_algo)], secure_cipher_string[CONFIG_INTEGER(secure_config_crypt_cipher)], (CONFIG_BOOLEAN(secure_config_crypt_salt)) ? _("on") : _("off")); /* display passphrase */ line++; gui_chat_printf_y (secure_buffer, line++, (secure_passphrase) ? _("Passphrase is set") : _("Passphrase is not set")); /* display secured data */ count = secure_hashtable_data->items_count; count_encrypted = secure_hashtable_data_encrypted->items_count; if (count > 0) { line++; gui_chat_printf_y (secure_buffer, line++, _("Secured data:")); line++; hashtable_map (secure_hashtable_data, &secure_buffer_display_data, &line); } /* display secured data not decrypted */ if (count_encrypted > 0) { line++; gui_chat_printf_y (secure_buffer, line++, _("Secured data STILL ENCRYPTED: (use /secure decrypt, " "see /help secure)")); line++; hashtable_map (secure_hashtable_data_encrypted, &secure_buffer_display_data, &line); } if ((count == 0) && (count_encrypted == 0)) { line++; gui_chat_printf_y (secure_buffer, line++, _("No secured data set")); } }
void debug_hdata_map_cb (void *data, struct t_hashtable *hashtable, const void *key, const void *value) { struct t_hdata *ptr_hdata; struct t_hdata_var *ptr_var; struct t_weelist *list; struct t_weelist_item *ptr_item; /* make C compiler happy */ (void) data; (void) hashtable; ptr_hdata = (struct t_hdata *)value; gui_chat_printf (NULL, " hdata 0x%lx: \"%s\", %d vars, %d lists:", ptr_hdata, (const char *)key, hashtable_get_integer (ptr_hdata->hash_var, "items_count"), hashtable_get_integer (ptr_hdata->hash_list, "items_count")); /* display lists */ hashtable_map (ptr_hdata->hash_list, &debug_hdata_hash_list_map_cb, NULL); /* display vars */ list = weelist_new (); hashtable_map (ptr_hdata->hash_var, &debug_hdata_hash_var_map_cb, list); for (ptr_item = list->items; ptr_item; ptr_item = ptr_item->next_item) { ptr_var = hashtable_get (ptr_hdata->hash_var, ptr_item->user_data); if (ptr_var) { gui_chat_printf (NULL, " %04d -> %s (%s%s%s%s%s%s)", ptr_var->offset, (char *)ptr_item->user_data, hdata_type_string[(int)ptr_var->type], (ptr_var->update_allowed) ? ", R/W" : "", (ptr_var->array_size) ? ", array size: " : "", (ptr_var->array_size) ? ptr_var->array_size : "", (ptr_var->hdata_name) ? ", hdata: " : "", (ptr_var->hdata_name) ? ptr_var->hdata_name : ""); } } weelist_free (list); }
int hdata_check_pointer (struct t_hdata *hdata, void *list, void *pointer) { void *pointers[4]; if (!hdata || !pointer) return 0; if (list) { /* search pointer in the given list */ return hdata_check_pointer_in_list (hdata, list, pointer); } else { /* search pointer in all lists with flag "check_pointers" */ pointers[0] = hdata; pointers[1] = pointer; pointers[2] = 0; /* number of lists with flag check_pointers */ pointers[3] = 0; /* pointer found? (0/1) */ hashtable_map (hdata->hash_list, &hdata_check_pointer_map_cb, pointers); return ((pointers[2] == 0) || pointers[3]) ? 1 : 0; } }
void hdata_print_log_map_cb (void *data, struct t_hashtable *hashtable, const void *key, const void *value) { struct t_hdata *ptr_hdata; /* make C compiler happy */ (void) data; (void) hashtable; (void) key; ptr_hdata = (struct t_hdata *)value; log_printf (""); log_printf ("[hdata (addr:0x%lx)]", ptr_hdata); log_printf (" name . . . . . . . . . : '%s'", ptr_hdata->name); log_printf (" plugin . . . . . . . . : 0x%lx", ptr_hdata->plugin); log_printf (" var_prev . . . . . . . : '%s'", ptr_hdata->var_prev); log_printf (" var_next . . . . . . . : '%s'", ptr_hdata->var_next); log_printf (" hash_var . . . . . . . : 0x%lx (hashtable: '%s')", ptr_hdata->hash_var, hashtable_get_string (ptr_hdata->hash_var, "keys_values")); log_printf (" hash_list. . . . . . . : 0x%lx (hashtable: '%s')", ptr_hdata->hash_list, hashtable_get_string (ptr_hdata->hash_list, "keys_values")); log_printf (" create_allowed . . . . : %d", (int)ptr_hdata->create_allowed); log_printf (" delete_allowed . . . . : %d", (int)ptr_hdata->delete_allowed); log_printf (" callback_update. . . . : 0x%lx", ptr_hdata->callback_update); log_printf (" callback_update_data . : 0x%lx", ptr_hdata->callback_update_data); log_printf (" update_pending . . . . : %d", (int)ptr_hdata->update_pending); hashtable_map (ptr_hdata->hash_var, &hdata_print_log_var_map_cb, NULL); }
int secure_data_write_cb (void *data, struct t_config_file *config_file, const char *section_name) { /* make C compiler happy */ (void) data; /* write name of section */ if (!config_file_write_line (config_file, section_name, NULL)) return WEECHAT_CONFIG_WRITE_ERROR; if (secure_hashtable_data->items_count > 0) { /* * write a special line indicating if a passphrase must be used to * decrypt data (if not, then data is stored as plain text) */ if (!config_file_write_line (config_file, SECURE_DATA_PASSPHRASE_FLAG, (secure_passphrase) ? "on" : "off")) { return WEECHAT_CONFIG_WRITE_ERROR; } /* encrypt and write secured data */ hashtable_map (secure_hashtable_data, &secure_data_write_map_cb, config_file); } else if (secure_hashtable_data_encrypted->items_count > 0) { /* * if there is encrypted data, that means passphrase was not set and * we were unable to decrypt => just save the encrypted content * as-is (so that content of sec.conf is not lost) */ if (!config_file_write_line (config_file, SECURE_DATA_PASSPHRASE_FLAG, "on")) { return WEECHAT_CONFIG_WRITE_ERROR; } hashtable_map (secure_hashtable_data_encrypted, &secure_data_write_map_encrypted_cb, config_file); } return WEECHAT_CONFIG_WRITE_OK; }
void debug_hdata () { int count; count = weechat_hdata->items_count; gui_chat_printf (NULL, ""); gui_chat_printf (NULL, "%d hdata in memory", count); if (count > 0) hashtable_map (weechat_hdata, &debug_hdata_map_cb, NULL); }
int completion_list_add_palette_colors_cb (void *data, const char *completion_item, struct t_gui_buffer *buffer, struct t_gui_completion *completion) { /* make C compiler happy */ (void) data; (void) completion_item; (void) buffer; hashtable_map (gui_color_hash_palette_color, &completion_list_map_add_palette_color_cb, completion); return WEECHAT_RC_OK; }
int completion_list_add_secured_data_cb (void *data, const char *completion_item, struct t_gui_buffer *buffer, struct t_gui_completion *completion) { /* make C compiler happy */ (void) data; (void) completion_item; (void) buffer; hashtable_map (secure_hashtable_data, &completion_list_map_add_secured_data_cb, completion); return WEECHAT_RC_OK; }
void gui_color_palette_build_aliases () { int i; struct t_gui_color_palette *color_palette; char str_number[64]; if (!gui_color_hash_palette_alias || !gui_color_list_with_alias || !gui_color_hash_palette_color) { gui_color_palette_alloc_structs (); } hashtable_remove_all (gui_color_hash_palette_alias); weelist_remove_all (gui_color_list_with_alias); for (i = 0; i < GUI_CURSES_NUM_WEECHAT_COLORS; i++) { weelist_add (gui_color_list_with_alias, gui_weechat_colors[i].string, WEECHAT_LIST_POS_END, NULL); } for (i = 0; i <= gui_color_term_colors; i++) { color_palette = gui_color_palette_get (i); if (color_palette) { weelist_add (gui_color_list_with_alias, color_palette->alias, WEECHAT_LIST_POS_END, NULL); } else { snprintf (str_number, sizeof (str_number), "%d", i); weelist_add (gui_color_list_with_alias, str_number, WEECHAT_LIST_POS_END, NULL); } } hashtable_map (gui_color_hash_palette_color, &gui_color_palette_add_alias_cb, NULL); }
int weeurl_download (const char *url, struct t_hashtable *options) { CURL *curl; struct t_url_file url_file[2]; char *url_file_option[2] = { "file_in", "file_out" }; char *url_file_mode[2] = { "rb", "wb" }; CURLoption url_file_opt_func[2] = { CURLOPT_READFUNCTION, CURLOPT_WRITEFUNCTION }; CURLoption url_file_opt_data[2] = { CURLOPT_READDATA, CURLOPT_WRITEDATA }; void *url_file_opt_cb[2] = { &weeurl_read, &weeurl_write }; struct t_proxy *ptr_proxy; int rc, curl_rc, i; rc = 0; for (i = 0; i < 2; i++) { url_file[i].filename = NULL; url_file[i].stream = NULL; } if (!url || !url[0]) { rc = 1; goto end; } curl = curl_easy_init(); if (!curl) { rc = 3; goto end; } /* set default options */ curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L); /* set proxy (if option weechat.network.proxy_curl is set) */ if (CONFIG_STRING(config_network_proxy_curl) && CONFIG_STRING(config_network_proxy_curl)[0]) { ptr_proxy = proxy_search (CONFIG_STRING(config_network_proxy_curl)); if (ptr_proxy) weeurl_set_proxy (curl, ptr_proxy); } /* set file in/out from options in hashtable */ if (options) { for (i = 0; i < 2; i++) { url_file[i].filename = hashtable_get (options, url_file_option[i]); if (url_file[i].filename) { url_file[i].stream = fopen (url_file[i].filename, url_file_mode[i]); if (!url_file[i].stream) { rc = 4; goto end; } curl_easy_setopt (curl, url_file_opt_func[i], url_file_opt_cb[i]); curl_easy_setopt (curl, url_file_opt_data[i], url_file[i].stream); } } } /* set other options in hashtable */ hashtable_map (options, &weeurl_option_map_cb, curl); /* set error buffer */ curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, url_error); /* perform action! */ curl_rc = curl_easy_perform (curl); if (curl_rc != CURLE_OK) { fprintf (stderr, _("curl error %d (%s) (URL: \"%s\")\n"), curl_rc, url_error, url); rc = 2; } /* cleanup */ curl_easy_cleanup (curl); end: for (i = 0; i < 2; i++) { if (url_file[i].stream) fclose (url_file[i].stream); } return rc; }
struct t_hashtable * gui_focus_to_hashtable (struct t_gui_focus_info *focus_info, const char *key) { struct t_hashtable *hashtable; char str_value[128], *str_time, *str_prefix, *str_tags, *str_message; const char *nick; hashtable = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); if (!hashtable) return NULL; /* key (key from keyboard or mouse event) */ FOCUS_STR("_key", key); /* x,y */ FOCUS_INT("_x", focus_info->x); FOCUS_INT("_y", focus_info->y); /* window */ FOCUS_PTR("_window", focus_info->window); if (focus_info->window) { FOCUS_INT("_window_number", (focus_info->window)->number); } else { FOCUS_STR("_window_number", "*"); } /* buffer */ FOCUS_PTR("_buffer", focus_info->buffer); if (focus_info->buffer) { FOCUS_INT("_buffer_number", (focus_info->buffer)->number); FOCUS_STR("_buffer_plugin", plugin_get_name ((focus_info->buffer)->plugin)); FOCUS_STR("_buffer_name", (focus_info->buffer)->name); FOCUS_STR("_buffer_full_name", (focus_info->buffer)->full_name); hashtable_map ((focus_info->buffer)->local_variables, &gui_focus_buffer_localvar_map_cb, hashtable); } else { FOCUS_PTR("_buffer", NULL); FOCUS_STR("_buffer_number", "-1"); FOCUS_STR("_buffer_plugin", ""); FOCUS_STR("_buffer_name", ""); FOCUS_STR("_buffer_full_name", ""); } /* chat area */ FOCUS_INT("_chat", focus_info->chat); str_time = NULL; str_prefix = NULL; if (focus_info->chat_line) { str_time = gui_color_decode (((focus_info->chat_line)->data)->str_time, NULL); str_prefix = gui_color_decode (((focus_info->chat_line)->data)->prefix, NULL); str_tags = string_build_with_split_string ((const char **)((focus_info->chat_line)->data)->tags_array, ","); str_message = gui_color_decode (((focus_info->chat_line)->data)->message, NULL); nick = gui_line_get_nick_tag (focus_info->chat_line); FOCUS_PTR("_chat_line", focus_info->chat_line); FOCUS_INT("_chat_line_x", focus_info->chat_line_x); FOCUS_INT("_chat_line_y", ((focus_info->chat_line)->data)->y); FOCUS_TIME("_chat_line_date", ((focus_info->chat_line)->data)->date); FOCUS_TIME("_chat_line_date_printed", ((focus_info->chat_line)->data)->date_printed); FOCUS_STR_VAR("_chat_line_time", str_time); FOCUS_STR_VAR("_chat_line_tags", str_tags); FOCUS_STR_VAR("_chat_line_nick", nick); FOCUS_STR_VAR("_chat_line_prefix", str_prefix); FOCUS_STR_VAR("_chat_line_message", str_message); if (str_time) free (str_time); if (str_prefix) free (str_prefix); if (str_tags) free (str_tags); if (str_message) free (str_message); } else { FOCUS_PTR("_chat_line", NULL); FOCUS_STR("_chat_line_x", "-1"); FOCUS_STR("_chat_line_y", "-1"); FOCUS_STR("_chat_line_date", "-1"); FOCUS_STR("_chat_line_date_printed", "-1"); FOCUS_STR("_chat_line_time", ""); FOCUS_STR("_chat_line_tags", ""); FOCUS_STR("_chat_line_nick", ""); FOCUS_STR("_chat_line_prefix", ""); FOCUS_STR("_chat_line_message", ""); } FOCUS_STR_VAR("_chat_word", focus_info->chat_word); FOCUS_STR_VAR("_chat_bol", focus_info->chat_bol); FOCUS_STR_VAR("_chat_eol", focus_info->chat_eol); /* bar/item */ if (focus_info->bar_window) { FOCUS_STR("_bar_name", ((focus_info->bar_window)->bar)->name); FOCUS_STR("_bar_filling", gui_bar_filling_string[gui_bar_get_filling ((focus_info->bar_window)->bar)]); } else { FOCUS_STR("_bar_name", ""); FOCUS_STR("_bar_filling", ""); } FOCUS_STR_VAR("_bar_item_name", focus_info->bar_item); FOCUS_INT("_bar_item_line", focus_info->bar_item_line); FOCUS_INT("_bar_item_col", focus_info->bar_item_col); return hashtable; }
void hdata_print_log () { hashtable_map (dogechat_hdata, &hdata_print_log_map_cb, NULL); }
void hdata_free_all () { hashtable_map (dogechat_hdata, &hdata_free_all_map_cb, NULL); }
void hdata_free_all_plugin (struct t_dogechat_plugin *plugin) { hashtable_map (dogechat_hdata, &hdata_free_all_plugin_map_cb, plugin); }
int weeurl_download (const char *url, struct t_hashtable *options) { CURL *curl; struct t_url_file url_file[2]; char *url_file_option[2] = { "file_in", "file_out" }; char *url_file_mode[2] = { "rb", "wb" }; CURLoption url_file_opt_func[2] = { CURLOPT_READFUNCTION, CURLOPT_WRITEFUNCTION }; CURLoption url_file_opt_data[2] = { CURLOPT_READDATA, CURLOPT_WRITEDATA }; void *url_file_opt_cb[2] = { &weeurl_read, &weeurl_write }; int rc, i; rc = 0; for (i = 0; i < 2; i++) { url_file[i].filename = NULL; url_file[i].stream = NULL; } if (!url || !url[0]) { rc = 1; goto end; } curl = curl_easy_init(); if (!curl) { rc = 3; goto end; } /* set default options */ curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L); /* set file in/out from options in hashtable */ if (options) { for (i = 0; i < 2; i++) { url_file[i].filename = hashtable_get (options, url_file_option[i]); if (url_file[i].filename) { url_file[i].stream = fopen (url_file[i].filename, url_file_mode[i]); if (!url_file[i].stream) { rc = 4; goto end; } curl_easy_setopt (curl, url_file_opt_func[i], url_file_opt_cb[i]); curl_easy_setopt (curl, url_file_opt_data[i], url_file[i].stream); } } } /* set other options in hashtable */ hashtable_map (options, &weeurl_option_map_cb, curl); /* perform action! */ if (curl_easy_perform (curl) != CURLE_OK) rc = 2; /* cleanup */ curl_easy_cleanup (curl); end: for (i = 0; i < 2; i++) { if (url_file[i].stream) fclose (url_file[i].stream); } return rc; }