/whois-update/src/main/java/net/ripe/db/whois/update/authentication/credential/AuthenticationModule.java

https://github.com/benkovsk/whois · Java · 122 lines · 99 code · 23 blank · 0 comment · 18 complexity · 7bf40f07540969c3d878271f9874480b MD5 · raw file

  1. package net.ripe.db.whois.update.authentication.credential;
  2. import com.google.common.collect.Lists;
  3. import com.google.common.collect.Maps;
  4. import net.ripe.db.whois.common.domain.CIString;
  5. import net.ripe.db.whois.common.rpsl.AttributeType;
  6. import net.ripe.db.whois.common.rpsl.RpslObject;
  7. import net.ripe.db.whois.update.domain.Credential;
  8. import net.ripe.db.whois.update.domain.Credentials;
  9. import net.ripe.db.whois.update.domain.PasswordCredential;
  10. import net.ripe.db.whois.update.domain.PgpCredential;
  11. import net.ripe.db.whois.update.domain.PreparedUpdate;
  12. import net.ripe.db.whois.update.domain.SsoCredential;
  13. import net.ripe.db.whois.update.domain.UpdateContext;
  14. import net.ripe.db.whois.update.domain.X509Credential;
  15. import net.ripe.db.whois.update.log.LoggerContext;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Component;
  20. import sun.reflect.Reflection;
  21. import java.util.Collection;
  22. import java.util.Collections;
  23. import java.util.Comparator;
  24. import java.util.List;
  25. import java.util.Map;
  26. @Component
  27. public class AuthenticationModule {
  28. private static final Logger LOGGER = LoggerFactory.getLogger(AuthenticationModule.class);
  29. private static final AuthComparator AUTH_COMPARATOR = new AuthComparator();
  30. private final Map<Class<? extends Credential>, CredentialValidator> credentialValidatorMap;
  31. private final LoggerContext loggerContext;
  32. @Autowired
  33. public AuthenticationModule(final LoggerContext loggerContext,
  34. final CredentialValidator<?>... credentialValidators) {
  35. this.loggerContext = loggerContext;
  36. credentialValidatorMap = Maps.newHashMap();
  37. for (final CredentialValidator<?> credentialValidator : credentialValidators) {
  38. credentialValidatorMap.put(credentialValidator.getSupportedCredentials(), credentialValidator);
  39. }
  40. }
  41. public List<RpslObject> authenticate(final PreparedUpdate update, final UpdateContext updateContext, final Collection<RpslObject> maintainers) {
  42. final Credentials offered = update.getCredentials();
  43. loggerContext.logAuthenticationStrategy(update.getUpdate(), Reflection.getCallerClass().getCanonicalName(), maintainers);
  44. final List<RpslObject> authenticatedCandidates = Lists.newArrayList();
  45. for (final RpslObject maintainer : maintainers) {
  46. if (hasValidCredentialForCandidate(update, updateContext, offered, maintainer)) {
  47. authenticatedCandidates.add(maintainer);
  48. }
  49. }
  50. return authenticatedCandidates;
  51. }
  52. private boolean hasValidCredentialForCandidate(final PreparedUpdate update, final UpdateContext updateContext, final Credentials offered, final RpslObject maintainer) {
  53. final List<CIString> authAttributes = Lists.newArrayList(maintainer.getValuesForAttribute(AttributeType.AUTH));
  54. Collections.sort(authAttributes, AUTH_COMPARATOR);
  55. for (final CIString auth : authAttributes) {
  56. final Credential credential = getCredential(auth);
  57. if (credential == null) {
  58. LOGGER.warn("Skipping unknown credential: {}", auth);
  59. continue;
  60. }
  61. final Class<? extends Credential> credentialClass = credential.getClass();
  62. final CredentialValidator credentialValidator = credentialValidatorMap.get(credentialClass);
  63. if (credentialValidator != null && credentialValidator.hasValidCredential(update, updateContext, offered.ofType(credentialClass), credential)) {
  64. return true;
  65. }
  66. }
  67. return false;
  68. }
  69. private Credential getCredential(final CIString auth) {
  70. if (auth.startsWith("md5-pw")) {
  71. return new PasswordCredential(auth.toString());
  72. }
  73. if (auth.startsWith("pgpkey")) {
  74. return PgpCredential.createKnownCredential(auth.toString());
  75. }
  76. if (auth.startsWith("x509")) {
  77. return X509Credential.createKnownCredential(auth.toString());
  78. }
  79. if (auth.startsWith("sso")) {
  80. return SsoCredential.createKnownCredential(auth.toString());
  81. }
  82. return null;
  83. }
  84. private static class AuthComparator implements Comparator<CIString> {
  85. private static final CIString SSO = CIString.ciString("SSO");
  86. @Override
  87. public int compare(final CIString o1, final CIString o2) {
  88. final boolean o1Sso = o1.startsWith(SSO);
  89. final boolean o2Sso = o2.startsWith(SSO);
  90. if (o1Sso == o2Sso) {
  91. return 0;
  92. } else if (o1Sso) {
  93. return -1;
  94. } else {
  95. return 1;
  96. }
  97. }
  98. }
  99. }