void acl_init(void) { iks *policy; iks *model; int class_no; int e; // parse security policy file e = iks_load("/etc/comar/security-policy.xml", &policy); if (e) { log_error("Cannot process security policy file '%s', error %d\n", "/etc/comar/security-policy.xml", e); return; } if (iks_strcmp(iks_name(policy), "comarSecurityPolicy") != 0) { log_error("Not a security policy file '%s'\n", "/etc/comar/security-policy.xml"); return; } // call permissions on the model model = iks_find(policy, "model"); if (model) { class_no = -1; while (model_next_class(&class_no)) { set_class(model, class_no); } } }
//! Returns a dictionar of models: methods int db_load_models(PyObject **py_models) { /*! * Returns a dictionary of models and their methods. * * @py_models Pointer to dictionary * @return 0 on success, -1 on error * */ struct dirent *dp; DIR *dir = opendir(config_dir_models); iks *xml; *py_models = PyDict_New(); // Iterate over all files under models directory while ((dp = readdir(dir)) != NULL) { if (dp->d_name[0] == '.') { continue; } // Load XML int size = strlen(config_dir_models) + 1 + strlen(dp->d_name) + 1; char *fn_xml = malloc(size); if (fn_xml == NULL) oom(); snprintf(fn_xml, size, "%s/%s", config_dir_models, dp->d_name); fn_xml[size - 1] = 0; switch (iks_load(fn_xml, &xml)) { case IKS_NOMEM: free(fn_xml); oom(); case IKS_FILE_RWERR: case IKS_FILE_NOACCESS: log_error("Unable to open XML: %s\n", fn_xml); closedir(dir); free(fn_xml); return -1; } // Validate XML if (db_validate_model(xml, fn_xml) != 0) { closedir(dir); iks_delete(xml); free(fn_xml); return -1; } // Load model db_load_model(xml, py_models); } closedir(dir); return 0; }
void prefs_setup (void) { iks *x; memset (&prefs, 0, sizeof (struct prefs_struct)); prefs_chdir (".ulubot"); if (iks_load ("ayarlar.xml", &x) == IKS_OK) { if (iks_strcmp (iks_name (x), "ulubot") == 0) { prefs.jid = iks_strdup (iks_find_cdata (x, "id")); prefs.pass = iks_strdup (iks_find_cdata (x, "password")); prefs.admin_jid = iks_strdup (iks_find_cdata (x, "admin_id")); iks_delete (x); if (prefs.jid && prefs.pass && prefs.admin_jid) return; } } puts (PACKAGE" v"VERSION" sözlük sunucusuna hoşgeldiniz!"); puts ("Hemen bir kaç ayar yapalım:"); prefs.jid = iks_strdup (input ("Botun Jabber hesabı")); prefs.pass = iks_strdup (input ("Botun Jabber şifresi")); prefs.admin_jid = iks_strdup (input ("Yöneticinin Jabber hesabı")); x = iks_new ("ulubot"); iks_insert_cdata (iks_insert (x, "id"), prefs.jid, 0); iks_insert_cdata (iks_insert (x, "password"), prefs.pass, 0); iks_insert_cdata (iks_insert (x, "admin_id"), prefs.admin_jid, 0); if (iks_save ("ayarlar.xml", x) != IKS_OK) { puts ("Hata: ayarları kaydedemedim!"); } iks_delete (x); puts ("Ayarlar tamam."); }
//! Imports model file static int model_import(const char *model_file) { /*! * Imports model file to node table. * * @model_file File to import * @return 0 on success, -1 on error */ iks *obj, *met; size_t size = 0; size_t obj_size, met_size; int obj_no; int count = 0; int e; e = iks_load(model_file, &model_xml); if (e != 0) { log_error("XML load error.\n"); return -1; } if (iks_strcmp(iks_name(model_xml), "comarModel") != 0) { log_error("Bad XML: not a Comar model.\n"); return -1; } // scan the model for (obj = iks_first_tag(model_xml); obj; obj = iks_next_tag(obj)) { if (iks_strcmp(iks_name(obj), "interface") == 0) { obj_size = iks_strlen(iks_find_attrib(obj, "name")); if (!obj_size) { log_error("Bad XML: interface has no name.\n"); return -1; } size += obj_size + 1; ++count; for (met = iks_first_tag(obj); met; met = iks_next_tag(met)) { if (iks_strcmp(iks_name(met), "method") == 0 || iks_strcmp(iks_name(met), "signal") == 0) { met_size = iks_strlen(iks_find_attrib(met, "name")); if (!met_size) { log_error("Bad XML: method/signal has no name.\n"); return -1; } size += obj_size + 1 + met_size + 1; ++count; iks *arg; for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) { if (iks_strcmp(iks_name(arg), "arg") != 0 && iks_strcmp(iks_name(arg), "annotation") != 0) { log_error("Bad XML: method/signal may contain <arg> or <annotation> only\n"); return -1; } } } else { log_error("Bad XML: interface may contain <method> or <signal> only\n"); return -1; } } } else { log_error("Bad XML: root node may contain <interface> only\n"); return -1; } } // size is counted to alloc mem for paths // prepare data structures if (prepare_tables(count, size) != 0) return -1; // load model for (obj = iks_first_tag(model_xml); obj; obj = iks_next_tag(obj)) { if (iks_strcmp(iks_find_attrib(obj, "name"), "Comar") == 0) { continue; } obj_no = add_node(-1, build_path(obj, NULL), "", N_INTERFACE); for (met = iks_first_tag(obj); met; met = iks_next_tag(met)) { if (iks_strcmp(iks_name(met), "method") == 0) { char *label = iks_find_attrib(met, "access_label"); if (label) { iks_insert_attrib(met, "access_label", NULL); } else { label = iks_find_attrib(met, "name"); } add_node(obj_no, build_path(obj, met), label, N_METHOD); } else if (iks_strcmp(iks_name(met), "signal") == 0) { add_node(obj_no, build_path(obj, met), "", N_SIGNAL); } } } return 0; }
int model_init(void) { iks *model; iks *grp, *obj, *met; int count = 0; size_t size = 0; size_t grp_size, obj_size, met_size; int grp_no, obj_no; int e; // parse model file e = iks_load(cfg_model_file, &model); if (e) { log_error("Cannot process model file '%s'\n", cfg_model_file); return -1; } if (iks_strcmp(iks_name(model), "comarModel") != 0) { log_error("Not a COMAR model file '%s'\n", cfg_model_file); return -1; } // FIXME: ugly code ahead, split into functions and simplify // scan the model for (grp = iks_first_tag(model); grp; grp = iks_next_tag(grp)) { if (iks_strcmp(iks_name(grp), "group") == 0) { grp_size = iks_strlen(iks_find_attrib(grp, "name")); if (!grp_size) { log_error("Broken COMAR model file '%s'\n", cfg_model_file); return -1; } size += grp_size + 1; ++count; for (obj = iks_first_tag(grp); obj; obj = iks_next_tag(obj)) { if (iks_strcmp(iks_name(obj), "class") == 0) { obj_size = iks_strlen(iks_find_attrib(obj, "name")); if (!obj_size) { log_error("Broken COMAR model file '%s'\n", cfg_model_file); return -1; } size += grp_size + obj_size + 2; ++count; for (met = iks_first_tag(obj); met; met = iks_next_tag(met)) { if (iks_strcmp(iks_name(met), "method") == 0 || iks_strcmp(iks_name(met), "notify") == 0) { met_size = iks_strlen(iks_find_attrib(met, "name")); if (!met_size) { log_error("Broken COMAR model file '%s'\n", cfg_model_file); return -1; } size += grp_size + obj_size + met_size + 3; ++count; } if (iks_strcmp(iks_name(met), "method") == 0) { iks *arg; for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) { if (iks_strcmp(iks_name(arg), "argument") == 0 || iks_strcmp(iks_name(arg), "instance") == 0) { size += iks_cdata_size(iks_child(arg)) + 1; } } } } } } } } // prepare data structures if (prepare_tables(count, size)) return -1; // load the model for (grp = iks_first_tag(model); grp; grp = iks_next_tag(grp)) { if (iks_strcmp(iks_name(grp), "group") == 0) { grp_no = add_node(-1, build_path(grp, NULL, NULL), N_GROUP); for (obj = iks_first_tag(grp); obj; obj = iks_next_tag(obj)) { if (iks_strcmp(iks_name(obj), "class") == 0) { obj_no = add_node(grp_no, build_path(grp, obj, NULL), N_CLASS); for (met = iks_first_tag(obj); met; met = iks_next_tag(met)) { int no; if (iks_strcmp(iks_name(met), "method") == 0) { iks *arg; char *prof; no = add_node(obj_no, build_path(grp, obj, met), N_METHOD); prof = iks_find_attrib(met, "access"); if (prof) { if (strcmp(prof, "user") == 0) nodes[no].level = ACL_USER; if (strcmp(prof, "guest") == 0) nodes[no].level = ACL_GUEST; } prof = iks_find_attrib(met, "profile"); if (prof) { if (strcmp(prof, "global") == 0) nodes[no].flags |= P_GLOBAL; if (strcmp(prof, "package") == 0) nodes[no].flags |= P_PACKAGE; } prof = iks_find_attrib(met, "profileOp"); if (prof) { if (strcmp(prof, "delete") == 0) nodes[no].flags |= P_DELETE; if (strcmp(prof, "startup") == 0) nodes[no].flags |= P_STARTUP; } for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) { if (iks_strcmp(iks_name(arg), "instance") == 0) { build_arg(no, 1, iks_cdata(iks_child(arg))); } } for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) { if (iks_strcmp(iks_name(arg), "argument") == 0) { char *argname; argname = iks_cdata(iks_child(arg)); if (argname) { build_arg(no, 0, argname); } else { log_error("Argument name needed in <argument> tag of model.xml\n"); } } } } else if (iks_strcmp(iks_name(met), "notify") == 0) { no = add_node(obj_no, build_path(grp, obj, met), N_NOTIFY); if (no >= model_max_notifications) model_max_notifications = no + 1; } } } } } } // no need to keep dom tree in memory iks_delete(model); return 0; }