public EmailChannel(String configuration) {
   Properties props = new Properties();
   try {
     props.load(new StringReader(configuration));
   } catch (IOException e) {
     // really shouldn't happen
     throw new IllegalStateException(
         "Bug: can't load email properties " + "for the channel instance", e);
   }
   String smtpUser = props.getProperty(CFG_USER);
   String smtpPassword = props.getProperty(CFG_PASSWD);
   Authenticator smtpAuthn =
       (smtpUser != null && smtpPassword != null)
           ? new SimpleAuthenticator(smtpUser, smtpPassword)
           : null;
   String trustAll = props.getProperty(CFG_TRUST_ALL);
   if (trustAll != null && "true".equalsIgnoreCase(trustAll)) {
     MailSSLSocketFactory trustAllSF;
     try {
       trustAllSF = new MailSSLSocketFactory();
     } catch (GeneralSecurityException e) {
       // really shouldn't happen
       throw new IllegalStateException("Can't init trust-all SSL socket factory", e);
     }
     trustAllSF.setTrustAllHosts(true);
     props.put("mail.smtp.ssl.socketFactory", trustAllSF);
   } else {
     X509CertChainValidator validator = pkiManagement.getMainAuthnAndTrust().getValidator();
     SSLSocketFactory factory = SocketFactoryCreator.getSocketFactory(null, validator);
     props.put("mail.smtp.ssl.socketFactory", factory);
   }
   session = Session.getInstance(props, smtpAuthn);
 }
  /** Creates a new SSLSocket bound to ContextWrapper * */
  private Socket createSocket() throws IOException {

    if (_factory == null) {
      Properties attributes = getCurrentProperties();
      StoreUpdateListener listener =
          new StoreUpdateListener() {
            public void loadingNotification(
                String location, String type, Severity level, Exception cause) {
              if (level != Severity.NOTIFICATION) {
                System.out.println(
                    "Error when creating or using SSL socket. Type "
                        + type
                        + " level: "
                        + level
                        + " cause: "
                        + cause.getClass()
                        + ":"
                        + cause.getMessage());
              } else {
                // log successful (re)loading
              }
            }
          };

      ArrayList<StoreUpdateListener> listenerList = new ArrayList<StoreUpdateListener>();
      listenerList.add(listener);

      RevocationParameters revParam =
          new RevocationParameters(
              CrlCheckingMode.REQUIRE,
              new OCSPParametes(),
              false,
              RevocationCheckingOrder.CRL_OCSP);

      String crlCheckingMode = (String) attributes.get(CRL_CHEKING_MODE_STRING);
      if (crlCheckingMode != null) {
        if (crlCheckingMode.equalsIgnoreCase("ifvalid")) {
          revParam =
              new RevocationParameters(
                  CrlCheckingMode.IF_VALID,
                  new OCSPParametes(),
                  false,
                  RevocationCheckingOrder.CRL_OCSP);
        } else {
          if (crlCheckingMode.equalsIgnoreCase("ignore")) {
            revParam =
                new RevocationParameters(
                    CrlCheckingMode.IGNORE,
                    new OCSPParametes(),
                    false,
                    RevocationCheckingOrder.CRL_OCSP);
          }
        }
      }

      ProxySupport proxySupport = ProxySupport.ALLOW;
      String proxySupportString = (String) attributes.get(PROXY_SUPPORT_STRING);
      if (proxySupportString != null) {
        if (proxySupportString.equalsIgnoreCase("no")
            || proxySupportString.equalsIgnoreCase("false")) {
          proxySupport = ProxySupport.DENY;
        }
      }

      ValidatorParams validatorParams = new ValidatorParams(revParam, proxySupport, listenerList);

      String trustStoreLocation = (String) attributes.get(TRUSTSTORE_STRING);
      if (trustStoreLocation == null) {
        throw new IOException(
            "No truststore defined, unable to load CA certificates and thus create SSL socket.");
      }

      String namespaceModeString = (String) attributes.get(NAMESPACE_STRING);
      NamespaceCheckingMode namespaceMode = NamespaceCheckingMode.EUGRIDPMA_AND_GLOBUS;
      if (namespaceModeString != null) {
        if (namespaceModeString.equalsIgnoreCase("no")
            || namespaceModeString.equalsIgnoreCase("false")
            || namespaceModeString.equalsIgnoreCase("off")) {
          namespaceMode = NamespaceCheckingMode.IGNORE;
        } else {
          if (namespaceModeString.equalsIgnoreCase("require")) {
            namespaceMode = NamespaceCheckingMode.EUGRIDPMA_AND_GLOBUS_REQUIRE;
          }
        }
      }

      String intervalString = (String) attributes.get(UPDATEINTERVAL_STRING);
      long intervalMS = 3600000; // update ever hour
      if (intervalString != null) {
        intervalMS = Long.parseLong(intervalString);
      }

      OpensslCertChainValidator validator =
          new OpensslCertChainValidator(
              trustStoreLocation, namespaceMode, intervalMS, validatorParams);

      X509Credential credentials = null;

      String proxyLoc = (String) attributes.get(PROXY_STRING);
      if (proxyLoc != null) {
        try {
          credentials = new PEMCredential(proxyLoc, (char[]) null);
        } catch (KeyStoreException e) {
          throw new IOException("Error opening proxy from " + proxyLoc + ": ", e);
        } catch (CertificateException e) {
          throw new IOException("Error reading proxy from " + proxyLoc + ": ", e);
        }
      } else {

        String hostCertLoc = (String) attributes.get(CERT_STRING);
        if (hostCertLoc == null) {
          throw new IOException(
              "Variable hostcert undefined, cannot start server with SSL/TLS without host certificate.");
        }
        java.security.cert.X509Certificate[] hostCertChain =
            CertificateUtils.loadCertificateChain(new FileInputStream(hostCertLoc), Encoding.PEM);

        String password = (String) attributes.get(PASSWORD_STRING);
        String hostKeyLoc = (String) attributes.get(KEY_STRING);
        if (hostKeyLoc == null) {
          throw new IOException(
              "Variable hostkey undefined, cannot start server with SSL/TLS without host private key.");
        }
        PrivateKey hostKey =
            CertificateUtils.loadPrivateKey(
                new FileInputStream(hostKeyLoc),
                Encoding.PEM,
                password == null ? null : password.toCharArray());

        try {
          credentials = new KeyAndCertCredential(hostKey, hostCertChain);
        } catch (KeyStoreException e) {
          throw new IOException("Error while creating keystore: " + e + ": " + e.getMessage(), e);
        }
      }
      SSLSocketFactory newFactory = SocketFactoryCreator.getSocketFactory(credentials, validator);
      SSLSocket socket = (SSLSocket) newFactory.createSocket();
      return socket;
    } else {
      return _factory.createSocket();
    }
  }