All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.electric.tool.project.Users Maven / Gradle / Ivy

There is a newer version: 9.02-e
Show newest version
/* -*- tab-width: 4 -*-
 *
 * Electric(tm) VLSI Design System
 *
 * File: Users.java
 * Project management tool: user management
 * Written by: Steven M. Rubin
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 *
 * Electric(tm) is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * Electric(tm) is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Electric(tm); see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, Mass 02111-1307, USA.
 */
package com.sun.electric.tool.project;

import com.sun.electric.tool.Job;
import com.sun.electric.util.TextUtils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;

/**
 * This is the user management part of the Project Management tool.
 */
public class Users
{
	/**
	 * There are two levels of security: low and medium.
	 * Medium security manages a list of user names/passwords and requires logging-in.
	 * It is only "medium" becuase the passwords are badly encrypted, and it is easy to add user names.
	 * Low security simply uses the user's name without questioning it.
	 */
	public static final boolean LOWSECURITY    = true;
    private static final String PUSERFILE      = "projectusers";

	/** the users */							private static HashMap usersMap;

	/**
	 * Method to return the number of users in the user database.
	 * @return the number of users in the user database.
	 */
	public static int getNumUsers()
	{
		ensureUserList();
		return usersMap.size();
	}

	/**
	 * Method to return an Iterator over the users in the user database.
	 * @return an Iterator over the users in the user database.
	 */
	public static Iterator getUsers()
	{
		ensureUserList();
		return usersMap.keySet().iterator();
	}

	/**
	 * Method to tell whether a user name is in the user database.
	 * @param user the user name.
	 * @return true if the user name is in the user database.
	 */
	public static boolean isExistingUser(String user)
	{
		ensureUserList();
		return usersMap.get(user) != null;
	}

	/**
	 * Method to remove a user name from the user database.
	 * @param user the user name to remove from the user database.
	 */
	public static void deleteUser(String user)
	{
		usersMap.remove(user);
		saveUserList();
	}

	/**
	 * Method to add a user to the user database.
	 * @param user the user name to add.
	 * @param encryptedPassword the encrypted password for the user.
	 */
	public static void addUser(String user, String encryptedPassword)
	{
		usersMap.put(user, encryptedPassword);
		saveUserList();
	}

	/**
	 * Method to return the encrypted password associated with a given user.
	 * @param user the user name.
	 * @return the user's encrypted password (null if not found).
	 */
	public static String getEncryptedPassword(String user)
	{
		return usersMap.get(user);
	}

	/**
	 * Method to change a user's encrypted password.
	 * @param user the user name.
	 * @param newEncryptedPassword the new encrypted password for the user.
	 */
	public static void changeEncryptedPassword(String user, String newEncryptedPassword)
	{
		usersMap.put(user, newEncryptedPassword);
		saveUserList();
	}

	/************************ USER SUPPORT ***********************/

	/**
	 * Method to ensuer that there is a valid user name.
	 * @return true if there is NO valid user name (also displays error message).
	 */
	static boolean needUserName()
	{
		Project.pmActive = true;
		if (Project.getCurrentUserName().length() == 0)
		{
			if (LOWSECURITY)
			{
				Project.setCurrentUserName(System.getProperty("user.name"));
				return false;
			}
			Job.getUserInterface().showErrorMessage(
				"You must select a user first (in the 'Project Management' panel of the Preferences dialog)",
				"No Valid User Name");
			return true;
		}
		return false;
	}

	private static void ensureUserList()
	{
		if (usersMap == null)
		{
			usersMap = new HashMap();
			String userFile = Project.getRepositoryLocation() + File.separator + PUSERFILE;
			URL url = TextUtils.makeURLToFile(userFile);
			try
			{
				URLConnection urlCon = url.openConnection();
				InputStreamReader is = new InputStreamReader(urlCon.getInputStream());
				LineNumberReader lnr = new LineNumberReader(is);

				for(;;)
				{
					String userLine = lnr.readLine();
					if (userLine == null) break;
					int colonPos = userLine.indexOf(':');
					if (colonPos < 0)
					{
						System.out.println("Missing ':' in user file: " + userLine);
						break;
					}
					String userName = userLine.substring(0, colonPos);
					String encryptedPassword = userLine.substring(colonPos+1);
					usersMap.put(userName, encryptedPassword);
				}

				lnr.close();
			} catch (IOException e)
			{
				System.out.println("Creating new user database");
			}
		}
	}

	private static void saveUserList()
	{
		// write the file back
		String userFile = Project.getRepositoryLocation() + File.separator + PUSERFILE;
		try
		{
			PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(userFile)));

			for(String userName : usersMap.keySet())
			{
				String encryptedPassword = usersMap.get(userName);
				printWriter.println(userName + ":" + encryptedPassword);
			}

			printWriter.close();
			System.out.println("Wrote " + userFile);
		} catch (IOException e)
		{
			System.out.println("Error writing " + userFile);
			return;
		}
	}

	private static final int ROTORSZ = 256;		/* a power of two */
	private static final int MASK =   (ROTORSZ-1);
	/**
	 * Method to encrypt a string in the most simple of ways.
	 * A one-rotor machine designed along the lines of Enigma but considerably trivialized.
	 * @param text the text to encrypt.
	 * @return an encrypted version of the text.
	 */
	public static String encryptPassword(String text)
	{
		// first setup the machine
		String key = "BicIsSchediwy";
		String readable = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-";
		int seed = 123;
		int keyLen = key.length();
		for (int i=0; i>= 8;
			int temp = t1[k];
			t1[k] = t1[ic];
			t1[ic] = (char)temp;
			if (t3[k] != 0) continue;
			ic = (random&MASK) % k;
			while (t3[ic] != 0) ic = (ic+1) % k;
			t3[k] = (char)ic;
			t3[ic] = (char)k;
		}
		for(int i=0; i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy