tree_cell * get_kb_list(lex_ctxt * lexic) { struct arglist * script_infos = lexic->script_infos; struct kb_item ** kb = plug_get_kb(script_infos); char * kb_mask = get_str_var_by_num(lexic, 0); tree_cell * retc; int num_elems = 0; nasl_array * a; struct kb_item * res, * top; if(kb_mask == NULL) { nasl_perror(lexic, "get_kb_list() usage : get_kb_list(<NameOfItem>)\n"); return NULL; } if(kb == NULL) { return NULL; } retc = alloc_tree_cell(0,NULL); retc->type = DYN_ARRAY; retc->x.ref_val = a = emalloc(sizeof(nasl_array)); top = res = kb_item_get_pattern(kb, kb_mask); while(res != NULL) { anon_nasl_var v; bzero(&v, sizeof(v)); if (lexic->authenticated || strncmp(res->name, SECRET_KB_PREFIX, sizeof(SECRET_KB_PREFIX) - 1) != 0) { if(res->type == KB_TYPE_INT) { v.var_type = VAR2_INT; v.v.v_int = res->v.v_int; add_var_to_array(a, res->name, &v); num_elems ++; } else if(res->type == KB_TYPE_STR) { v.var_type = VAR2_DATA; v.v.v_str.s_val = res->v.v_str; v.v.v_str.s_siz = strlen(res->v.v_str); add_var_to_array(a, res->name, &v); num_elems ++; } } #if NASL_DEBUG > 0 else nasl_perror(lexic, "get_kb_list: skipping protected KN entry %s\n", res->name); #endif res = res->next; } kb_item_get_all_free(top); if(num_elems == 0) { deref_cell(retc); return FAKE_CELL; } return retc; }
/** * @brief Inits or loads the knowledge base for a single host. * * Fills the knowledge base with host-specific login information for local * checks if defined. * * @param globals Global preference arglist. * @param hostname Name of the host. * @param new_kb[out] TRUE if the kb is new and shall be saved. * * @return A knowledge base. * * @see fill_host_kb_ssh_credentials */ static kb_t init_host_kb (struct arglist *globals, char *hostname, struct arglist *hostinfos, gboolean * new_kb) { kb_t kb, network_kb; (*new_kb) = FALSE; gchar *vhosts; struct kb_item *host_network_results = NULL; struct kb_item *result_iter; gchar *network_scan_status = (gchar *) arg_get_value (globals, "network_scan_status"); if (network_scan_status != NULL) { if (g_ascii_strcasecmp (network_scan_status, "done") == 0) { gchar *hostname_pattern = g_strdup_printf ("%s/*", hostname); network_kb = save_kb_load_kb (globals, "network"); host_network_results = kb_item_get_pattern (network_kb, hostname_pattern); } if (g_ascii_strcasecmp (network_scan_status, "busy") == 0) { arg_add_value (globals, "CURRENTLY_TESTED_HOST", ARG_STRING, strlen ("network"), "network"); save_kb_new (globals, "network"); kb = kb_new (); (*new_kb) = TRUE; return kb; } } // Check if kb should be saved. if (save_kb (globals)) { // Check if a saved kb exists and we shall restore it. if (save_kb_exists (hostname) != 0) { save_kb_backup (hostname); kb = save_kb_load_kb (globals, hostname); } else { // We shall not or cannot restore. save_kb_new (globals, hostname); kb = kb_new (); (*new_kb) = TRUE; } arg_add_value (globals, "CURRENTLY_TESTED_HOST", ARG_STRING, strlen (hostname), hostname); } else /* save_kb(globals) */ { kb = kb_new (); } /* Add local check (SSH)- related knowledge base items. */ fill_host_kb_ssh_credentials (kb, globals, hostname); /* If vhosts is set, split it and put it in the KB. */ vhosts = (gchar *)arg_get_value (hostinfos, "VHOSTS"); if (vhosts) { gchar **vhosts_array = g_strsplit (vhosts, ",", 0); guint i = 0; while (vhosts_array[i] != NULL) { kb_item_add_str (kb, "hostinfos/vhosts", vhosts_array[i]); save_kb_write_str (globals, hostname, "hostinfos/vhosts", vhosts_array[i]); i++; } g_strfreev (vhosts_array); } result_iter = host_network_results; while (result_iter != NULL) { char *newname = strstr (result_iter->name, "/") + 1; if (result_iter->type == KB_TYPE_STR) { kb_item_add_str (kb, newname, result_iter->v.v_str); save_kb_write_str (globals, hostname, newname, result_iter->v.v_str); } else if (result_iter->type == KB_TYPE_INT) { kb_item_add_int (kb, newname, result_iter->v.v_int); save_kb_write_int (globals, hostname, newname, result_iter->v.v_int); } result_iter = result_iter->next; } return kb; }