Project

General

Profile

Actions

Bug #2750

closed

When using regexp in nodes search, bad error arise

Added by Nicolas CHARLES over 11 years ago. Updated over 11 years ago.

Status:
Released
Priority:
N/A
Category:
Web - Nodes & inventories
Target version:
Severity:
UX impact:
User visibility:
Effort required:
Priority:
Name check:
Fix check:
Regression:

Description

Doing a search based on the hostname, with a regexp \.*.normation\.com fails with this error

[2012-08-01 11:40:27] ERROR net.liftweb.http.LiftRules - Exception being returned to browser when processing /ajax_request/F1339579337873LQCHTS/: Message: LDAPException(resultCode=87 (filter error), errorMessage='Invalid hex character '.' encountered at position 16.')
com.unboundid.ldap.sdk.Filter.readEscapedHexString(Filter.java:1859)
com.unboundid.ldap.sdk.Filter.create(Filter.java:1628)
com.unboundid.ldap.sdk.Filter.create(Filter.java:1070)
com.normation.ldap.sdk.BuildFilter$.apply(BuildFilter.scala:247)
com.normation.rudder.domain.queries.TStringComparator$class.eqOrSub(CmdbQuery.scala:166)
com.normation.rudder.domain.queries.StringComparator$.eqOrSub(CmdbQuery.scala:170)
com.normation.rudder.domain.queries.StringComparator$.buildFilter(CmdbQuery.scala:175)
com.normation.rudder.domain.queries.Criterion.buildFilter(CmdbQuery.scala:454)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor$$anonfun$23$$anonfun$apply$26.apply(LdapQueryProcessor.scala:537)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor$$anonfun$23$$anonfun$apply$26.apply(LdapQueryProcessor.scala:534)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:60)
scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
scala.collection.mutable.ArrayBuffer.map(ArrayBuffer.scala:47)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor$$anonfun$23.apply(LdapQueryProcessor.scala:534)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor$$anonfun$23.apply(LdapQueryProcessor.scala:533)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.immutable.Map$Map1.foreach(Map.scala:119)
scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
scala.collection.immutable.Map$Map1.map(Map.scala:107)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor.normalize(LdapQueryProcessor.scala:533)
com.normation.rudder.services.queries.InternalLDAPQueryProcessor.internalQueryProcessor(LdapQueryProcessor.scala:237)
com.normation.rudder.services.queries.AccepetedNodesLDAPQueryProcessor.queryAndChekNodeId(LdapQueryProcessor.scala:134)
com.normation.rudder.services.queries.AccepetedNodesLDAPQueryProcessor.process(LdapQueryProcessor.scala:151)
com.normation.rudder.web.components.SearchNodeComponent.processForm$1(SearchNodeComponent.scala:180)
com.normation.rudder.web.components.SearchNodeComponent$$anonfun$displayQuery$1$5.apply(SearchNodeComponent.scala:255)
com.normation.rudder.web.components.SearchNodeComponent$$anonfun$displayQuery$1$5.apply(SearchNodeComponent.scala:255)
net.liftweb.http.S$NFuncHolder$$anonfun$apply$5.apply(S.scala:190)
net.liftweb.http.S$NFuncHolder$$anonfun$apply$5.apply(S.scala:190)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
scala.collection.immutable.List.foreach(List.scala:76)
scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
scala.collection.immutable.List.map(List.scala:76)
net.liftweb.http.S$NFuncHolder.apply(S.scala:190)
net.liftweb.http.S$ProxyFuncHolder.apply(S.scala:115)
net.liftweb.http.LiftSession$$anon$3.net$liftweb$http$LiftSession$$anon$$super$apply(LiftSession.scala:1456)
net.liftweb.http.LiftSession$$anon$3$$anonfun$apply$67$$anonfun$apply$68$$anonfun$apply$69.apply(LiftSession.scala:1456)
net.liftweb.util.AnyVarTrait$class.doWith(AnyVar.scala:233)
net.liftweb.util.AnyVar.doWith(AnyVar.scala:89)
net.liftweb.http.LiftSession$$anon$3$$anonfun$apply$67$$anonfun$apply$68.apply(LiftSession.scala:1455)
net.liftweb.util.AnyVarTrait$class.doWith(AnyVar.scala:233)
net.liftweb.util.AnyVar.doWith(AnyVar.scala:89)
net.liftweb.http.LiftSession$$anon$3$$anonfun$apply$67.apply(LiftSession.scala:1454)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1$$anonfun$apply$8$$anonfun$apply$9$$anonfun$apply$10$$anonfun$apply$11.apply(Vars.scala:554)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1$$anonfun$apply$8$$anonfun$apply$9$$anonfun$apply$10.apply(Vars.scala:553)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1$$anonfun$apply$8$$anonfun$apply$9.apply(Vars.scala:552)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1$$anonfun$apply$8.apply(Vars.scala:551)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1.apply(Vars.scala:550)
net.liftweb.http.CoreRequestVarHandler$$anonfun$generateSnapshotRestorer$1.apply(Vars.scala:550)
net.liftweb.http.LiftSession$$anon$3.apply(LiftSession.scala:1453)
net.liftweb.http.S$ProxyFuncHolder.apply(S.scala:115)
net.liftweb.http.LiftSession$$anonfun$buildFunc$1$2.apply(LiftSession.scala:651)
net.liftweb.http.LiftSession$$anonfun$16$$anonfun$apply$39.apply(LiftSession.scala:667)
net.liftweb.http.LiftSession$$anonfun$16$$anonfun$apply$39.apply(LiftSession.scala:667)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
scala.collection.immutable.List.foreach(List.scala:76)
scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
scala.collection.immutable.List.map(List.scala:76)
net.liftweb.http.LiftSession$$anonfun$16.apply(LiftSession.scala:667)
net.liftweb.http.LiftSession$$anonfun$16.apply(LiftSession.scala:656)
scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:239)
scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:239)
scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
scala.collection.immutable.List.foreach(List.scala:76)
scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:239)
scala.collection.immutable.List.flatMap(List.scala:76)
net.liftweb.http.LiftSession.runParams(LiftSession.scala:655)
net.liftweb.http.LiftServlet.liftedTree2$1(LiftServlet.scala:445)
net.liftweb.http.LiftServlet.handleAjax(LiftServlet.scala:444)
net.liftweb.http.LiftServlet.net$liftweb$http$LiftServlet$$dispatchStatefulRequest(LiftServlet.scala:412)
net.liftweb.http.LiftServlet$$anonfun$doSession$1$1.apply(LiftServlet.scala:279)
net.liftweb.http.LiftServlet$$anonfun$doSession$1$1.apply(LiftServlet.scala:279)
net.liftweb.http.S$class.net$liftweb$http$S$$wrapQuery(S.scala:1376)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1$$anonfun$apply$34.apply(S.scala:1524)
net.liftweb.http.S$class.net$liftweb$http$S$$doAround(S.scala:1305)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1.apply(S.scala:1522)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$class.net$liftweb$http$S$$_nest2InnerInit(S.scala:1521)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$38$$anonfun$apply$39$$anonfun$apply$40$$anonfun$apply$41.apply(S.scala:1561)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$withReq$1.apply(S.scala:1571)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$class.withReq(S.scala:1570)
net.liftweb.http.S$.withReq(S.scala:48)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$38$$anonfun$apply$39$$anonfun$apply$40.apply(S.scala:1560)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$38$$anonfun$apply$39.apply(S.scala:1559)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$38.apply(S.scala:1558)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1.apply(S.scala:1557)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$class.net$liftweb$http$S$$_innerInit(S.scala:1556)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1$$anonfun$apply$44$$anonfun$apply$45$$anonfun$apply$46$$anonfun$apply$47$$anonfun$apply$48.apply(S.scala:1594)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1$$anonfun$apply$44$$anonfun$apply$45$$anonfun$apply$46$$anonfun$apply$47.apply(S.scala:1592)
net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:613)
net.liftweb.http.RequestVarHandler$.apply(Vars.scala:515)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1$$anonfun$apply$44$$anonfun$apply$45$$anonfun$apply$46.apply(S.scala:1591)
net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:613)
net.liftweb.http.TransientRequestVarHandler$.apply(Vars.scala:528)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1$$anonfun$apply$44$$anonfun$apply$45.apply(S.scala:1590)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1$$anonfun$apply$44.apply(S.scala:1589)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_init$1.apply(S.scala:1588)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.S$class.net$liftweb$http$S$$_init(S.scala:1587)
net.liftweb.http.S$class.init(S.scala:1190)
net.liftweb.http.LiftServlet.doSession$1(LiftServlet.scala:278)
net.liftweb.http.LiftServlet.doService(LiftServlet.scala:288)
net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:132)
net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:131)
net.liftweb.util.TimeHelpers$class.calcTime(TimeHelpers.scala:344)
net.liftweb.util.Helpers$.calcTime(Helpers.scala:34)
net.liftweb.util.TimeHelpers$class.logTime(TimeHelpers.scala:363)
net.liftweb.util.Helpers$.logTime(Helpers.scala:34)
net.liftweb.http.LiftServlet.doIt$1(LiftServlet.scala:131)
net.liftweb.http.LiftServlet.service(LiftServlet.scala:142)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply$mcV$sp(HTTPProvider.scala:72)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(HTTPProvider.scala:71)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(HTTPProvider.scala:71)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.URLRewriter$.doWith(Req.scala:1253)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1.apply$mcV$sp(HTTPProvider.scala:70)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1.apply(HTTPProvider.scala:70)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2$$anonfun$apply$mcV$sp$1.apply(HTTPProvider.scala:70)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2.apply$mcV$sp(HTTPProvider.scala:66)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2.apply(HTTPProvider.scala:60)
net.liftweb.http.provider.HTTPProvider$$anonfun$service$2.apply(HTTPProvider.scala:60)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.provider.HTTPProvider$class.service(HTTPProvider.scala:60)
net.liftweb.http.LiftFilter.service(LiftServlet.scala:757)
net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(ServletFilterProvider.scala:67)
net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1$$anonfun$apply$mcV$sp$1.apply(ServletFilterProvider.scala:62)
net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1$$anonfun$apply$mcV$sp$1.apply(ServletFilterProvider.scala:62)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17$$anonfun$apply$18$$anonfun$apply$19.apply(Vars.scala:619)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17$$anonfun$apply$18.apply(Vars.scala:618)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17.apply(Vars.scala:617)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16.apply(Vars.scala:616)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:615)
net.liftweb.http.RequestVarHandler$.apply(Vars.scala:515)
net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1.apply(ServletFilterProvider.scala:61)
net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1.apply(ServletFilterProvider.scala:61)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17$$anonfun$apply$18$$anonfun$apply$19.apply(Vars.scala:619)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17$$anonfun$apply$18.apply(Vars.scala:618)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16$$anonfun$apply$17.apply(Vars.scala:617)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$16.apply(Vars.scala:616)
net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:615)
net.liftweb.http.provider.servlet.ServletFilterProvider$class.doFilter(ServletFilterProvider.scala:60)
net.liftweb.http.LiftFilter.doFilter(LiftServlet.scala:757)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
org.mortbay.jetty.handler.ContextHandler.__handle(ContextHandler.java:766)
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java)
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
org.mortbay.jetty.Server.handle(Server.java:326)
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Actions #1

