2727import com .stormpath .sdk .servlet .form .Form ;
2828import com .stormpath .sdk .servlet .http .MediaType ;
2929import com .stormpath .sdk .servlet .http .Saver ;
30+ import org .apache .http .HttpStatus ;
31+ import org .slf4j .Logger ;
32+ import org .slf4j .LoggerFactory ;
3033
3134import javax .servlet .http .HttpServletRequest ;
3235import javax .servlet .http .HttpServletResponse ;
36+ import java .net .URLEncoder ;
3337import java .util .ArrayList ;
3438import java .util .Collections ;
3539import java .util .HashMap ;
4145 */
4246public class ChangePasswordController extends FormController {
4347
48+ private static final Logger log = LoggerFactory .getLogger (ChangePasswordController .class );
49+
4450 private String forgotPasswordUri ;
4551 private String loginUri ;
4652 private String loginNextUri ;
@@ -212,7 +218,7 @@ protected ViewModel onValidSubmit(HttpServletRequest request, HttpServletRespons
212218 String sptoken = form .getFieldValue ("sptoken" );
213219
214220 if (isJsonPreferred (request , response )) {
215- Map <String , Object > model = new HashMap <String , Object >();
221+ Map <String , Object > model = new HashMap <>();
216222 try {
217223 Account account = application .resetPassword (sptoken , password );
218224 if (autoLogin ) {
@@ -237,11 +243,22 @@ protected ViewModel onValidSubmit(HttpServletRequest request, HttpServletRespons
237243 if (autoLogin ) {
238244 final AuthenticationResult result = new TransientAuthenticationResult (account );
239245 this .authenticationResultSaver .set (request , response , result );
240- next = loginNextUri ;
246+ next = this . loginNextUri ;
241247 } else {
242248 next = this .nextUri ;
243249 }
250+ } catch (ResourceException e ) {
251+ // 404 is invalid, expired or used sptoken
252+ if (e .getCode () == HttpStatus .SC_NOT_FOUND ) {
253+ next = this .errorUri ;
254+ } else {
255+ // resolves https://github.com/stormpath/stormpath-sdk-java/issues/1138
256+ // TODO This breaks i18n. Fix when Stormpath backend returns specific password policy failure codes.
257+ ErrorModel errorModel = errorModelFactory .toError (request , e );
258+ next = getUri () + "?sptoken=" + sptoken + "&error=" + URLEncoder .encode (errorModel .getMessage (), "UTF-8" );
259+ }
244260 } catch (Exception e ) {
261+ log .error ("Caught exception: {}. Redirecting to: {}" , e .getMessage (), errorUri , e );
245262 next = errorUri ;
246263 }
247264
0 commit comments