home *** CD-ROM | disk | FTP | other *** search
- package netscape.secfile;
-
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.FilenameFilter;
- import java.io.IOException;
- import java.io.Writer;
- import java.util.Hashtable;
- import java.util.Vector;
- import netscape.security.Principal;
- import netscape.security.PrivilegeManager;
-
- public class SecureFile extends File {
- private static String indexDir = null;
- private static String indexDirSep;
- private static Hashtable prinToReldirHashtable = new Hashtable();
- private String prepend;
- private Principal prin;
- private String path;
- private String canonicalPath;
- public static final String separator;
- public static final char separatorChar;
- public static final String pathSeparator;
- public static final char pathSeparatorChar;
-
- private static long random() {
- PrivilegeManager.enableTarget("UniversalPropertyRead");
- PrivilegeManager.enableTarget("UniversalFileRead");
- File var0 = new File(System.getProperty("user.home"));
- long var1 = 0L;
- if (var0.list() != null) {
- for(int var3 = 0; var3 < var0.list().length; ++var3) {
- File var4 = new File(System.getProperty("user.home") + File.separator + var0.list()[var3]);
- var1 += var4.length();
- }
- }
-
- long var5 = System.currentTimeMillis();
- return (var1 & 65535L) << 16 | var5 & 65535L;
- }
-
- private static synchronized void getIndexDir() {
- if (indexDir == null) {
- PrivilegeManager.enableTarget("UniversalPropertyRead");
- indexDir = System.getProperty("user.home") + separator + "secfile";
- indexDirSep = indexDir + separator;
- File var0 = new File(indexDir);
- PrivilegeManager.enableTarget("UniversalFileRead");
- if (!var0.exists()) {
- PrivilegeManager.enableTarget("UniversalFileWrite");
- if (!var0.mkdir()) {
- throw new SecureFileException("Error creating secfile directory");
- }
- }
- }
-
- }
-
- private static void putIndexfileIntoHashtable() {
- Hashtable var0 = prinToReldirHashtable;
- synchronized(var0){}
-
- try {
- if (prinToReldirHashtable.size() == 0) {
- File var2 = new File(indexDirSep + "index.txt");
- PrivilegeManager.enableTarget("UniversalFileRead");
- if (var2.exists()) {
- try {
- BufferedReader var3 = new BufferedReader(new FileReader(indexDirSep + "index.txt"));
-
- while(true) {
- String var4 = var3.readLine();
- if (var4 == null) {
- break;
- }
-
- int var5 = var4.indexOf(" ");
- if (var5 <= 0 || var5 >= var4.length() - 1) {
- var3.close();
- var2.renameTo(new File(indexDirSep + "index.bad"));
- throw new SecureFileException("Syntax error in index file");
- }
-
- prinToReldirHashtable.put(var4.substring(var5 + 1), var4.substring(0, var5));
- }
- } catch (IOException var8) {
- var2.renameTo(new File(indexDirSep + "index.bad"));
- throw new SecureFileException("Error reading index file" + var8);
- }
- }
- }
- } catch (Throwable var9) {
- throw var9;
- }
-
- }
-
- private static void addNewPrincipal(String var0) {
- Hashtable var2 = prinToReldirHashtable;
- synchronized(var2){}
-
- try {
- if (prinToReldirHashtable.get(var0) == null) {
- PrivilegeManager.enableTarget("UniversalFileRead");
-
- String var1;
- String var4;
- do {
- var4 = Long.toString(random(), 16);
- var1 = indexDirSep + var4;
- } while((new File(var1)).exists());
-
- PrivilegeManager.enableTarget("UniversalFileWrite");
- if (!(new File(var1)).mkdir()) {
- throw new SecureFileException("Error creating directory for " + var0);
- }
-
- try {
- BufferedWriter var5 = new BufferedWriter(new FileWriter(indexDirSep + "index.txt", true));
- ((Writer)var5).write(var4 + ' ' + var0);
- var5.newLine();
- var5.flush();
- } catch (IOException var8) {
- throw new SecureFileException("Error writing index file");
- }
-
- prinToReldirHashtable.put(var0, var4);
- }
- } catch (Throwable var9) {
- throw var9;
- }
-
- }
-
- static String getPrepend(Principal var0, int var1) {
- String var2 = var0.toString();
- if (!checkPrincipal(var0, var1 + 1)) {
- throw new SecureFileException("Unauthorized principal:" + var2);
- } else {
- if (indexDir == null) {
- getIndexDir();
- }
-
- if (prinToReldirHashtable.size() == 0) {
- putIndexfileIntoHashtable();
- }
-
- if (prinToReldirHashtable.get(var2) == null) {
- addNewPrincipal(var2);
- }
-
- return indexDirSep + prinToReldirHashtable.get(var2);
- }
- }
-
- static String getPrependedPath(String var0, String var1) {
- if (var1 != null && var1 != "") {
- return var1.startsWith(separator) ? var0 + var1 : var0 + separator + var1;
- } else {
- return var0;
- }
- }
-
- private static boolean checkPrincipal(Principal var0, int var1) {
- if (var0.isCodebaseExact() && var0.toString().equals("Common")) {
- return true;
- } else {
- PrivilegeManager var2 = PrivilegeManager.getPrivilegeManager();
- return var2 == null ? false : var2.isCalledByPrincipal(var0, var1 + 1);
- }
- }
-
- static String checkCanonicalPath(String var0, String var1) {
- PrivilegeManager.enableTarget("UniversalFileRead");
-
- String var2;
- try {
- if (var0.startsWith(separator)) {
- var2 = (new File(var1 + var0)).getCanonicalPath();
- } else {
- var2 = (new File(var1 + separator + var0)).getCanonicalPath();
- }
- } catch (IOException var3) {
- throw new SecureFileException("Unable to verify canonical path");
- }
-
- if (!var2.startsWith(var1)) {
- throw new SecureFileException("Canonical path is outside of principal's subdirectory");
- } else {
- return var2.substring(var1.length());
- }
- }
-
- static Principal getClassPrincipal(int var0) {
- PrivilegeManager var1 = PrivilegeManager.getPrivilegeManager();
- return var1 == null ? null : var1.getClassPrincipalsFromStack(var0 + 1)[0];
- }
-
- public SecureFile(String var1) {
- this(var1, getClassPrincipal(1), 1);
- }
-
- public SecureFile(String var1, String var2) {
- this(var1, var2, getClassPrincipal(1), 1);
- }
-
- public SecureFile(SecureFile var1, String var2) {
- this(var1.getPath(), var2, var1.getPrincipal(), 1);
- }
-
- public SecureFile(String var1, Principal var2) {
- this(var1, var2, 1);
- }
-
- private SecureFile(String var1, Principal var2, int var3) {
- super(getPrependedPath(getPrepend(var2, var3 + 1), var1));
- this.prepend = getPrepend(var2, var3 + 1);
- if (var1 != null) {
- this.path = var1;
- } else {
- this.path = "";
- }
-
- this.prin = var2;
- this.canonicalPath = checkCanonicalPath(this.path, this.prepend);
- }
-
- public SecureFile(String var1, String var2, Principal var3) {
- this(var1, var2, var3, 1);
- }
-
- private SecureFile(String var1, String var2, Principal var3, int var4) {
- super(getPrependedPath(getPrepend(var3, var4 + 1), var1), var2);
- this.prepend = getPrepend(var3, var4 + 1);
- if (var1 != null) {
- if (var1.endsWith(separator)) {
- this.path = var1 + var2;
- } else {
- this.path = var1 + separator + var2;
- }
- } else {
- this.path = var2;
- }
-
- this.prin = var3;
- this.canonicalPath = checkCanonicalPath(this.path, this.prepend);
- }
-
- public Principal getPrincipal() {
- return this.prin;
- }
-
- public String getPath() {
- return this.path;
- }
-
- public String getAbsolutePath() {
- return this.path.startsWith(separator) ? this.path : separator + this.path;
- }
-
- public String getCanonicalPath() throws IOException {
- return this.canonicalPath;
- }
-
- public String getParent() {
- int var1 = this.path.lastIndexOf(separatorChar);
- if (var1 < 0) {
- return null;
- } else if (var1 > 0) {
- return this.path.substring(0, var1);
- } else {
- return this.path.length() > 1 ? this.path.substring(0, 1) : null;
- }
- }
-
- public boolean exists() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.exists();
- }
-
- public boolean canWrite() {
- PrivilegeManager.enableTarget("UniversalFileWrite");
- return super.canWrite();
- }
-
- public boolean canRead() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.canRead();
- }
-
- public boolean isFile() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.isFile();
- }
-
- public boolean isDirectory() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.isDirectory();
- }
-
- public long lastModified() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.lastModified();
- }
-
- public long length() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.length();
- }
-
- public boolean mkdir() {
- PrivilegeManager.enableTarget("UniversalFileWrite");
- return super.mkdir();
- }
-
- public boolean renameTo(SecureFile var1) {
- PrivilegeManager.enableTarget("UniversalFileWrite");
- return super.renameTo(new File(getPrepend(var1.getPrincipal(), 1) + var1.getAbsolutePath()));
- }
-
- public boolean mkdirs() {
- PrivilegeManager.enableTarget("UniversalFileWrite");
- if (this.exists()) {
- return false;
- } else if (this.mkdir()) {
- return true;
- } else {
- String var1 = this.getParent();
- return var1 != null && (new SecureFile(var1, getClassPrincipal(1), 1)).mkdirs() && this.mkdir();
- }
- }
-
- public String[] list() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.list();
- }
-
- public String[] list(FilenameFilter var1) {
- String[] var2 = this.list();
- if (var2 == null) {
- return null;
- } else {
- Vector var3 = new Vector();
-
- for(int var4 = 0; var4 < var2.length; ++var4) {
- if (var1 == null || var1.accept(this, var2[var4])) {
- var3.addElement(var2[var4]);
- }
- }
-
- String[] var5 = new String[var3.size()];
- var3.copyInto(var5);
- return var5;
- }
- }
-
- public boolean delete() {
- PrivilegeManager.enableTarget("UniversalFileDelete");
- return super.delete();
- }
-
- public int hashCode() {
- return this.path.hashCode() ^ 1234321;
- }
-
- public boolean equals(Object var1) {
- return var1 != null && var1 instanceof SecureFile ? this.path.equals(((SecureFile)var1).getPath()) : false;
- }
-
- public String toString() {
- return this.getPath();
- }
-
- public long lastAccessed() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.lastAccessed();
- }
-
- public long lastStatusChange() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.lastStatusChange();
- }
-
- public boolean isLink() {
- PrivilegeManager.enableTarget("UniversalFileRead");
- return super.isLink();
- }
-
- static {
- separator = File.separator;
- separatorChar = File.separatorChar;
- pathSeparator = File.pathSeparator;
- pathSeparatorChar = File.pathSeparatorChar;
- }
- }
-