/*
* Copyright (C) 2014 Divide.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.divide.client.auth;
import com.google.inject.Inject;
import io.divide.client.GsonResponse;
import io.divide.client.auth.credentials.LoginCredentials;
import io.divide.client.auth.credentials.SignUpCredentials;
import io.divide.client.auth.credentials.ValidCredentials;
import io.divide.shared.logging.Logger;
import io.divide.shared.server.AuthServerLogic;
import io.divide.shared.server.DAO;
import io.divide.shared.server.KeyManager;
import io.divide.shared.transitory.Credentials;
import io.divide.shared.transitory.TransientObject;
import io.divide.shared.util.ObjectUtils;
import retrofit.client.Response;
import retrofit.http.Body;
import retrofit.http.Header;
import retrofit.http.Path;
import rx.Observable;
import rx.Subscriber;
import java.util.Map;
import static io.divide.shared.util.DaoUtils.to;
public class MockAuthWebService implements AuthWebService{
private static Logger logger = Logger.getLogger(MockAuthWebService.class);
private AuthServerLogic<TransientObject> authServerLogic;
private AuthManager authManager;
@Inject
public MockAuthWebService(DAO<TransientObject, TransientObject> dao, KeyManager keyManager) {
this.authServerLogic = new AuthServerLogic<TransientObject>(dao,keyManager);
}
// must be done after initialization to prevent cyclic referencing
public void setAuthManger(AuthManager authManager){
this.authManager = authManager;
}
@Override
public Response userSignUp(@Body SignUpCredentials credentials) {
try {
Credentials c = authServerLogic.userSignUp(credentials);
return new GsonResponse("",200,"",null, c).build();
} catch (DAO.DAOException e) {
return new GsonResponse("",e.getStatusCode(),e.getMessage(), null, null).build();
}
}
@Override
public Observable<ValidCredentials> userSignUpA(@Body SignUpCredentials credentials) {
try {
return Observable.from(to(ValidCredentials.class, authServerLogic.userSignUp(credentials)));
} catch (DAO.DAOException e) {
return Observable.error(e);
}
}
@Override
public Response login(@Body LoginCredentials credentials) {
try{
Credentials dbCreds = authServerLogic.userSignIn(credentials);
return new GsonResponse("",200,"",null, dbCreds).build();
}catch(DAO.DAOException e) {
return new GsonResponse("",e.getStatusCode(),e.getMessage(), null, null).build();
}
}
@Override
public Observable<ValidCredentials> loginA(@Body LoginCredentials credentials) {
try {
return Observable.from(to(ValidCredentials.class, authServerLogic.userSignIn(credentials)));
} catch (DAO.DAOException e) {
return Observable.error(e);
}
}
@Override
public Observable<byte[]> getPublicKeyA() {
return Observable.from(authServerLogic.getPublicKey());
}
@Override
public byte[] getPublicKey() {
return authServerLogic.getPublicKey();
}
@Override
public Observable<ValidCredentials> getUserFromAuthToken(@Path("token") String authToken) {
try {
return Observable.from(to(ValidCredentials.class, authServerLogic.getUserFromAuthToken(authToken)));
} catch (DAO.DAOException e) {
return Observable.error(e);
}
}
@Override
public Observable<ValidCredentials> getUserFromRecoveryToken(final @Path("token") String authToken) {
return Observable.create(new Observable.OnSubscribe<ValidCredentials>() {
@Override
public void call(Subscriber<? super ValidCredentials> subscriber) {
try {
subscriber.onNext(to(ValidCredentials.class, authServerLogic.getUserFromRecoveryToken(authToken)));
} catch (DAO.DAOException e) {
System.out.println(e.getStatusCode() + " : " + e.getMessage());
subscriber.onError(e);
}
}
});
}
@Override
public Observable<Void> sendUserData(@Header("Authorization") String authToken, @Path("userId") final String userId, @Body final Map<String, ?> data) {
verifyAuthToken(authToken);
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
try {
System.err.println("Saving: " + userId + ", " + data);
authServerLogic.recieveUserData(userId, data);
subscriber.onNext(null);
} catch (DAO.DAOException e) {
subscriber.onError(e);
}
}
});
}
@Override
public Observable<Map<String,Object>> getUserData(@Header("Authorization") final String authToken, final String userId) {
verifyAuthToken(authToken);
return Observable.create(new Observable.OnSubscribe<Map<String,Object>>() {
@Override
public void call(Subscriber<? super Map<String,Object>> subscriber) {
try {
Credentials x = authServerLogic.getUserById(userId);
TransientObject to = ObjectUtils.get1stOrNull(x);
if(to!=null){
subscriber.onNext(authServerLogic.sendUserData(userId));
} else {
subscriber.onNext(null);
}
} catch (DAO.DAOException e) {
subscriber.onError(e);
}
}
});
}
public void verifyAuthToken(String token){
System.out.println("MockAuthWebService: " + token);
token = token.substring("CUSTOM ".length(),token.length());
if(token == null ||
token.length() == 0 || //TODO token should be fixed length, verify against this also
authManager == null ||
authManager.getUser() == null ||
authManager.getUser().getAuthToken() == null ||
!authManager.getUser().getAuthToken().equals(token)){
throw new RuntimeException("");
}
}
}