/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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 org.apereo.portal.jgroups.auth; import java.io.DataInput; import java.io.DataOutput; import org.jgroups.Message; import org.jgroups.auth.AuthToken; import org.jgroups.logging.LogFactory; import org.jgroups.util.Util; import org.springframework.security.core.token.Sha512DigestUtils; public class HashedDaoAuthToken extends AuthToken { private static volatile AuthDao authDao; public static void setAuthDao(AuthDao authDao) { if (HashedDaoAuthToken.authDao != null) { LogFactory.getLog(HashedDaoAuthToken.class) .warn( "A AuthDao was already set. " + HashedDaoAuthToken.authDao + " will be replaced with " + authDao); } HashedDaoAuthToken.authDao = authDao; } private String authValue; public String getAuthValue() { String av = authValue; if (av == null) { if (HashedDaoAuthToken.authDao == null) { throw new IllegalStateException( "An AuthDao needs to be injected for the HashedDaoAuthToken to function"); } final String authToken = authDao.getAuthToken(this.getName()); if (authToken != null) { av = Sha512DigestUtils.shaHex(authToken); this.authValue = av; } } return av; } public String getName() { return HashedDaoAuthToken.class.getName(); } public boolean authenticate(AuthToken token, Message msg) { if ((token != null) && (token instanceof HashedDaoAuthToken)) { // Found a valid Token to authenticate against HashedDaoAuthToken serverToken = (HashedDaoAuthToken) token; final String localAuthValue = this.getAuthValue(); final String messageAuthValue = serverToken.getAuthValue(); if ((localAuthValue != null) && (messageAuthValue != null) && (localAuthValue.equalsIgnoreCase(messageAuthValue))) { // validated log.debug("HashedDaoAuthToken match"); return true; } else { return false; } } if (log.isWarnEnabled()) { log.warn("Invalid AuthToken instance - wrong type or null: " + token); } return false; } public void writeTo(DataOutput out) throws Exception { if (log.isDebugEnabled()) { log.debug("HashedDaoAuthToken writeTo()"); } Util.writeString(this.getAuthValue(), out); } public void readFrom(DataInput in) throws Exception { if (log.isDebugEnabled()) { log.debug("HashedDaoAuthToken readFrom()"); } this.authValue = Util.readString(in); } }