Hello Katherine,

I am sorry to ask this question. But really i need some light on bellow
matter.


I want to run solr in cloud mode . So obliviously I am going to use
zookeeper.


My quorum are distributed on 3 server with static ip , lets say


server.1=xx.xx.x1:2888:3888
server.2=xx.xx.x2:2889:3889
server.3=xx.xx.x3:2890:3890


With solr pointing to this ensemble. Now my concern is how should I protect
it to other unauthorized zkClient to connect above quorum. One way could be
don't open the port for the client but then how will solr connect ?
other problem is how to safeguard  quorum interconnection.  I observed a
weird behavior  that I can point a fourth zookeeper from my local to the
above quorum (i have to know only ip and port which is not tough to find)
and it will be absorbed as a part of quorum and then I can use my local
zkClient to connect my local zoookeeper and have access to quorum which we
don't want. I want to define quorum in a way that foreign zookeeper server
is not able to
become part already configured quorum.

Again one more strange behavior about znode of zookeeper, User A can set
ACL of a znode and  user B which can connect to zookeeper but can't see the
content as it will throw ACL error that is fine but strange thing is user B
can still  delete the znode of A which he cant see. :(

I think a hell lot of things is not clear about zoookeeper security.

Please can you help me ? And don't forget my thanks in advance.





On Thu, Mar 3, 2016 at 7:32 PM, Katherine Mora <km...@searchtechnologies.com
> wrote:

> Hi Jeff,
>
> Are you still having the same issue or did you manage to fix it?
>
> I have the default files that come with the Solr 5.2.1 installation (I’m
> copying those below).
> I’m pretty sure my password is correct, unless the tool is generating one
> that does not match my version? I’m using the jetty jar that comes with the
> Solr installation to generate it, so I’m assuming this is not the case.
>
>
> Jetty-ssl.xml
> <?xml version="1.0"?>
> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "
> http://www.eclipse.org/jetty/configure_9_0.dtd";>
>
> <!-- ============================================================= -->
> <!-- Configure a TLS (SSL) Context Factory                         -->
> <!-- This configuration must be used in conjunction with jetty.xml -->
> <!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
> <!-- ============================================================= -->
> <Configure id="sslContextFactory"
> class="org.eclipse.jetty.util.ssl.SslContextFactory">
>   <Set name="KeyStorePath"><Property name="solr.jetty.keystore"
> default="./etc/solr-ssl.keystore.jks"/></Set>
>   <Set name="KeyStorePassword"><Property
> name="solr.jetty.keystore.password" default="secret"/></Set>
>   <Set name="TrustStorePath"><Property name="solr.jetty.truststore"
> default="./etc/solr-ssl.keystore.jks"/></Set>
>   <Set name="TrustStorePassword"><Property
> name="solr.jetty.truststore.password" default="secret"/></Set>
>   <Set name="NeedClientAuth"><Property
> name="solr.jetty.ssl.needClientAuth" default="false"/></Set>
>   <Set name="WantClientAuth"><Property
> name="solr.jetty.ssl.wantClientAuth" default="false"/></Set>
>   <Set name="excludeProtocols">
>     <Array type="java.lang.String">
>       <Item>SSLv3</Item>
>     </Array>
>   </Set>
>   <Set name="ExcludeCipherSuites">
>     <Array type="String">
>       <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
>       <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
>       <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
>       <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
>       <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
>       <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
>       <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
>     </Array>
>   </Set>
>
>   <!-- =========================================================== -->
>   <!-- Create a TLS specific HttpConfiguration based on the        -->
>   <!-- common HttpConfiguration defined in jetty.xml               -->
>   <!-- Add a SecureRequestCustomizer to extract certificate and    -->
>   <!-- session information                                         -->
>   <!-- =========================================================== -->
>   <New id="sslHttpConfig"
> class="org.eclipse.jetty.server.HttpConfiguration">
>     <Arg><Ref refid="httpConfig"/></Arg>
>     <Call name="addCustomizer">
>       <Arg><New
> class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
>     </Call>
>   </New>
>
> </Configure>
>
> jetty-https.xml
> <?xml version="1.0"?>
> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "
> http://www.eclipse.org/jetty/configure_9_0.dtd";>
>
> <!-- ============================================================= -->
> <!-- Configure a HTTPS connector.                                  -->
> <!-- This configuration must be used in conjunction with jetty.xml -->
> <!-- and jetty-ssl.xml.                                            -->
> <!-- ============================================================= -->
> <Configure id="Server" class="org.eclipse.jetty.server.Server">
>
>   <!-- =========================================================== -->
>   <!-- Add a HTTPS Connector.                                      -->
>   <!-- Configure an o.e.j.server.ServerConnector with connection   -->
>   <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
>   <!-- All accepted TLS connections are wired to a HTTP connection.-->
>   <!--                                                             -->
>   <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
>   <!-- o.e.j.server.SslConnectionFactory and                       -->
>   <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
>   <!-- that may be set here.                                       -->
>   <!-- =========================================================== -->
>   <Call id="httpsConnector" name="addConnector">
>     <Arg>
>       <New class="org.eclipse.jetty.server.ServerConnector">
>         <Arg name="server"><Ref refid="Server" /></Arg>
>         <Arg name="acceptors" type="int"><Property
> name="solr.jetty.ssl.acceptors" default="-1"/></Arg>
>         <Arg name="selectors" type="int"><Property
> name="solr.jetty.ssl.selectors" default="-1"/></Arg>
>         <Arg name="factories">
>           <Array type="org.eclipse.jetty.server.ConnectionFactory">
>             <Item>
>               <New class="org.eclipse.jetty.server.SslConnectionFactory">
>                 <Arg name="next">http/1.1</Arg>
>                 <Arg name="sslContextFactory"><Ref
> refid="sslContextFactory"/></Arg>
>               </New>
>             </Item>
>             <Item>
>               <New class="org.eclipse.jetty.server.HttpConnectionFactory">
>                 <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
>               </New>
>             </Item>
>           </Array>
>         </Arg>
>         <Set name="host"><Property name="solr.jetty.host" /></Set>
>         <Set name="port"><Property name="solr.jetty.https.port"
> default="8983" /></Set>
>         <Set name="idleTimeout"><Property name="solr.jetty.https.timeout"
> default="50000"/></Set>
>         <Set name="soLingerTime"><Property
> name="solr.jetty.https.soLingerTime" default="-1"/></Set>
>         <Set name="acceptorPriorityDelta"><Property
> name="solr.jetty.ssl.acceptorPriorityDelta" default="0"/></Set>
>         <Set name="selectorPriorityDelta"><Property
> name="solr.jetty.ssl.selectorPriorityDelta" default="0"/></Set>
>         <Set name="acceptQueueSize"><Property
> name="solr.jetty.https.acceptQueueSize" default="0"/></Set>
>       </New>
>     </Arg>
>   </Call>
> </Configure>
>
>
>
>
> -----Original Message-----
> From: Jeff Wu [mailto:wuhai...@gmail.com]
> Sent: Monday, February 29, 2016 12:58 PM
> To: solr-user@lucene.apache.org
> Subject: Re: Prevent the SSL Keystore and Truststore password from showing
> up in the Solr Admin and Linux processes (Solr 5.2.1)
>
> Hi Katherine, we had exact the same issue, we need to protect our password.
> Anyone who can access to solr server can do "ps -elf|grep java" to grep
> the solr commandline, and it has all the password in plain text.
>
> The /bin/solr shell will set 10 related system property:
>  SOLR_SSL_OPTS=" -Dsolr.jetty.keystore=$SOLR_SSL_KEY_STORE \
>     -Dsolr.jetty.keystore.password=$SOLR_SSL_KEY_STORE_PASSWORD \
>     -Dsolr.jetty.truststore=$SOLR_SSL_TRUST_STORE \
>     -Dsolr.jetty.truststore.password=$SOLR_SSL_TRUST_STORE_PASSWORD \
>     -Dsolr.jetty.ssl.needClientAuth=$SOLR_SSL_NEED_CLIENT_AUTH \
>     -Dsolr.jetty.ssl.wantClientAuth=$SOLR_SSL_WANT_CLIENT_AUTH"
>   SOLR_SSL_OPTS+=" -Djavax.net.ssl.keyStore=$SOLR_SSL_KEY_STORE \
>       -Djavax.net.ssl.keyStorePassword=$SOLR_SSL_KEY_STORE_PASSWORD \
>       -Djavax.net.ssl.trustStore=$SOLR_SSL_TRUST_STORE \
>       -Djavax.net.ssl.trustStorePassword=$SOLR_SSL_TRUST_STORE_PASSWORD"
> and also
>        SOLR_JETTY_CONFIG+=("--module=https")
>
> The questions we have:
> 1. We doubt "OBF:XYZ"  does not work when you set to solr.in.sh.  the
> javax.net.ssl can't work with jetty OBF. What we saw is Incorrect password
>
> Caused by: java.io.IOException: Keystore was tampered with, or password
> was incorrect at
> sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:780)
> at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
> at
>
> sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:225)
> at
>
> sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
> at java.security.KeyStore.load(KeyStore.java:1445)
> at
>
> sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultKeyManager(SSLContextImpl.java:852)
> at
>
> sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:732)
> at sun.reflect.GeneratedConstructorAccessor280.newInstance(Unknown Source)
> at
>
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
> at java.security.Provider$Service.newInstance(Provider.java:1595)
>
> 2. Is there any good sample we can referent to configure in
> jetty-https.xml and jetty-ssl.xml to leverage Jetty OBF?
> Katherine, can you share your jetty-ssl.xml and jetty-https.xml?
> From this link:
>
> http://www.eclipse.org/jetty/documentation/9.2.6.v20141205/configuring-ssl.html
> ,
> did you put keystore files under jetty home?
> and followed this sample?
> <New id="sslContextFactory" class=
> "org.eclipse.jetty.util.ssl.SslContextFactory">
>   <Set name="KeyStorePath"><Property name="jetty.home" default="."
> />/etc/keystore</Set>
>   <Set name="KeyStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
>   <Set name="KeyManagerPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
>   <Set name="TrustStorePath"><Property name="jetty.home" default="."
> />/etc/keystore</Set>
>   <Set name="TrustStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
> </New>
>
>
>
>
> 2016-02-15 13:23 GMT-05:00 Katherine Mora <km...@searchtechnologies.com
> <mailto:km...@searchtechnologies.com>>:
>
> > Hello All,
> >
> > I've configured Solr 5.2.1 to enable SSL by following the instructions
> > listed in the Wiki in Enabling SSL<
> > https://cwiki.apache.org/confluence/display/solr/Enabling+SSL>. This
> > is working fine. However, if I go to the Solr Admin (Dashboard -> JVM
> > -> Args) or if I list the processes running in the computer, I can see
> > the password that I set in the solr.in.sh script for
> > SOLR_SSL_KEY_STORE_PASSWORD and
> > SOLR_SSL_TRUST_STORE_PASSWORD:
> >
> > -Dsolr.jetty.truststore.password=XYZ
> > -Dsolr.jetty.keystore.password=XYZ
> > -Djavax.net.ssl.trustStorePassword=XYZ
> > -Djavax.net.ssl.keyStorePassword=XYZ
> >
> >
> > I have tried securing the passwords using Jetty's Password utility:
> >
> > java -cp jetty-util-9.2.10.v20150310.jar
> > org.eclipse.jetty.util.security.Password XYZ
> >
> > And using the "OBF:XYZ" password in solr.in.sh instead but I get an
> > exception java.security.NoSuchAlgorithmException -> java.io.IOException:
> > Keystore was tampered with, or password was incorrect (I'm listing the
> > complete exception below as well)
> >
> > Additionally, I have tried to remove the lines in the "bin/solr"
> > script that set the passwords in SOLR_SSL_OPTS and eventually in
> > SOLR_OPTS instead, setting the passwords directly in the jetty
> > configuration files located under "server/etc". However, when I do
> > this, I get an exception saying the password cannot be null. It seems
> > like there is a setting that is not listed in the jetty files. I found
> > that "keyManagerPassword" is not listed in the jetty-ssl.xml file and
> > I added it, but I keep getting the same error.
> >
> > Does anyone know how to prevent the SSL keystore and trust store
> > password from showing up in the Solr Admin by doing the configuration
> > in the jetty files or by securing the passwords?
> >
> > Thanks in advance for any help you can provide.
> >
> >
> > Caused by: java.net.SocketException:
> > java.security.NoSuchAlgorithmException: Error constructing
> > implementation
> > (algorithm: Default, provider: SunJSSE, class:
> > sun.security.ssl.SSLContextImpl$DefaultSSLContext)
> >         at
> >
> javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:198)
> >         at
> >
> javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:205)
> >         at
> >
> org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:513)
> >         at
> >
> org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:383)
> >         at
> >
> org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
> >         at
> >
> org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
> >         at
> >
> org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
> >         at
> >
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
> >         at
> >
> org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
> >         at
> >
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
> >         at
> >
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
> >         at
> >
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
> >         at
> >
> org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:466)
> >         ... 12 more
> > Caused by: java.security.NoSuchAlgorithmException: Error constructing
> > implementation (algorithm: Default, provider: SunJSSE, class:
> > sun.security.ssl.SSLContextImpl$DefaultSSLContext)
> >         at java.security.Provider$Service.newInstance(Provider.java:1259)
> >         at sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
> >         at sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
> >         at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
> >         at javax.net.ssl.SSLContext.getDefault(SSLContext.java:97)
> >         at
> > javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:121)
> >         at
> >
> org.apache.http.conn.ssl.SSLSocketFactory.getSystemSocketFactory(SSLSocketFactory.java:190)
> >         at
> >
> org.apache.http.impl.conn.SchemeRegistryFactory.createSystemDefault(SchemeRegistryFactory.java:85)
> >         at
> >
> org.apache.http.impl.client.SystemDefaultHttpClient.createClientConnectionManager(SystemDefaultHttpClient.java:121)
> >         at
> >
> org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:484)
> >         at
> >
> org.apache.solr.client.solrj.impl.HttpClientUtil.setMaxConnections(HttpClientUtil.java:214)
> >         at
> >
> org.apache.solr.client.solrj.impl.HttpClientConfigurer.configure(HttpClientConfigurer.java:35)
> >         at
> >
> org.apache.solr.client.solrj.impl.HttpClientUtil.configureClient(HttpClientUtil.java:142)
> >         at
> >
> org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:118)
> >         at
> >
> org.apache.solr.handler.component.HttpShardHandlerFactory.init(HttpShardHandlerFactory.java:166)
> >         at
> >
> org.apache.solr.handler.component.ShardHandlerFactory.newInstance(ShardHandlerFactory.java:49)
> >         at
> org.apache.solr.core.CoreContainer.load(CoreContainer.java:328)
> >         at
> >
> org.apache.solr.servlet.SolrDispatchFilter.createCoreContainer(SolrDispatchFilter.java:140)
> >         at
> >
> org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:110)
> >         at
> > org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:138)
> >         at
> >
> org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:852)
> >         at
> >
> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
> >         at
> >
> org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
> >         at
> >
> org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
> >         at
> >
> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
> >         at
> > org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
> >         at
> >
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
> >         at
> >
> org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
> >         at
> > org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:186)
> >         at
> >
> org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:498)
> >         at
> >
> org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:146)
> >         at
> >
> org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
> >         at
> >
> org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:461)
> >         at
> >
> org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
> >         at
> org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:609)
> >         at
> > org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:528)
> >         at org.eclipse.jetty.util.Scanner.scan(Scanner.java:391)
> >         at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:313)
> >         at
> >
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
> >         at
> >
> org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:150)
> >         at
> >
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
> >         at
> >
> org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:560)
> >         at
> >
> org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:235)
> >         at
> >
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
> >         at
> >
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
> >         at org.eclipse.jetty.server.Server.start(Server.java:387)
> >         at
> >
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
> >         at
> >
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
> >         at org.eclipse.jetty.server.Server.doStart(Server.java:354)
> >         at
> >
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
> >         at
> > org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
> >         at java.security.AccessController.doPrivileged(Native Method)
> >         at
> > org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >         at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> >         at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> >         at java.lang.reflect.Method.invoke(Method.java:606)
> >         at org.eclipse.jetty.start.Main.invokeMain(Main.java:321)
> >         at org.eclipse.jetty.start.Main.start(Main.java:817)
> >         at org.eclipse.jetty.start.Main.main(Main.java:112)
> > Caused by: java.io.IOException: Keystore was tampered with, or
> > password was incorrect
> >         at
> > sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)
> >         at
> > sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
> >         at java.security.KeyStore.load(KeyStore.java:1214)
> >         at
> >
> sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultKeyManager(SSLContextImpl.java:642)
> >         at
> >
> sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:527)
> >         at
> > sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> > Method)
> >         at
> >
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
> >         at
> >
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> >         at
> java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> >         at java.security.Provider$Service.newInstance(Provider.java:1240)
> >         ... 59 more
> > Caused by: java.security.UnrecoverableKeyException: Password
> > verification failed
> >         at
> > sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)
> >         ... 68 more
> >
> >
> > Katherine Mora
> >
>
>

Reply via email to