Uploaded image for project: 'OpenICF'
  1. OpenICF
  2. OPENICF-1372

LDAP Connector: Creating an LDAP AD group with groupObjectClasses returns exception

    XMLWordPrintable

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • ldap-connector-1.4.1.0, ldap-connector-1.4.2.0, ldap-connector-1.5.0.0, ldap-connector-1.4.3.0, ldap-connector-1.4.4.0, ldap-connector-1.4.5.0, ldap-connector-1.4.6.0, ldap-connector-1.4.7.0, ldap-connector-1.4.8.0, ldap-connector-1.4.9.0, ldap-connector-1.4.10.0, ldap-connector-1.4.11.0, ldap-connector-1.5.1.0, ldap-connector-1.5.2.0, ldap-connector-1.5.3.0, ldap-connector-1.5.4.0, ldap-connector-1.5.5.0
    • None
    • OpenDJ: 7.0.0 8f861799382
      OpenIDM: 7.1.0-SNAPSHOT aabe994
      LDAPConnector: 1.5.5.0-SNAPSHOT 3c99481de07

    Description

      Our automated pyforge test is failing for a long time now but it was tagged as unstable originally.

      It worked with LDAP-connector-1.4.0.0

      The problem is when we add a new groupObjectClasses into our provisioner and attempt to create a group using that groupObjectClass it returns HTTP 500 with LDAP exception.

      Automated test can be run as:

      ./run-pybot.py -s *ldap.ad.ldap_ad_configuration.configuration_properties_optional_group* -t groupObjectClasses_value_add_groupOfNames OpenIDM
      

      Steps to reproduce:

      • Install IDM and use project dir sync-with-ldap-groups
      • Use ldif file from that project dir
      • Use example provisioner from samples/example-configurations/provisioners/provisioner.openicf-adldap.json
      • Configure provisioner to be able to connect to LDAP AD
      • Add "groupOfNames" and "top" to the groupObjectClasses in provisioner
        "groupObjectClasses": ["groupOfNames", "top"],
        
      • Create new group using the objectClass
        curl --header "X-OpenIDM-Username: openidm-admin" --header 
        "X-OpenIDM-Password: openidm-admin" --header "Content-Type: 
        application/json" --request  POST --data 
        '{"dn":"CN=E_1597820261,OU=RobotTests2020_08_19_08_54_29,DC=ad,DC=idm-robot-windows,DC=com","description":"Foo","member":["CN=Administrator,CN=Users,DC=ad,DC=idm-robot-windows,DC=com"],
         "objectClass": ["groupOfNames","top"] }' http://localhost:8080/openidm/system/ldap/group/?_action=create
        
        {"code":500,"reason":"Internal Server Error","message":"Operation CREATE failed with ConnectorException on system object"}
        
      • IDM returns HTTP 500 with the exception in the IDM log
        [197] Aug 19, 2020 8:58:22.680 AM org.identityconnectors.ldap.LdapConnector create
        FINE: Creating LDAP entry CN=E_1597820261,OU=RobotTests2020_08_19_08_54_29,DC=ad,DC=idm-robot-windows,DC=com with attributes {objectClass=objectClass: groupOfNames, top, groupType=groupType: -2147483646, description=description: Foo, member=member: CN=Administrator,CN=Users,DC=ad,DC=idm-robot-windows,DC=com}%09Method: doCreate
        [197] Aug 19, 2020 8:58:22.761 AM org.slf4j.impl.JDK14LoggerAdapter fillCallerData
        FINE: Exception: %09Method: create
        org.identityconnectors.framework.common.exceptions.ConnectorException: javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - 0000207D: UpdErr: DSID-0315121C, problem 6002 (OBJ_CLASS_VIOLATION), data 590574
        ]; remaining name 'CN=E_1597820261,OU=RobotTests2020_08_19_08_54_29,DC=ad,DC=idm-robot-windows,DC=com'
        	at org.identityconnectors.ldap.modify.LdapCreate.doCreate(LdapCreate.java:194)
        	at org.identityconnectors.ldap.modify.LdapCreate.executeImpl(LdapCreate.java:152)
        	at org.identityconnectors.ldap.modify.LdapCreate.execute(LdapCreate.java:78)
        	at org.identityconnectors.ldap.LdapConnector.create(LdapConnector.java:228)
        	at org.identityconnectors.framework.impl.api.local.operations.CreateImpl.create(CreateImpl.java:88)
        	at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.identityconnectors.framework.impl.api.local.operations.ConnectorAPIOperationRunnerProxy.invoke(ConnectorAPIOperationRunnerProxy.java:104)
        	at com.sun.proxy.$Proxy69.create(Unknown Source)
        	at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.identityconnectors.framework.impl.api.local.operations.ThreadClassLoaderManagerProxy.invoke(ThreadClassLoaderManagerProxy.java:96)
        	at com.sun.proxy.$Proxy69.create(Unknown Source)
        	at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.identityconnectors.framework.impl.api.DelegatingTimeoutProxy.invoke(DelegatingTimeoutProxy.java:101)
        	at com.sun.proxy.$Proxy69.create(Unknown Source)
        	at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.identityconnectors.framework.impl.api.LoggingProxy.invoke(LoggingProxy.java:76)
        	at com.sun.proxy.$Proxy69.create(Unknown Source)
        	at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.identityconnectors.framework.impl.api.local.LocalConnectorFacadeImpl$ReferenceCountingProxy.invoke(LocalConnectorFacadeImpl.java:315)
        	at com.sun.proxy.$Proxy69.create(Unknown Source)
        	at org.identityconnectors.framework.impl.api.AbstractConnectorFacade.create(AbstractConnectorFacade.java:210)
        	at org.forgerock.openidm.provisioner.openicf.impl.ObjectClassResourceProvider.handleCreate(ObjectClassResourceProvider.java:279)
        	at org.forgerock.openidm.provisioner.openicf.impl.ObjectClassRequestHandler.handleCreate(ObjectClassRequestHandler.java:100)
        	at org.forgerock.json.resource.Router.handleCreate(Router.java:265)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:64)
        	at org.forgerock.json.resource.ResourceApiVersionRoutingFilter.filterCreate(ResourceApiVersionRoutingFilter.java:47)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.json.resource.FilterChain.handleCreate(FilterChain.java:231)
        	at org.forgerock.json.resource.Router.handleCreate(Router.java:265)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:64)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:54)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.lambda$filterCreate$1(DelegatedAdminFilter.java:244)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:263)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:227)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.filterRequest(DelegatedAdminFilter.java:303)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.filterCreate(DelegatedAdminFilter.java:243)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.lambda$filterCreate$1(DelegatedAdminFilter.java:244)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:263)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:227)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.filterRequest(DelegatedAdminFilter.java:303)
        	at org.forgerock.openidm.authz.DelegatedAdminFilter.filterCreate(DelegatedAdminFilter.java:243)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:54)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:54)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.audit.filter.AuditFilter.lambda$filterCreate$1(AuditFilter.java:127)
        	at org.forgerock.openidm.audit.filter.AuditFilter.logAuditAccessEntry(AuditFilter.java:177)
        	at org.forgerock.openidm.audit.filter.AuditFilter.filterCreate(AuditFilter.java:127)
        	at org.forgerock.openidm.router.filter.MutableFilterDecorator.filterCreate(MutableFilterDecorator.java:72)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.servlet.internal.ResourceFilters$3.lambda$filterCreate$1(ResourceFilters.java:176)
        	at org.forgerock.openidm.servlet.internal.ResourceFilters$3.handleRequestWithLogging(ResourceFilters.java:222)
        	at org.forgerock.openidm.servlet.internal.ResourceFilters$3.filterCreate(ResourceFilters.java:176)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.router.filter.QueryIdToQueryFilterTransformFilter.filterCreate(QueryIdToQueryFilterTransformFilter.java:227)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.router.filter.PassthroughFilter.filterCreate(PassthroughFilter.java:48)
        	at org.forgerock.openidm.router.filter.MutableFilterDecorator.filterCreate(MutableFilterDecorator.java:72)
        	at org.forgerock.openidm.router.filter.MutableFilterDecorator.filterCreate(MutableFilterDecorator.java:72)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.router.filter.PassthroughFilter.filterCreate(PassthroughFilter.java:48)
        	at org.forgerock.openidm.router.filter.MutableFilterDecorator.filterCreate(MutableFilterDecorator.java:72)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.openidm.servlet.internal.ResourceFilters$2.filterCreate(ResourceFilters.java:101)
        	at org.forgerock.json.resource.Filters$ConditionalFilter.filterCreate(Filters.java:52)
        	at org.forgerock.json.resource.FilterChain$Cursor.handleCreate(FilterChain.java:62)
        	at org.forgerock.json.resource.FilterChain.handleCreate(FilterChain.java:231)
        	at org.forgerock.json.resource.InternalConnection.createAsync(InternalConnection.java:40)
        	at org.forgerock.json.resource.AbstractConnectionWrapper.createAsync(AbstractConnectionWrapper.java:101)
        	at org.forgerock.openidm.servlet.internal.ServletConnectionFactory$InternalConnectionWrapper.lambda$createAsync$1(ServletConnectionFactory.java:274)
        	at org.forgerock.openidm.metrics.MetricsCollector.time(MetricsCollector.java:112)
        	at org.forgerock.openidm.servlet.internal.ServletConnectionFactory$InternalConnectionWrapper.time(ServletConnectionFactory.java:263)
        	at org.forgerock.openidm.servlet.internal.ServletConnectionFactory$InternalConnectionWrapper.createAsync(ServletConnectionFactory.java:274)
        	at org.forgerock.json.resource.http.RequestRunner.visitCreateRequest(RequestRunner.java:172)
        	at org.forgerock.json.resource.http.RequestRunner.visitCreateRequest(RequestRunner.java:87)
        	at org.forgerock.json.resource.Requests$CreateRequestImpl.accept(Requests.java:254)
        	at org.forgerock.json.resource.http.RequestRunner.handleResult(RequestRunner.java:143)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:263)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:252)
        	at org.forgerock.json.resource.http.HttpAdapter.doRequest(HttpAdapter.java:747)
        	at org.forgerock.json.resource.http.HttpAdapter.doCreate(HttpAdapter.java:580)
        	at org.forgerock.json.resource.http.HttpAdapter.handle(HttpAdapter.java:303)
        	at org.forgerock.http.handler.Handlers$HandlerDescribableAsDescribableHandler.handle(Handlers.java:147)
        	at org.forgerock.http.filter.OptionsFilter.filter(OptionsFilter.java:69)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.openidm.auth.ProfileEnhancementCheckFilter.filter(ProfileEnhancementCheckFilter.java:157)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.openidm.auth.LoginCountFilter.filter(LoginCountFilter.java:75)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.caf.authentication.framework.AuthenticationFramework.grantAccess(AuthenticationFramework.java:188)
        	at org.forgerock.caf.authentication.framework.AuthenticationFramework.lambda$onValidateRequestSuccess$1(AuthenticationFramework.java:181)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:263)
        	at org.forgerock.util.promise.Promises$CompletedPromise.thenAsync(Promises.java:252)
        	at org.forgerock.caf.authentication.framework.AuthenticationFramework.validateRequest(AuthenticationFramework.java:144)
        	at org.forgerock.caf.authentication.framework.AuthenticationFramework.processMessage(AuthenticationFramework.java:134)
        	at org.forgerock.caf.authentication.framework.AuthenticationFilter.filter(AuthenticationFilter.java:85)
        	at org.forgerock.openidm.auth.AuthFilterWrapper.filter(AuthFilterWrapper.java:85)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.http.swagger.OpenApiRequestFilter.filter(OpenApiRequestFilter.java:63)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.http.routing.Router.handle(Router.java:100)
        	at org.forgerock.http.filter.TransactionIdInboundFilter.filter(TransactionIdInboundFilter.java:86)
        	at org.forgerock.http.handler.Handlers$1.handle(Handlers.java:54)
        	at org.forgerock.http.servlet.HttpFrameworkServlet.service(HttpFrameworkServlet.java:262)
        	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        	at org.eclipse.jetty.servlet.ServletHolder$NotAsyncServlet.service(ServletHolder.java:1386)
        	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755)
        	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617)
        	at org.forgerock.openidm.jetty.LargePayloadServletFilter.doFilter(LargePayloadServletFilter.java:64)
        	at jdk.internal.reflect.GeneratedMethodAccessor102.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.forgerock.openidm.servletregistration.impl.ServletRegistrationSingleton$FilterProxy.invoke(ServletRegistrationSingleton.java:327)
        	at com.sun.proxy.$Proxy55.doFilter(Unknown Source)
        	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
        	at org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:310)
        	at org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:264)
        	at jdk.internal.reflect.GeneratedMethodAccessor102.invoke(Unknown Source)
        	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        	at org.forgerock.openidm.servletregistration.impl.ServletRegistrationSingleton$FilterProxy.invoke(ServletRegistrationSingleton.java:327)
        	at com.sun.proxy.$Proxy54.doFilter(Unknown Source)
        	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
        	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545)
        	at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)
        	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590)
        	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
        	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607)
        	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297)
        	at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:290)
        	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
        	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
        	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577)
        	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
        	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212)
        	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        	at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)
        	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:717)
        	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        	at org.eclipse.jetty.server.Server.handle(Server.java:500)
        	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
        	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
        	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
        	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
        	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
        	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
        	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
        	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
        	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
        	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
        	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388)
        	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
        	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
        	at java.base/java.lang.Thread.run(Thread.java:834)
        Caused by: javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - 0000207D: UpdErr: DSID-0315121C, problem 6002 (OBJ_CLASS_VIOLATION), data 590574
        ]; remaining name 'CN=E_1597820261,OU=RobotTests2020_08_19_08_54_29,DC=ad,DC=idm-robot-windows,DC=com'
        	at java.naming/com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3186)
        	at java.naming/com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3101)
        	at java.naming/com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2892)
        	at java.naming/com.sun.jndi.ldap.LdapCtx.c_createSubcontext(LdapCtx.java:812)
        	at java.naming/com.sun.jndi.toolkit.ctx.ComponentDirContext.p_createSubcontext(ComponentDirContext.java:341)
        	at java.naming/com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.createSubcontext(PartialCompositeDirContext.java:268)
        	at java.naming/javax.naming.directory.InitialDirContext.createSubcontext(InitialDirContext.java:202)
        	at org.identityconnectors.ldap.modify.LdapCreate.doCreate(LdapCreate.java:189)
        	... 175 more
        

      Attachments

        Activity

          People

            gael Gael Allioux
            son.nguyen Son Nguyen
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: