[xmppd-dev] commit r1565 - trunk/jabberd14/jsm/modules

mail at jabberd.org mail at jabberd.org
Tue Nov 10 02:21:34 CET 2009


Author: mawis
Date: Tue Nov 10 02:21:34 2009
New Revision: 1565

Log:
Porting changes in mod_dynamic from RELEASE_1_6_1 branch to trunk

Modified:
   trunk/jabberd14/jsm/modules/mod_dynamic.cc

Modified: trunk/jabberd14/jsm/modules/mod_dynamic.cc
==============================================================================
--- trunk/jabberd14/jsm/modules/mod_dynamic.cc	Tue Nov 10 02:02:44 2009	(r1564)
+++ trunk/jabberd14/jsm/modules/mod_dynamic.cc	Tue Nov 10 02:21:34 2009	(r1565)
@@ -140,9 +140,10 @@
  * handle our server commands
  *
  * @param m the ::mapi_struct that contains the request
+ * @param config_jid the jid where dynamically hosts are stored to
  * @return signalling if this method processed the request
  */
-static mreturn mod_dynamic_server_command(mapi m) {
+static mreturn mod_dynamic_server_command(mapi m, jid config_jid) {
     // we only handle set requests
     if (jpacket_subtype(m->packet) != JPACKET__SET)
 	return M_PASS;
@@ -252,18 +253,31 @@
 		} else {
 		    xmlnode_put_attrib_ns(note, "type", NULL, NULL, "info");
 
+		    std::ostringstream replace_path;
+		    replace_path << "dhost:host[@jid='" << preped_hostname->get_domain() << "']";
+
 		    // execute
+		    xmlnode newhost = NULL;
 		    switch (given_command) {
 			case host:
 			    xmlnode_insert_cdata(note, messages_get(xmlnode_get_lang(m->packet->x), N_("Hostname has been added.")), -1);
 			    log_debug2(ZONE, LOGT_DYNAMIC, "registering hostname %s on server %s", preped_hostname->get_domain().c_str(), m->si->i->id);
 			    register_instance(m->si->i, preped_hostname->get_domain().c_str());
+
+			    // store in xdb
+			    newhost = xmlnode_new_tag_ns("host", NULL, NS_JABBERD_CONFIG_DYNAMICHOST);
+			    xmlnode_put_attrib_ns(newhost, "jid", NULL, NULL, preped_hostname->get_domain().c_str());
+			    xdb_act_path(m->si->xc, config_jid, NS_JABBERD_CONFIG_DYNAMICHOST, "insert", replace_path.str().c_str(), m->si->std_namespace_prefixes, newhost);
+			    xmlnode_free(newhost);
 			    break;
 			case unhost:
 			    // XXX kick existing sessions and remove local data about this domain
 			    xmlnode_insert_cdata(note, messages_get(xmlnode_get_lang(m->packet->x), N_("Hostname has been removed.")), -1);
 			    log_debug2(ZONE, LOGT_DYNAMIC, "unregistering hostname %s on server %s", preped_hostname->get_domain().c_str(), m->si->i->id);
 			    unregister_instance(m->si->i, preped_hostname->get_domain().c_str());
+
+			    // remove in xdb
+			    xdb_act_path(m->si->xc, config_jid, NS_JABBERD_CONFIG_DYNAMICHOST, "insert", replace_path.str().c_str(), m->si->std_namespace_prefixes, NULL);
 			    break;
 		    }
 		}
@@ -296,12 +310,12 @@
  * handle requests to add or remove hosts from the server
  *
  * @param m the ::mapi_struct that contains the request to handle
- * @param arg unused/ignored
+ * @param arg jid used for xdb access
  * @return signalling if this method processed the request
  */
 static mreturn mod_dynamic_server(mapi m, void *arg) {
     /* sanity check */
-    if (m == NULL || m->packet == NULL)
+    if (m == NULL || m->packet == NULL || !arg)
 	return M_PASS;
 
     /* only handle iqs */
@@ -315,7 +329,7 @@
 	return mod_dynamic_server_disco_items(m);
 
     if (NSCHECK(m->packet->iq, NS_COMMAND))
-	return mod_dynamic_server_command(m);
+	return mod_dynamic_server_command(m, static_cast<jid>(arg));
 
     return M_PASS;
 }
@@ -326,5 +340,33 @@
  * @param si the session manager instance
  */
 extern "C" void mod_dynamic(jsmi si) {
-    js_mapi_register(si, e_SERVER, mod_dynamic_server, NULL);
+    jid config_jid = jid_new(si->p, si->i->id);
+
+    js_mapi_register(si, e_SERVER, mod_dynamic_server, config_jid);
+
+    // get additional hostnames of the session manager, that have been dynamically added
+    xmlnode dynhosts = xdb_get(si->xc, config_jid, NS_JABBERD_CONFIG_DYNAMICHOST);
+    for (xmlnode iter = xmlnode_get_firstchild(dynhosts); iter; iter = xmlnode_get_nextsibling(iter)) {
+	// skip what we do not care about
+	if (xmlnode_get_type(iter) != NTYPE_TAG) {
+	    continue;
+	}
+	if (j_strcmp(xmlnode_get_namespace(iter), NS_JABBERD_CONFIG_DYNAMICHOST)) {
+	    continue;
+	}
+	if (j_strcmp(xmlnode_get_localname(iter), "host")) {
+	    continue;
+	}
+
+	char const* dynhost = xmlnode_get_attrib_ns(iter, "jid", NULL);
+	if (!dynhost) {
+	    log_notice(si->i->id, "ignoring empty dynamic host in configuration: %s", xmlnode_serialize_string(iter, xmppd::ns_decl_list(), 0));
+	    continue;
+	}
+
+	// actually register the hostname
+	log_notice(si->i->id, "loading dynamic host: %s", dynhost);
+	register_instance(si->i, dynhost);
+    }
+    xmlnode_free(dynhosts);
 }


More information about the dev mailing list