/*
 * Copyright (c) 2008-2012, 2016, 2019, 2020 Eike Stepper (Loehne, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.net4j.util.security;

import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
import org.eclipse.net4j.util.io.IORuntimeException;
import org.eclipse.net4j.util.lifecycle.Lifecycle;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Eike Stepper
 */
public class UserManager extends Lifecycle implements IUserManager, IAuthenticator
{
  @ExcludeFromDump
  protected transient Map<String, char[]> users = new HashMap<>();

  public UserManager()
  {
  }

  @Override
  public synchronized void addUser(String userID, char[] password)
  {
    users.put(userID, password);
    save(users);
  }

  @Override
  public synchronized void removeUser(String userID)
  {
    if (users.remove(userID) != null)
    {
      save(users);
    }
  }

  /**
   * @since 3.3
   */
  public synchronized char[] getPassword(String userID)
  {
    return users.get(userID);
  }

  /**
   * @since 3.3
   */
  @Override
  public void authenticate(String userID, char[] password)
  {
    char[] userPassword;
    synchronized (this)
    {
      userPassword = users.get(userID);
    }

    if (userPassword == null)
    {
      throw new SecurityException("No such user: " + userID); //$NON-NLS-1$
    }

    if (!Arrays.equals(userPassword, password))
    {
      throw new SecurityException("Wrong password for user: " + userID); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  @Override
  public byte[] encrypt(String userID, byte[] data, String algorithmName, byte[] salt, int count) throws SecurityException
  {
    char[] password;
    synchronized (this)
    {
      password = users.get(userID);
    }

    if (password == null)
    {
      throw new SecurityException("No such user: " + userID); //$NON-NLS-1$
    }

    try
    {
      return SecurityUtil.pbeEncrypt(data, password, algorithmName, salt, count);
    }
    catch (RuntimeException ex)
    {
      throw ex;
    }
    catch (Exception ex)
    {
      throw new SecurityException(ex);
    }
  }

  @Override
  protected void doActivate() throws Exception
  {
    super.doActivate();
    load(users);
  }

  @Override
  protected void doDeactivate() throws Exception
  {
    users.clear();
    super.doDeactivate();
  }

  protected void load(Map<String, char[]> users) throws IORuntimeException
  {
  }

  protected void save(Map<String, char[]> users) throws IORuntimeException
  {
  }
}
