On 01/08/2017 13:42, Dino Mifsud wrote:
Hi
I am trying to sync users from Syncope to a backend DB using scriptesql 
connector.
The users are being created (in the tables) but a subsequent call creates again 
the users duplicating them. Also I am getting this error in the Search script 
which I cannot solve. See stack trace below.
Can you help me please? much appreciated

Hi Dino,
glad to see that you are progressing.

The error below (and also the duplication of entries that you observe) derive from an incomplete / erroneous implementation of the search script: you must ensure that:

1. the search scripts effectively founds the item it was requested to (if such item is effectively existing in the external database): look in the core-connid.log right before the second, unwanted, create()

2. the search scripts returns all the attributes it was asked for by Syncope: you should find, prior to the error message below, in core-connid.log something like as

13:41:25.136 DEBUG Enter: search(ObjectClass: __ACCOUNT__, EQUALS: Attribute: {Name=fullname, Value=[17b7da3asyncope...@apache.org]}, org.apache.syncope.core.provisioning.java.ConnectorFacadeProxy$2@6afd8683, OperationOptions: {ATTRS_TO_GET:[__NAME__,fullname,__UID__,__ENABLE__]}) Method: search

in this case, Syncope is asking for [__NAME__,fullname,__UID__,__ENABLE__] to be available in the results: if not all attributes are included, you receive the "XXX was returned by the connector but failed to pass the framework filter. This seems like wrong implementation of the filter in the connector" error message.

HTH
Regards.

12:04:41.720 DEBUG Search script loaded Method: executeQuery
12:04:41.720 DEBUG ObjectClass: __ACCOUNT__     Method: executeQuery
12:04:41.720 INFO  Entering SEARCH Script************** Method: run
12:04:41.722 INFO  GGOO SEARCH SCRIPT......     Method: run
12:04:41.722 DEBUG Search ok    Method: executeQuery
12:04:41.722 DEBUG Enter: {Uid=Attribute: {Name=__UID__, 
Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}, ObjectClass=ObjectClass: 
__ACCOUNT__, Attributes=[Attribute: {Name=uid, Value=[administrator]}, 
Attribute: {Name=__NAME__, Value=[administrator]}, Attribute: {Name=cn, 
Value=[administrator]}, Attribute: {Name=__UID__, 
Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}], Name=Attribute: {Name=__NAME__, 
Value=[administrator]}}       Method: handle
12:04:41.722 DEBUG Exception:   Method: handle
java.lang.IllegalStateException: Object {Uid=Attribute: {Name=__UID__, 
Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}, ObjectClass=ObjectClass: 
__ACCOUNT__, Attributes=[Attribute: {Name=__NAME__, Value=[administrator]}, 
Attribute: {Name=__UID__, Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}], 
Name=Attribute: {Name=__NAME__, Value=[administrator]}} was returned by the 
connector but failed to pass the framework filter. This seems like wrong 
implementation of the filter in the connector.
        at 
