private void prepareConfigData(Packet result, String comp_name) throws ConfigurationException { if (comp_name.equals("--none--")) { newComponentCommand(result); return; } // end of if (comp_name.equals("--none--")) Command.setStatus(result, Command.Status.executing); Command.addAction(result, Command.Action.complete); // Let's try to sort them to make it easier to find options on // configuration page. Map<String, Object> allprop = new TreeMap<String, Object>(getAllProperties(comp_name)); for (Map.Entry<String, Object> entry : allprop.entrySet()) { Command.addFieldValue( result, XMLUtils.escape(entry.getKey()), XMLUtils.escape(objectToString(entry.getValue()))); } // end of for (Map.Entry entry: prop.entrySet()) Command.addFieldValue( result, XMLUtils.escape("new-prop-name"), XMLUtils.escape(comp_name + "/"), "text-single", "New property name"); Command.addFieldValue( result, XMLUtils.escape("new-prop-value"), "", "text-single", "New property value"); }
private boolean checkComponentName(Packet result, String name) { String msg = name; if (msg != null) { Command.addFieldValue( result, "Info", "Note!! " + msg + ", please provide valid component name.", "fixed"); newComponentCommand(result); return false; } // end of if (new_comp_name == null || new_comp_name.length() == 0) String[] comp_names = getComponents(); for (String comp_name : comp_names) { if (comp_name.equals(name)) { Command.addFieldValue( result, "Info", "Note!! Component with provided name already exists.", "fixed"); Command.addFieldValue(result, "Info", "Please provide different component name.", "fixed"); newComponentCommand(result); return false; } // end of if (comp_name.equals(new_comp_name)) } // end of for (String comp_name: comp_names) return true; }
public Object setPropertyValue(String key, String val, Packet result_pack, boolean admin) { Object result = null; try { if (admin) { result = setValue(key, val, false, false, null); } if (result != null) { Command.addFieldValue(result_pack, XMLUtils.escape(key), XMLUtils.escape(val)); } else { Command.addFieldValue( result_pack, "Note", "You can not set new properties yet, you can just modify existing ones.", "fixed"); } } catch (Exception e) { Command.addFieldValue(result_pack, "Note", "Error setting property: " + e, "fixed"); } return result; }
@Override public void responseReceived(Packet packet, Packet response) { String pb = Command.getFieldValue(packet, PRE_BIND_ATTR); boolean prebind = Boolean.valueOf(pb); String sessionId = Command.getFieldValue(packet, SESSION_ID_ATTR); String userID = Command.getFieldValue(packet, USER_ID_ATTR); if (prebind) { // we are doing pre-bind, send user-login command, bind resource Packet packetOut = Command.USER_STATUS.getPacket( packet.getFrom(), packet.getTo(), StanzaType.get, UUID.randomUUID().toString()); // Element presence = new Element( "presence" ); Command.addFieldValue(packetOut, USER_ID_ATTR, userID); if (null != sessionId) { Command.addFieldValue(packetOut, SESSION_ID_ATTR, sessionId); } Command.addFieldValue(packetOut, PRE_BIND_ATTR, String.valueOf(prebind)); addOutPacket(packetOut); } else { // We are now ready to ask for features.... addOutPacket( Command.GETFEATURES.getPacket( packet.getFrom(), packet.getTo(), StanzaType.get, UUID.randomUUID().toString(), null)); } }
private void updateConfigChanges(Packet packet, Packet result, String comp_name, boolean admin) throws ConfigurationException { if (comp_name.equals("--none--")) { newComponentCommand(packet, result, admin); return; } // end of if (comp_name.equals("--none--")) Command.addNote(result, "You changed following settings:"); Command.addFieldValue(result, "Note", "You changed following settings:", "fixed"); Map<String, Object> allprop = getAllProperties(comp_name); boolean changed = false; for (Map.Entry<String, Object> entry : allprop.entrySet()) { String tmp_val = Command.getFieldValue(packet, XMLUtils.escape(entry.getKey())); String old_val = objectToString(entry.getValue()); String new_val = old_val; if (tmp_val != null) { new_val = XMLUtils.unescape(tmp_val); } if (new_val != null && old_val != null && !new_val.equals(old_val)) { defConfigParams.put( entry.getKey(), setPropertyValue(entry.getKey(), new_val, result, admin)); changed = true; } } // end of for (Map.Entry entry: prop.entrySet()) String prop_value = Command.getFieldValue(packet, "new-prop-value"); if (prop_value != null && prop_value.trim().length() > 0) { setPropertyValue( XMLUtils.unescape(Command.getFieldValue(packet, "new-prop-name")), XMLUtils.unescape(prop_value), result, admin); changed = true; } if (changed && admin) { setup(comp_name); } }
/** * Method description * * @param packet * @param session * @param repo * @param results * @param settings */ @Override public void process( final Packet packet, final XMPPResourceConnection session, final NonAuthUserRepository repo, final Queue<Packet> results, final Map<String, Object> settings) { if (session == null) { return; } // end of if (session == null) if (packet.isElement("starttls", XMLNS)) { if (session.getSessionData(ID) != null) { // Somebody tries to activate multiple TLS layers. // This is possible and can even work but this can also be // a DOS attack. Blocking it now, unless someone requests he wants // to have multiple layers of TLS for his connection log.log( Level.WARNING, "Multiple TLS requests, possible DOS attack, closing connection: {0}", packet); results.offer(packet.swapFromTo(failure, null, null)); results.offer( Command.CLOSE.getPacket( packet.getTo(), packet.getFrom(), StanzaType.set, session.nextStanzaId())); return; } session.putSessionData(ID, "true"); Packet result = Command.STARTTLS.getPacket( packet.getTo(), packet.getFrom(), StanzaType.set, session.nextStanzaId(), Command.DataType.submit); Command.setData(result, proceed); results.offer(result); } else { log.log(Level.WARNING, "Unknown TLS element: {0}", packet); results.offer(packet.swapFromTo(failure, null, null)); results.offer( Command.CLOSE.getPacket( packet.getTo(), packet.getFrom(), StanzaType.set, session.nextStanzaId())); } // end of if (packet.getElement().getName().equals("starttls")) else }
private void newComponentCommand(Packet result) { Command.addFieldValue(result, "Info", "Press:", "fixed"); Command.addFieldValue( result, "Info", "'Next' to set all parameters for the new component.", "fixed"); Command.setStatus(result, Command.Status.executing); Command.addAction(result, Command.Action.next); Command.addFieldValue(result, "Component name", "", "text-single", "Component name"); try { Set<Class<MessageReceiver>> receiv_cls = ClassUtil.getClassesImplementing(MessageReceiver.class); // All message receivers except MessageRouter String[] receiv_cls_names = new String[receiv_cls.size() - 1]; String[] receiv_cls_simple = new String[receiv_cls.size() - 1]; int idx = 0; for (Class<MessageReceiver> reciv : receiv_cls) { if (!reciv.getName().equals(ROUTER_COMP_CLASS_NAME)) { receiv_cls_names[idx] = reciv.getName(); receiv_cls_simple[idx++] = reciv.getSimpleName(); } // end of if (!reciv.getName().equals(ROUTER_COMP_CLASS_NAME)) } // end of for (MessageReceiver.class reciv: receiv_cls) Command.addFieldValue( result, "Component class", EXT_COMP_CLASS_NAME, "Component class", receiv_cls_simple, receiv_cls_names); } catch (Exception e) { log.log(Level.SEVERE, "Problem loading MessageReceiver implementations", e); Command.addFieldValue( result, "Component class", "ERROR!! Problem loading MessageReceiver implementations, " + "look in log file for details...", "text-single", "Component class"); } // end of try-catch }
private void newComponentCommand(Packet packet, Packet result, boolean admin) { String params_set = Command.getFieldValue(packet, "Params set"); if (Command.getAction(packet) != null && Command.getAction(packet).equals("prev")) { newComponentCommand(result); return; } // end of if () if (params_set != null) { createNewComponent(packet, result, admin); return; } // end of if (params_set != null) String new_comp_name = Command.getFieldValue(packet, "Component name"); String new_comp_class = Command.getFieldValue(packet, "Component class"); if (!checkComponentName(result, new_comp_name)) { return; } // end of if (!checkComponentName(new_comp_name)) Command.setStatus(result, Command.Status.executing); Command.addFieldValue(result, "Component name", new_comp_name, "hidden"); Command.addFieldValue(result, "Component class", new_comp_class, "hidden"); Command.addFieldValue(result, "Info1", "Press:", "fixed"); try { MessageReceiver mr = (MessageReceiver) Class.forName(new_comp_class).newInstance(); Command.addFieldValue( result, "Info4", "Component name: " + new_comp_name + ", class: " + mr.getClass().getSimpleName(), "fixed"); if (mr instanceof ConnectionManager) { String ports = Command.getFieldValue(packet, "TCP/IP ports"); if (ports == null) { Command.addFieldValue( result, "Info2", "1. 'Next' to set more component parameters.", "fixed"); Command.addFieldValue( result, "Info3", "2. 'Previous' to go back and select different component.", "fixed"); Command.addAction(result, Command.Action.next); Command.addAction(result, Command.Action.prev); Command.addFieldValue( result, "Info4", "This component uses TCP/IP ports, please provide port numbers:", "fixed"); Command.addFieldValue(result, "TCP/IP ports", "5557"); return; } else { String[] ports_arr = ports.split(","); int[] ports_i = new int[ports_arr.length]; try { for (int i = 0; i < ports_arr.length; i++) { ports_i[i] = Integer.decode(ports_arr[i].trim()); } // end of for (int i = 0; i < ports_arr.length; i++) defConfigParams.put(new_comp_name + "/connections/ports", ports_i); } catch (Exception e) { Command.addFieldValue( result, "Info2", "1. 'Next' to set more component parameters.", "fixed"); Command.addFieldValue( result, "Info3", "2. 'Previous' to go back and select different component.", "fixed"); Command.addAction(result, Command.Action.next); Command.addAction(result, Command.Action.prev); Command.addFieldValue( result, "Info4", "Incorrect TCP/IP ports provided, please provide port numbers:", "fixed"); Command.addFieldValue(result, "TCP/IP ports", ports); return; } // end of try-catch } // end of else } Command.addFieldValue( result, "Info2", "1. 'Finish' to create component with this parameters.", "fixed"); Command.addFieldValue( result, "Info3", "2. 'Previous' to go back and select different component.", "fixed"); Command.addAction(result, Command.Action.complete); Command.addAction(result, Command.Action.prev); mr.setName(new_comp_name); if (mr instanceof Configurable) { // Load defaults into sorted Map: Map<String, Object> comp_props = new TreeMap<String, Object>(((Configurable) mr).getDefaults(defConfigParams)); for (Map.Entry<String, Object> entry : comp_props.entrySet()) { Command.addFieldValue( result, XMLUtils.escape(entry.getKey()), XMLUtils.escape(objectToString(entry.getValue()))); } // end of for (Map.Entry entry: prop.entrySet()) } else { Command.addFieldValue( result, "Info6", "Component is not configurable, do you want to create it?", "fixed"); } // end of else Command.addFieldValue(result, "Params set", "true", "hidden"); } catch (Exception e) { log.log(Level.SEVERE, "Problem instantiating component:", e); Command.addFieldValue( result, "Component class", "ERROR!! Problem instantiating component, " + "look in log file for details...", "text-single", "Component class"); } // end of try-catch }
private void createNewComponent(Packet packet, Packet result, boolean admin) { String new_comp_name = Command.getFieldValue(packet, "Component name"); String new_comp_class = Command.getFieldValue(packet, "Component class"); try { MessageReceiver mr = (MessageReceiver) Class.forName(new_comp_class).newInstance(); mr.setName(new_comp_name); if (mr instanceof Configurable) { Map<String, Object> comp_props = ((Configurable) mr).getDefaults(defConfigParams); Map<String, Object> new_params = new LinkedHashMap<String, Object>(comp_props); // Convert String values to proper Objecy values for (Map.Entry<String, Object> entry : comp_props.entrySet()) { String val = Command.getFieldValue(packet, XMLUtils.escape(entry.getKey())); if (val == null) { val = ""; } val = XMLUtils.unescape(val); log.info("New component value: " + entry.getKey() + "=" + val); setValue(entry.getKey(), val, false, false, new_params); } // end of for (Map.Entry entry: prop.entrySet()) if (admin) { // Now we can save all properties to config repository: for (Map.Entry<String, Object> entry : new_params.entrySet()) { String key = entry.getKey(); String subnode = null; int key_idx = entry.getKey().lastIndexOf('/'); if (key_idx > 0) { key = entry.getKey().substring(key_idx + 1); subnode = entry.getKey().substring(0, key_idx); } log.info( "Saving property to repository: " + "root=" + new_comp_name + ", subnode=" + subnode + ", key=" + key + ", value=" + entry.getValue()); repository.set(new_comp_name, subnode, key, entry.getValue()); } // end of for (Map.Entry entry: prop.entrySet()) // And load the component itself..... // Set class name for the component repository.set( routerCompName, "/components/msg-receivers", new_comp_name + ".class", new_comp_class); // Activate the component repository.set( routerCompName, "/components/msg-receivers", new_comp_name + ".active", true); // Add to the list of automaticaly loaded components setValue( routerCompName + "/components/msg-receivers/id-names", new_comp_name, true, false, null); // repository.sync(); setup(routerCompName); } // end of if (admin) } Command.addNote(result, "New component created: " + new_comp_name); Command.addFieldValue(result, "Note", "New component created: " + new_comp_name, "fixed"); } catch (Exception e) { log.log(Level.SEVERE, "Problem instantiating component:", e); Command.addFieldValue( result, "Component class", "ERROR!! Problem instantiating component, " + "look in log file for details...", "text-single", "Component class"); } // end of try-catch }
@Override public void processPacket(final Packet packet, final Queue<Packet> results) { if (!packet.isCommand()) { return; } Iq iqc = (Iq) packet; if (iqc.getType() != null && iqc.getType() == StanzaType.error) { log.info("Ignoring error packet: " + iqc.toString()); return; } String nick = iqc.getTo().getLocalpart(); if (nick == null || !getName().equals(nick)) return; String msg = "Please be careful, you are service admin and all changes" + " you make are instantly applied to live system!"; boolean admin = true; if (iqc.getPermissions() != Permissions.ADMIN) { if (demoMode) { admin = false; msg = "You are not admin. You can safely play with the settings as" + " you can not change anything."; if (iqc.getStrCommand() != null && iqc.getStrCommand().endsWith(DEF_SM_NAME)) { Packet result = iqc.commandResult(Command.DataType.result); Command.addFieldValue(result, "Note", msg, "fixed"); Command.addFieldValue( result, "Note", "Restricted area, only admin can see these settings.", "fixed"); results.offer(result); return; } } else { try { results.offer( Authorization.NOT_AUTHORIZED.getResponseMessage( packet, "You are not authorized for this action.", true)); } catch (PacketErrorTypeException e) { log.warning("Packet processing exception: " + e); } return; } } if (log.isLoggable(Level.FINEST)) { log.finest("Command received: " + iqc.toString()); } Command.Action action = Command.getAction(iqc); if (action == Command.Action.cancel) { Packet result = iqc.commandResult(null); results.offer(result); return; } switch (iqc.getCommand()) { case OTHER: if (iqc.getStrCommand() != null) { if (iqc.getStrCommand().startsWith("config/list/")) { try { String[] spl = iqc.getStrCommand().split("/"); Packet result = iqc.commandResult(Command.DataType.result); Command.addFieldValue(result, "Note", msg, "fixed"); Map<String, Object> allprop = getAllProperties(spl[2]); for (Map.Entry<String, Object> entry : allprop.entrySet()) { Command.addFieldValue( result, XMLUtils.escape(entry.getKey()), XMLUtils.escape(objectToString(entry.getValue()))); } // end of for (Map.Entry entry: prop.entrySet()) results.offer(result); } catch (ConfigurationException ex) { Logger.getLogger(ConfiguratorOld.class.getName()).log(Level.SEVERE, null, ex); } } if (iqc.getStrCommand().startsWith("config/set/")) { try { String[] spl = iqc.getStrCommand().split("/"); Packet result = iqc.commandResult(Command.DataType.result); Command.addFieldValue(result, "Note", msg, "fixed"); if (Command.getData(packet) == null) { prepareConfigData(result, spl[2]); results.offer(result); } else { updateConfigChanges(packet, result, spl[2], admin); results.offer(result); } } catch (ConfigurationException ex) { Logger.getLogger(ConfiguratorOld.class.getName()).log(Level.SEVERE, null, ex); } } } break; default: break; } }
@Override protected void processCommand(Packet packet) { BoshSession session = getBoshSession(packet.getTo()); switch (packet.getCommand()) { case USER_LOGIN: String jid = Command.getFieldValue(packet, "user-jid"); if (jid != null) { if (session != null) { try { BareJID fromJID = BareJID.bareJIDInstance(jid); BareJID hostJid = getSeeOtherHostForJID(fromJID, Phase.LOGIN); if (hostJid != null) { Element streamErrorElement = see_other_host_strategy.getStreamError( "urn:ietf:params:xml:ns:xmpp-streams", hostJid); Packet redirectPacket = Packet.packetInstance(streamErrorElement); redirectPacket.setPacketTo(packet.getTo()); writePacketToSocket(redirectPacket); session.sendWaitingPackets(); session.close(); if (log.isLoggable(Level.FINE)) { log.log( Level.FINE, "{0} : {1} ({2})", new Object[] { BOSH_OPERATION_TYPE.REMOVE, session.getSid(), "See other host" }); } sessions.remove(session.getSid()); } else { session.setUserJid(jid); } } catch (TigaseStringprepException ex) { log.log(Level.SEVERE, "user JID violates RFC6122 (XMPP:Address Format): ", ex); } } else { if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Missing XMPPIOService for USER_LOGIN command: {0}", packet); } } } else { log.log(Level.WARNING, "Missing user-jid for USER_LOGIN command: {0}", packet); } break; case CLOSE: if (session != null) { if (log.isLoggable(Level.FINER)) { log.log(Level.FINER, "Closing session for command CLOSE: {0}", session.getSid()); } try { List<Element> err_el = packet.getElement().getChildrenStaticStr(Iq.IQ_COMMAND_PATH); if ((err_el != null) && (err_el.size() > 0)) { Element error = new Element("stream:error"); error.addChild(err_el.get(0)); Packet condition = Packet.packetInstance(error); condition.setPacketTo(packet.getTo()); writePacketToSocket(condition); session.sendWaitingPackets(); bosh_session_close_delay = 100; } } catch (TigaseStringprepException ex) { Logger.getLogger(BoshConnectionManager.class.getName()).log(Level.SEVERE, null, ex); } if (bosh_session_close_delay > 0) { try { Thread.sleep(bosh_session_close_delay); } catch (InterruptedException ex) { // Intentionally left blank } } session.close(); if (log.isLoggable(Level.FINE)) { log.log( Level.FINE, "{0} : {1} ({2})", new Object[] { BOSH_OPERATION_TYPE.REMOVE, session.getSid(), "Closing session for command CLOSE" }); } sessions.remove(session.getSid()); } else { if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "Session does not exist for packet: {0}", packet); } } break; case CHECK_USER_CONNECTION: if (session != null) { // It's ok, the session has been found, respond with OK. addOutPacket(packet.okResult((String) null, 0)); } else { // Session is no longer active, respond with an error. try { addOutPacket( Authorization.ITEM_NOT_FOUND.getResponseMessage(packet, "Connection gone.", false)); } catch (PacketErrorTypeException e) { // Hm, error already, ignoring... log.log(Level.INFO, "Error packet is not really expected here: {0}", packet); } } break; default: super.processCommand(packet); break; } // end of switch (pc.getCommand()) }