コード例 #1
0
ファイル: iks.c プロジェクト: contextlogger/contextlogger2
iks *
iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value)
{
	iks *y;

	if (NULL == x) return NULL;

	if (tagname) {
		for (y = IKS_TAG_CHILDREN (x); y; y = y->next) {
			if (IKS_TAG == y->type
				&& strcmp (IKS_TAG_NAME (y), tagname) == 0
				&& iks_strcmp (iks_find_attrib (y, attrname), value) == 0) {
					return y;
			}
		}
	} else {
		for (y = IKS_TAG_CHILDREN (x); y; y = y->next) {
			if (IKS_TAG == y->type
				&& iks_strcmp (iks_find_attrib (y, attrname), value) == 0) {
					return y;
			}
		}
	}
	return NULL;
}
コード例 #2
0
ファイル: tst-jid.c プロジェクト: SupportSpace/SupportCenter
void
test_id (char *id, char *partial, char *user, char *server, char *resource)
{
	iksid *a;

	a = iks_id_new (my_stack, id);
	if ((a->partial || partial) && iks_strcmp (a->partial, partial) != 0) BUG(a);
	if ((a->user || user) && iks_strcmp (a->user, user) != 0) BUG(a);
	if ((a->server || server) && iks_strcmp (a->server, server) != 0) BUG(a);
	if ((a->resource || resource) && iks_strcmp (a->resource, resource) != 0) BUG(a);
}
コード例 #3
0
ファイル: jabber.c プロジェクト: SupportSpace/SupportCenter
static int
iks_sasl_mechanisms (iks *x)
{
	int sasl_mech = 0;

	while (x) {
		if (!iks_strcmp(iks_cdata(iks_child(x)), "DIGEST-MD5"))
			sasl_mech |= IKS_STREAM_SASL_MD5;
		else if (!iks_strcmp(iks_cdata(iks_child(x)), "PLAIN"))
			sasl_mech |= IKS_STREAM_SASL_PLAIN;
		x = iks_next_tag(x);
	}
	return sasl_mech;
}
コード例 #4
0
ファイル: jabber.c プロジェクト: SupportSpace/SupportCenter
int
iks_id_cmp (iksid *a, iksid *b, int parts)
{
	int diff;

	if (!a || !b) return (IKS_ID_RESOURCE | IKS_ID_USER | IKS_ID_SERVER);
	diff = 0;
	if (parts & IKS_ID_RESOURCE && !(!a->resource && !b->resource) && iks_strcmp (a->resource, b->resource) != 0)
		diff += IKS_ID_RESOURCE;
	if (parts & IKS_ID_USER && !(!a->user && !b->user) && iks_strcasecmp (a->user, b->user) != 0)
		diff += IKS_ID_USER;
	if (parts & IKS_ID_SERVER && !(!a->server && !b->server) && iks_strcmp (a->server, b->server) != 0)
		diff += IKS_ID_SERVER;
	return diff;
}
コード例 #5
0
// iksparser calls this when it has a full tag
// 
// Important: Nothing must be done after a self->streamHook invocation
// if the hook returns a non-zero value.
static int
tagHook (ikss_Stream *self, char *name, char **atts, int type)
{
  iks *x;
  int err;

  switch (type) {
  case IKS_OPEN:
  case IKS_SINGLE:
    if (self->current) {
      x = iks_insert (self->current, name);
      insert_attribs (x, atts);
    } else {
      x = iks_new (name);
      insert_attribs (x, atts);
      if (iks_strcmp (name, "stream:stream") == 0) {
	err = self->streamHook (self->user_data, IKS_NODE_START, x);
	if (err != IKS_OK) return err;
	break;
      }
    }
    self->current = x;
    if (IKS_OPEN == type) break;
  case IKS_CLOSE:
    x = self->current;
    if (NULL == x) {
      err = self->streamHook (self->user_data, IKS_NODE_STOP, NULL);
      if (err != IKS_OK) return err;
      break;
    }
    if (NULL == iks_parent (x)) {
      self->current = NULL;
      if (iks_strcmp (name, "challenge") == 0) {
	send_sasl_challenge(self, x);
	iks_delete (x);
      } else if (iks_strcmp (name, "stream:error") == 0) {
	err = self->streamHook (self->user_data, IKS_NODE_ERROR, x);
	if (err != IKS_OK) return err;
      } else {
	err = self->streamHook (self->user_data, IKS_NODE_NORMAL, x);
	if (err != IKS_OK) return err;
      }
      break;
    }
    self->current = iks_parent (x);
  }
  return IKS_OK;
}
コード例 #6
0
ファイル: tst-dom.c プロジェクト: AbrahamJewowich/FreeSWITCH
void
cdata (char *data, ...)
{
	iks *x;
	va_list ap;

	x = my_x;
	va_start (ap, data);
	while (1) {
		char *name = iks_name (x);
		char *tmp = va_arg (ap, char*);
		if (NULL == tmp) break;
		x = iks_find (x, tmp);
		if (!x) {
			PR_TEST;
			printf ("Tag <%s> is not a child of tag <%s>\n", tmp, name);
			exit (1);
		}
	}
	if (iks_strcmp ( iks_cdata (iks_child (x)), data) != 0) {
		PR_TEST;
		printf ("CDATA [%s] not found.\n", data);
		exit (1);
	}
	va_end (ap);
}
コード例 #7
0
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);
        }
    }
}
コード例 #8
0
static void
add_groups(iks *tag, int class_no, int level, struct acl_class *ac)
{
    iks *x;
    // global permissions
    for (x = iks_find(tag, "group"); x; x = iks_next_tag(x)) {
        if (iks_strcmp(iks_name(x), "group") == 0)
            add_group(x, level, ac);
    }
    // class permissions
    x = iks_find_with_attrib(tag, "class", "name", model_get_path(class_no));
    for (x = iks_find(x, "group"); x; x = iks_next_tag(x)) {
        if (iks_strcmp(iks_name(x), "group") == 0)
            add_group(x, level, ac);
    }
}
コード例 #9
0
ファイル: tst-dom.c プロジェクト: AbrahamJewowich/FreeSWITCH
void
attrib (char *att, char *val, ...)
{
	iks *x;
	va_list ap;

	x = my_x;
	va_start (ap, val);
	while (1) {
		char *name = iks_name (x);
		char *tmp = va_arg (ap, char*);
		if (NULL == tmp) break;
		x = iks_find (x, tmp);
		if (!x) {
			PR_TEST;
			printf ("Tag <%s> is not a child of tag <%s>\n", tmp, name);
			exit (1);
		}
	}
	if (iks_strcmp (val, iks_find_attrib (x, att)) != 0) {
		PR_TEST;
		printf ("Attribute '%s' not found.\n", att);
		exit (1);
	}
	va_end (ap);
}
コード例 #10
0
ファイル: jabber.c プロジェクト: SupportSpace/SupportCenter
int
iks_stream_features (iks *x)
{
	int features = 0;

	if (iks_strcmp(iks_name(x), "stream:features"))
		return 0;
	for (x = iks_child(x); x; x = iks_next_tag(x))
		if (!iks_strcmp(iks_name(x), "starttls"))
			features |= IKS_STREAM_STARTTLS;
		else if (!iks_strcmp(iks_name(x), "bind"))
			features |= IKS_STREAM_BIND;
		else if (!iks_strcmp(iks_name(x), "session"))
			features |= IKS_STREAM_SESSION;
		else if (!iks_strcmp(iks_name(x), "mechanisms"))
			features |= iks_sasl_mechanisms(iks_child(x));
	return features;
}
コード例 #11
0
static int
count_groups(iks *tag, int class_no)
{
    iks *x;
    unsigned int nr = 0;
    // global permissions
    for (x = iks_find(tag, "group"); x; x = iks_next_tag(x)) {
        if (iks_strcmp(iks_name(x), "group") == 0)
            ++nr;
    }
    // class permissions
    x = iks_find_with_attrib(tag, "class", "name", model_get_path(class_no));
    for (x = iks_find(x, "group"); x; x = iks_next_tag(x)) {
        if (iks_strcmp(iks_name(x), "group") == 0)
            ++nr;
    }
    return nr;
}
コード例 #12
0
ファイル: tst-dom.c プロジェクト: AbrahamJewowich/FreeSWITCH
void
string (char *xml)
{
	char *tmp;

	tmp = iks_string (iks_stack (my_x), my_x);
	if (iks_strcmp (tmp, xml) != 0) {
		PR_TEST;
		printf ("Result:   %s\n", tmp);
		printf ("Expected: %s\n", xml);
		exit (1);
	}
}
コード例 #13
0
ファイル: jabber.c プロジェクト: SupportSpace/SupportCenter
iks *
iks_make_resource_bind (iksid *id)
{
	iks *x, *y, *z;

	x = iks_new("iq");
	iks_insert_attrib(x, "type", "set");
	y = iks_insert(x, "bind");
	iks_insert_attrib(y, "xmlns", IKS_NS_XMPP_BIND);
	if (id->resource && iks_strcmp(id->resource, "")) {
		z = iks_insert(y, "resource");
		iks_insert_cdata(z, id->resource, 0);
	}
	return x;
}
コード例 #14
0
ファイル: prefs.c プロジェクト: hasanakgoz/Pardus-2011-Svn-
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.");
}
コード例 #15
0
ファイル: db.c プロジェクト: harunpehlivan/project
//! Validates model file
int
db_validate_model(iks *xml, char *filename)
{
    /*!
     * Validates model file.
     *
     * @xml Iksemel document
     * @return 0 on success, -1 on error
     *
     */

    iks *iface, *met, *arg;

    DBusError bus_error;
    dbus_error_init(&bus_error);

    // Check root tag
    if (iks_strcmp(iks_name(xml), "comarModel") != 0) {
        log_error("Not a valid model XML: %s\n", filename);
        return -1;
    }

    for (iface = iks_first_tag(xml); iface; iface = iks_next_tag(iface)) {
        // Only "interface" tag is allowed
        if (iks_strcmp(iks_name(iface), "interface") != 0) {
            log_error("Unknown tag '%s' in XML: %s\n", iks_name(iface), filename);
            return -1;
        }
        // Interfaces must have a "name" attribute
        if (!iks_strlen(iks_find_attrib(iface, "name"))) {
            log_error("Model with no name in XML: %s\n", filename);
            return -1;
        }

        for (met = iks_first_tag(iface); met; met = iks_next_tag(met)) {
            // Only "method" and "signal" tags are allowed
            if (iks_strcmp(iks_name(met), "method") == 0 || iks_strcmp(iks_name(met), "signal") == 0) {
                // Tags must have a "name" attribute
                if (!iks_strlen(iks_find_attrib(met, "name"))) {
                    log_error("Method/Signal tag without name under '%s' in XML: %s\n", iks_find_attrib(iface, "name"), filename);
                    return -1;
                }
                for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) {
                    if (iks_strcmp(iks_name(arg), "arg") == 0) {
                        // Arguments must have a "name" attribute
                        if (!iks_strlen(iks_find_attrib(arg, "name"))) {
                            log_error("Argument tag with no name under '%s/%s' in XML: %s\n", iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), filename);
                            return -1;
                        }
                        // Arguments must have a "type" attribute
                        if (!iks_strlen(iks_find_attrib(arg, "type"))) {
                            log_error("Argument tag without type under '%s/%s' in XML: %s\n", iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), filename);
                            return -1;
                        }
                        // Types must be a valid DBus signature
                        if (!dbus_signature_validate(iks_find_attrib(arg, "type"), &bus_error)) {
                            dbus_error_free(&bus_error);
                            log_error("Argument tag with invalid type (%s/%s/%s) in XML: %s\n", iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), iks_find_attrib(arg, "name"), filename);
                            return -1;
                        }
                        // Types must be single type object
                        if (!dbus_signature_validate_single(iks_find_attrib(arg, "type"), &bus_error)) {
                            dbus_error_free(&bus_error);
                            log_error("Argument tag with a non-single element type (%s/%s/%s) in XML: %s\n", iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), iks_find_attrib(arg, "name"), filename);
                            return -1;
                        }
                    }
                    else if (iks_strcmp(iks_name(arg), "annotation") == 0) {
                        // Attributes must have a "name" attribute
                        if (!iks_strlen(iks_find_attrib(arg, "name"))) {
                            log_error("Annotation tag without name under '%s' in XML: %s\n", iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), filename);
                            return -1;
                        }
                    }
                    else {
                        log_error("Unknown tag '%s' under '%s/%s' in XML: %s\n", iks_name(arg), iks_find_attrib(iface, "name"), iks_find_attrib(met, "name"), filename);
                        return -1;
                    }
                }
            }
            else {
                log_error("Unknown tag '%s' under '%s' in XML: %s\n", iks_name(met), iks_find_attrib(iface, "name"), filename);
                return -1;
            }
        }
    }

    return 0;
}
コード例 #16
0
ファイル: model.c プロジェクト: Tayyib/uludag
//! 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;
}
コード例 #17
0
ファイル: jabber.c プロジェクト: hasanakgoz/Pardus-2011-Svn-
static int
on_stream (void *ptr, int type, iks *node)
{
	iks *x;
	ikspak *pak;

	switch (type) {
		case IKS_NODE_START:
			/* x = iks_make_auth (j_user, prefs.pass, iks_find_attrib (node, "id"));
			iks_insert_attrib (x, "id", "auth");
			iks_send (j_parser, x);
			iks_delete (x); */
			break;

		case IKS_NODE_NORMAL:
			if (strcmp("stream:features", iks_name(node)) == 0) {
				if (authorized) {
					int features;
					features = iks_stream_features(node);
					if (features & IKS_STREAM_BIND) {
						x = iks_make_resource_bind(j_user);
						iks_send(j_parser, x);
						iks_delete(x);
					}
					if (features & IKS_STREAM_SESSION) {
						x = iks_make_session();
						iks_insert_attrib(x, "id", "auth");
						iks_send(j_parser, x);
						iks_delete(x);
					}
				} else {
					iks_start_sasl(j_parser, IKS_SASL_DIGEST_MD5, j_user->user, prefs.pass);
				}
				break;
			} else if (strcmp("failure", iks_name(node)) == 0) {
				log_event ("Hata: SASL başarısız!");
				return IKS_HOOK;
			} else if (strcmp("success", iks_name(node)) == 0) {
				authorized = 1;
				iks_send_header(j_parser, j_user->server);
				break;
			}
		
			pak = iks_packet (node);
			if (pak->type == IKS_PAK_MESSAGE) {
				// process incoming messages
				command_parse (pak->from->partial, iks_find_cdata (node, "body"));
			} else if (pak->type == IKS_PAK_S10N) {
				// always accept subscriptions
				if (pak->subtype == IKS_TYPE_SUBSCRIBE) {
					x = iks_make_s10n (IKS_TYPE_SUBSCRIBED, pak->from->full, NULL);
					iks_send (j_parser, x);
					iks_delete (x);
				}
			} else if (pak->type == IKS_PAK_IQ) {
				if (iks_strcmp (pak->id, "auth") == 0) {
					// auth response
					if (pak->subtype == IKS_TYPE_RESULT) {
						log_event ("Bağlandık.");
						x = iks_make_iq (IKS_TYPE_GET, IKS_NS_ROSTER);
						iks_send (j_parser, x);
						iks_delete (x);
						x = iks_make_pres (IKS_SHOW_AVAILABLE, NULL);
						iks_send (j_parser, x);
						iks_delete (x);
					} else {
						log_event ("Hata: kullanıcı doğrulama başarısız oldu!");
						return IKS_HOOK;
					}
				}
			}
			break;

		case IKS_NODE_STOP:
		case IKS_NODE_ERROR:
			log_event ("Hata: XMPP stream hatası!");
			return IKS_HOOK;
	}
	if (node) iks_delete (node);

	return IKS_OK;
}
コード例 #18
0
ファイル: r_gradient.c プロジェクト: Bisheg/evince
void
r_draw_gradient (ImpRenderCtx *ctx, void *drw_data, iks *node)
{
//	GdkGC *gc;
	Gradient grad;
	char *stil, *tmp;
	iks *x;

	stil = r_get_style (ctx, node, "draw:fill-gradient-name");
	x = iks_find_with_attrib (iks_find (ctx->styles, "office:styles"),
		"draw:gradient", "draw:name", stil);
	if (x) {
		memset (&grad, 0, sizeof (Gradient));
		grad.type = -1;
		grad.offset_x = 50;
		grad.offset_y = 50;

		tmp = iks_find_attrib (x, "draw:start-color");
		if (tmp) r_parse_color (tmp, &grad.start);
		tmp = iks_find_attrib (x, "draw:start-intensity");
		if (tmp) {
			int val = atoi (tmp);
			grad.start.red = grad.start.red * val / 100;
			grad.start.green = grad.start.green * val / 100;
			grad.start.blue = grad.start.blue * val / 100;
		}
		tmp = iks_find_attrib (x, "draw:end-color");
		if (tmp) r_parse_color (tmp, &grad.end);
		tmp = iks_find_attrib (x, "draw:end-intensity");
		if (tmp) {
			int val = atoi (tmp);
			grad.end.red = grad.end.red * val / 100;
			grad.end.green = grad.end.green * val / 100;
			grad.end.blue = grad.end.blue * val / 100;
		}
		tmp = iks_find_attrib (x, "draw:angle");
		if (tmp) grad.angle = atoi(tmp) % 3600;
		tmp = iks_find_attrib (x, "draw:border");
		if (tmp) grad.border = atoi(tmp);
		tmp = r_get_style (ctx, node, "draw:gradient-step-count");
		if (tmp) grad.steps = atoi (tmp);
		tmp = iks_find_attrib (x, "draw:cx");
		if (tmp) grad.offset_x = atoi (tmp);
		tmp = iks_find_attrib (x, "draw:cy");
		if (tmp) grad.offset_y = atoi (tmp);
		tmp = iks_find_attrib (x, "draw:style");
		if (iks_strcmp (tmp, "linear") == 0)
			grad.type = GRAD_LINEAR;
		else if (iks_strcmp (tmp, "axial") == 0)
			grad.type = GRAD_AXIAL;
		else if (iks_strcmp (tmp, "radial") == 0)
			grad.type = GRAD_RADIAL;
		else if (iks_strcmp (tmp, "rectangular") == 0)
			grad.type = GRAD_RECTANGULAR;
		else if (iks_strcmp (tmp, "ellipsoid") == 0)
			grad.type = GRAD_ELLIPTICAL;
		else if (iks_strcmp (tmp, "square") == 0)
			grad.type = GRAD_SQUARE;

		if (grad.type == -1) return;

//		gc = ctx->gc;
//		ctx->gc = gdk_gc_new (ctx->d);
//		gdk_gc_copy (ctx->gc, gc);

		if (grad.type == GRAD_LINEAR || grad.type == GRAD_AXIAL)
			r_draw_gradient_simple (ctx, drw_data, &grad);
		else
			r_draw_gradient_complex (ctx, drw_data, &grad);

//		g_object_unref (ctx->gc);
//		ctx->gc = gc;
	}
}
コード例 #19
0
ファイル: stream.c プロジェクト: areski/FreeSWITCH
static int
tagHook (struct stream_data *data, char *name, char **atts, int type)
{
	iks *x;
	int err;

	switch (type) {
		case IKS_OPEN:
		case IKS_SINGLE:
#ifdef HAVE_GNUTLS
			if (data->flags & SF_TRY_SECURE) {
				if (strcmp (name, "proceed") == 0) {
					err = handshake (data);
					return err;
				} else if (strcmp (name, "failure") == 0){
					return IKS_NET_TLSFAIL;
				}
			}
#elif HAVE_SSL
			if (data->flags & SF_TRY_SECURE) {
				if (strcmp (name, "proceed") == 0) {
					err = handshake (data);
					return err;
				} else if (strcmp (name, "failure") == 0){
					return IKS_NET_TLSFAIL;
				}
			}
#endif
			if (data->current) {
				x = iks_insert (data->current, name);
				insert_attribs (x, atts);
			} else {
				x = iks_new (name);
				insert_attribs (x, atts);
				if (iks_strcmp (name, "stream:stream") == 0) {
					err = data->streamHook (data->user_data, IKS_NODE_START, x);
					if (err != IKS_OK) return err;
					break;
				}
			}
			data->current = x;
			if (IKS_OPEN == type) break;
		case IKS_CLOSE:
			x = data->current;
			if (NULL == x) {
				err = data->streamHook (data->user_data, IKS_NODE_STOP, NULL);
				if (err != IKS_OK) return err;
				break;
			}
			if (NULL == iks_parent (x)) {
				data->current = NULL;
				if (iks_strcmp (name, "challenge") == 0)
					iks_sasl_challenge(data, x);
				else if (iks_strcmp (name, "stream:error") == 0) {
					err = data->streamHook (data->user_data, IKS_NODE_ERROR, x);
					if (err != IKS_OK) return err;
				} else {
					err = data->streamHook (data->user_data, IKS_NODE_NORMAL, x);
					if (err != IKS_OK) return err;
				}
				break;
			}
			data->current = iks_parent (x);
	}
	return IKS_OK;
}
コード例 #20
0
ファイル: stream.c プロジェクト: filip-maryjanski/iksemel
static int tagHook(struct stream_data *data, char *name, char **atts, int type)
{
	iks *x;
	int err;

	switch(type)
	{
	case IKS_OPEN:
	case IKS_SINGLE:
		if(data->flags & SF_TRY_SECURE)
		{
			if(strcmp(name, "proceed") == 0)
			{
				err = iks_default_tls.handshake(&data->tlsdata,
				                                data->trans, data->sock);
				if(err == IKS_OK)
				{
					data->flags &= (~SF_TRY_SECURE);
					data->flags |= SF_SECURE;
					iks_send_header(data->prs, data->server);
				}
				if(err == IKS_AGAIN)
				{
					data->flags &= (~SF_TRY_SECURE);
					data->flags |= SF_SECURE_AGAIN;
					err = IKS_OK;
				}
				return err;
			}
			else if(strcmp(name, "failure") == 0)
			{
				return IKS_NET_TLSFAIL;
			}
		}
		if(data->current)
		{
			x = iks_insert(data->current, name);
			insert_attribs(x, atts);
		}
		else
		{
			x = iks_new(name);
			insert_attribs(x, atts);
			if(iks_strcmp(name, "stream:stream") == 0)
			{
				err = data->streamHook(data->user_data, IKS_NODE_START, x);
				if(err != IKS_OK) return err;
				break;
			}
		}
		data->current = x;
		if(IKS_OPEN == type) break;
	case IKS_CLOSE:
		x = data->current;
		if(NULL == x)
		{
			err = data->streamHook(data->user_data, IKS_NODE_STOP, NULL);
			if(err != IKS_OK) return err;
			break;
		}
		if(NULL == iks_parent(x))
		{
			data->current = NULL;
			if(iks_strcmp(name, "challenge") == 0)
			{
				iks_sasl_challenge(data, x);
				iks_delete(x);
			}
			else if(iks_strcmp(name, "stream:error") == 0)
			{
				err = data->streamHook(data->user_data, IKS_NODE_ERROR, x);
				if(err != IKS_OK) return err;
			}
			else
			{
				err = data->streamHook(data->user_data, IKS_NODE_NORMAL, x);
				if(err != IKS_OK) return err;
			}
			break;
		}
		data->current = iks_parent(x);
	}
	return IKS_OK;
}
コード例 #21
0
ファイル: db.c プロジェクト: harunpehlivan/project
//! Loads model to database
void
db_load_model(iks *xml, PyObject **py_models)
{
    /*!
     * Loads models to database
     *
     * @xml Iksemel document
     * @py_models Pointer to models dictionary
     *
     */

    iks *iface, *met, *arg;

    for (iface = iks_first_tag(xml); iface; iface = iks_next_tag(iface)) {
        PyObject *py_methods = PyDict_New();

        char *iface_name = iks_find_attrib(iface, "name");

        for (met = iks_first_tag(iface); met; met = iks_next_tag(met)) {
            PyObject *py_tuple = PyTuple_New(4);

            // First argument is type. 0 for methods, 1 for signals
            if (iks_strcmp(iks_name(met), "method") == 0) {
                PyTuple_SetItem(py_tuple, 0, PyInt_FromLong((long) 0));
            }
            else {
                PyTuple_SetItem(py_tuple, 0, PyInt_FromLong((long) 1));
            }

            // Second argument is PolicyKit action ID
            char *action_id = db_action_id(iface_name, met);
            PyTuple_SetItem(py_tuple, 1, PyString_FromString(action_id));

            // Build argument lists
            PyObject *py_args_in = PyList_New(0);
            PyObject *py_args_out = PyList_New(0);
            int noreply = 0;
            for (arg = iks_first_tag(met); arg; arg = iks_next_tag(arg)) {
                if (iks_strcmp(iks_name(arg), "attribute") == 0) {
                    if (iks_strcmp(iks_find_attrib(arg, "name"), "org.freedesktop.DBus.Method.NoReply") == 0) {
                        if (iks_strcmp(iks_find_attrib(arg, "value"), "true") == 0) {
                            noreply = 1;
                        }
                    }
                }
                else if (iks_strcmp(iks_name(arg), "arg") == 0) {
                    if (iks_strcmp(iks_name(met), "method") == 0) {
                        if (iks_strcmp(iks_find_attrib(arg, "direction"), "out") == 0) {
                            PyList_Append(py_args_out, PyString_FromString(iks_find_attrib(arg, "type")));
                        }
                        else {
                            PyList_Append(py_args_in, PyString_FromString(iks_find_attrib(arg, "type")));
                        }
                    }
                    else if (iks_strcmp(iks_name(met), "signal") == 0) {
                        PyList_Append(py_args_out, PyString_FromString(iks_find_attrib(arg, "type")));
                    }
                }
            }

            if (noreply) {
                py_args_out = PyList_New(0);
            }

            // Third argument is input arguments
            PyTuple_SetItem(py_tuple, 2, py_args_in);
            // Fourth argument is output arguments
            PyTuple_SetItem(py_tuple, 3, py_args_out);

            PyDict_SetItemString(py_methods, iks_find_attrib(met, "name"), py_tuple);
        }

        PyDict_SetItemString(*py_models, iface_name, py_methods);
    }
}
コード例 #22
0
ファイル: model.c プロジェクト: Tayyib/uludag
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;
}
コード例 #23
0
ファイル: packet.c プロジェクト: hustwcw/packet
// 客户端解析服务器响应的协商包,从协商包中解析出临时密钥,并使用自己的私钥进行解密
// 服务器端解析客户端发来的协商包,并填充服务器包解析器
int pkg_talk_parse(packet_parser_t *pkg, const char* xml)
{
	iks *x, *e, *c;
	int result=0;
	int dest_len;

	if(NULL==xml) return NULL_ERROR;

	x =	iks_tree (xml, 0, &result);
	if(!x) return NULL_ERROR;
	if(result != IKS_OK)
	{
		iks_delete(x);
		return IKS_BADXML;
	}

	if(0 == iks_strcmp("connection",iks_name(x)))
	{
		char* tmp = NULL;
		char *tempkey;
		char *output;

		tmp = iks_find_attrib(x, "type");
		if(NULL != tmp){
			if(strcmp(tmp, "create")==0)
				set_talk_type(1, pkg); //说明为服务端
			else
				set_talk_type(0, pkg); //说明为客户端
		}

		if(1 == pkg->talk_type)
		{
			//说明本端为服务端
			tmp = iks_find_cdata(x, "client-id");
			set_client_id(tmp, pkg);

			tmp = iks_find_cdata(x, "public-key");
			if(SUCCESS != set_talk_crt_public_key(tmp, pkg))
				return SET_TALK_CRT_KEY_ERROR;

			tmp = iks_find_attrib(iks_find(x,"public-key"), "type");
			if(SUCCESS != set_talk_crt_type(tmp, pkg))
				return SET_TALK_CRT_TYPE_ERROR;

			e = iks_find(x,"encryption");
			while( e ){
				tmp = iks_find_cdata(e, "allow");
				if(SUCCESS == set_transfer_crt_type(tmp, pkg)) break;
				e = iks_next(e);
			}
			// 服务器端设置传输数据使用的临时密钥
			set_transfer_crt_key(TRANSFERKEY, pkg);

			c = iks_find(x,"compression");
			while( c ){
				tmp = iks_find_cdata(c, "allow");
				if(SUCCESS == set_cps_type(tmp, pkg)) break;
				c = iks_next(c);
			}
		}
		else if(0 == pkg->talk_type)
		{
			// 说明本端为客户端
			tempkey = iks_find_cdata(x,"encryption");
			output = (char *)calloc(strlen(tempkey)/2+1, 1);
			hex2byte(tempkey, strlen(tempkey), (unsigned char *)output);
			if (pkg->asym_encrypt_hook == NULL)
			{
				tempkey = (char *)rsa_encrypt((unsigned char *)output, strlen(tempkey)/2, &dest_len, pkg->curr_ert.ert_keys[1], CRYPT_TYPE_DECRYPT);
			}
			else
			{
				tempkey = (char *)pkg->asym_encrypt_hook((unsigned char *)output, strlen(tempkey)/2, &dest_len, pkg->curr_ert.ert_keys[1], CRYPT_TYPE_DECRYPT);
			}
			free(output);
			// 比较服务器端响应的压缩加密方式与客户端请求的是否相同
			if( SUCCESS != set_transfer_crt_key(tempkey, pkg))
				return SET_TRANSFER_ERT_KEY_ERROR;
			free(tempkey);
			if( SUCCESS != cmp_transfer_crt_type(iks_find_attrib(iks_find(x, "encryption"), "type"), pkg) )
				return CMP_TRANSFER_CRT_TYPE_ERROR;
			if( SUCCESS != cmp_cps_type(iks_find_cdata(x, "compression"), pkg) )
				return CMP_CPS_TYPE_ERROR;
			set_heatbeat("client", iks_find_attrib(iks_find(x, "heartbeat"), "seconds"), pkg);
		}	
	} 
	
	//iks_parser_delete (p);
	iks_delete(x);
	return SUCCESS;
}