org.identityconnectors.framework.impl.api.local.operations.FilteredResultsHandler.handle(FilteredResultsHandler.java:82)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$AttributesToGetSearchResultsHandler.handle(SearchImpl.java:278)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$1.handle(SearchImpl.java:142)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.SearchResultsHandlerLoggingProxy.handle(SearchResultsHandlerLoggingProxy.java:64)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.processResults(ScriptedSQLConnector.java:586)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:403)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:61)
 ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.rawSearch(SearchImpl.java:193)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.search(SearchImpl.java:130)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor239.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ConnectorAPIOperationRunnerProxy.invoke(ConnectorAPIOperationRunnerProxy.java:98)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy256.search(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.GetImpl.getObject(GetImpl.java:67)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ThreadClassLoaderManagerProxy.invoke(ThreadClassLoaderManagerProxy.java:96)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.DelegatingTimeoutProxy.invoke(DelegatingTimeoutProxy.java:99)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.LoggingProxy.invoke(LoggingProxy.java:83)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.AbstractConnectorFacade.getObject(AbstractConnectorFacade.java:261)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade.getObject(AsyncConnectorFacade.java:104)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade$$FastClassBySpringCGLIB$$886ae36a.invoke(<generated>)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
~[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[?:1.8.0_91]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
12:04:41.722 DEBUG Exception:   Method: executeQuery
org.identityconnectors.framework.common.exceptions.ConnectorException: Search 
script error
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:405)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:61)
 ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.rawSearch(SearchImpl.java:193)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.search(SearchImpl.java:130)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor239.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ConnectorAPIOperationRunnerProxy.invoke(ConnectorAPIOperationRunnerProxy.java:98)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy256.search(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.GetImpl.getObject(GetImpl.java:67)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ThreadClassLoaderManagerProxy.invoke(ThreadClassLoaderManagerProxy.java:96)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.DelegatingTimeoutProxy.invoke(DelegatingTimeoutProxy.java:99)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.LoggingProxy.invoke(LoggingProxy.java:83)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.AbstractConnectorFacade.getObject(AbstractConnectorFacade.java:261)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade.getObject(AsyncConnectorFacade.java:104)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade$$FastClassBySpringCGLIB$$886ae36a.invoke(<generated>)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
~[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[?:1.8.0_91]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
Caused by: java.lang.IllegalStateException: Object {Uid=Attribute: 
{Name=__UID__, Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}, 
ObjectClass=ObjectClass: __ACCOUNT__, Attributes=[Attribute: {Name=__NAME__, 
Value=[administrator]}, Attribute: {Name=__UID__, 
Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}], Name=Attribute: {Name=__NAME__, 
Value=[administrator]}} was returned by the connector but failed to pass the 
framework filter. This seems like wrong implementation of the filter in the 
connector.
        at 
org.identityconnectors.framework.impl.api.local.operations.FilteredResultsHandler.handle(FilteredResultsHandler.java:82)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$AttributesToGetSearchResultsHandler.handle(SearchImpl.java:278)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$1.handle(SearchImpl.java:142)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.SearchResultsHandlerLoggingProxy.handle(SearchResultsHandlerLoggingProxy.java:64)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.processResults(ScriptedSQLConnector.java:586)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:403)
 ~[?:?]
        ... 35 more
12:04:41.722 DEBUG Exception:   Method: getObject
org.identityconnectors.framework.common.exceptions.ConnectorException: Search 
script error
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:405)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:61)
 ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.rawSearch(SearchImpl.java:193)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl.search(SearchImpl.java:130)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor239.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ConnectorAPIOperationRunnerProxy.invoke(ConnectorAPIOperationRunnerProxy.java:98)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy256.search(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.GetImpl.getObject(GetImpl.java:67)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.local.operations.ThreadClassLoaderManagerProxy.invoke(ThreadClassLoaderManagerProxy.java:96)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.DelegatingTimeoutProxy.invoke(DelegatingTimeoutProxy.java:99)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) ~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
        at 
org.identityconnectors.framework.impl.api.LoggingProxy.invoke(LoggingProxy.java:83)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at com.sun.proxy.$Proxy263.getObject(Unknown Source) ~[?:?]
        at 
org.identityconnectors.framework.impl.api.AbstractConnectorFacade.getObject(AbstractConnectorFacade.java:261)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade.getObject(AsyncConnectorFacade.java:104)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.apache.syncope.core.provisioning.java.AsyncConnectorFacade$$FastClassBySpringCGLIB$$886ae36a.invoke(<generated>)
 ~[syncope-core-provisioning-java-2.0.4.jar:2.0.4]
        at 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at 
org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
 ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
~[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[?:1.8.0_91]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[?:1.8.0_91]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
Caused by: java.lang.IllegalStateException: Object {Uid=Attribute: 
{Name=__UID__, Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}, 
ObjectClass=ObjectClass: __ACCOUNT__, Attributes=[Attribute: {Name=__NAME__, 
Value=[administrator]}, Attribute: {Name=__UID__, 
Value=[17e4c35c-383f-1035-9abe-d7b00eb73b03]}], Name=Attribute: {Name=__NAME__, 
Value=[administrator]}} was returned by the connector but failed to pass the 
framework filter. This seems like wrong implementation of the filter in the 
connector.
        at 
org.identityconnectors.framework.impl.api.local.operations.FilteredResultsHandler.handle(FilteredResultsHandler.java:82)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$AttributesToGetSearchResultsHandler.handle(SearchImpl.java:278)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.local.operations.SearchImpl$1.handle(SearchImpl.java:142)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
org.identityconnectors.framework.impl.api.SearchResultsHandlerLoggingProxy.handle(SearchResultsHandlerLoggingProxy.java:64)
 ~[connector-framework-internal-1.4.2.0.jar:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.processResults(ScriptedSQLConnector.java:586)
 ~[?:?]
        at 
net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector.executeQuery(ScriptedSQLConnector.java:403)
 ~[?:?]
        ... 35 more

--
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Member at The Apache Software Foundation
Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail
http://home.apache.org/~ilgrosso/

Reply via email to