package plugins;
import java.util.Date;
import models.User;
import models.dao.UserDAO;
import play.Application;
import play.Logger;
import play.Logger.ALogger;
import com.feth.play.module.pa.providers.oauth2.OAuth2AuthInfo;
import com.feth.play.module.pa.providers.oauth2.facebook.FacebookAuthUser;
import com.feth.play.module.pa.service.UserServicePlugin;
import com.feth.play.module.pa.user.AuthUser;
import com.feth.play.module.pa.user.AuthUserIdentity;
public class AuthenticatePlugin extends UserServicePlugin {
private static ALogger log = Logger.of(AuthenticatePlugin.class);
private static AuthenticatePlugin instance;// plugin instance
private UserDAO userDAO;
public AuthenticatePlugin(Application app) {
super(app);
if (log.isInfoEnabled())
log.debug(getClass().getSimpleName() + " created.");
}
@Override
public Object save(final AuthUser authUser) {
if (log.isDebugEnabled())
log.debug("save <-");
if (log.isDebugEnabled())
log.debug("authUser : " + authUser);
String userKey = User.getKey(authUser.getProvider(), authUser.getId());
User user = userDAO().get(userKey);
if (log.isDebugEnabled())
log.debug("user : " + user);
if (user == null) {
user = new User();
user.setKey(authUser.getProvider(), authUser.getId());
if (authUser instanceof FacebookAuthUser) {
FacebookAuthUser fbu = (FacebookAuthUser) authUser;
// Remember, even when getting them from FB & Co., emails should be
// verified within the application as a security breach there might
// break your security as well!
//TODO:user.setEmailValidated(false);
user.setEmail(fbu.getEmail());
user.setFirstName(fbu.getFirstName());
user.setLastName(fbu.getLastName());
user.setGender(fbu.getGender());
OAuth2AuthInfo authInfo = fbu.getOAuth2AuthInfo();
user.setAccessToken(authInfo.getAccessToken());
user.setAccessExpires(new Date(authInfo.getExpiration()));
user.setProfileImageURL(fbu.getPicture());
}
userDAO().create(user);
return userKey;
} else {
// we have this user already, so return null
user.setLoginCount(user.getLoginCount() + 1);
user.setLastLogin(new Date());
userDAO().update(user);
return null;
}
}
private UserDAO userDAO() {
if (userDAO == null)
userDAO = GuicePlugin.getInstance().getInstance(UserDAO.class);
return userDAO;
}
@Override
public AuthUser update(final AuthUser authUser) {
// User logged in again
if (log.isDebugEnabled())
log.debug("authUser : " + authUser);
String userKey = User.getKey(authUser.getProvider(), authUser.getId());
User user = userDAO().get(userKey);
if (log.isDebugEnabled())
log.debug("user : " + user);
if (user != null) {
// bump last login date
user.setLastLogin(new Date());
// update info from facebook
if (authUser instanceof FacebookAuthUser) {
FacebookAuthUser fbu = (FacebookAuthUser) authUser;
// Remember, even when getting them from FB & Co., emails should be
// verified within the application as a security breach there might
// break your security as well!
//TODO:user.setEmailValidated(false);
user.setEmail(fbu.getEmail());
user.setFirstName(fbu.getFirstName());
user.setLastName(fbu.getLastName());
user.setGender(fbu.getGender());
OAuth2AuthInfo authInfo = fbu.getOAuth2AuthInfo();
user.setAccessToken(authInfo.getAccessToken());
user.setAccessExpires(new Date(authInfo.getExpiration()));
user.setProfileImageURL(fbu.getPicture());
}
userDAO().update(user);
}
return super.update(authUser);
}
@Override
public Object getLocalIdentity(final AuthUserIdentity identity) {
if (log.isDebugEnabled())
log.debug("getLocalIdentity <-");
String userKey = User.getKey(identity.getProvider(), identity.getId());
User user = userDAO().get(userKey);
if (log.isDebugEnabled())
log.debug("user : " + user);
if(user != null) {
return user.getKey();
} else {
return null;
}
}
@Override
public AuthUser merge(final AuthUser newUser, final AuthUser oldUser) {
if (log.isDebugEnabled())
log.debug("merge <-");
if (!oldUser.equals(newUser)) {
//TODO: User.merge(oldUser, newUser);
}
return oldUser;
}
@Override
public AuthUser link(final AuthUser oldUser, final AuthUser newUser) {
if (log.isDebugEnabled())
log.debug("link <-");
//TODO: User.addLinkedAccount(oldUser, newUser);
return null;
}
public User find(String userKey) {
if (log.isDebugEnabled())
log.debug("find() <-");
if (log.isDebugEnabled())
log.debug("userKey : " + userKey);
final User user = userDAO().get(userKey);
if (log.isDebugEnabled())
log.debug("user : " + user);
return user;
}
public User find(AuthUser authUser) {
if (log.isDebugEnabled())
log.debug("find <- " + authUser);
if (authUser == null) return null;
String userKey = User.getKey(authUser.getProvider(), authUser.getId());
if (log.isDebugEnabled())
log.debug("userKey : " + userKey);
User user = userDAO().get(userKey);
if (log.isDebugEnabled())
log.debug("user : " + user);
return user;
}
@Override
public void onStart() {
instance = this;
userDAO = GuicePlugin.getInstance().getInstance(UserDAO.class);
if (log.isDebugEnabled())
log.debug("userDAO : " + userDAO);
super.onStart();
log.info(getClass().getSimpleName() + " started.");
}
@Override
public void onStop() {
instance = null;
userDAO = null;
if (log.isDebugEnabled())
log.debug("userDAO : " + userDAO);
super.onStop();
if (log.isInfoEnabled())
log.debug(getClass().getSimpleName() + " stopped.");
}
public static AuthenticatePlugin getInstance() {
return instance;
}
@Override
public boolean enabled() {
return true;
}
}