Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ChangeCredentialsIndication.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ChangeCredentialsIndication.java130
1 files changed, 130 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ChangeCredentialsIndication.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ChangeCredentialsIndication.java
new file mode 100644
index 0000000000..a42a7bccce
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ChangeCredentialsIndication.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2009-2013 Eike Stepper (Berlin, Germany), CEA LIST, and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ * Christian W. Damus (CEA LIST) - Adapted from AuthenticationIndication for 399306
+ */
+package org.eclipse.emf.cdo.internal.net4j.protocol;
+
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+import org.eclipse.emf.cdo.internal.net4j.bundle.OM;
+
+import org.eclipse.net4j.signal.IndicationWithMonitoring;
+import org.eclipse.net4j.signal.SignalProtocol;
+import org.eclipse.net4j.util.StringUtil;
+import org.eclipse.net4j.util.io.ExtendedDataInputStream;
+import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
+import org.eclipse.net4j.util.om.monitor.OMMonitor;
+import org.eclipse.net4j.util.om.monitor.OMMonitor.Async;
+import org.eclipse.net4j.util.security.DiffieHellman;
+import org.eclipse.net4j.util.security.DiffieHellman.Client.Response;
+import org.eclipse.net4j.util.security.DiffieHellman.Server.Challenge;
+import org.eclipse.net4j.util.security.IPasswordCredentialsProvider;
+import org.eclipse.net4j.util.security.IPasswordCredentialsUpdate;
+import org.eclipse.net4j.util.security.IPasswordCredentialsUpdateProvider;
+
+import org.eclipse.emf.spi.cdo.InternalCDOSession;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * Implementation of the CDO client handler for the server-initiated change-credentials protocol.
+ */
+public class ChangeCredentialsIndication extends IndicationWithMonitoring
+{
+ private Challenge challenge;
+
+ public ChangeCredentialsIndication(SignalProtocol<?> protocol)
+ {
+ super(protocol, CDOProtocolConstants.SIGNAL_CHANGE_CREDENTIALS);
+ }
+
+ @Override
+ public CDOClientProtocol getProtocol()
+ {
+ return (CDOClientProtocol)super.getProtocol();
+ }
+
+ protected InternalCDOSession getSession()
+ {
+ return (InternalCDOSession)getProtocol().getSession();
+ }
+
+ @Override
+ protected void indicating(ExtendedDataInputStream in, OMMonitor monitor) throws Exception
+ {
+ challenge = new Challenge(in);
+ }
+
+ @Override
+ protected void responding(ExtendedDataOutputStream out, OMMonitor monitor) throws Exception
+ {
+ monitor.begin();
+ Async async = monitor.forkAsync();
+
+ try
+ {
+ IPasswordCredentialsProvider credentialsProvider = getSession().getCredentialsProvider();
+ if (!(credentialsProvider instanceof IPasswordCredentialsUpdateProvider))
+ {
+ throw new IllegalStateException("No credentials update provider configured"); //$NON-NLS-1$
+ }
+
+ IPasswordCredentialsUpdate credentials = ((IPasswordCredentialsUpdateProvider)credentialsProvider)
+ .getCredentialsUpdate();
+ if (credentials == null)
+ {
+ // user canceled. Fine
+ out.writeBoolean(false);
+ return;
+ }
+
+ String userID = credentials.getUserID();
+ if (StringUtil.isEmpty(userID))
+ {
+ throw new IllegalStateException("No userID provided"); //$NON-NLS-1$
+ }
+
+ String password = new String(credentials.getPassword());
+ if (StringUtil.isEmpty(password))
+ {
+ throw new IllegalStateException("No password provided"); //$NON-NLS-1$
+ }
+
+ String newPassword = new String(credentials.getNewPassword());
+ if (StringUtil.isEmpty(newPassword))
+ {
+ throw new IllegalStateException("No new password provided"); //$NON-NLS-1$
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ @SuppressWarnings("resource")
+ ExtendedDataOutputStream stream = new ExtendedDataOutputStream(baos);
+ stream.writeString(userID);
+ stream.writeString(password);
+ stream.writeString(newPassword);
+ stream.flush();
+ byte[] clearText = baos.toByteArray();
+
+ DiffieHellman.Client client = new DiffieHellman.Client();
+ Response response = client.handleChallenge(challenge, clearText);
+ out.writeBoolean(true);
+ response.write(out);
+ }
+ catch (Throwable ex)
+ {
+ out.writeBoolean(false);
+ OM.LOG.error(ex);
+ }
+ finally
+ {
+ async.stop();
+ monitor.done();
+ }
+ }
+}

Back to the top