Modified: directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPDaemonImpl.java URL: http://svn.apache.org/viewvc/directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPDaemonImpl.java?rev=782980&r1=782979&r2=782980&view=diff ============================================================================== --- directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPDaemonImpl.java (original) +++ directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPDaemonImpl.java Tue Jun 9 12:50:45 2009 @@ -19,7 +19,6 @@ */ package org.apache.directory.slp.impl; - import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -73,17 +72,14 @@ * * String scope -> List of ServiceURLs services. //?? Service, not URLS... */ - private Map> registeredServices = new HashMap>(); + private final Map> registeredServices = new HashMap>(); /** * Sorted set for disposal of services which lifetimes have expired: * * Long expirationTimestamp -> ServiceURL service. */ - private SortedMap serviceDisposalQueue = new TreeMap(); - - - + private final SortedMap serviceDisposalQueue = new TreeMap(); /** * create a new SLPDaemon instance. @@ -94,7 +90,7 @@ public SLPDaemonImpl() throws Exception { new ServiceDisposalThread(); SLPCore.platform.logDebug("jSLP daemon starting ..."); - running=true; + running = true; } /** @@ -105,12 +101,13 @@ * the ServiceRegistration. */ private void registerService(final ServiceRegistrationMessage reg) { - // prevent registrations from being sent to the same DA multiple times when in multiple scopes - List handledDAs = new ArrayList(); + // prevent registrations from being sent to the same DA multiple times + // when in multiple scopes + final List handledDAs = new ArrayList(); - Service service = new Service(reg); - String[] scopes = reg.getScopes(); - for (int i=0;i ServiceURL.LIFETIME_PERMANENT) { synchronized (serviceDisposalQueue) { - long next = System.currentTimeMillis() - + (reg.getServiceURL().getLifetime() * 1000); - ArrayList keys = new ArrayList(serviceDisposalQueue - .keySet()); - for (Iterator iter = keys.iterator(); iter.hasNext();) { - Object key = iter.next(); - if (serviceDisposalQueue.get(key).equals(reg.getServiceURL())) { + final long next = System.currentTimeMillis() + + reg.getServiceURL().getLifetime() * 1000; + final ArrayList keys = new ArrayList( + serviceDisposalQueue.keySet()); + for (final Iterator iter = keys.iterator(); iter.hasNext();) { + final Object key = iter.next(); + if (serviceDisposalQueue.get(key).equals( + reg.getServiceURL())) { serviceDisposalQueue.remove(key); } } - serviceDisposalQueue.put(new Long(next), reg.getServiceURL()); + serviceDisposalQueue.put(new Long(next), reg + .getServiceURL()); serviceDisposalQueue.notifyAll(); } } @@ -137,64 +136,69 @@ SLPCore.platform.logTraceReg("REGISTERED " + reg.getServiceURL()); // register the service with all known DAs in the scopes - List daList = (List) SLPCore.dAs.get(scope); + List daList = SLPCore.dAs.get(scope); // no DA for the scope known ? // try to find one - //could this lead to unnecessary timeouts??? + // could this lead to unnecessary timeouts??? if ((daList == null || daList.isEmpty()) && !SLPCore.noDiscovery) { try { - SLPCore.daLookup(new String[] { (String) scope }); + SLPCore.daLookup(new String[] { scope }); // wait a short time for incoming replies synchronized (SLPCore.dAs) { try { SLPCore.dAs.wait(SLPCore.CONFIG.getWaitTime()); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { } } daList = SLPCore.dAs.get(scope); - } catch (ServiceLocationException sle) { + } catch (final ServiceLocationException sle) { SLPCore.platform.logError(sle.getMessage(), sle .fillInStackTrace()); } } - - - if (daList != null && !daList.isEmpty()) { - final String[] dAs = (String[]) daList - .toArray(new String[daList.size()]); + final String[] dAs = daList.toArray(new String[daList.size()]); for (int j = 0; j < dAs.length; j++) { - try{ - if (handledDAs.contains(dAs[j])){ + try { + if (handledDAs.contains(dAs[j])) { continue; } handledDAs.add(dAs[j]); - // if the ip is within the framework, i.e. DA and SA are running at the same time, then pass the reg on internally - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(dAs[j])){ - if (SLPCore.getDirectoryAgentDaemon()!=null){ - if (SLPCore.getDirectoryAgentDaemon().isKnownService(service)){ - SLPCore.getDirectoryAgentDaemon().updateServiceEntry(reg); + // if the ip is within the framework, i.e. DA and SA are + // running at the same time, then pass the reg on + // internally + if (SLPUtils.arrayToList(SLPCore.myIPs) + .contains(dAs[j])) { + if (SLPCore.getDirectoryAgentDaemon() != null) { + if (SLPCore.getDirectoryAgentDaemon() + .isKnownService(service)) { + SLPCore.getDirectoryAgentDaemon() + .updateServiceEntry(reg); } else { - SLPCore.getDirectoryAgentDaemon().registerService(reg); + SLPCore.getDirectoryAgentDaemon() + .registerService(reg); } } else { - // what? no daDaemon running?? must remove the ip from the list - SLPUtils.removeValueFromAll(SLPCore.dAs, (reg).getServiceURL().toString()); - SLPCore.dASPIs.remove((reg).getServiceURL().toString()); + // what? no daDaemon running?? must remove the + // ip from the list + SLPUtils.removeValueFromAll(SLPCore.dAs, reg + .getServiceURL().toString()); + SLPCore.dASPIs.remove(reg.getServiceURL() + .toString()); } } else { announceService(dAs[j], reg); } - } catch (ServiceLocationException e) { - if (e.getErrorCode()==ServiceLocationException.INVALID_REGISTRATION){ + } catch (final ServiceLocationException e) { + if (e.getErrorCode() == ServiceLocationException.INVALID_REGISTRATION) { return; } - + // remove DA from list SLPUtils.removeValueFromAll(SLPCore.dAs, dAs[i]); SLPCore.dASPIs.remove(dAs[i]); @@ -207,21 +211,26 @@ } - private void updateService(final ServiceRegistrationMessage reg) throws ServiceLocationException{ + private void updateService(final ServiceRegistrationMessage reg) + throws ServiceLocationException { - // fresh flag is set and the message comes from the framework, considered safe for now... + // fresh flag is set and the message comes from the framework, + // considered safe for now... Service registeredService = null; - Service newService = new Service(reg); + final Service newService = new Service(reg); boolean found = false; - for (int i=0;i services = registeredServices.get(reg.getScopes()[i].toLowerCase().trim()); + for (int i = 0; i < reg.getScopes().length && !found; i++) { + final List services = registeredServices.get(reg + .getScopes()[i].toLowerCase().trim()); if (services == null) { continue; } - for (Iterator srvs = services.iterator(); srvs.hasNext();) { - Service service = srvs.next(); - if (service.getURL().toString().equals(reg.getServiceURL().toString())){ + for (final Iterator srvs = services.iterator(); srvs + .hasNext();) { + final Service service = srvs.next(); + if (service.getURL().toString().equals( + reg.getServiceURL().toString())) { registeredService = service; found = true; break; @@ -229,40 +238,50 @@ } } - if (registeredService==null){ - throw new ServiceLocationException(ServiceLocationException.INVALID_UPDATE,"No service to update..."); + if (registeredService == null) { + throw new ServiceLocationException( + ServiceLocationException.INVALID_UPDATE, + "No service to update..."); } - Dictionary registeredAttributes = registeredService.getAttributes(); - Dictionary newAttributes = SLPUtils.stringArrayToDict(reg.getAttrList()); - Enumeration keys = newAttributes.keys(); - while (keys.hasMoreElements()){ - String key = keys.nextElement(); + final Dictionary registeredAttributes = registeredService + .getAttributes(); + final Dictionary newAttributes = SLPUtils + .stringArrayToDict(reg.getAttrList()); + final Enumeration keys = newAttributes.keys(); + while (keys.hasMoreElements()) { + final String key = keys.nextElement(); registeredAttributes.remove(key); registeredAttributes.put(key, newAttributes.get(key)); } newService.setAttributes(registeredAttributes); - final String[] scopes = (String[]) registeredServices.keySet().toArray( + final String[] scopes = registeredServices.keySet().toArray( new String[registeredServices.size()]); for (int i = 0; i < scopes.length; i++) { - final List tmp = registeredServices.get(scopes[i].toLowerCase()); - final Service[] services = tmp.toArray(new Service[tmp - .size()]); + final List tmp = registeredServices.get(scopes[i] + .toLowerCase()); + final Service[] services = tmp.toArray(new Service[tmp.size()]); for (int j = 0; j < services.length; j++) { if (reg.getServiceURL().matches(services[j].getURL())) { - List daList = SLPCore.dAs.get(scopes[i].toLowerCase()); + final List daList = SLPCore.dAs.get(scopes[i] + .toLowerCase()); if (daList != null) { - for (String dA : daList) { + for (final String dA : daList) { - // if there is a local DA in the same framework, deregister the service directly from there - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(dA)){ - if (SLPCore.getDirectoryAgentDaemon()!=null){ - SLPCore.getDirectoryAgentDaemon().updateServiceEntry(reg); - } else { - // what? no daDaemon running?? must remove the ip from the list - SLPUtils.removeValueFromAll(SLPCore.dAs, dA); + // if there is a local DA in the same framework, + // deregister the service directly from there + if (SLPUtils.arrayToList(SLPCore.myIPs) + .contains(dA)) { + if (SLPCore.getDirectoryAgentDaemon() != null) { + SLPCore.getDirectoryAgentDaemon() + .updateServiceEntry(reg); + } else { + // what? no daDaemon running?? must remove + // the ip from the list + SLPUtils + .removeValueFromAll(SLPCore.dAs, dA); SLPCore.dASPIs.remove(dA); } @@ -271,23 +290,21 @@ // update all known remote DAs - if (SLPCore.CONFIG.getSecurityEnabled()) { - List spiList = (List) SLPCore.dASPIs - .get(dA); + final List spiList = SLPCore.dASPIs.get(dA); reg.sign(SLPUtils.listToStringArray(spiList)); } announceUpdatedService(dA, reg, newService); - - } + } } synchronized (registeredServices) { SLPUtils.removeValue(registeredServices, scopes[i], services[j]); - SLPUtils.addValue(registeredServices, scopes[i], newService); + SLPUtils.addValue(registeredServices, scopes[i], + newService); } break; } @@ -295,8 +312,6 @@ } } - - /** * deregister a service from the SLP framework. Deregisters from all DAs * within the scopes and from the local service cache. @@ -306,34 +321,43 @@ * @throws ServiceLocationException */ private void deregisterService(final ServiceDeregistrationMessage dereg) - throws ServiceLocationException { + throws ServiceLocationException { - final String[] scopes = (String[]) registeredServices.keySet().toArray( + final String[] scopes = registeredServices.keySet().toArray( new String[registeredServices.size()]); - List handledDAs = new ArrayList(); + final List handledDAs = new ArrayList(); for (int i = 0; i < scopes.length; i++) { - final List tmp = registeredServices.get(scopes[i].toLowerCase()); - final Service[] services = tmp.toArray(new Service[tmp - .size()]); + final List tmp = registeredServices.get(scopes[i] + .toLowerCase()); + final Service[] services = tmp.toArray(new Service[tmp.size()]); for (int j = 0; j < services.length; j++) { if (dereg.getServiceURL().matches(services[j].getURL())) { - List daList = SLPCore.dAs.get(scopes[i].toLowerCase()); + final List daList = SLPCore.dAs.get(scopes[i] + .toLowerCase()); if (daList != null) { - for (String dA : daList) { - if (handledDAs.contains(dA)){ + for (final String dA : daList) { + if (handledDAs.contains(dA)) { continue; } handledDAs.add(dA); try { - // if there is a local DA in the same framework, deregister the service directly from there - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(dA)){ - if (SLPCore.getDirectoryAgentDaemon()!=null){ - SLPCore.getDirectoryAgentDaemon().deregisterService(dereg); - } else { - // what? no daDaemon running?? must remove the ip from the list - SLPUtils.removeValueFromAll(SLPCore.dAs, (dereg).getServiceURL().toString()); - SLPCore.dASPIs.remove((dereg).getServiceURL().toString()); + // if there is a local DA in the same framework, + // deregister the service directly from there + if (SLPUtils.arrayToList(SLPCore.myIPs) + .contains(dA)) { + if (SLPCore.getDirectoryAgentDaemon() != null) { + SLPCore.getDirectoryAgentDaemon() + .deregisterService(dereg); + } else { + // what? no daDaemon running?? must + // remove the ip from the list + SLPUtils.removeValueFromAll( + SLPCore.dAs, dereg + .getServiceURL() + .toString()); + SLPCore.dASPIs.remove(dereg + .getServiceURL().toString()); } return; @@ -341,28 +365,29 @@ // deregister from all known remote DAs - ServiceDeregistrationMessage dadereg = new ServiceDeregistrationMessage(); + final ServiceDeregistrationMessage dadereg = new ServiceDeregistrationMessage(); dadereg.setLocale(dereg.getLocale()); dadereg.setMulticast(false); dadereg.setScopes(dereg.getScopes()); dadereg.setServiceURL(dereg.getServiceURL()); dadereg.setTags(dereg.getTags()); - InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(dA),SLPCore.SLP_PORT); + final InetSocketAddress address = new InetSocketAddress( + InetAddress.getByName(dA), + SLPCore.SLP_PORT); dadereg.setXid(SLPCore.nextXid()); if (SLPCore.CONFIG.getSecurityEnabled()) { - List spiList = (List) SLPCore.dASPIs - .get(dA); + final List spiList = SLPCore.dASPIs.get(dA); dadereg.sign(spiList); } - AbstractSLPReplyMessage reply = new ServiceReplyMessage(); - new AnnouncerThread(address,dadereg,reply); + final AbstractSLPReplyMessage reply = new ServiceReplyMessage(); + new AnnouncerThread(address, dadereg, reply); - } catch (UnknownHostException uhe) { + } catch (final UnknownHostException uhe) { throw new ServiceLocationException( ServiceLocationException.NETWORK_ERROR, uhe.getMessage()); - } + } } } synchronized (registeredServices) { @@ -386,13 +411,13 @@ * for various reasons like authentication failures etc. */ public AbstractSLPReplyMessage handleMessage(final AbstractSLPMessage msg) - throws ServiceLocationException { - short zero=0; + throws ServiceLocationException { + short zero = 0; if (msg == null) { return null; } - String via = msg.isTcp() ? " (tcp)" : " (udp)"; + final String via = msg.isTcp() ? " (tcp)" : " (udp)"; SLPCore.platform.logTraceMessage("RECEIVED (" + msg.getSource() + ":" + msg.getPort() + ") " + msg.toString() + via); @@ -401,38 +426,51 @@ switch (msg.getFuncID()) { case AbstractSLPMessage.SRVRQST: - if (msg.hasUnsupportedMandatoryExtensions()){ - ServiceReplyMessage servreply = new ServiceReplyMessage(); + if (msg.hasUnsupportedMandatoryExtensions()) { + final ServiceReplyMessage servreply = new ServiceReplyMessage(); servreply.setXid(msg.getXid()); servreply.setLocale(msg.getLocale()); - servreply.setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); + servreply + .setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); return servreply; } - ServiceRequestMessage req = (ServiceRequestMessage) msg; + final ServiceRequestMessage req = (ServiceRequestMessage) msg; - List results = new ArrayList(); - List extensions = new ArrayList(); - for (int i=0;i services = registeredServices.get(req.getScopes()[i].toLowerCase()); + final List results = new ArrayList(); + final List extensions = new ArrayList(); + for (int i = 0; i < req.getScopes().length; i++) { + final List services = registeredServices.get(req + .getScopes()[i].toLowerCase()); if (services == null) { continue; } - for (Service service : services) { - if (service.getURL().getServiceType().matches(req.getServiceType())) { - if (req.getPredicate() == null || req.getPredicate().equals("")) { + for (final Service service : services) { + if (service.getURL().getServiceType().matches( + req.getServiceType())) { + if (req.getPredicate() == null + || req.getPredicate().equals("")) { results.add(service.getURL()); - if (req.hasExtensionType(AbstractExtension.ATTRIBUTE_LIST_EXTENSION)){ - AttributeListExtension ale = new AttributeListExtension(service.getURL().toString(),SLPUtils.dictToString(service.getAttributesAsStringDict())); + if (req + .hasExtensionType(AbstractExtension.ATTRIBUTE_LIST_EXTENSION)) { + final AttributeListExtension ale = new AttributeListExtension( + service.getURL().toString(), + SLPUtils.dictToString(service + .getAttributesAsStringDict())); extensions.add(ale); } continue; } - Filter filter = SLPCore.platform.createFilter(req.getPredicate()); + final Filter filter = SLPCore.platform.createFilter(req + .getPredicate()); if (filter.match(service.getAttributes())) { results.add(service.getURL()); - if (req.hasExtensionType(AbstractExtension.ATTRIBUTE_LIST_EXTENSION)){ - AttributeListExtension ale = new AttributeListExtension(service.getURL().toString(),SLPUtils.dictToString(service.getAttributesAsStringDict())); + if (req + .hasExtensionType(AbstractExtension.ATTRIBUTE_LIST_EXTENSION)) { + final AttributeListExtension ale = new AttributeListExtension( + service.getURL().toString(), + SLPUtils.dictToString(service + .getAttributesAsStringDict())); extensions.add(ale); } } @@ -448,114 +486,117 @@ if (results.size() == 0 && req.isMulticast()) { return null; } - + reply = new ServiceReplyMessage(); - ServiceReplyMessage servreply = (ServiceReplyMessage) reply; + final ServiceReplyMessage servreply = (ServiceReplyMessage) reply; servreply.setXid(req.getXid()); servreply.setLocale(req.getLocale()); servreply.setErrorCode(zero); - servreply.setServiceURLs((ServiceURL[]) results.toArray(new ServiceURL[]{})); - - servreply.setExtensions(extensions.toArray(new AbstractExtension[]{})); - + servreply.setServiceURLs(results.toArray(new ServiceURL[] {})); + + servreply.setExtensions(extensions + .toArray(new AbstractExtension[] {})); + if (SLPCore.CONFIG.getSecurityEnabled()) { - servreply.sign(SLPUtils.arrayToString(req.getSPIs(),",")); + servreply.sign(SLPUtils.arrayToString(req.getSPIs(), ",")); } return servreply; case AbstractSLPMessage.ATTRRQST: - if (msg.hasUnsupportedMandatoryExtensions()){ - AttributeReplyMessage attreply = new AttributeReplyMessage(); + if (msg.hasUnsupportedMandatoryExtensions()) { + final AttributeReplyMessage attreply = new AttributeReplyMessage(); attreply.setXid(msg.getXid()); attreply.setLocale(msg.getLocale()); - attreply.setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); + attreply + .setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); return attreply; } - - - AttributeRequestMessage attreq = (AttributeRequestMessage) msg; + + final AttributeRequestMessage attreq = (AttributeRequestMessage) msg; // moved this out of the for loop for performance // the request can either be for a ServiceURL or a ServiceType Object reqService; boolean fullurl = false; - if ((attreq.getServiceUrl().getURL().indexOf("//") == -1) || (attreq.getServiceUrl().getHost().equals("nullnull"))) { + if (attreq.getServiceUrl().getURL().indexOf("//") == -1 + || attreq.getServiceUrl().getHost().equals("nullnull")) { reqService = attreq.getServiceUrl().getServiceType(); } else { fullurl = true; reqService = new ServiceURL(attreq.getServiceUrl().getURL(), 0); } - List attResult = new ArrayList(); - for (int i=0;i services = registeredServices.get(attreq.getScopes()[i].toLowerCase()); + final List attResult = new ArrayList(); + for (int i = 0; i < attreq.getScopes().length; i++) { + final List services = registeredServices.get(attreq + .getScopes()[i].toLowerCase()); if (services == null) { continue; } - // if spi is sent, the request must be for a full url and // the tag list has to be empty - if (attreq.getSPIs().length==0 - || (fullurl && attreq.getTags().length==0)) { - for (Service service:services) { + if (attreq.getSPIs().length == 0 || fullurl + && attreq.getTags().length == 0) { + for (final Service service : services) { if (service.getURL().matches(reqService)) { - attResult.addAll(SLPUtils.findMatches( - SLPUtils.arrayToList(attreq.getTags()), service.getAttributesAsStringDict())); + attResult.addAll(SLPUtils.findMatches(SLPUtils + .arrayToList(attreq.getTags()), service + .getAttributesAsStringDict())); } } } } - + String[] finalAtts = SLPUtils.listToStringArray(attResult); - if (!fullurl){ + if (!fullurl) { finalAtts = SLPUtils.mergeAttributes(attResult); } - + reply = new AttributeReplyMessage(); - AttributeReplyMessage attrep = (AttributeReplyMessage) reply; + final AttributeReplyMessage attrep = (AttributeReplyMessage) reply; attrep.setAttributes(finalAtts); attrep.setLocale(attreq.getLocale()); attrep.setXid(attreq.getXid()); attrep.setAuthBlocks(new AuthenticationBlock[0]); attrep.setErrorCode(zero); - if (attreq.getSPIs().length>0 && !fullurl){ - attrep.setErrorCode(ServiceLocationException.AUTHENTICATION_FAILED); + if (attreq.getSPIs().length > 0 && !fullurl) { + attrep + .setErrorCode(ServiceLocationException.AUTHENTICATION_FAILED); } - - if (SLPCore.CONFIG.getSecurityEnabled()) { - attrep.sign(SLPUtils.arrayToString(attreq.getSPIs(),",")); + attrep.sign(SLPUtils.arrayToString(attreq.getSPIs(), ",")); } return reply; case AbstractSLPMessage.SRVTYPERQST: - - if (msg.hasUnsupportedMandatoryExtensions()){ - ServiceTypeReplyMessage streply = new ServiceTypeReplyMessage(); + + if (msg.hasUnsupportedMandatoryExtensions()) { + final ServiceTypeReplyMessage streply = new ServiceTypeReplyMessage(); streply.setXid(msg.getXid()); streply.setLocale(msg.getLocale()); - streply.setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); + streply + .setErrorCode(ServiceLocationException.OPTION_NOT_UNDERSTOOD); return streply; } - - ServiceTypeRequestMessage streq = (ServiceTypeRequestMessage) msg; - ArrayList result = new ArrayList(); + final ServiceTypeRequestMessage streq = (ServiceTypeRequestMessage) msg; + + final ArrayList result = new ArrayList(); // iterate over scopes - for (int i=0;i0){ + + final ServiceDeregistrationMessage dereg = (ServiceDeregistrationMessage) msg; + // check if tags have been set to delete attributes only... + if (dereg.getTags().length > 0) { deleteAttributes(dereg); } else { deregisterService(dereg); @@ -641,7 +686,7 @@ return srvreply; case AbstractSLPMessage.SRVACK: - if (msg.hasUnsupportedMandatoryExtensions()){ + if (msg.hasUnsupportedMandatoryExtensions()) { return null; } final AbstractSLPReplyMessage rep = (AbstractSLPReplyMessage) msg; @@ -650,7 +695,8 @@ + " replied with error code " + rep.getErrorCode() + " (" + rep + ")"); } - SLPCore.addReply(msg, new InetSocketAddress(msg.getSource(),msg.getPort())); + SLPCore.addReply(msg, new InetSocketAddress(msg.getSource(), msg + .getPort())); return null; default: @@ -658,8 +704,9 @@ // exception during parsing throw new ServiceLocationException( ServiceLocationException.NOT_IMPLEMENTED, - "The message type " + AbstractSLPMessage.getType(msg.getFuncID()) - + " is not implemented"); + "The message type " + + AbstractSLPMessage.getType(msg.getFuncID()) + + " is not implemented"); } } @@ -673,76 +720,81 @@ */ public void newDaDiscovered(final DAAdvertisementMessage advert) { // so find all services within the scopes of the new DA: - for (int i=0;i> getRegisteredServices(){ + public Map> getRegisteredServices() { return registeredServices; } - - /** * Delete attributes from an existing regstration * * @param dereg - * The Deregistration Message asking for this to happen + * The Deregistration Message asking for this to happen * @throws ServiceLocationException */ - private void deleteAttributes(ServiceDeregistrationMessage dereg) throws ServiceLocationException{ + private void deleteAttributes(final ServiceDeregistrationMessage dereg) + throws ServiceLocationException { // check for security has been done by the handler! // message comes from the framework, considered safe for now... Service registeredService = null; boolean found = false; - for (int i=0;i services = registeredServices.get(dereg.getScopes()[i].toLowerCase().trim()); + for (int i = 0; i < dereg.getScopes().length && !found; i++) { + final List services = registeredServices.get(dereg + .getScopes()[i].toLowerCase().trim()); if (services == null) { continue; } - for (Iterator srvs = services.iterator(); srvs.hasNext();) { - Service service = srvs.next(); - if (service.getURL().toString().equals(dereg.getServiceURL().toString())){ + for (final Iterator srvs = services.iterator(); srvs + .hasNext();) { + final Service service = srvs.next(); + if (service.getURL().toString().equals( + dereg.getServiceURL().toString())) { registeredService = service; found = true; break; @@ -750,46 +802,55 @@ } } - if (registeredService==null){ - throw new ServiceLocationException(ServiceLocationException.INVALID_UPDATE,"No service to update..."); + if (registeredService == null) { + throw new ServiceLocationException( + ServiceLocationException.INVALID_UPDATE, + "No service to update..."); } - Dictionary registeredAttributes = registeredService.getAttributes(); - for (String t: dereg.getTags()){ + final Dictionary registeredAttributes = registeredService + .getAttributes(); + for (final String t : dereg.getTags()) { registeredAttributes.remove(t); } // now propagate to DAs - final String[] scopes = (String[]) registeredServices.keySet().toArray( + final String[] scopes = registeredServices.keySet().toArray( new String[registeredServices.size()]); for (int i = 0; i < scopes.length; i++) { - final List tmp = registeredServices.get(scopes[i].toLowerCase()); - final Service[] services = tmp.toArray(new Service[tmp - .size()]); + final List tmp = registeredServices.get(scopes[i] + .toLowerCase()); + final Service[] services = tmp.toArray(new Service[tmp.size()]); for (int j = 0; j < services.length; j++) { if (dereg.getServiceURL().matches(services[j].getURL())) { - List daList = SLPCore.dAs.get(scopes[i].toLowerCase()); + final List daList = SLPCore.dAs.get(scopes[i] + .toLowerCase()); if (daList != null) { - for (String dA : daList) { + for (final String dA : daList) { - // if there is a local DA in the same framework, delete the attribute directly from there - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(dA)){ - if (SLPCore.getDirectoryAgentDaemon()!=null){ - SLPCore.getDirectoryAgentDaemon().deregisterService(dereg); - } else { - // what? no daDaemon running?? must remove the ip from the list - SLPUtils.removeValueFromAll(SLPCore.dAs, dA); + // if there is a local DA in the same framework, + // delete the attribute directly from there + if (SLPUtils.arrayToList(SLPCore.myIPs) + .contains(dA)) { + if (SLPCore.getDirectoryAgentDaemon() != null) { + SLPCore.getDirectoryAgentDaemon() + .deregisterService(dereg); + } else { + // what? no daDaemon running?? must remove + // the ip from the list + SLPUtils + .removeValueFromAll(SLPCore.dAs, dA); SLPCore.dASPIs.remove(dA); } return; } -// deregister from all known remote DAs + // deregister from all known remote DAs - ServiceDeregistrationMessage dadereg = new ServiceDeregistrationMessage(); + final ServiceDeregistrationMessage dadereg = new ServiceDeregistrationMessage(); dadereg.setLocale(dereg.getLocale()); dadereg.setMulticast(false); dadereg.setScopes(dereg.getScopes()); @@ -797,35 +858,29 @@ dadereg.setTags(dereg.getTags()); try { - InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(dA),SLPCore.SLP_PORT); + final InetSocketAddress address = new InetSocketAddress( + InetAddress.getByName(dA), + SLPCore.SLP_PORT); dadereg.setXid(SLPCore.nextXid()); - AbstractSLPReplyMessage reply = new ServiceReplyMessage(); - new AnnouncerThread(address,dadereg,reply); - } catch (UnknownHostException uhe) { + final AbstractSLPReplyMessage reply = new ServiceReplyMessage(); + new AnnouncerThread(address, dadereg, reply); + } catch (final UnknownHostException uhe) { throw new ServiceLocationException( ServiceLocationException.NETWORK_ERROR, uhe.getMessage()); - } - - - - + } - } + } } - // now that we have found a service that matches the one in dereg, we can move on to the next scope + // now that we have found a service that matches the one in + // dereg, we can move on to the next scope break; } } } } - - - - - /** * register a service with a DA. * @@ -837,10 +892,12 @@ * in case of network errors. */ private void announceService(final String dAAddress, - final ServiceRegistrationMessage reg) throws ServiceLocationException { + final ServiceRegistrationMessage reg) + throws ServiceLocationException { try { - InetSocketAddress addr = new InetSocketAddress(InetAddress.getByName(dAAddress),SLPCore.SLP_PORT); - ServiceRegistrationMessage dareg = new ServiceRegistrationMessage(); + final InetSocketAddress addr = new InetSocketAddress(InetAddress + .getByName(dAAddress), SLPCore.SLP_PORT); + final ServiceRegistrationMessage dareg = new ServiceRegistrationMessage(); dareg.setAttrList(reg.getAttrList()); dareg.setAuthBlocks(reg.getAuthBlocks()); dareg.setLocale(reg.getLocale()); @@ -851,18 +908,17 @@ dareg.setXid(SLPCore.nextXid()); dareg.setFresh(reg.isFresh()); if (SLPCore.CONFIG.getSecurityEnabled()) { - List spiList = SLPCore.dASPIs.get(dAAddress); - dareg.sign((String[]) spiList.toArray(new String[]{})); + final List spiList = SLPCore.dASPIs.get(dAAddress); + dareg.sign(spiList.toArray(new String[] {})); } - new AnnouncerThread(addr,dareg,null); + new AnnouncerThread(addr, dareg, null); - } catch (UnknownHostException e) { - SLPCore.platform.logError("Service announcement to " - + dAAddress + " failed. ", e.fillInStackTrace()); + } catch (final UnknownHostException e) { + SLPCore.platform.logError("Service announcement to " + dAAddress + + " failed. ", e.fillInStackTrace()); } } - /** * updatea service with a DA. * @@ -874,10 +930,12 @@ * in case of network errors. */ private void announceUpdatedService(final String dAAddress, - final ServiceRegistrationMessage reg, final Service service) throws ServiceLocationException { + final ServiceRegistrationMessage reg, final Service service) + throws ServiceLocationException { try { - InetSocketAddress addr = new InetSocketAddress(InetAddress.getByName(dAAddress),SLPCore.SLP_PORT); - ServiceRegistrationMessage dareg = new ServiceRegistrationMessage(); + final InetSocketAddress addr = new InetSocketAddress(InetAddress + .getByName(dAAddress), SLPCore.SLP_PORT); + final ServiceRegistrationMessage dareg = new ServiceRegistrationMessage(); dareg.setAttrList(reg.getAttrList()); dareg.setAuthBlocks(reg.getAuthBlocks()); dareg.setLocale(reg.getLocale()); @@ -888,23 +946,16 @@ dareg.setXid(SLPCore.nextXid()); dareg.setFresh(reg.isFresh()); if (SLPCore.CONFIG.getSecurityEnabled()) { - List spiList = SLPCore.dASPIs.get(dAAddress); - dareg.sign((String[]) spiList.toArray(new String[]{})); + final List spiList = SLPCore.dASPIs.get(dAAddress); + dareg.sign(spiList.toArray(new String[] {})); } - new UpdaterThread(addr,dareg,service); + new UpdaterThread(addr, dareg, service); - } catch (UnknownHostException e) { - SLPCore.platform.logError("Service announcement to " - + dAAddress + " failed. ", e.fillInStackTrace()); + } catch (final UnknownHostException e) { + SLPCore.platform.logError("Service announcement to " + dAAddress + + " failed. ", e.fillInStackTrace()); } } - - - - - - - /** * service disposal thread. Removes services from the local registry when @@ -923,6 +974,7 @@ /** * thread's main loop. */ + @Override public void run() { try { while (running) { @@ -930,33 +982,32 @@ if (serviceDisposalQueue.isEmpty()) { // nothing to do, sleep until something arrives SLPCore.platform - .logDebug("ServiceDisposalThread sleeping ..."); + .logDebug("ServiceDisposalThread sleeping ..."); serviceDisposalQueue.wait(); } else { // we have work, do everything that is due Long nextActivity; while (!serviceDisposalQueue.isEmpty() - && (nextActivity = ((Long) serviceDisposalQueue - .firstKey())).longValue() <= System + && (nextActivity = serviceDisposalQueue + .firstKey()).longValue() <= System .currentTimeMillis()) { - ServiceURL service = (ServiceURL) serviceDisposalQueue - .get(nextActivity); + final ServiceURL service = serviceDisposalQueue + .get(nextActivity); - ServiceDeregistrationMessage dereg = new ServiceDeregistrationMessage(); + final ServiceDeregistrationMessage dereg = new ServiceDeregistrationMessage(); dereg.setServiceURL(service); dereg.setLocale(SLPCore.DEFAULT_LOCALE); try { deregisterService(dereg); - } catch (ServiceLocationException sle) { - SLPCore.platform.logError(sle - .getMessage(), sle - .fillInStackTrace()); + } catch (final ServiceLocationException sle) { + SLPCore.platform.logError(sle.getMessage(), + sle.fillInStackTrace()); } SLPCore.platform - .logTraceReg("disposed service " - + service); + .logTraceReg("disposed service " + + service); serviceDisposalQueue.remove(nextActivity); } if (!serviceDisposalQueue.isEmpty()) { @@ -964,44 +1015,40 @@ * there are some activities in the future, * sleep until the first activity becomes due */ - nextActivity = ((Long) serviceDisposalQueue - .firstKey()); - long waitTime = nextActivity.longValue() - - System.currentTimeMillis(); + nextActivity = serviceDisposalQueue.firstKey(); + final long waitTime = nextActivity.longValue() + - System.currentTimeMillis(); if (waitTime > 0) { - SLPCore.platform - .logDebug("sleeping for " - + waitTime / 1000 - + " seconds."); + SLPCore.platform.logDebug("sleeping for " + + waitTime / 1000 + " seconds."); serviceDisposalQueue.wait(waitTime); } } } } } - } catch (InterruptedException ie) { + } catch (final InterruptedException ie) { // let the thread stop. } } } - - /** * service anouncer thread. */ private final class AnnouncerThread extends Thread { - - private InetSocketAddress addr; - private AbstractSLPMessage msg; + private final InetSocketAddress addr; + private final AbstractSLPMessage msg; private AbstractSLPReplyMessage replyMsg; - private AnnouncerThread(InetSocketAddress sock,final AbstractSLPMessage message, AbstractSLPReplyMessage reply) { - addr=sock; - msg=message; - if (reply!=null){ - replyMsg=reply; + private AnnouncerThread(final InetSocketAddress sock, + final AbstractSLPMessage message, + final AbstractSLPReplyMessage reply) { + addr = sock; + msg = message; + if (reply != null) { + replyMsg = reply; } else { replyMsg = new ServiceReplyMessage(); } @@ -1011,96 +1058,114 @@ /** * thread's main loop. */ + @Override public void run() { - try{ - AbstractSLPReplyMessage rm = SLPCore.sendReliableUnicastMessage(msg, addr, true); - if (rm!=null){ + try { + final AbstractSLPReplyMessage rm = SLPCore + .sendReliableUnicastMessage(msg, addr, true); + if (rm != null) { replyMsg.setErrorCode(rm.getErrorCode()); } else { - //remove DA from list - SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress().getHostAddress()); - SLPCore.dASPIs.remove( addr.getAddress().getHostAddress()); + // remove DA from list + SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress() + .getHostAddress()); + SLPCore.dASPIs.remove(addr.getAddress().getHostAddress()); } - if (msg instanceof ServiceRegistrationMessage){ + if (msg instanceof ServiceRegistrationMessage) { SLPCore.platform.logTraceReg("ANNOUNCED " - + ((ServiceRegistrationMessage)msg).getServiceURL() + " to " + addr.getAddress().getHostAddress()); - } else if (msg instanceof ServiceDeregistrationMessage){ + + ((ServiceRegistrationMessage) msg) + .getServiceURL() + " to " + + addr.getAddress().getHostAddress()); + } else if (msg instanceof ServiceDeregistrationMessage) { SLPCore.platform.logTraceReg("DEREGISTERED " - + ((ServiceDeregistrationMessage)msg).getServiceURL() + " from " + addr.getAddress().getHostAddress()); - } + + ((ServiceDeregistrationMessage) msg) + .getServiceURL() + " from " + + addr.getAddress().getHostAddress()); + } - } catch (ServiceLocationException sle){ - if (msg instanceof ServiceRegistrationMessage){ + } catch (final ServiceLocationException sle) { + if (msg instanceof ServiceRegistrationMessage) { // remove DA from list - SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress().getHostAddress()); - SLPCore.dASPIs.remove( addr.getAddress().getHostAddress()); - SLPCore.platform.logError(sle.getMessage(), sle.fillInStackTrace()); - } + SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress() + .getHostAddress()); + SLPCore.dASPIs.remove(addr.getAddress().getHostAddress()); + SLPCore.platform.logError(sle.getMessage(), sle + .fillInStackTrace()); + } } } } - /** * service anouncer thread. */ private final class UpdaterThread extends Thread { - - private InetSocketAddress addr; - private ServiceRegistrationMessage msg; - private Service srv; - - private UpdaterThread(InetSocketAddress sock, ServiceRegistrationMessage message,final Service service) { - addr=sock; - msg=message; - srv=service; + private final InetSocketAddress addr; + private final ServiceRegistrationMessage msg; + private final Service srv; + + private UpdaterThread(final InetSocketAddress sock, + final ServiceRegistrationMessage message, final Service service) { + addr = sock; + msg = message; + srv = service; start(); } /** * thread's main loop. */ + @Override public void run() { - try{ - AbstractSLPReplyMessage rm = SLPCore.sendReliableUnicastMessage(msg, addr, true); - if (rm!=null){ - if (rm.getErrorCode()!=0){ - //DA may not udnerstand updates... - msg.setAttrList(SLPUtils.listToStringArray(SLPUtils.dictToAttrList(srv.getAttributes()))); + try { + AbstractSLPReplyMessage rm = SLPCore + .sendReliableUnicastMessage(msg, addr, true); + if (rm != null) { + if (rm.getErrorCode() != 0) { + // DA may not udnerstand updates... + msg.setAttrList(SLPUtils.listToStringArray(SLPUtils + .dictToAttrList(srv.getAttributes()))); msg.setAuthBlocks(srv.getAuthBlocks()); msg.setXid(SLPCore.nextXid()); msg.setFresh(true); if (SLPCore.CONFIG.getSecurityEnabled()) { - List spiList = SLPCore.dASPIs.get(addr); - msg.sign((String[]) spiList.toArray(new String[]{})); + final List spiList = SLPCore.dASPIs + .get(addr); + msg.sign(spiList.toArray(new String[] {})); } - rm = SLPCore.sendReliableUnicastMessage(msg, addr, true); - if (rm==null){ -// remove DA from list - SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress().getHostAddress()); - SLPCore.dASPIs.remove( addr.getAddress().getHostAddress()); + rm = SLPCore + .sendReliableUnicastMessage(msg, addr, true); + if (rm == null) { + // remove DA from list + SLPUtils.removeValueFromAll(SLPCore.dAs, addr + .getAddress().getHostAddress()); + SLPCore.dASPIs.remove(addr.getAddress() + .getHostAddress()); } } } else { - //remove DA from list - SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress().getHostAddress()); - SLPCore.dASPIs.remove( addr.getAddress().getHostAddress()); + // remove DA from list + SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress() + .getHostAddress()); + SLPCore.dASPIs.remove(addr.getAddress().getHostAddress()); } SLPCore.platform.logTraceReg("ANNOUNCED " - + ((ServiceRegistrationMessage)msg).getServiceURL() + " to " + addr.getAddress().getHostAddress()); - + + (msg).getServiceURL() + " to " + + addr.getAddress().getHostAddress()); - } catch (ServiceLocationException sle){ + } catch (final ServiceLocationException sle) { // remove DA from list - SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress().getHostAddress()); - SLPCore.dASPIs.remove( addr.getAddress().getHostAddress()); - SLPCore.platform.logError(sle.getMessage(), sle.fillInStackTrace()); + SLPUtils.removeValueFromAll(SLPCore.dAs, addr.getAddress() + .getHostAddress()); + SLPCore.dASPIs.remove(addr.getAddress().getHostAddress()); + SLPCore.platform.logError(sle.getMessage(), sle + .fillInStackTrace()); } } Modified: directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPHandler.java URL: http://svn.apache.org/viewvc/directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPHandler.java?rev=782980&r1=782979&r2=782980&view=diff ============================================================================== --- directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPHandler.java (original) +++ directory/sandbox/slp/src/main/java/org/apache/directory/slp/impl/SLPHandler.java Tue Jun 9 12:50:45 2009 @@ -19,7 +19,6 @@ */ package org.apache.directory.slp.impl; - import java.net.InetSocketAddress; import org.apache.directory.slp.ServiceLocationException; @@ -34,399 +33,506 @@ import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; - /** - * The IoHandler processing incoming SLP messages and dispatching them to the correct agent for processing + * The IoHandler processing incoming SLP messages and dispatching them to the + * correct agent for processing * * @author Lorenz Breu - * + * */ -public class SLPHandler extends IoHandlerAdapter{ - - - public SLPHandler(){ +public class SLPHandler extends IoHandlerAdapter { + + public SLPHandler() { } - + @Override - public void exceptionCaught(IoSession session, Throwable cause) - throws Exception { - cause.printStackTrace(); - session.close(false); - } - - @Override - public void messageReceived(IoSession session, Object message) throws ServiceLocationException { - - if (message == null || !(message instanceof AbstractSLPMessage)) { - return; + public void exceptionCaught(final IoSession session, final Throwable cause) + throws Exception { + cause.printStackTrace(); + session.close(false); } - AbstractSLPMessage msg = (AbstractSLPMessage) message; - - - - InetSocketAddress address = (InetSocketAddress) session.getRemoteAddress(); - SLPCore.platform.logDebug("RECEIVED (" + msg.getSource() + ":" - + msg.getPort() + ") " + msg.toString()); - - switch (msg.getFuncID()) { - case AbstractSLPMessage.DAADVERT: - // drop message, if noDADiscovery is set - if (SLPCore.noDiscovery) { - if (SLPCore.discoveryException.equals(address.getAddress().getHostAddress())){ - SLPCore.addReply(msg, address); - } else { - SLPCore.platform.logTraceDrop("DROPPED (" + address.getAddress() + ":" - + address.getPort() + ") " + msg.toString() - + "(reason: noDADiscovery is set"); - } - session.close(false); - return; - } - DAAdvertisementMessage advert = (DAAdvertisementMessage) message; + @Override + public void messageReceived(final IoSession session, final Object message) + throws ServiceLocationException { - if (advert.getErrorCode() != 0) { - SLPCore.platform.logTraceDrop("DROPPED DAADvertisement (" + address.getAddress() + ":" - + address.getPort() + ") " + advert.toString() - + "(reason: " + advert.getErrorCode() + " != 0"); - session.close(false); + if (message == null || !(message instanceof AbstractSLPMessage)) { return; } - // this should also prevent reverse-lookup each time a DA is contacted - if (advert.getServiceURL().getHost() != address.getAddress().getHostAddress()) { - advert.getServiceURL().setHost(address.getAddress().getHostAddress()); - } + final AbstractSLPMessage msg = (AbstractSLPMessage) message; - // statelessBootTimestamp = 0 means DA is going down - if (advert.getStatelessBootTimestamp() == 0) { - for (int i=0;iSLPCore.CONFIG.getMTU()){ - SLPCore.sendMessageTCP(reply, new InetSocketAddress(msg.getSource(),SLPCore.SLP_PORT), false); - session.close(false); - return; - } - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + // if the message comes from a different host and security is + // enabled, verify the message. + // if verification fails, drop the message and throw an exception + if (!msg.getSource().equals("127.0.0.1") + && SLPCore.CONFIG.getSecurityEnabled()) { + if (!((AttributeReplyMessage) msg).verify()) { + throw new ServiceLocationException( + ServiceLocationException.AUTHENTICATION_FAILED, + "Failed to verify AttributeReply"); } } + SLPCore.addReply(msg, address); session.close(false); return; - } - - - // else if we have a daemon instance, delegate the - // message to the daemon. - if (SLPCore.getDaemon() != null) { - AbstractSLPMessage reply = SLPCore.getDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - if (reply.getSize()>SLPCore.CONFIG.getMTU()){ - SLPCore.sendMessageTCP(reply, new InetSocketAddress(msg.getSource(),SLPCore.SLP_PORT), false); - session.close(false); - return; - } - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + case AbstractSLPMessage.SRVRPLY: + if (msg.hasUnsupportedMandatoryExtensions()) { + return; + } + // if the message comes from a different host and security is + // enabled, verify the message. + // if verification fails, drop the message and throw an exception + if (!msg.getSource().equals("127.0.0.1") + && SLPCore.CONFIG.getSecurityEnabled()) { + if (!((ServiceReplyMessage) msg).verify()) { + throw new ServiceLocationException( + ServiceLocationException.AUTHENTICATION_FAILED, + "Failed to verify ServiceReply"); } } - + SLPCore.addReply(msg, address); session.close(false); return; - } else { - SLPCore.platform.logDebug("Request recieved (" - + address.getAddress().getHostAddress() + ":" + address.getPort() + ") " - + msg.toString() - + " but no SLPDaemon to handle the message present"); + case AbstractSLPMessage.SRVTYPERPLY: + if (msg.hasUnsupportedMandatoryExtensions()) { + return; + } + // add the reply to the queue if it has been verified... + SLPCore.addReply(msg, address); session.close(false); return; - } - - case AbstractSLPMessage.SRVREG: - - if (SLPCore.CONFIG.getSecurityEnabled()){ - if (!((ServiceRegistrationMessage)msg).verify()){ - ServiceAcknowledgementMessage ack = new ServiceAcknowledgementMessage(); - ack.setXid(msg.getXid()); - ack.setErrorCode(ServiceLocationException.AUTHENTICATION_FAILED); - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(ack, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - session.write(ack); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + ack + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + // request messages + case AbstractSLPMessage.SRVRQST: + case AbstractSLPMessage.ATTRRQST: + case AbstractSLPMessage.SRVTYPERQST: + // silently drop messages where this peer is in the previous + // responder list + for (int i = 0; i < SLPCore.myIPs.length; i++) { + if (((AbstractSLPRequestMessage) message) + .knowsResponder(SLPCore.myIPs[i])) { + SLPCore.platform.logTraceDrop("DROPPED (" + + address.getAddress() + ":" + address.getPort() + + ") " + msg.toString() + "(udp multicast)"); + session.close(false); + return; } } - } - - // if the reg comes from within the framework, pass it to the SA part... - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(msg.getSource())){ - if (SLPCore.getDaemon()!=null){ - AbstractSLPMessage reply = SLPCore.getDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); + + // if a DA is running, all requests should be passed to it + if (SLPCore.getDirectoryAgentDaemon() != null) { + final AbstractSLPMessage reply = SLPCore + .getDirectoryAgentDaemon().handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); } else { + if (reply.getSize() > SLPCore.CONFIG.getMTU()) { + SLPCore.sendMessageTCP(reply, + new InetSocketAddress(msg.getSource(), + SLPCore.SLP_PORT), false); + session.close(false); + return; + } session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); } } session.close(false); return; } - } - // this reg comes from outside - if (SLPCore.getDirectoryAgentDaemon() != null) { - AbstractSLPMessage reply = SLPCore.getDirectoryAgentDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + + // else if we have a daemon instance, delegate the + // message to the daemon. + if (SLPCore.getDaemon() != null) { + final AbstractSLPMessage reply = SLPCore.getDaemon() + .handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + if (reply.getSize() > SLPCore.CONFIG.getMTU()) { + SLPCore.sendMessageTCP(reply, + new InetSocketAddress(msg.getSource(), + SLPCore.SLP_PORT), false); + session.close(false); + return; + } + session.write(reply); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); + } } + + session.close(false); + return; + } else { + SLPCore.platform.logDebug("Request recieved (" + + address.getAddress().getHostAddress() + ":" + + address.getPort() + ") " + msg.toString() + + " but no SLPDaemon to handle the message present"); + session.close(false); + return; } - session.close(false); - return; - } - - case AbstractSLPMessage.SRVDEREG: - // if the reg comes from within the framework, pass it to the SA part... - if (SLPUtils.arrayToList(SLPCore.myIPs).contains(msg.getSource())){ - if (SLPCore.getDaemon()!=null){ - AbstractSLPMessage reply = SLPCore.getDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); + + case AbstractSLPMessage.SRVREG: + + if (SLPCore.CONFIG.getSecurityEnabled()) { + if (!((ServiceRegistrationMessage) msg).verify()) { + final ServiceAcknowledgementMessage ack = new ServiceAcknowledgementMessage(); + ack.setXid(msg.getXid()); + ack + .setErrorCode(ServiceLocationException.AUTHENTICATION_FAILED); + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(ack, new InetSocketAddress( + msg.getSource(), msg.getPort()), false); + } else { + session.write(ack); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + ack + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); + } + } + } + + // if the reg comes from within the framework, pass it to the SA + // part... + if (SLPUtils.arrayToList(SLPCore.myIPs).contains(msg.getSource())) { + if (SLPCore.getDaemon() != null) { + final AbstractSLPMessage reply = SLPCore.getDaemon() + .handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + session.write(reply); + SLPCore.platform + .logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()) + .getPort() + ")"); + } + } + session.close(false); + return; + } + } + // this reg comes from outside + if (SLPCore.getDirectoryAgentDaemon() != null) { + final AbstractSLPMessage reply = SLPCore + .getDirectoryAgentDaemon().handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); } else { session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); } } session.close(false); return; } - } - // this reg comes from outside - if (SLPCore.getDirectoryAgentDaemon() != null) { - AbstractSLPMessage reply = SLPCore.getDirectoryAgentDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + + case AbstractSLPMessage.SRVDEREG: + // if the reg comes from within the framework, pass it to the SA + // part... + if (SLPUtils.arrayToList(SLPCore.myIPs).contains(msg.getSource())) { + if (SLPCore.getDaemon() != null) { + final AbstractSLPMessage reply = SLPCore.getDaemon() + .handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + session.write(reply); + SLPCore.platform + .logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()) + .getPort() + ")"); + } + } + session.close(false); + return; } } - session.close(false); - return; - } - - case AbstractSLPMessage.SRVACK: - if (msg.hasUnsupportedMandatoryExtensions()){ - return; - } - - SLPCore.addReply(msg, new InetSocketAddress(msg.getSource(),msg.getPort())); - return; - - - default: - // if we have a DA running, pass messages (in this case reg and dereg) to it. - // the da will relegate reg and deregs coming from the framework on to the SA if present - if (SLPCore.getDirectoryAgentDaemon() != null) { - AbstractSLPMessage reply = SLPCore.getDirectoryAgentDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + // this reg comes from outside + if (SLPCore.getDirectoryAgentDaemon() != null) { + final AbstractSLPMessage reply = SLPCore + .getDirectoryAgentDaemon().handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + session.write(reply); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); + } } + session.close(false); + return; } - session.close(false); + + case AbstractSLPMessage.SRVACK: + if (msg.hasUnsupportedMandatoryExtensions()) { + return; + } + + SLPCore.addReply(msg, new InetSocketAddress(msg.getSource(), msg + .getPort())); return; - } - - - // if we have a daemon instance but no DA, delegate all other - // messages to the daemon. - if (SLPCore.getDaemon() != null) { - AbstractSLPMessage reply = SLPCore.getDaemon().handleMessage(msg); - if (reply!=null){ - if (msg.isMulticast()){ - SLPCore.sendUnicastMessage(reply, new InetSocketAddress(msg.getSource(),msg.getPort()), false); - } else { - session.write(reply); - SLPCore.platform.logTraceMessage("SENT (" + msg.getSource() + ":" + msg.getPort() + ") " - + reply + " (via udp port " +((InetSocketAddress) session.getLocalAddress()).getPort() - + ")"); + + default: + // if we have a DA running, pass messages (in this case reg and + // dereg) to it. + // the da will relegate reg and deregs coming from the framework on + // to the SA if present + if (SLPCore.getDirectoryAgentDaemon() != null) { + final AbstractSLPMessage reply = SLPCore + .getDirectoryAgentDaemon().handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + session.write(reply); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); + } } + session.close(false); + return; + } + + // if we have a daemon instance but no DA, delegate all other + // messages to the daemon. + if (SLPCore.getDaemon() != null) { + final AbstractSLPMessage reply = SLPCore.getDaemon() + .handleMessage(msg); + if (reply != null) { + if (msg.isMulticast()) { + SLPCore.sendUnicastMessage(reply, + new InetSocketAddress(msg.getSource(), msg + .getPort()), false); + } else { + session.write(reply); + SLPCore.platform.logTraceMessage("SENT (" + + msg.getSource() + + ":" + + msg.getPort() + + ") " + + reply + + " (via udp port " + + ((InetSocketAddress) session + .getLocalAddress()).getPort() + ")"); + } + } + + session.close(false); + return; + } else { + SLPCore.platform.logDebug("A message recieved (" + + address.getAddress() + ":" + address.getPort() + ") " + + msg.toString() + + " but no SLPDaemon to handle the message present"); + session.close(false); + return; } - - session.close(false); - return; - } else { - SLPCore.platform.logDebug("A message recieved (" - + address.getAddress() + ":" + address.getPort() + ") " - + msg.toString() - + " but no SLPDaemon to handle the message present"); - session.close(false); - return; } + } -} + @Override + public void sessionClosed(final IoSession session) throws Exception { - @Override - public void sessionClosed(IoSession session) throws Exception { - - } - - @Override - public void sessionCreated(IoSession session) throws Exception { - - - } - - @Override - public void sessionIdle(IoSession session, IdleStatus status) - throws Exception { - - } - - @Override - public void sessionOpened(IoSession session) throws Exception { - - } -} + } + + @Override + public void sessionCreated(final IoSession session) throws Exception { + } + @Override + public void sessionIdle(final IoSession session, final IdleStatus status) + throws Exception { + + } + @Override + public void sessionOpened(final IoSession session) throws Exception { + + } +}