package org.apereo.cas.adaptors.gauth;
import com.warrenstrange.googleauth.GoogleAuthenticatorKey;
import com.warrenstrange.googleauth.IGoogleAuthenticator;
import org.apereo.cas.adaptors.gauth.repository.credentials.GoogleAuthenticatorAccount;
import org.apereo.cas.otp.repository.credentials.BaseOneTimeTokenCredentialRepository;
import org.apereo.cas.otp.repository.credentials.OneTimeTokenAccount;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.util.Assert;
import javax.persistence.NoResultException;
import java.util.List;
/**
* This is {@link MongoDbGoogleAuthenticatorTokenCredentialRepository}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class MongoDbGoogleAuthenticatorTokenCredentialRepository extends BaseOneTimeTokenCredentialRepository {
private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbGoogleAuthenticatorTokenCredentialRepository.class);
private final IGoogleAuthenticator googleAuthenticator;
private final String collectionName;
private final MongoOperations mongoTemplate;
public MongoDbGoogleAuthenticatorTokenCredentialRepository(final IGoogleAuthenticator googleAuthenticator,
final MongoOperations mongoTemplate,
final String collectionName,
final boolean dropCollection) {
this.mongoTemplate = mongoTemplate;
this.collectionName = collectionName;
this.googleAuthenticator = googleAuthenticator;
Assert.notNull(this.mongoTemplate);
if (dropCollection) {
LOGGER.debug("Dropping database collection: [{}]", this.collectionName);
this.mongoTemplate.dropCollection(this.collectionName);
}
if (!this.mongoTemplate.collectionExists(this.collectionName)) {
LOGGER.debug("Creating database collection: [{}]", this.collectionName);
this.mongoTemplate.createCollection(this.collectionName);
}
}
@Override
public String toString() {
return getClass().getSimpleName();
}
@Override
public String getSecret(final String username) {
try {
final Query query = new Query();
query.addCriteria(Criteria.where("username").is(username));
final GoogleAuthenticatorAccount r = this.mongoTemplate.findOne(query, GoogleAuthenticatorAccount.class, this.collectionName);
if (r != null) {
return r.getSecretKey();
}
} catch (final NoResultException e) {
LOGGER.debug("No record could be found for google authenticator id [{}]", username);
}
return null;
}
@Override
public void save(final String userName, final String secretKey, final int validationCode, final List<Integer> scratchCodes) {
final GoogleAuthenticatorAccount account = new GoogleAuthenticatorAccount(userName, secretKey, validationCode, scratchCodes);
this.mongoTemplate.save(account, this.collectionName);
}
@Override
public OneTimeTokenAccount create(final String username) {
final GoogleAuthenticatorKey key = this.googleAuthenticator.createCredentials();
return new GoogleAuthenticatorAccount(username, key.getKey(), key.getVerificationCode(), key.getScratchCodes());
}
}