Updated by Nicolas CHARLES over 11 years ago

Can't really reproducing it, the query was made by Jonathan during the demo

Actions #2

Updated by François ARMAND over 11 years ago

  • Status changed from New to In progress
Actions #3

Updated by François ARMAND over 11 years ago

Well, that's an error reported by the LDAP server. I'm didn't succeeded to reproduce it, but perhaps that a bad character looking like a '.' was written...

If that is the case, that would means that perhaps there is some bug in the filter encoding logic (of UmboundId ?).

All in all, the error should have beed reported somehow, at least to inform the user then the LDAP server didn't accepted the filter.

Actions #4

Updated by François ARMAND over 11 years ago

OK, so in fact it's an exception from the UnmoundID filter parser, so there was clearly something bad with the written filter.

Nonetheless, there must be an error message somehow.

Actions #5

Updated by Nicolas CHARLES over 11 years ago

I had the explanation: it's not with a regexp, but with a regular string, like with an = search

Actions #6

Updated by François ARMAND over 11 years ago

In fact, we have to (LDAP) escape values before creating the filter, in any case.

Actions #7

Updated by François ARMAND over 11 years ago

  • Status changed from In progress to Pending technical review
  • % Done changed from 0 to 100
Actions #8

Updated by Jonathan CLARKE over 11 years ago

  • Target version changed from 2.4.0~beta4 to 2.4.0~beta3
Actions #9

Updated by Nicolas CHARLES over 11 years ago

  • Status changed from Pending technical review to Released

This is much nicer, thank you Francois

Actions

Also available in: Atom PDF