/* * 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. * under the License. */ package org.apache.karaf.jaas.modules.audit; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; public class FileAuditLoginModule extends AbstractAuditLoginModule { public static final String LOG_FILE_OPTION = "file"; private final static DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); private String logFile; public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { super.initialize(subject, callbackHandler, sharedState, options); logFile = (String) options.get(LOG_FILE_OPTION); } protected synchronized void audit(Action action, String username) { Date date = new Date(); try { File file = new File(logFile); file.getParentFile().mkdirs(); FileOutputStream out = new FileOutputStream(file, true); FileChannel channel = out.getChannel(); FileLock lock = channel.lock(0, Long.MAX_VALUE, false); PrintWriter writer = new PrintWriter(out, false); String actionStr; switch (action) { case ATTEMPT: actionStr = "Authentication attempt"; break; case SUCCESS: actionStr = "Authentication succeeded"; break; case FAILURE: actionStr = "Authentication failed"; break; case LOGOUT: actionStr = "Explicit logout"; break; default: actionStr = action.toString(); break; } writer.println(DATE_FORMAT.format(date) + " - " + actionStr + " - " + username); writer.flush(); writer.close(); if (lock.isValid()) { lock.release(); } } catch (IOException e) { throw new RuntimeException("Unable to write to authentication log file", e); } } }