You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2005/01/14 21:49:59 UTC
svn commit: r125207 - in incubator/directory/changepw/trunk/core/src/java/org/apache/changepw: . io service
Author: erodriguez
Date: Fri Jan 14 12:49:57 2005
New Revision: 125207
URL: http://svn.apache.org/viewcvs?view=rev&rev=125207
Log:
Refactoring.
Modified:
incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java
incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java
incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java
incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java
Modified: incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java
Url: http://svn.apache.org/viewcvs/incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java?view=diff&rev=125207&p1=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java&r1=125206&p2=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java&r2=125207
==============================================================================
--- incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java (original)
+++ incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordDispatcher.java Fri Jan 14 12:49:57 2005
@@ -18,6 +18,7 @@
package org.apache.changepw;
import java.io.IOException;
+import java.nio.ByteBuffer;
import org.apache.changepw.io.ChangePasswordErrorEncoder;
import org.apache.changepw.io.ChangePasswordReplyEncoder;
@@ -25,6 +26,7 @@
import org.apache.changepw.messages.ChangePasswordError;
import org.apache.changepw.messages.ChangePasswordReply;
import org.apache.changepw.messages.ChangePasswordRequest;
+import org.apache.changepw.service.ChangePasswordServiceImpl;
import org.apache.changepw.store.PasswordStore;
import org.apache.kerberos.kdc.KdcConfiguration;
import org.apache.kerberos.kdc.KerberosException;
@@ -41,45 +43,45 @@
private ChangePasswordService changepwService;
private ChangePasswordErrorService errorService;
- public ChangePasswordDispatcher(KdcConfiguration config, BootstrapStore bootstrap, PasswordStore store)
+ public ChangePasswordDispatcher( KdcConfiguration config, BootstrapStore bootstrap, PasswordStore store )
{
this.config = config;
this.bootstrap = bootstrap;
this.store = store;
- errorService = new ChangePasswordErrorService(this.config);
- changepwService = new ChangePasswordService(this.store, this.bootstrap, this.config);
+ errorService = new ChangePasswordErrorService( this.config );
+ changepwService = new ChangePasswordServiceImpl( this.store, this.bootstrap, this.config );
}
- public byte[] dispatch(byte[] requestBytes) throws IOException
+ public byte[] dispatch( ByteBuffer requestBuffer ) throws IOException
{
byte[] reply = null;
try
{
ChangePasswordRequestDecoder decoder = new ChangePasswordRequestDecoder();
- ChangePasswordRequest changepwRequest = decoder.decode(requestBytes);
+ ChangePasswordRequest changepwRequest = decoder.decode( requestBuffer );
- ChangePasswordReply changepwReply = changepwService.getReplyFor(changepwRequest);
+ ChangePasswordReply changepwReply = changepwService.getReplyFor( changepwRequest );
ChangePasswordReplyEncoder encoder = new ChangePasswordReplyEncoder();
- reply = encoder.encode(changepwReply);
+ reply = encoder.encode( changepwReply );
}
- catch (KerberosException ke)
+ catch ( KerberosException ke )
{
- System.out.println("Returning error message: " + ke.getMessage());
- ChangePasswordError errorMessage = errorService.getReplyFor(ke);
+ System.out.println( "Returning error message: " + ke.getMessage() );
+ ChangePasswordError errorMessage = errorService.getReplyFor( ke );
ChangePasswordErrorEncoder errorEncoder = new ChangePasswordErrorEncoder();
- reply = errorEncoder.encode(errorMessage);
+ reply = errorEncoder.encode( errorMessage );
}
- catch (IOException ioe)
+ catch ( IOException ioe )
{
- System.out.println("Returning error message: " + ioe.getMessage());
+ System.out.println( "Returning error message: " + ioe.getMessage() );
ioe.printStackTrace();
ChangePasswordError errorMessage =
- errorService.getReplyFor(ChangePasswordException.KRB5_KPASSWD_MALFORMED);
+ errorService.getReplyFor( ChangePasswordException.KRB5_KPASSWD_MALFORMED );
ChangePasswordErrorEncoder errorEncoder = new ChangePasswordErrorEncoder();
- reply = errorEncoder.encode(errorMessage);
+ reply = errorEncoder.encode( errorMessage );
}
return reply;
Modified: incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java
Url: http://svn.apache.org/viewcvs/incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java?view=diff&rev=125207&p1=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java&r1=125206&p2=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java&r2=125207
==============================================================================
--- incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java (original)
+++ incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/ChangePasswordService.java Fri Jan 14 12:49:57 2005
@@ -18,166 +18,17 @@
package org.apache.changepw;
import java.io.IOException;
-import java.net.InetAddress;
-import javax.security.auth.kerberos.KerberosKey;
-import javax.security.auth.kerberos.KerberosPrincipal;
-
-import org.apache.changepw.io.ChangePasswordDataDecoder;
import org.apache.changepw.messages.ChangePasswordReply;
-import org.apache.changepw.messages.ChangePasswordReplyModifier;
import org.apache.changepw.messages.ChangePasswordRequest;
-import org.apache.changepw.store.PasswordStore;
-import org.apache.changepw.value.ChangePasswordData;
-import org.apache.changepw.value.ChangePasswordDataModifier;
-import org.apache.kerberos.crypto.encryption.EncryptionEngine;
-import org.apache.kerberos.io.decoder.EncKrbPrivPartDecoder;
-import org.apache.kerberos.io.encoder.EncApRepPartEncoder;
-import org.apache.kerberos.io.encoder.EncKrbPrivPartEncoder;
-import org.apache.kerberos.kdc.KdcConfiguration;
import org.apache.kerberos.kdc.KerberosException;
-import org.apache.kerberos.kdc.KerberosService;
-import org.apache.kerberos.kdc.store.PrincipalStore;
-import org.apache.kerberos.messages.ApplicationRequest;
-import org.apache.kerberos.messages.application.ApplicationReply;
-import org.apache.kerberos.messages.application.PrivateMessage;
-import org.apache.kerberos.messages.components.Authenticator;
-import org.apache.kerberos.messages.components.EncApRepPart;
-import org.apache.kerberos.messages.components.EncApRepPartModifier;
-import org.apache.kerberos.messages.components.EncKrbPrivPart;
-import org.apache.kerberos.messages.components.EncKrbPrivPartModifier;
-import org.apache.kerberos.messages.components.Ticket;
-import org.apache.kerberos.messages.value.EncryptedData;
-import org.apache.kerberos.messages.value.EncryptionKey;
-import org.apache.kerberos.messages.value.HostAddress;
/**
* Kerberos Change Password and Set Password Protocols (RFC 3244)
*/
-public class ChangePasswordService extends KerberosService
+public interface ChangePasswordService
{
- private PasswordStore store;
- private KdcConfiguration config;
-
- public ChangePasswordService(PasswordStore store, PrincipalStore bootstrap, KdcConfiguration config)
- {
- super(config, bootstrap, null);
-
- this.store = store;
- this.config = config;
- }
-
- public ChangePasswordReply getReplyFor(ChangePasswordRequest request)
- throws KerberosException, IOException
- {
- ApplicationRequest authHeader = request.getAuthHeader();
-
- Ticket ticket = authHeader.getTicket();
-
- Authenticator authenticator = verifyAuthHeader(authHeader, ticket);
-
- verifyTicket(ticket, config.getChangepwPrincipal());
-
- // TODO - check ticket is for service authorized to change passwords
- // ticket.getServerPrincipal().getName().equals(config.getChangepwPrincipal().getName()));
-
- // TODO - check client principal in ticket is authorized to change password
-
- // get the subsession key from the Authenticator
- EncryptionKey sessionKey = authenticator.getSubSessionKey();
-
- // getDecryptedData the request's private message with the subsession key
- EncryptedData encReqPrivPart = request.getPrivateMessage().getEncryptedPart();
- EncKrbPrivPart privatePart;
- try {
- EncryptionEngine engine = getEncryptionEngine(sessionKey);
-
- byte[] decPrivPart = engine.getDecryptedData(sessionKey, encReqPrivPart);
-
- EncKrbPrivPartDecoder privDecoder = new EncKrbPrivPartDecoder();
- privatePart = privDecoder.decode(decPrivPart);
- } catch (KerberosException ke) {
- ke.printStackTrace();
- throw ChangePasswordException.KRB5_KPASSWD_AUTHERROR;
- }
-
- ChangePasswordData passwordData = null;
-
- if (request.getProtocolVersionNumber() == (short)1) {
- // Use protocol version 0x0001, the legacy Kerberos change password protocol
- ChangePasswordDataModifier modifier = new ChangePasswordDataModifier();
- modifier.setNewPassword(privatePart.getUserData());
- passwordData = modifier.getChangePasswdData();
- } else {
- // Use protocol version 0xFF80, the backwards-compatible MS protocol
- ChangePasswordDataDecoder passwordDecoder = new ChangePasswordDataDecoder();
- passwordData = passwordDecoder.decodeChangePasswordData(privatePart.getUserData());
- }
-
- // usec and seq-number must be present per MS but aren't in legacy kpasswd
- // seq-number must have same value as authenticator
- // ignore r-address
-
- // generate key from password
- String password = new String(passwordData.getNewPassword());
- KerberosPrincipal clientPrincipal = authenticator.getClientPrincipal();
- KerberosKey newKey = new KerberosKey(clientPrincipal, password.toCharArray(), "DES");
-
- // store password in database
- String principalName = store.changePassword(clientPrincipal, newKey.getEncoded());
- System.out.println("Successfully modified principal named " + principalName);
-
- // begin building reply
-
- // create priv message
- // user-data component is short result code
- EncKrbPrivPartModifier modifier = new EncKrbPrivPartModifier();
- byte[] resultCode = {(byte)0x00, (byte)0x00};
- modifier.setUserData(resultCode);
-
- modifier.setSenderAddress(new HostAddress(InetAddress.getLocalHost()));
- EncKrbPrivPart privPart = modifier.getEncKrbPrivPart();
-
- EncKrbPrivPartEncoder encoder = new EncKrbPrivPartEncoder();
- byte[] encodedPrivPart = encoder.encode(privPart);
-
- EncryptedData encPrivPart = null;
- try {
- EncryptionEngine engine = getEncryptionEngine(sessionKey);
-
- encPrivPart = engine.getEncryptedData(sessionKey, encodedPrivPart);
- } catch (KerberosException ke) {
- ke.printStackTrace();
- }
- PrivateMessage privateMessage = new PrivateMessage(encPrivPart);
-
- // Begin AP_REP generation
- EncApRepPartModifier encApModifier = new EncApRepPartModifier();
- encApModifier.setClientTime(authenticator.getClientTime());
- encApModifier.setClientMicroSecond(authenticator.getClientMicroSecond());
- encApModifier.setSequenceNumber(new Integer(authenticator.getSequenceNumber()));
- encApModifier.setSubSessionKey(authenticator.getSubSessionKey());
-
- EncApRepPart repPart = encApModifier.getEncApRepPart();
- EncApRepPartEncoder repEncoder = new EncApRepPartEncoder();
- byte[] encodedRepPart = repEncoder.encode(repPart);
-
- EncryptedData encRepPart = null;
- try {
- EncryptionEngine engine = getEncryptionEngine(ticket.getSessionKey());
-
- encRepPart = engine.getEncryptedData(ticket.getSessionKey(), encodedRepPart);
- } catch (KerberosException ke) {
- ke.printStackTrace();
- }
- ApplicationReply appReply = new ApplicationReply(encRepPart);
-
- // return status message value object
- ChangePasswordReplyModifier replyModifier = new ChangePasswordReplyModifier();
- replyModifier.setApplicationReply(appReply);
- replyModifier.setPrivateMessage(privateMessage);
-
- return replyModifier.getChangePasswordReply();
- }
+ public ChangePasswordReply getReplyFor( ChangePasswordRequest request )
+ throws KerberosException, IOException;
}
Modified: incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java?view=diff&rev=125207&p1=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java&r1=125206&p2=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java&r2=125207
==============================================================================
--- incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java (original)
+++ incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/io/ChangePasswordRequestDecoder.java Fri Jan 14 12:49:57 2005
@@ -27,35 +27,33 @@
import org.apache.kerberos.messages.ApplicationRequest;
import org.apache.kerberos.messages.application.PrivateMessage;
-public class ChangePasswordRequestDecoder extends KerberosMessageDecoder {
-
- public ChangePasswordRequest decode(byte[] message) throws IOException {
-
- ByteBuffer buf = ByteBuffer.wrap(message);
-
+public class ChangePasswordRequestDecoder extends KerberosMessageDecoder
+{
+ public ChangePasswordRequest decode( ByteBuffer buf ) throws IOException
+ {
ChangePasswordRequestModifier modifier = new ChangePasswordRequestModifier();
- modifier.setMessageLength(buf.getShort());
- modifier.setProtocolVersionNumber(buf.getShort());
+ modifier.setMessageLength( buf.getShort() );
+ modifier.setProtocolVersionNumber( buf.getShort() );
short authHeaderLength = buf.getShort();
- modifier.setAuthHeaderLength(authHeaderLength);
+ modifier.setAuthHeaderLength( authHeaderLength );
- byte[] undecodedAuthHeader = new byte[authHeaderLength];
- buf.get(undecodedAuthHeader, 0, authHeaderLength);
+ byte[] undecodedAuthHeader = new byte[ authHeaderLength ];
+ buf.get( undecodedAuthHeader, 0, authHeaderLength );
ApplicationRequestDecoder decoder = new ApplicationRequestDecoder();
- ApplicationRequest authHeader = decoder.decode(undecodedAuthHeader);
+ ApplicationRequest authHeader = decoder.decode( undecodedAuthHeader );
- modifier.setAuthHeader(authHeader);
+ modifier.setAuthHeader( authHeader );
- byte[] encodedPrivate = new byte[buf.remaining()];
- buf.get(encodedPrivate, 0, buf.remaining());
+ byte[] encodedPrivate = new byte[ buf.remaining() ];
+ buf.get( encodedPrivate, 0, buf.remaining() );
PrivateMessageDecoder privateDecoder = new PrivateMessageDecoder();
- PrivateMessage privMessage = privateDecoder.decode(encodedPrivate);
+ PrivateMessage privMessage = privateDecoder.decode( encodedPrivate );
- modifier.setPrivateMessage(privMessage);
+ modifier.setPrivateMessage( privMessage );
return modifier.getChangePasswordMessage();
}
Modified: incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java
Url: http://svn.apache.org/viewcvs/incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java?view=diff&rev=125207&p1=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java&r1=125206&p2=incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java&r2=125207
==============================================================================
--- incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java (original)
+++ incubator/directory/changepw/trunk/core/src/java/org/apache/changepw/service/ChangePasswordServiceImpl.java Fri Jan 14 12:49:57 2005
@@ -17,11 +17,170 @@
package org.apache.changepw.service;
+import java.io.IOException;
+import java.net.InetAddress;
+
+import javax.security.auth.kerberos.KerberosKey;
+import javax.security.auth.kerberos.KerberosPrincipal;
+
+import org.apache.changepw.ChangePasswordException;
import org.apache.changepw.ChangePasswordService;
+import org.apache.changepw.io.ChangePasswordDataDecoder;
+import org.apache.changepw.messages.ChangePasswordReply;
+import org.apache.changepw.messages.ChangePasswordReplyModifier;
+import org.apache.changepw.messages.ChangePasswordRequest;
+import org.apache.changepw.store.PasswordStore;
+import org.apache.changepw.value.ChangePasswordData;
+import org.apache.changepw.value.ChangePasswordDataModifier;
+import org.apache.kerberos.crypto.encryption.EncryptionEngine;
+import org.apache.kerberos.io.decoder.EncKrbPrivPartDecoder;
+import org.apache.kerberos.io.encoder.EncApRepPartEncoder;
+import org.apache.kerberos.io.encoder.EncKrbPrivPartEncoder;
+import org.apache.kerberos.kdc.KdcConfiguration;
+import org.apache.kerberos.kdc.KerberosException;
+import org.apache.kerberos.kdc.KerberosService;
+import org.apache.kerberos.kdc.store.PrincipalStore;
+import org.apache.kerberos.messages.ApplicationRequest;
+import org.apache.kerberos.messages.application.ApplicationReply;
+import org.apache.kerberos.messages.application.PrivateMessage;
+import org.apache.kerberos.messages.components.Authenticator;
+import org.apache.kerberos.messages.components.EncApRepPart;
+import org.apache.kerberos.messages.components.EncApRepPartModifier;
+import org.apache.kerberos.messages.components.EncKrbPrivPart;
+import org.apache.kerberos.messages.components.EncKrbPrivPartModifier;
+import org.apache.kerberos.messages.components.Ticket;
+import org.apache.kerberos.messages.value.EncryptedData;
+import org.apache.kerberos.messages.value.EncryptionKey;
+import org.apache.kerberos.messages.value.HostAddress;
-public class ChangePasswordServiceImpl implements ChangePasswordService
+/**
+ * Kerberos Change Password and Set Password Protocols (RFC 3244)
+ */
+public class ChangePasswordServiceImpl extends KerberosService implements ChangePasswordService
{
+ private PasswordStore store;
+ private KdcConfiguration config;
+ public ChangePasswordServiceImpl( PasswordStore store, PrincipalStore bootstrap, KdcConfiguration config )
+ {
+ super(config, bootstrap, null);
+
+ this.store = store;
+ this.config = config;
+ }
+
+ public ChangePasswordReply getReplyFor(ChangePasswordRequest request)
+ throws KerberosException, IOException
+ {
+ ApplicationRequest authHeader = request.getAuthHeader();
+
+ Ticket ticket = authHeader.getTicket();
+
+ Authenticator authenticator = verifyAuthHeader(authHeader, ticket);
+
+ verifyTicket(ticket, config.getChangepwPrincipal());
+
+ // TODO - check ticket is for service authorized to change passwords
+ // ticket.getServerPrincipal().getName().equals(config.getChangepwPrincipal().getName()));
+
+ // TODO - check client principal in ticket is authorized to change password
+
+ // get the subsession key from the Authenticator
+ EncryptionKey sessionKey = authenticator.getSubSessionKey();
+
+ // getDecryptedData the request's private message with the subsession key
+ EncryptedData encReqPrivPart = request.getPrivateMessage().getEncryptedPart();
+ EncKrbPrivPart privatePart;
+ try {
+ EncryptionEngine engine = getEncryptionEngine(sessionKey);
+
+ byte[] decPrivPart = engine.getDecryptedData(sessionKey, encReqPrivPart);
+
+ EncKrbPrivPartDecoder privDecoder = new EncKrbPrivPartDecoder();
+ privatePart = privDecoder.decode(decPrivPart);
+ } catch (KerberosException ke) {
+ ke.printStackTrace();
+ throw ChangePasswordException.KRB5_KPASSWD_AUTHERROR;
+ }
+
+ ChangePasswordData passwordData = null;
+
+ if (request.getProtocolVersionNumber() == (short)1) {
+ // Use protocol version 0x0001, the legacy Kerberos change password protocol
+ ChangePasswordDataModifier modifier = new ChangePasswordDataModifier();
+ modifier.setNewPassword(privatePart.getUserData());
+ passwordData = modifier.getChangePasswdData();
+ } else {
+ // Use protocol version 0xFF80, the backwards-compatible MS protocol
+ ChangePasswordDataDecoder passwordDecoder = new ChangePasswordDataDecoder();
+ passwordData = passwordDecoder.decodeChangePasswordData(privatePart.getUserData());
+ }
+
+ // usec and seq-number must be present per MS but aren't in legacy kpasswd
+ // seq-number must have same value as authenticator
+ // ignore r-address
+
+ // generate key from password
+ String password = new String(passwordData.getNewPassword());
+ KerberosPrincipal clientPrincipal = authenticator.getClientPrincipal();
+ KerberosKey newKey = new KerberosKey(clientPrincipal, password.toCharArray(), "DES");
+
+ // store password in database
+ String principalName = store.changePassword(clientPrincipal, newKey.getEncoded());
+ System.out.println("Successfully modified principal named " + principalName);
+
+ // begin building reply
+
+ // create priv message
+ // user-data component is short result code
+ EncKrbPrivPartModifier modifier = new EncKrbPrivPartModifier();
+ byte[] resultCode = {(byte)0x00, (byte)0x00};
+ modifier.setUserData(resultCode);
+
+ modifier.setSenderAddress(new HostAddress(InetAddress.getLocalHost()));
+ EncKrbPrivPart privPart = modifier.getEncKrbPrivPart();
+
+ EncKrbPrivPartEncoder encoder = new EncKrbPrivPartEncoder();
+ byte[] encodedPrivPart = encoder.encode(privPart);
+
+ EncryptedData encPrivPart = null;
+ try {
+ EncryptionEngine engine = getEncryptionEngine(sessionKey);
+
+ encPrivPart = engine.getEncryptedData(sessionKey, encodedPrivPart);
+ } catch (KerberosException ke) {
+ ke.printStackTrace();
+ }
+ PrivateMessage privateMessage = new PrivateMessage(encPrivPart);
+
+ // Begin AP_REP generation
+ EncApRepPartModifier encApModifier = new EncApRepPartModifier();
+ encApModifier.setClientTime(authenticator.getClientTime());
+ encApModifier.setClientMicroSecond(authenticator.getClientMicroSecond());
+ encApModifier.setSequenceNumber(new Integer(authenticator.getSequenceNumber()));
+ encApModifier.setSubSessionKey(authenticator.getSubSessionKey());
+
+ EncApRepPart repPart = encApModifier.getEncApRepPart();
+ EncApRepPartEncoder repEncoder = new EncApRepPartEncoder();
+ byte[] encodedRepPart = repEncoder.encode(repPart);
+
+ EncryptedData encRepPart = null;
+ try {
+ EncryptionEngine engine = getEncryptionEngine(ticket.getSessionKey());
+
+ encRepPart = engine.getEncryptedData(ticket.getSessionKey(), encodedRepPart);
+ } catch (KerberosException ke) {
+ ke.printStackTrace();
+ }
+ ApplicationReply appReply = new ApplicationReply(encRepPart);
+
+ // return status message value object
+ ChangePasswordReplyModifier replyModifier = new ChangePasswordReplyModifier();
+ replyModifier.setApplicationReply(appReply);
+ replyModifier.setPrivateMessage(privateMessage);
+
+ return replyModifier.getChangePasswordReply();
+ }
}