client/ftpd/src/se/lu/thep/coreftpd/ftp_server/FileAccess.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic, Olle Mansson
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25 //  Xerver Free Web Server
741 10 Oct 06 olle 26 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 27 //
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 30 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 31 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 32 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 33 //
741 10 Oct 06 olle 34 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 35 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 36 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 37 //  GNU General Public License for more details.
741 10 Oct 06 olle 38 //
741 10 Oct 06 olle 39 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 40 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 41 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 42 //
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //  #############################################################
741 10 Oct 06 olle 45 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 46 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 47 //  ##                                                         ##
741 10 Oct 06 olle 48 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 49 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 50 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 51 //  ##                                                         ##
741 10 Oct 06 olle 52 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 53 //  #############################################################
1652 22 May 07 gregory 54 package se.lu.thep.coreftpd.ftp_server;
741 10 Oct 06 olle 55
1216 18 Feb 07 gregory 56 import org.proteios.core.DbControl;
1216 18 Feb 07 gregory 57 import org.proteios.core.Directory;
931 16 Nov 06 olle 58 import org.proteios.core.Include;
1369 06 Mar 07 olle 59 import org.proteios.core.InvalidPathException;
1656 22 May 07 gregory 60 import org.proteios.core.ItemFactory;
795 24 Oct 06 olle 61 import org.proteios.core.ItemQuery;
795 24 Oct 06 olle 62 import org.proteios.core.ItemResultList;
1369 06 Mar 07 olle 63 import org.proteios.core.Permission;
1369 06 Mar 07 olle 64 import org.proteios.core.PermissionDeniedException;
1676 25 May 07 olle 65 import org.proteios.core.SessionControl;
790 23 Oct 06 olle 66 import org.proteios.core.User;
795 24 Oct 06 olle 67 import org.proteios.core.Path.Type;
1216 18 Feb 07 gregory 68 import java.io.File;
741 10 Oct 06 olle 69
741 10 Oct 06 olle 70 /**
1652 22 May 07 gregory 71  * <B>About this class:</B> <BR>
1652 22 May 07 gregory 72  * This class takes a user name and a password and then reads from a
1652 22 May 07 gregory 73  * UserDatabase to see what permissions this user have.
1652 22 May 07 gregory 74  * 
741 10 Oct 06 olle 75  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 76  * @version 1.0
741 10 Oct 06 olle 77  */
1656 22 May 07 gregory 78 final public class FileAccess
1656 22 May 07 gregory 79 {
1652 22 May 07 gregory 80   static private UserDatabase udb_userDatabase = null;
741 10 Oct 06 olle 81   private UserData ud_user;
1652 22 May 07 gregory 82   boolean b_userAndPassOK = false;
1652 22 May 07 gregory 83   private String[] as_writePermissionDirs;
1652 22 May 07 gregory 84   private String[] as_readPermissionDirs;
1652 22 May 07 gregory 85   private String[] as_createPermissionDirs;
1652 22 May 07 gregory 86   private String[] as_listPermissionDirs;
741 10 Oct 06 olle 87   private MyHashTableWithPaths MH_allPermissions;
1652 22 May 07 gregory 88   private static boolean isWindows = File.separatorChar == '\\';
1652 22 May 07 gregory 89   // private String s_root;
1052 08 Dec 06 olle 90   final static private char coreSeparatorChar = FTPNewConnection.coreSeparatorChar;
1052 08 Dec 06 olle 91   final static private String coreSeparator = FTPNewConnection.coreSeparator;
1676 25 May 07 olle 92   /*
1676 25 May 07 olle 93    * Instance variables not in original Xerver code.
1676 25 May 07 olle 94    */
1676 25 May 07 olle 95   private SessionControl sc = null;
790 23 Oct 06 olle 96   /**
790 23 Oct 06 olle 97    * Logger used. Used to log specific events.
790 23 Oct 06 olle 98    */
790 23 Oct 06 olle 99   private static final org.apache.log4j.Logger log = org.apache.log4j.LogManager
1656 22 May 07 gregory 100     .getLogger("se.lu.thep.coreftpd.ftp_server");
790 23 Oct 06 olle 101
1656 22 May 07 gregory 102
1676 25 May 07 olle 103   /**
1676 25 May 07 olle 104    * Get the SessionControl object.
1676 25 May 07 olle 105    * 
1676 25 May 07 olle 106    * @return the SessionControl object
1676 25 May 07 olle 107    */
1676 25 May 07 olle 108   public SessionControl getSessionControl() {
1676 25 May 07 olle 109     return this.sc;
1676 25 May 07 olle 110   }
1676 25 May 07 olle 111
1676 25 May 07 olle 112
1676 25 May 07 olle 113   /**
1676 25 May 07 olle 114    * Set the SessionControl object.
1676 25 May 07 olle 115    * 
1676 25 May 07 olle 116    * @param sc the SessionControl object to set.
1676 25 May 07 olle 117    */
1676 25 May 07 olle 118   public void setSessionControl(SessionControl sc) {
1676 25 May 07 olle 119     this.sc = sc;
1676 25 May 07 olle 120   }
1676 25 May 07 olle 121
1676 25 May 07 olle 122
1676 25 May 07 olle 123   public FileAccess(String name, String password, SessionControl newSc)
1656 22 May 07 gregory 124   {
790 23 Oct 06 olle 125     // *** Debug Info
1656 22 May 07 gregory 126     log
1656 22 May 07 gregory 127       .info("FileAccess::FileAccess(): Start - name = \"" + name + "\" password = \"<password>\"");
1676 25 May 07 olle 128     setSessionControl(newSc);
1680 25 May 07 olle 129     DbControl dc = getSessionControl().newDbControl();
1645 16 May 07 olle 130     /*
1652 22 May 07 gregory 131      * User access control handled by Proteios database. Make sure that
1652 22 May 07 gregory 132      * udb_userDatabase will always be updated when a new login attempt is
1652 22 May 07 gregory 133      * made.
1645 16 May 07 olle 134      */
1645 16 May 07 olle 135     udb_userDatabase = null;
1656 22 May 07 gregory 136     if (udb_userDatabase == null)
1656 22 May 07 gregory 137     {
1652 22 May 07 gregory 138       // createDataBase();
790 23 Oct 06 olle 139       createDataBase(name);
790 23 Oct 06 olle 140     }
1652 22 May 07 gregory 141     ud_user = udb_userDatabase.getUserData(name);
790 23 Oct 06 olle 142     /*
790 23 Oct 06 olle 143      * Try to login to Proteios
790 23 Oct 06 olle 144      */
1656 22 May 07 gregory 145     try
1656 22 May 07 gregory 146     {
1676 25 May 07 olle 147       getSessionControl().login(name, password, "", false);
790 23 Oct 06 olle 148       /*
790 23 Oct 06 olle 149        * If no exceptions, the login is OK
790 23 Oct 06 olle 150        */
790 23 Oct 06 olle 151       // *** Debug Info
790 23 Oct 06 olle 152       log.info("FileAccess::FileAccess(): Trying to login.");
1652 22 May 07 gregory 153       b_userAndPassOK = true;
790 23 Oct 06 olle 154       /*
790 23 Oct 06 olle 155        * Get logged-in user and home directory
790 23 Oct 06 olle 156        */
1680 25 May 07 olle 157       //DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 158       ItemFactory factory = new ItemFactory(dc);
1652 22 May 07 gregory 159       // User coreUser = User.getNew(dc, name, password);
1676 25 May 07 olle 160       int coreUserId = getSessionControl().getLoggedInUserId();
790 23 Oct 06 olle 161       log.info("FileAccess::FileAccess(): coreUserId = " + coreUserId);
790 23 Oct 06 olle 162       User coreUser = User.getById(dc, coreUserId);
1656 22 May 07 gregory 163       log
1656 22 May 07 gregory 164         .info("FileAccess::FileAccess(): coreUser.getName() = \"" + coreUser
1656 22 May 07 gregory 165           .getName() + "\"");
790 23 Oct 06 olle 166       Directory homeDir = coreUser.getHomeDirectory();
1656 22 May 07 gregory 167       if (homeDir == null)
1656 22 May 07 gregory 168       {
965 23 Nov 06 olle 169         /*
1652 22 May 07 gregory 170          * Logged-in user has no special home directory. Use root
1652 22 May 07 gregory 171          * directory "/" as home directory.
965 23 Nov 06 olle 172          */
965 23 Nov 06 olle 173         String dirPath = new String("/");
1656 22 May 07 gregory 174         try
1656 22 May 07 gregory 175         {
1652 22 May 07 gregory 176           org.proteios.core.Path homeDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 177             dirPath, Type.DIRECTORY);
1656 22 May 07 gregory 178           homeDir = factory.getByPath(homeDirPath);
965 23 Nov 06 olle 179           /*
965 23 Nov 06 olle 180            * If no exceptions, core directory may be valid.
965 23 Nov 06 olle 181            */
1656 22 May 07 gregory 182         }
1656 22 May 07 gregory 183         catch (Exception e)
1656 22 May 07 gregory 184         {
965 23 Nov 06 olle 185           /*
965 23 Nov 06 olle 186            * Exception was thrown, path is not a valid core directory.
965 23 Nov 06 olle 187            */
1652 22 May 07 gregory 188           log
1656 22 May 07 gregory 189             .warn("FileAccess::FileAccess(): Could not create home directory \"/\".");
965 23 Nov 06 olle 190         }
965 23 Nov 06 olle 191       }
1652 22 May 07 gregory 192       log
1656 22 May 07 gregory 193         .info("FileAccess::FileAccess(): homeDir.getName() = \"" + homeDir
1656 22 May 07 gregory 194           .getName() + "\"");
1656 22 May 07 gregory 195       log
1656 22 May 07 gregory 196         .info("FileAccess::FileAccess(): homeDir.getPath().toString() = \"" + homeDir
1656 22 May 07 gregory 197           .getPath().toString() + "\"");
1656 22 May 07 gregory 198       if (ud_user != null)
1656 22 May 07 gregory 199       {
790 23 Oct 06 olle 200         log.info("FileAccess::FileAccess(): ud_user != null");
790 23 Oct 06 olle 201         /*
1652 22 May 07 gregory 202          * Set FTP root directory to core home directory for logged-in
1652 22 May 07 gregory 203          * user.
790 23 Oct 06 olle 204          */
790 23 Oct 06 olle 205         ud_user.updateData(homeDir.getPath().toString());
790 23 Oct 06 olle 206         /*
790 23 Oct 06 olle 207          * Get permissions
790 23 Oct 06 olle 208          */
1652 22 May 07 gregory 209         MH_allPermissions = ud_user.getAllPermissionDirs();
1652 22 May 07 gregory 210         as_writePermissionDirs = ud_user.getWritePermissionDirs();
1652 22 May 07 gregory 211         as_readPermissionDirs = ud_user.getReadPermissionDirs();
1652 22 May 07 gregory 212         as_createPermissionDirs = ud_user.getCreatePermissionDirs();
1652 22 May 07 gregory 213         as_listPermissionDirs = ud_user.getListPermissionDirs();
1656 22 May 07 gregory 214       }
1656 22 May 07 gregory 215       else
1656 22 May 07 gregory 216       {
1652 22 May 07 gregory 217         log.info("FileAccess::FileAccess(): ud_user == null");
790 23 Oct 06 olle 218       }
790 23 Oct 06 olle 219       // *** Debug Info
1656 22 May 07 gregory 220       if (as_writePermissionDirs != null)
1656 22 May 07 gregory 221       {
1652 22 May 07 gregory 222         log
1656 22 May 07 gregory 223           .info("FileAccess::FileAccess(): as_writePermissionDirs.length = " + as_writePermissionDirs.length);
1656 22 May 07 gregory 224         if (as_writePermissionDirs.length > 0)
1656 22 May 07 gregory 225         {
1656 22 May 07 gregory 226           for (int i = 0; i < as_writePermissionDirs.length; i++)
1656 22 May 07 gregory 227           {
1652 22 May 07 gregory 228             log
1656 22 May 07 gregory 229               .info("FileAccess::FileAccess(): as_writePermissionDirs[" + i + "] = \"" + as_writePermissionDirs[i] + "\"");
790 23 Oct 06 olle 230           }
790 23 Oct 06 olle 231         }
1656 22 May 07 gregory 232       }
1656 22 May 07 gregory 233       else
1656 22 May 07 gregory 234       {
1652 22 May 07 gregory 235         log
1656 22 May 07 gregory 236           .info("FileAccess::FileAccess(): as_writePermissionDirs == null");
790 23 Oct 06 olle 237       }
1656 22 May 07 gregory 238       if (as_readPermissionDirs != null)
1656 22 May 07 gregory 239       {
1652 22 May 07 gregory 240         log
1656 22 May 07 gregory 241           .info("FileAccess::FileAccess(): as_readPermissionDirs.length = " + as_readPermissionDirs.length);
1656 22 May 07 gregory 242         if (as_readPermissionDirs.length > 0)
1656 22 May 07 gregory 243         {
1656 22 May 07 gregory 244           for (int i = 0; i < as_readPermissionDirs.length; i++)
1656 22 May 07 gregory 245           {
1652 22 May 07 gregory 246             log
1656 22 May 07 gregory 247               .info("FileAccess::FileAccess(): as_readPermissionDirs[" + i + "] = \"" + as_readPermissionDirs[i] + "\"");
790 23 Oct 06 olle 248           }
790 23 Oct 06 olle 249         }
1656 22 May 07 gregory 250       }
1656 22 May 07 gregory 251       else
1656 22 May 07 gregory 252       {
1652 22 May 07 gregory 253         log
1656 22 May 07 gregory 254           .info("FileAccess::FileAccess(): as_readPermissionDirs == null");
790 23 Oct 06 olle 255       }
1656 22 May 07 gregory 256       if (as_createPermissionDirs != null)
1656 22 May 07 gregory 257       {
1652 22 May 07 gregory 258         log
1656 22 May 07 gregory 259           .info("FileAccess::FileAccess(): as_createPermissionDirs.length = " + as_createPermissionDirs.length);
1656 22 May 07 gregory 260         if (as_createPermissionDirs.length > 0)
1656 22 May 07 gregory 261         {
1656 22 May 07 gregory 262           for (int i = 0; i < as_createPermissionDirs.length; i++)
1656 22 May 07 gregory 263           {
1652 22 May 07 gregory 264             log
1656 22 May 07 gregory 265               .info("FileAccess::FileAccess(): as_createPermissionDirs[" + i + "] = \"" + as_createPermissionDirs[i] + "\"");
790 23 Oct 06 olle 266           }
790 23 Oct 06 olle 267         }
1656 22 May 07 gregory 268       }
1656 22 May 07 gregory 269       else
1656 22 May 07 gregory 270       {
1652 22 May 07 gregory 271         log
1656 22 May 07 gregory 272           .info("FileAccess::FileAccess(): as_createPermissionDirs == null");
790 23 Oct 06 olle 273       }
1656 22 May 07 gregory 274       if (as_listPermissionDirs != null)
1656 22 May 07 gregory 275       {
1652 22 May 07 gregory 276         log
1656 22 May 07 gregory 277           .info("FileAccess::FileAccess(): as_listPermissionDirs.length = " + as_listPermissionDirs.length);
1656 22 May 07 gregory 278         if (as_listPermissionDirs.length > 0)
1656 22 May 07 gregory 279         {
1656 22 May 07 gregory 280           for (int i = 0; i < as_listPermissionDirs.length; i++)
1656 22 May 07 gregory 281           {
1652 22 May 07 gregory 282             log
1656 22 May 07 gregory 283               .info("FileAccess::FileAccess(): as_listPermissionDirs[" + i + "] = \"" + as_listPermissionDirs[i] + "\"");
790 23 Oct 06 olle 284           }
790 23 Oct 06 olle 285         }
1656 22 May 07 gregory 286       }
1656 22 May 07 gregory 287       else
1656 22 May 07 gregory 288       {
1652 22 May 07 gregory 289         log
1656 22 May 07 gregory 290           .info("FileAccess::FileAccess(): as_listPermissionDirs == null");
790 23 Oct 06 olle 291       }
790 23 Oct 06 olle 292       /*
790 23 Oct 06 olle 293        * If no exceptions, the login is OK
790 23 Oct 06 olle 294        */
1652 22 May 07 gregory 295       log.info("FileAccess::FileAccess(): Login OK.");
1656 22 May 07 gregory 296     }
1656 22 May 07 gregory 297     catch (Exception e)
1656 22 May 07 gregory 298     {
790 23 Oct 06 olle 299       // *** Debug Info
1656 22 May 07 gregory 300       log
1656 22 May 07 gregory 301         .info("FileAccess::FileAccess(): Login failed, e = \"" + e + "\"");
1652 22 May 07 gregory 302       b_userAndPassOK = false;
790 23 Oct 06 olle 303     }
790 23 Oct 06 olle 304     /*
1652 22 May 07 gregory 305      * if (udb_userDatabase==null) createDataBase();
1656 22 May 07 gregory 306      * ud_user=udb_userDatabase.getUserData(name); if (ud_user!=null) { if
1656 22 May 07 gregory 307      * (password.equals(ud_user.getPassword())) //If [wrong password]... {
1656 22 May 07 gregory 308      * b_userAndPassOK=true;
1652 22 May 07 gregory 309      * MH_allPermissions=ud_user.getAllPermissionDirs();
1652 22 May 07 gregory 310      * as_writePermissionDirs=ud_user.getWritePermissionDirs();
1652 22 May 07 gregory 311      * as_readPermissionDirs=ud_user.getReadPermissionDirs();
1652 22 May 07 gregory 312      * as_createPermissionDirs=ud_user.getCreatePermissionDirs();
1652 22 May 07 gregory 313      * as_listPermissionDirs=ud_user.getListPermissionDirs(); } else {
1652 22 May 07 gregory 314      * ud_user=null; } } //else b_userAndPassOK=false;
1652 22 May 07 gregory 315      */
1680 25 May 07 olle 316     /*
1680 25 May 07 olle 317      * Close DbControl.
1680 25 May 07 olle 318      */
1680 25 May 07 olle 319     dc.close();
741 10 Oct 06 olle 320   }
741 10 Oct 06 olle 321
1656 22 May 07 gregory 322
1656 22 May 07 gregory 323   public boolean userAndPassOK()
1656 22 May 07 gregory 324   {
741 10 Oct 06 olle 325     return b_userAndPassOK;
741 10 Oct 06 olle 326   }
741 10 Oct 06 olle 327
1656 22 May 07 gregory 328
1656 22 May 07 gregory 329   public boolean writePermissionOK(String s_file)
1656 22 May 07 gregory 330   {
790 23 Oct 06 olle 331     // *** Debug Info
1656 22 May 07 gregory 332     log
1656 22 May 07 gregory 333       .debug("FileAccess::writePermissionOK(): Start - s_file = \"" + s_file + "\"");
790 23 Oct 06 olle 334     /*
1369 06 Mar 07 olle 335      * Check file read permission on core file in database
790 23 Oct 06 olle 336      */
790 23 Oct 06 olle 337     int one = 1;
1656 22 May 07 gregory 338     if (one == 1)
1656 22 May 07 gregory 339     {
1652 22 May 07 gregory 340       boolean permissionCheck = corePermissionOK(s_file, Permission.WRITE);
1656 22 May 07 gregory 341       log
1656 22 May 07 gregory 342         .debug("FileAccess::writePermissionOK(): permissionCheck = " + permissionCheck);
1369 06 Mar 07 olle 343       return permissionCheck;
790 23 Oct 06 olle 344     }
1652 22 May 07 gregory 345     if (s_file == null)
741 10 Oct 06 olle 346       return false;
1652 22 May 07 gregory 347     if (s_file.indexOf("..") != -1) // You have tried to reach a folder with
1656 22 May 07 gregory 348       // "http://www.sida.com/folder/../../secretfile.txt"
741 10 Oct 06 olle 349       return false;
1652 22 May 07 gregory 350     // First check if the OS will give access at all...
1652 22 May 07 gregory 351     File f_file = new File(s_file);
1656 22 May 07 gregory 352     log
1656 22 May 07 gregory 353       .debug("FileAccess::writePermissionOK(): f_file.exists() = " + f_file
1656 22 May 07 gregory 354         .exists());
741 10 Oct 06 olle 355     if (!f_file.exists())
1652 22 May 07 gregory 356       f_file = new File(f_file.getParent());
1656 22 May 07 gregory 357     log
1656 22 May 07 gregory 358       .debug("FileAccess::writePermissionOK(): f_file.canWrite() = " + f_file
1656 22 May 07 gregory 359         .canWrite());
1656 22 May 07 gregory 360     if (!f_file.canWrite())
1656 22 May 07 gregory 361     {
741 10 Oct 06 olle 362       return false;
741 10 Oct 06 olle 363     }
1652 22 May 07 gregory 364     // Stop OS check
1652 22 May 07 gregory 365     s_file = s_file
1656 22 May 07 gregory 366       .substring(0, s_file.lastIndexOf(File.separatorChar) + 1);
1656 22 May 07 gregory 367     log
1656 22 May 07 gregory 368       .debug("FileAccess::writePermissionOK(): (2) s_file = \"" + s_file + "\"");
1652 22 May 07 gregory 369     int i_longestMatchingPath = MH_allPermissions
1656 22 May 07 gregory 370       .giveBiggestKeySize(s_file); // The reason why we have this
1656 22 May 07 gregory 371     // is to make sure that if we
1656 22 May 07 gregory 372     // have "c:\*;w,c:\a\;r" and
1656 22 May 07 gregory 373     // someone visits "c:\a\" he
1656 22 May 07 gregory 374     // shall NOT have write
1656 22 May 07 gregory 375     // permissions (because
1656 22 May 07 gregory 376     // as_writePermissionDirs only
1656 22 May 07 gregory 377     // contains "c:\*", not "c:\a\".
1656 22 May 07 gregory 378     // With i_longestMatchingPath we
1656 22 May 07 gregory 379     // are not able to check that
1656 22 May 07 gregory 380     // "c:\a\" won't match "c\*"
1656 22 May 07 gregory 381     // when it comes to write
1656 22 May 07 gregory 382     // permissions).
1652 22 May 07 gregory 383     for (int i = 0, sharedPathsLength = as_writePermissionDirs.length; i < sharedPathsLength; i++) // Optimization...
741 10 Oct 06 olle 384     {
1652 22 May 07 gregory 385       String tmpDir = as_writePermissionDirs[i];// .replace('\\','/');
1656 22 May 07 gregory 386       log
1656 22 May 07 gregory 387         .debug("FileAccess::writePermissionOK(): tmpDir = \"" + tmpDir + "\"");
1656 22 May 07 gregory 388       if (tmpDir.endsWith("*") && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 389         .length()) // If you
1656 22 May 07 gregory 390       // are
1656 22 May 07 gregory 391       // allowed
1656 22 May 07 gregory 392       // to view
1656 22 May 07 gregory 393       // the
1656 22 May 07 gregory 394       // content
1656 22 May 07 gregory 395       // of
1656 22 May 07 gregory 396       // subfolders
1656 22 May 07 gregory 397       // as
1656 22 May 07 gregory 398       // well...
1656 22 May 07 gregory 399       // (if the
1656 22 May 07 gregory 400       // name ends
1656 22 May 07 gregory 401       // with an *
1656 22 May 07 gregory 402       // ("/mapp1/mapp2/*"))
741 10 Oct 06 olle 403       {
1652 22 May 07 gregory 404         if (tmpDir.regionMatches(isWindows, 0, s_file, 0, tmpDir
1656 22 May 07 gregory 405           .length() - 1)) // If [the first "tmpDir.length()-1"
1656 22 May 07 gregory 406           // characters of the two strings are
1656 22 May 07 gregory 407           // equal (isWindows==true ==> case
1656 22 May 07 gregory 408           // insensitive)]...
741 10 Oct 06 olle 409           return true;
1656 22 May 07 gregory 410       }
1656 22 May 07 gregory 411       else if (pathEQ(tmpDir, s_file) && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 412         .length())
741 10 Oct 06 olle 413         return true;
741 10 Oct 06 olle 414     }
741 10 Oct 06 olle 415     return false;
741 10 Oct 06 olle 416   }
741 10 Oct 06 olle 417
1656 22 May 07 gregory 418
1656 22 May 07 gregory 419   public boolean readPermissionOK(String s_file)
1656 22 May 07 gregory 420   {
790 23 Oct 06 olle 421     // *** Debug Info
1656 22 May 07 gregory 422     log
1656 22 May 07 gregory 423       .debug("FileAccess::readPermissionOK(): Start - s_file = \"" + s_file + "\"");
790 23 Oct 06 olle 424     /*
1369 06 Mar 07 olle 425      * Check file read permission on core file in database
790 23 Oct 06 olle 426      */
790 23 Oct 06 olle 427     int one = 1;
1656 22 May 07 gregory 428     if (one == 1)
1656 22 May 07 gregory 429     {
1652 22 May 07 gregory 430       boolean permissionCheck = corePermissionOK(s_file, Permission.READ);
1656 22 May 07 gregory 431       log
1656 22 May 07 gregory 432         .debug("FileAccess::readPermissionOK(): permissionCheck = " + permissionCheck);
1369 06 Mar 07 olle 433       return permissionCheck;
790 23 Oct 06 olle 434     }
1652 22 May 07 gregory 435     if (s_file == null)
741 10 Oct 06 olle 436       return false;
1652 22 May 07 gregory 437     if (s_file.indexOf("..") != -1) // You have tried to reach a folder with
1656 22 May 07 gregory 438       // "http://www.sida.com/folder/../../secretfile.txt"
741 10 Oct 06 olle 439       return false;
1652 22 May 07 gregory 440     // First check if the OS will give access at all...
1652 22 May 07 gregory 441     File f_file = new File(s_file);
1656 22 May 07 gregory 442     log.debug("FileAccess::readPermissionOK(): f_file.exists() = " + f_file
1656 22 May 07 gregory 443       .exists());
741 10 Oct 06 olle 444     if (!f_file.exists())
1652 22 May 07 gregory 445       f_file = new File(f_file.getParent());
1656 22 May 07 gregory 446     log
1656 22 May 07 gregory 447       .debug("FileAccess::readPermissionOK(): f_file.canRead() = " + f_file
1656 22 May 07 gregory 448         .canRead());
1656 22 May 07 gregory 449     if (!f_file.canRead())
1656 22 May 07 gregory 450     {
741 10 Oct 06 olle 451       return false;
741 10 Oct 06 olle 452     }
1652 22 May 07 gregory 453     // Stop OS check
1652 22 May 07 gregory 454     s_file = s_file
1656 22 May 07 gregory 455       .substring(0, s_file.lastIndexOf(File.separatorChar) + 1);
1656 22 May 07 gregory 456     log
1656 22 May 07 gregory 457       .debug("FileAccess::readPermissionOK(): (2) s_file = \"" + s_file + "\"");
1652 22 May 07 gregory 458     int i_longestMatchingPath = MH_allPermissions
1656 22 May 07 gregory 459       .giveBiggestKeySize(s_file); // The reason why we have this
1656 22 May 07 gregory 460     // is to make sure that if we
1656 22 May 07 gregory 461     // have "c:\*;w,c:\a\;r" and
1656 22 May 07 gregory 462     // someone visits "c:\a\" he
1656 22 May 07 gregory 463     // shall NOT have write
1656 22 May 07 gregory 464     // permissions (because
1656 22 May 07 gregory 465     // as_writePermissionDirs only
1656 22 May 07 gregory 466     // contains "c:\*", not "c:\a\".
1656 22 May 07 gregory 467     // With i_longestMatchingPath we
1656 22 May 07 gregory 468     // are not able to check that
1656 22 May 07 gregory 469     // "c:\a\" won't match "c\*"
1656 22 May 07 gregory 470     // when it comes to write
1656 22 May 07 gregory 471     // permissions).
1656 22 May 07 gregory 472     log
1656 22 May 07 gregory 473       .debug("FileAccess::readPermissionOK(): i_longestMatchingPath = " + i_longestMatchingPath);
1652 22 May 07 gregory 474     for (int i = 0, sharedPathsLength = as_readPermissionDirs.length; i < sharedPathsLength; i++) // Optimization...
741 10 Oct 06 olle 475     {
1652 22 May 07 gregory 476       String tmpDir = as_readPermissionDirs[i];// .replace('\\','/');
1656 22 May 07 gregory 477       log
1656 22 May 07 gregory 478         .debug("FileAccess::readPermissionOK(): tmpDir = \"" + tmpDir + "\"");
1656 22 May 07 gregory 479       if (tmpDir.endsWith("*") && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 480         .length()) // If you
1656 22 May 07 gregory 481       // are
1656 22 May 07 gregory 482       // allowed
1656 22 May 07 gregory 483       // to view
1656 22 May 07 gregory 484       // the
1656 22 May 07 gregory 485       // content
1656 22 May 07 gregory 486       // of
1656 22 May 07 gregory 487       // subfolders
1656 22 May 07 gregory 488       // as
1656 22 May 07 gregory 489       // well...
1656 22 May 07 gregory 490       // (if the
1656 22 May 07 gregory 491       // name ends
1656 22 May 07 gregory 492       // with an *
1656 22 May 07 gregory 493       // ("/mapp1/mapp2/*"))
741 10 Oct 06 olle 494       {
1652 22 May 07 gregory 495         if (tmpDir.regionMatches(isWindows, 0, s_file, 0, tmpDir
1656 22 May 07 gregory 496           .length() - 1)) // If [the first "tmpDir.length()-1"
1656 22 May 07 gregory 497           // characters of the two strings are
1656 22 May 07 gregory 498           // equal (isWindows==true ==> case
1656 22 May 07 gregory 499           // insensitive)]...
741 10 Oct 06 olle 500           return true;
1656 22 May 07 gregory 501       }
1656 22 May 07 gregory 502       else if (pathEQ(tmpDir, s_file) && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 503         .length())
741 10 Oct 06 olle 504         return true;
741 10 Oct 06 olle 505     }
741 10 Oct 06 olle 506     return false;
741 10 Oct 06 olle 507   }
741 10 Oct 06 olle 508
1656 22 May 07 gregory 509
1656 22 May 07 gregory 510   public boolean createPermissionOK(String s_file)
1656 22 May 07 gregory 511   {
1678 25 May 07 olle 512     // *** Debug Info
1678 25 May 07 olle 513     log
1678 25 May 07 olle 514       .debug("FileAccess::createPermissionOK(): Start - s_file = \"" + s_file + "\"");
1678 25 May 07 olle 515     /*
1678 25 May 07 olle 516      * Check file create permission on core file in database
1678 25 May 07 olle 517      */
1678 25 May 07 olle 518     int one = 1;
1678 25 May 07 olle 519     if (one == 1)
1678 25 May 07 olle 520     {
1678 25 May 07 olle 521       boolean permissionCheck = corePermissionOK(s_file, Permission.CREATE);
1678 25 May 07 olle 522       log
1678 25 May 07 olle 523         .debug("FileAccess::createPermissionOK(): permissionCheck = " + permissionCheck);
1678 25 May 07 olle 524       return permissionCheck;
1678 25 May 07 olle 525     }
1652 22 May 07 gregory 526     if (s_file == null)
741 10 Oct 06 olle 527       return false;
1652 22 May 07 gregory 528     if (s_file.indexOf("..") != -1) // You have tried to reach a folder with
1656 22 May 07 gregory 529       // "http://www.sida.com/folder/../../secretfile.txt"
741 10 Oct 06 olle 530       return false;
1652 22 May 07 gregory 531     // First check if the OS will give access at all...
1652 22 May 07 gregory 532     File f_file = new File(s_file);
741 10 Oct 06 olle 533     if (!f_file.exists())
1652 22 May 07 gregory 534       f_file = new File(f_file.getParent());
1656 22 May 07 gregory 535     if (!f_file.canWrite())
1656 22 May 07 gregory 536     {
741 10 Oct 06 olle 537       return false;
741 10 Oct 06 olle 538     }
1652 22 May 07 gregory 539     // Stop OS check
1652 22 May 07 gregory 540     s_file = s_file
1656 22 May 07 gregory 541       .substring(0, s_file.lastIndexOf(File.separatorChar) + 1);
1652 22 May 07 gregory 542     int i_longestMatchingPath = MH_allPermissions
1656 22 May 07 gregory 543       .giveBiggestKeySize(s_file); // The reason why we have this
1656 22 May 07 gregory 544     // is to make sure that if we
1656 22 May 07 gregory 545     // have "c:\*;w,c:\a\;r" and
1656 22 May 07 gregory 546     // someone visits "c:\a\" he
1656 22 May 07 gregory 547     // shall NOT have write
1656 22 May 07 gregory 548     // permissions (because
1656 22 May 07 gregory 549     // as_writePermissionDirs only
1656 22 May 07 gregory 550     // contains "c:\*", not "c:\a\".
1656 22 May 07 gregory 551     // With i_longestMatchingPath we
1656 22 May 07 gregory 552     // are not able to check that
1656 22 May 07 gregory 553     // "c:\a\" won't match "c\*"
1656 22 May 07 gregory 554     // when it comes to write
1656 22 May 07 gregory 555     // permissions).
1652 22 May 07 gregory 556     for (int i = 0, sharedPathsLength = as_createPermissionDirs.length; i < sharedPathsLength; i++) // Optimization...
741 10 Oct 06 olle 557     {
1652 22 May 07 gregory 558       String tmpDir = as_createPermissionDirs[i];// .replace('\\','/');
1656 22 May 07 gregory 559       if (tmpDir.endsWith("*") && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 560         .length()) // If you
1656 22 May 07 gregory 561       // are
1656 22 May 07 gregory 562       // allowed
1656 22 May 07 gregory 563       // to view
1656 22 May 07 gregory 564       // the
1656 22 May 07 gregory 565       // content
1656 22 May 07 gregory 566       // of
1656 22 May 07 gregory 567       // subfolders
1656 22 May 07 gregory 568       // as
1656 22 May 07 gregory 569       // well...
1656 22 May 07 gregory 570       // (if the
1656 22 May 07 gregory 571       // name ends
1656 22 May 07 gregory 572       // with an *
1656 22 May 07 gregory 573       // ("/mapp1/mapp2/*"))
741 10 Oct 06 olle 574       {
1652 22 May 07 gregory 575         if (tmpDir.regionMatches(isWindows, 0, s_file, 0, tmpDir
1656 22 May 07 gregory 576           .length() - 1)) // If [the first "tmpDir.length()-1"
1656 22 May 07 gregory 577           // characters of the two strings are
1656 22 May 07 gregory 578           // equal (isWindows==true ==> case
1656 22 May 07 gregory 579           // insensitive)]...
741 10 Oct 06 olle 580           return true;
1656 22 May 07 gregory 581       }
1656 22 May 07 gregory 582       else if (pathEQ(tmpDir, s_file) && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 583         .length())
741 10 Oct 06 olle 584         return true;
741 10 Oct 06 olle 585     }
741 10 Oct 06 olle 586     return false;
741 10 Oct 06 olle 587   }
741 10 Oct 06 olle 588
1656 22 May 07 gregory 589
1656 22 May 07 gregory 590   public boolean listPermissionOK(String s_file)
1656 22 May 07 gregory 591   {
790 23 Oct 06 olle 592     // *** Debug Info
1656 22 May 07 gregory 593     log
1656 22 May 07 gregory 594       .debug("FileAccess::listPermissionOK(): Start - s_file = \"" + s_file + "\"");
790 23 Oct 06 olle 595     /*
1369 06 Mar 07 olle 596      * Check list permission for core file
790 23 Oct 06 olle 597      */
790 23 Oct 06 olle 598     int one = 1;
1656 22 May 07 gregory 599     if (one == 1)
1656 22 May 07 gregory 600     {
1652 22 May 07 gregory 601       boolean permissionCheck = corePermissionOK(s_file, Permission.READ);
1656 22 May 07 gregory 602       log
1656 22 May 07 gregory 603         .debug("FileAccess::listPermissionOK(): permissionCheck = " + permissionCheck);
1369 06 Mar 07 olle 604       return permissionCheck;
790 23 Oct 06 olle 605     }
1652 22 May 07 gregory 606     if (s_file == null)
741 10 Oct 06 olle 607       return false;
1652 22 May 07 gregory 608     if (s_file.indexOf("..") != -1) // You have tried to reach a folder with
1656 22 May 07 gregory 609       // "http://www.sida.com/folder/../../secretfile.txt"
741 10 Oct 06 olle 610       return false;
1652 22 May 07 gregory 611     // First check if the OS will give access at all...
1652 22 May 07 gregory 612     File f_file = new File(s_file);
741 10 Oct 06 olle 613     if (!f_file.exists())
1652 22 May 07 gregory 614       f_file = new File(f_file.getParent());
741 10 Oct 06 olle 615     if (!f_file.canRead())
741 10 Oct 06 olle 616       return false;
1652 22 May 07 gregory 617     // Stop OS check
1652 22 May 07 gregory 618     s_file = s_file
1656 22 May 07 gregory 619       .substring(0, s_file.lastIndexOf(File.separatorChar) + 1);
1652 22 May 07 gregory 620     int i_longestMatchingPath = MH_allPermissions
1656 22 May 07 gregory 621       .giveBiggestKeySize(s_file); // The reason why we have this
1656 22 May 07 gregory 622     // is to make sure that if we
1656 22 May 07 gregory 623     // have "c:\*;w,c:\a\;r" and
1656 22 May 07 gregory 624     // someone visits "c:\a\" he
1656 22 May 07 gregory 625     // shall NOT have write
1656 22 May 07 gregory 626     // permissions (because
1656 22 May 07 gregory 627     // as_writePermissionDirs only
1656 22 May 07 gregory 628     // contains "c:\*", not "c:\a\".
1656 22 May 07 gregory 629     // With i_longestMatchingPath we
1656 22 May 07 gregory 630     // are not able to check that
1656 22 May 07 gregory 631     // "c:\a\" won't match "c\*"
1656 22 May 07 gregory 632     // when it comes to write
1656 22 May 07 gregory 633     // permissions).
1652 22 May 07 gregory 634     for (int i = 0, sharedPathsLength = as_listPermissionDirs.length; i < sharedPathsLength; i++) // Optimization...
741 10 Oct 06 olle 635     {
1652 22 May 07 gregory 636       String tmpDir = as_listPermissionDirs[i];// .replace('\\','/');
1656 22 May 07 gregory 637       if (tmpDir.endsWith("*") && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 638         .length()) // If you
1656 22 May 07 gregory 639       // are
1656 22 May 07 gregory 640       // allowed
1656 22 May 07 gregory 641       // to view
1656 22 May 07 gregory 642       // the
1656 22 May 07 gregory 643       // content
1656 22 May 07 gregory 644       // of
1656 22 May 07 gregory 645       // subfolders
1656 22 May 07 gregory 646       // as
1656 22 May 07 gregory 647       // well...
1656 22 May 07 gregory 648       // (if the
1656 22 May 07 gregory 649       // name ends
1656 22 May 07 gregory 650       // with an *
1656 22 May 07 gregory 651       // ("/mapp1/mapp2/*"))
741 10 Oct 06 olle 652       {
1652 22 May 07 gregory 653         if (tmpDir.regionMatches(isWindows, 0, s_file, 0, tmpDir
1656 22 May 07 gregory 654           .length() - 1)) // If [the first "tmpDir.length()-1"
1656 22 May 07 gregory 655           // characters of the two strings are
1656 22 May 07 gregory 656           // equal (isWindows==true ==> case
1656 22 May 07 gregory 657           // insensitive)]...
741 10 Oct 06 olle 658           return true;
1656 22 May 07 gregory 659       }
1656 22 May 07 gregory 660       else if (pathEQ(tmpDir, s_file) && i_longestMatchingPath <= tmpDir
1656 22 May 07 gregory 661         .length())
741 10 Oct 06 olle 662         return true;
741 10 Oct 06 olle 663     }
741 10 Oct 06 olle 664     return false;
741 10 Oct 06 olle 665   }
741 10 Oct 06 olle 666
1656 22 May 07 gregory 667
1369 06 Mar 07 olle 668   /**
1369 06 Mar 07 olle 669    * Checks permissions for core items.
1369 06 Mar 07 olle 670    * 
1656 22 May 07 gregory 671    * @param s_file Path to core file or directory to check permission for, or
1656 22 May 07 gregory 672    *        null if irrelevant.
1656 22 May 07 gregory 673    * @param permission Permission type to check
1369 06 Mar 07 olle 674    * @return boolean
1369 06 Mar 07 olle 675    */
1656 22 May 07 gregory 676   public boolean corePermissionOK(String s_file, Permission permission)
1656 22 May 07 gregory 677   {
1369 06 Mar 07 olle 678     // *** Debug Info
1656 22 May 07 gregory 679     log
1678 25 May 07 olle 680       .debug("FileAccess::corePermissionOK(): Start - s_file = \"" + s_file + "\" permission = " + permission.name());
1369 06 Mar 07 olle 681     /*
1369 06 Mar 07 olle 682      * Check permission for core item.
1369 06 Mar 07 olle 683      */
1676 25 May 07 olle 684     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 685     ItemFactory factory = new ItemFactory(dc);
1369 06 Mar 07 olle 686     org.proteios.core.Path corePath = null;
1656 22 May 07 gregory 687     if (permission == Permission.CREATE)
1656 22 May 07 gregory 688     {
1369 06 Mar 07 olle 689       /*
1652 22 May 07 gregory 690        * The check for Permission.CREATE is handled separately, as the
1652 22 May 07 gregory 691        * path does not have to correspond to an existing item.
1369 06 Mar 07 olle 692        */
1656 22 May 07 gregory 693       try
1656 22 May 07 gregory 694       {
1369 06 Mar 07 olle 695         /*
1369 06 Mar 07 olle 696          * Check if path corresponds to core directory.
1369 06 Mar 07 olle 697          */
1369 06 Mar 07 olle 698         corePath = new org.proteios.core.Path(s_file, Type.DIRECTORY);
1369 06 Mar 07 olle 699         /*
1652 22 May 07 gregory 700          * If no InvalidPathException, core directory path is valid, but
1652 22 May 07 gregory 701          * the core directory does not necessarily exist.
1369 06 Mar 07 olle 702          */
1656 22 May 07 gregory 703       }
1656 22 May 07 gregory 704       catch (InvalidPathException e)
1656 22 May 07 gregory 705       {
1369 06 Mar 07 olle 706         /*
1369 06 Mar 07 olle 707          * Path does not correspond to valid directory.
1369 06 Mar 07 olle 708          */
1656 22 May 07 gregory 709         try
1656 22 May 07 gregory 710         {
1369 06 Mar 07 olle 711           /*
1369 06 Mar 07 olle 712            * Check if path corresponds to core file.
1369 06 Mar 07 olle 713            */
1369 06 Mar 07 olle 714           corePath = new org.proteios.core.Path(s_file, Type.FILE);
1369 06 Mar 07 olle 715           /*
1652 22 May 07 gregory 716            * If no InvalidPathException, core file path is valid, but
1652 22 May 07 gregory 717            * the core file does not necessarily exist.
1369 06 Mar 07 olle 718            */
1656 22 May 07 gregory 719         }
1656 22 May 07 gregory 720         catch (InvalidPathException e2)
1656 22 May 07 gregory 721         {
1369 06 Mar 07 olle 722           /*
1680 25 May 07 olle 723            * Close DbControl.
1680 25 May 07 olle 724            */
1680 25 May 07 olle 725           dc.close();
1680 25 May 07 olle 726           /*
1652 22 May 07 gregory 727            * Path corresponds to neither core directory or core file.
1369 06 Mar 07 olle 728            */
1678 25 May 07 olle 729           log.debug("FileAccess::corePermissionOK(): return false");
1369 06 Mar 07 olle 730           return false;
1369 06 Mar 07 olle 731         }
1369 06 Mar 07 olle 732       }
1678 25 May 07 olle 733       log.debug("FileAccess::corePermissionOK(): corePath = " + corePath);
1678 25 May 07 olle 734       log.debug("FileAccess::corePermissionOK(): corePath.getType() = " + corePath.getType());
1369 06 Mar 07 olle 735       /*
1652 22 May 07 gregory 736        * Get path for core directory (testCoreDirPath), that a new item
1652 22 May 07 gregory 737        * should be created in.
1369 06 Mar 07 olle 738        */
1369 06 Mar 07 olle 739       org.proteios.core.Path testCoreDirPath = null;
1369 06 Mar 07 olle 740       String testCoreDirPathStr = new String();
1369 06 Mar 07 olle 741       int nCoreDirs = corePath.getDirectoryCount();
1678 25 May 07 olle 742       log.debug("FileAccess::corePermissionOK(): nCoreDirs = " + nCoreDirs);
1656 22 May 07 gregory 743       if (nCoreDirs > 1)
1656 22 May 07 gregory 744       {
1678 25 May 07 olle 745         //testCoreDirPathStr = corePath.getDirectory(nCoreDirs - 2);
1678 25 May 07 olle 746         for (int i = 0; i < (nCoreDirs - 1); i++)
1678 25 May 07 olle 747         {
1678 25 May 07 olle 748           testCoreDirPathStr = testCoreDirPathStr + coreSeparator + corePath.getDirectory(i);
1678 25 May 07 olle 749         }
1656 22 May 07 gregory 750       }
1656 22 May 07 gregory 751       else
1656 22 May 07 gregory 752       {
1678 25 May 07 olle 753         //testCoreDirPathStr = corePath.getDirectory(0);
1678 25 May 07 olle 754         testCoreDirPathStr = coreSeparator + corePath.getDirectory(0);
1369 06 Mar 07 olle 755       }
1678 25 May 07 olle 756       log.debug("FileAccess::corePermissionOK(): testCoreDirPathStr = \"" + testCoreDirPathStr + "\"");
1652 22 May 07 gregory 757       testCoreDirPath = new org.proteios.core.Path(testCoreDirPathStr,
1656 22 May 07 gregory 758         Type.DIRECTORY);
1678 25 May 07 olle 759       log.debug("FileAccess::corePermissionOK(): testCoreDirPath = " + testCoreDirPath);
1369 06 Mar 07 olle 760       /*
1652 22 May 07 gregory 761        * We have path for core directory (testCoreDirPath), that a new
1652 22 May 07 gregory 762        * item should be created in. For create permission to be ok, this
1652 22 May 07 gregory 763        * core directory must exist, and permission to create new items in
1652 22 May 07 gregory 764        * it must be granted.
1369 06 Mar 07 olle 765        */
1656 22 May 07 gregory 766       try
1656 22 May 07 gregory 767       {
1656 22 May 07 gregory 768         Directory testCoreDir = factory.getByPath(testCoreDirPath);
1678 25 May 07 olle 769         log.debug("FileAccess::corePermissionOK(): testCoreDir = " + testCoreDir);
1369 06 Mar 07 olle 770         testCoreDir.checkPermission(permission);
1369 06 Mar 07 olle 771         /*
1680 25 May 07 olle 772          * Close DbControl.
1680 25 May 07 olle 773          */
1680 25 May 07 olle 774         dc.close();
1680 25 May 07 olle 775         /*
1652 22 May 07 gregory 776          * If no PermissionDeniedException, permission is granted.
1369 06 Mar 07 olle 777          */
1678 25 May 07 olle 778         log.debug("FileAccess::corePermissionOK(): return true");
1369 06 Mar 07 olle 779         return true;
1656 22 May 07 gregory 780       }
1656 22 May 07 gregory 781       catch (Exception e)
1656 22 May 07 gregory 782       {
1369 06 Mar 07 olle 783         /*
1680 25 May 07 olle 784          * Close DbControl.
1680 25 May 07 olle 785          */
1680 25 May 07 olle 786         dc.close();
1680 25 May 07 olle 787         /*
1652 22 May 07 gregory 788          * Parent core directory does not exist, or the user is not
1652 22 May 07 gregory 789          * permitted to read it. Either way permission to create new
1652 22 May 07 gregory 790          * items in this core directory is denied.
1369 06 Mar 07 olle 791          */
1678 25 May 07 olle 792         log.debug("FileAccess::corePermissionOK(): return false");
1369 06 Mar 07 olle 793         return false;
1369 06 Mar 07 olle 794       }
1656 22 May 07 gregory 795     }
1656 22 May 07 gregory 796     else
1656 22 May 07 gregory 797     {
1369 06 Mar 07 olle 798       /*
1678 25 May 07 olle 799        * Other type of permission check than Permission.CREATE. The path
1652 22 May 07 gregory 800        * should correspond to an existing item.
1369 06 Mar 07 olle 801        */
1656 22 May 07 gregory 802       try
1656 22 May 07 gregory 803       {
1656 22 May 07 gregory 804         if (coreDirExists(s_file))
1656 22 May 07 gregory 805         {
1369 06 Mar 07 olle 806           /*
1369 06 Mar 07 olle 807            * Get core directory corresponding to path.
1369 06 Mar 07 olle 808            */
1652 22 May 07 gregory 809           corePath = new org.proteios.core.Path(s_file,
1656 22 May 07 gregory 810             Type.DIRECTORY);
1656 22 May 07 gregory 811           org.proteios.core.Directory tmpCoreDir = factory
1656 22 May 07 gregory 812             .getByPath(corePath);
1369 06 Mar 07 olle 813           /*
1369 06 Mar 07 olle 814            * Check permission.
1369 06 Mar 07 olle 815            */
1369 06 Mar 07 olle 816           tmpCoreDir.checkPermission(permission);
1369 06 Mar 07 olle 817           /*
1680 25 May 07 olle 818            * Close DbControl.
1680 25 May 07 olle 819            */
1680 25 May 07 olle 820           dc.close();
1680 25 May 07 olle 821           /*
1652 22 May 07 gregory 822            * If no PermissionDeniedException, permission is granted.
1369 06 Mar 07 olle 823            */
1678 25 May 07 olle 824           log.debug("FileAccess::corePermissionOK(): return true");
1369 06 Mar 07 olle 825           return true;
1656 22 May 07 gregory 826         }
1656 22 May 07 gregory 827         else if (coreFileExists(s_file))
1656 22 May 07 gregory 828         {
1369 06 Mar 07 olle 829           /*
1369 06 Mar 07 olle 830            * Get core file corresponding to path.
1369 06 Mar 07 olle 831            */
1369 06 Mar 07 olle 832           corePath = new org.proteios.core.Path(s_file, Type.FILE);
1656 22 May 07 gregory 833           org.proteios.core.File tmpCoreFile = factory.getByPath(
1656 22 May 07 gregory 834             corePath, false);
1369 06 Mar 07 olle 835           /*
1369 06 Mar 07 olle 836            * Check permission.
1369 06 Mar 07 olle 837            */
1369 06 Mar 07 olle 838           tmpCoreFile.checkPermission(permission);
1369 06 Mar 07 olle 839           /*
1680 25 May 07 olle 840            * Close DbControl.
1680 25 May 07 olle 841            */
1680 25 May 07 olle 842           dc.close();
1680 25 May 07 olle 843           /*
1652 22 May 07 gregory 844            * If no PermissionDeniedException, permission is granted.
1369 06 Mar 07 olle 845            */
1678 25 May 07 olle 846           log.debug("FileAccess::corePermissionOK(): return true");
1369 06 Mar 07 olle 847           return true;
1656 22 May 07 gregory 848         }
1656 22 May 07 gregory 849         else
1656 22 May 07 gregory 850         {
1369 06 Mar 07 olle 851           /*
1680 25 May 07 olle 852            * Close DbControl.
1680 25 May 07 olle 853            */
1680 25 May 07 olle 854           dc.close();
1680 25 May 07 olle 855           /*
1369 06 Mar 07 olle 856            * Core item does not exist.
1369 06 Mar 07 olle 857            */
1678 25 May 07 olle 858           log.debug("FileAccess::corePermissionOK(): return false");
1369 06 Mar 07 olle 859           return false;
1369 06 Mar 07 olle 860         }
1656 22 May 07 gregory 861       }
1656 22 May 07 gregory 862       catch (PermissionDeniedException e)
1656 22 May 07 gregory 863       {
1369 06 Mar 07 olle 864         /*
1680 25 May 07 olle 865          * Close DbControl.
1680 25 May 07 olle 866          */
1680 25 May 07 olle 867         dc.close();
1680 25 May 07 olle 868         /*
1369 06 Mar 07 olle 869          * Permission not granted.
1369 06 Mar 07 olle 870          */
1678 25 May 07 olle 871         log.debug("FileAccess::corePermissionOK(): return false");
1369 06 Mar 07 olle 872         return false;
1369 06 Mar 07 olle 873       }
1369 06 Mar 07 olle 874     }
1369 06 Mar 07 olle 875   }
1369 06 Mar 07 olle 876
1656 22 May 07 gregory 877
1656 22 May 07 gregory 878   private static boolean pathEQ(String p1, String p2)
1656 22 May 07 gregory 879   {
1652 22 May 07 gregory 880     if (isWindows) // If Windows...
741 10 Oct 06 olle 881     {
741 10 Oct 06 olle 882       return p1.equalsIgnoreCase(p2);
1656 22 May 07 gregory 883     }
1656 22 May 07 gregory 884     else
1656 22 May 07 gregory 885     {
741 10 Oct 06 olle 886       return p1.equals(p2);
741 10 Oct 06 olle 887     }
741 10 Oct 06 olle 888   }
741 10 Oct 06 olle 889
1656 22 May 07 gregory 890
1656 22 May 07 gregory 891   public boolean fileExists(String s_file)
1656 22 May 07 gregory 892   {
790 23 Oct 06 olle 893     // *** Debug Info
1656 22 May 07 gregory 894     log
1656 22 May 07 gregory 895       .debug("FileAccess::fileExists(): Start - s_file = \"" + s_file + "\"");
795 24 Oct 06 olle 896     /*
1652 22 May 07 gregory 897      * Argument s_file is absolute path. Get parent directory path and the
1652 22 May 07 gregory 898      * parent core directory. Check if file or directory already exists,
795 24 Oct 06 olle 899      */
795 24 Oct 06 olle 900     String parentDirPath = new String("");
795 24 Oct 06 olle 901     String newFileOrDirName = new String("");
1652 22 May 07 gregory 902     // if (!s_file.equals(File.separator))
1656 22 May 07 gregory 903     if (!s_file.equals(coreSeparator))
1656 22 May 07 gregory 904     {
1652 22 May 07 gregory 905       // parentDirPath =
1652 22 May 07 gregory 906       // s_file.substring(0,s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 907       // s_file.length()-2)+1);
1652 22 May 07 gregory 908       // newFileOrDirName =
1652 22 May 07 gregory 909       // s_file.substring(s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 910       // s_file.length()-2)+1);
1652 22 May 07 gregory 911       parentDirPath = s_file.substring(0, s_file.lastIndexOf(
1656 22 May 07 gregory 912         coreSeparatorChar, s_file.length() - 2) + 1);
1652 22 May 07 gregory 913       newFileOrDirName = s_file.substring(s_file.lastIndexOf(
1656 22 May 07 gregory 914         coreSeparatorChar, s_file.length() - 2) + 1);
795 24 Oct 06 olle 915       /*
795 24 Oct 06 olle 916        * Remove possible slash from end of name.
795 24 Oct 06 olle 917        */
1652 22 May 07 gregory 918       // if (newFileOrDirName.lastIndexOf(File.separator) ==
1652 22 May 07 gregory 919       // (newFileOrDirName.length()-1))
1652 22 May 07 gregory 920       if (newFileOrDirName.lastIndexOf(coreSeparatorChar) == (newFileOrDirName
1656 22 May 07 gregory 921         .length() - 1))
1656 22 May 07 gregory 922       {
1652 22 May 07 gregory 923         newFileOrDirName = newFileOrDirName.substring(0,
1656 22 May 07 gregory 924           newFileOrDirName.length() - 1);
795 24 Oct 06 olle 925       }
1656 22 May 07 gregory 926     }
1656 22 May 07 gregory 927     else
1656 22 May 07 gregory 928     {
1652 22 May 07 gregory 929       // parentDirPath = File.separator;
1052 08 Dec 06 olle 930       parentDirPath = coreSeparator;
795 24 Oct 06 olle 931     }
1656 22 May 07 gregory 932     log
1656 22 May 07 gregory 933       .debug("FileAccess::fileExists(): parentDirPath = \"" + parentDirPath + "\"");
1656 22 May 07 gregory 934     log
1656 22 May 07 gregory 935       .debug("FileAccess::fileExists(): newFileOrDirName = \"" + newFileOrDirName + "\"");
1656 22 May 07 gregory 936     log
1656 22 May 07 gregory 937       .debug("FileAccess::fileExists(): parentDirPath = \"" + parentDirPath + "\"");
795 24 Oct 06 olle 938     boolean dirExists = false;
795 24 Oct 06 olle 939     boolean fileExists = false;
1652 22 May 07 gregory 940     org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 941       parentDirPath, Type.DIRECTORY);
1676 25 May 07 olle 942     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 943     ItemFactory factory = new ItemFactory(dc);
795 24 Oct 06 olle 944     Directory coreDir = null;
1656 22 May 07 gregory 945     try
1656 22 May 07 gregory 946     {
1656 22 May 07 gregory 947       coreDir = factory.getByPath(coreDirPath);
795 24 Oct 06 olle 948       dirExists = Directory.exists(dc, coreDir, newFileOrDirName);
1652 22 May 07 gregory 949       log
1656 22 May 07 gregory 950         .debug("FileAccess::fileExists(): Directory.exists(dc, coreDir, " + newFileOrDirName + ") = " + dirExists);
1656 22 May 07 gregory 951     }
1656 22 May 07 gregory 952     catch (Exception e)
1656 22 May 07 gregory 953     {
1680 25 May 07 olle 954       /*
1680 25 May 07 olle 955        * Close DbControl.
1680 25 May 07 olle 956        */
1680 25 May 07 olle 957       dc.close();
1652 22 May 07 gregory 958       log
1656 22 May 07 gregory 959         .debug("FileAccess::fileExists(): Could not get parent core directory, return false.");
795 24 Oct 06 olle 960       return false;
795 24 Oct 06 olle 961     }
795 24 Oct 06 olle 962     dirExists = Directory.exists(dc, coreDir, newFileOrDirName);
1652 22 May 07 gregory 963     log
1656 22 May 07 gregory 964       .debug("FileAccess::fileExists(): Directory.exists(dc, coreDir, " + newFileOrDirName + ") = " + dirExists);
1656 22 May 07 gregory 965     log
1656 22 May 07 gregory 966       .debug("FileAccess::fileExists(): After directory check: dirExists = " + dirExists);
795 24 Oct 06 olle 967     /*
1652 22 May 07 gregory 968      * If a subdirectory with the specified name already exists, we are
1652 22 May 07 gregory 969      * finished. Otherwise, check if a file with the specified name exists.
795 24 Oct 06 olle 970      */
1656 22 May 07 gregory 971     if (!dirExists)
1656 22 May 07 gregory 972     {
795 24 Oct 06 olle 973       /*
795 24 Oct 06 olle 974        * Get ItemQuery for core files in core directory
795 24 Oct 06 olle 975        */
795 24 Oct 06 olle 976       ItemQuery fileQuery = coreDir.getFileQuery();
795 24 Oct 06 olle 977       int nFiles = fileQuery.count(dc);
1656 22 May 07 gregory 978       log
1656 22 May 07 gregory 979         .debug("FileAccess::fileExists(): fileQuery.count(dc) = " + nFiles);
931 16 Nov 06 olle 980       /*
931 16 Nov 06 olle 981        * The ItemResultList may exclude some items.
931 16 Nov 06 olle 982        */
795 24 Oct 06 olle 983       ItemResultList fileList = fileQuery.list(dc);
1656 22 May 07 gregory 984       log.debug("FileAccess::fileExists(): fileList.size() = " + fileList
1656 22 May 07 gregory 985         .size());
931 16 Nov 06 olle 986       nFiles = fileList.size();
1656 22 May 07 gregory 987       for (int i = 0; i < nFiles; i++)
1656 22 May 07 gregory 988       {
1652 22 May 07 gregory 989         org.proteios.core.File tmpCoreFile = (org.proteios.core.File) fileList
1656 22 May 07 gregory 990           .get(i);
1691 29 May 07 olle 991         //log
1691 29 May 07 olle 992         //  .debug("FileAccess::fileExists(): fileList.get(" + i + ").getName() = \"" + tmpCoreFile
1691 29 May 07 olle 993         //    .getName() + "\"");
1656 22 May 07 gregory 994         if (tmpCoreFile.getName().equals(newFileOrDirName))
1656 22 May 07 gregory 995         {
795 24 Oct 06 olle 996           fileExists = true;
795 24 Oct 06 olle 997         }
795 24 Oct 06 olle 998       }
795 24 Oct 06 olle 999     }
1656 22 May 07 gregory 1000     log
1656 22 May 07 gregory 1001       .debug("FileAccess::fileExists(): dirExists = " + dirExists + " fileExists = " + fileExists);
1656 22 May 07 gregory 1002     if (dirExists || fileExists)
1656 22 May 07 gregory 1003     {
1680 25 May 07 olle 1004       /*
1680 25 May 07 olle 1005        * Close DbControl.
1680 25 May 07 olle 1006        */
1680 25 May 07 olle 1007       dc.close();
1646 16 May 07 olle 1008       log.debug("FileAccess::fileExists(): return true");
795 24 Oct 06 olle 1009       return true;
1656 22 May 07 gregory 1010     }
1656 22 May 07 gregory 1011     else
1656 22 May 07 gregory 1012     {
1680 25 May 07 olle 1013       /*
1680 25 May 07 olle 1014        * Close DbControl.
1680 25 May 07 olle 1015        */
1680 25 May 07 olle 1016       dc.close();
1646 16 May 07 olle 1017       log.debug("FileAccess::fileExists(): return false");
795 24 Oct 06 olle 1018       return false;
795 24 Oct 06 olle 1019     }
799 24 Oct 06 olle 1020   }
790 23 Oct 06 olle 1021
1656 22 May 07 gregory 1022
799 24 Oct 06 olle 1023   /**
1652 22 May 07 gregory 1024    * Checks if a core directory with the specified path exists. Convenience
1652 22 May 07 gregory 1025    * method not part of original Xerver code.
799 24 Oct 06 olle 1026    * 
1656 22 May 07 gregory 1027    * @param s_file String path to check if it represents an existing core
1656 22 May 07 gregory 1028    *        directory.
1652 22 May 07 gregory 1029    * @return boolean true if path represents an existing core directory, else
1652 22 May 07 gregory 1030    *         false.
799 24 Oct 06 olle 1031    */
1656 22 May 07 gregory 1032   public boolean coreDirExists(String s_file)
1656 22 May 07 gregory 1033   {
799 24 Oct 06 olle 1034     // *** Debug Info
1656 22 May 07 gregory 1035     log
1656 22 May 07 gregory 1036       .debug("FileAccess::coreDirExists(): Start - s_file = \"" + s_file + "\"");
790 23 Oct 06 olle 1037     /*
1652 22 May 07 gregory 1038      * Argument s_file is absolute path. Get parent directory path and the
1652 22 May 07 gregory 1039      * parent core directory. Check if file or directory already exists,
790 23 Oct 06 olle 1040      */
799 24 Oct 06 olle 1041     String parentDirPath = new String("");
799 24 Oct 06 olle 1042     String newFileOrDirName = new String("");
1652 22 May 07 gregory 1043     // if (!s_file.equals(File.separator))
1656 22 May 07 gregory 1044     if (!s_file.equals(coreSeparator))
1656 22 May 07 gregory 1045     {
1652 22 May 07 gregory 1046       // parentDirPath =
1652 22 May 07 gregory 1047       // s_file.substring(0,s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 1048       // s_file.length()-2)+1);
1652 22 May 07 gregory 1049       // newFileOrDirName =
1652 22 May 07 gregory 1050       // s_file.substring(s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 1051       // s_file.length()-2)+1);
1652 22 May 07 gregory 1052       parentDirPath = s_file.substring(0, s_file.lastIndexOf(
1656 22 May 07 gregory 1053         coreSeparatorChar, s_file.length() - 2) + 1);
1652 22 May 07 gregory 1054       newFileOrDirName = s_file.substring(s_file.lastIndexOf(
1656 22 May 07 gregory 1055         coreSeparatorChar, s_file.length() - 2) + 1);
799 24 Oct 06 olle 1056       /*
799 24 Oct 06 olle 1057        * Remove possible slash from end of name.
799 24 Oct 06 olle 1058        */
1652 22 May 07 gregory 1059       // if (newFileOrDirName.lastIndexOf(File.separator) ==
1652 22 May 07 gregory 1060       // (newFileOrDirName.length()-1))
1652 22 May 07 gregory 1061       if (newFileOrDirName.lastIndexOf(coreSeparator) == (newFileOrDirName
1656 22 May 07 gregory 1062         .length() - 1))
1656 22 May 07 gregory 1063       {
1652 22 May 07 gregory 1064         newFileOrDirName = newFileOrDirName.substring(0,
1656 22 May 07 gregory 1065           newFileOrDirName.length() - 1);
799 24 Oct 06 olle 1066       }
1656 22 May 07 gregory 1067     }
1656 22 May 07 gregory 1068     else
1656 22 May 07 gregory 1069     {
1652 22 May 07 gregory 1070       // parentDirPath = File.separator;
1052 08 Dec 06 olle 1071       parentDirPath = coreSeparator;
799 24 Oct 06 olle 1072     }
1656 22 May 07 gregory 1073     log
1656 22 May 07 gregory 1074       .debug("FileAccess::coreDirExists(): parentDirPath = \"" + parentDirPath + "\"");
1656 22 May 07 gregory 1075     log
1656 22 May 07 gregory 1076       .debug("FileAccess::coreDirExists(): newFileOrDirName = \"" + newFileOrDirName + "\"");
799 24 Oct 06 olle 1077     boolean dirExists = false;
1652 22 May 07 gregory 1078     org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 1079       parentDirPath, Type.DIRECTORY);
1676 25 May 07 olle 1080     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1081     ItemFactory factory = new ItemFactory(dc);
799 24 Oct 06 olle 1082     Directory coreDir = null;
1656 22 May 07 gregory 1083     try
1656 22 May 07 gregory 1084     {
1656 22 May 07 gregory 1085       coreDir = factory.getByPath(coreDirPath);
799 24 Oct 06 olle 1086       dirExists = Directory.exists(dc, coreDir, newFileOrDirName);
1652 22 May 07 gregory 1087       log
1656 22 May 07 gregory 1088         .debug("FileAccess::coreDirExists(): Directory.exists(dc, coreDir, " + newFileOrDirName + ") = " + dirExists);
1656 22 May 07 gregory 1089     }
1656 22 May 07 gregory 1090     catch (Exception e)
1656 22 May 07 gregory 1091     {
1680 25 May 07 olle 1092       /*
1680 25 May 07 olle 1093        * Close DbControl.
1680 25 May 07 olle 1094        */
1680 25 May 07 olle 1095       dc.close();
1652 22 May 07 gregory 1096       log
1656 22 May 07 gregory 1097         .debug("FileAccess::coreDirExists(): Could not get parent core directory, return false.");
799 24 Oct 06 olle 1098       return false;
799 24 Oct 06 olle 1099     }
799 24 Oct 06 olle 1100     dirExists = Directory.exists(dc, coreDir, newFileOrDirName);
1680 25 May 07 olle 1101     /*
1680 25 May 07 olle 1102      * Close DbControl.
1680 25 May 07 olle 1103      */
1680 25 May 07 olle 1104     dc.close();
1652 22 May 07 gregory 1105     log
1656 22 May 07 gregory 1106       .debug("FileAccess::coreDirExists(): Directory.exists(dc, coreDir, " + newFileOrDirName + ") = " + dirExists);
1656 22 May 07 gregory 1107     log
1656 22 May 07 gregory 1108       .debug("FileAccess::coreDirExists(): After directory check: dirExists = " + dirExists);
799 24 Oct 06 olle 1109     return dirExists;
741 10 Oct 06 olle 1110   }
741 10 Oct 06 olle 1111
1656 22 May 07 gregory 1112
799 24 Oct 06 olle 1113   /**
1652 22 May 07 gregory 1114    * Checks if a core file with the specified path exists. Convenience method
1652 22 May 07 gregory 1115    * not part of original Xerver code. Does not include removed core files.
799 24 Oct 06 olle 1116    * 
1656 22 May 07 gregory 1117    * @param s_file String path to check if it represents an existing core
1656 22 May 07 gregory 1118    *        file.
1652 22 May 07 gregory 1119    * @return boolean true if path represents an existing core file, else
1652 22 May 07 gregory 1120    *         false.
799 24 Oct 06 olle 1121    */
1656 22 May 07 gregory 1122   public boolean coreFileExists(String s_file)
1656 22 May 07 gregory 1123   {
799 24 Oct 06 olle 1124     // *** Debug Info
1656 22 May 07 gregory 1125     log
1656 22 May 07 gregory 1126       .debug("FileAccess::coreFileExists(): Start - s_file = \"" + s_file + "\"");
931 16 Nov 06 olle 1127     boolean includeRemoved = false;
931 16 Nov 06 olle 1128     return coreFileExists(s_file, includeRemoved);
931 16 Nov 06 olle 1129   }
931 16 Nov 06 olle 1130
1656 22 May 07 gregory 1131
931 16 Nov 06 olle 1132   /**
1652 22 May 07 gregory 1133    * Checks if a core file with the specified path exists. Convenience method
1652 22 May 07 gregory 1134    * not part of original Xerver code.
931 16 Nov 06 olle 1135    * 
1656 22 May 07 gregory 1136    * @param s_file String path to check if it represents an existing core
1656 22 May 07 gregory 1137    *        file.
1656 22 May 07 gregory 1138    * @param includeRemoved boolean flag indicating if removed files should be
1656 22 May 07 gregory 1139    *        included.
1652 22 May 07 gregory 1140    * @return boolean true if path represents an existing core file, else
1652 22 May 07 gregory 1141    *         false.
931 16 Nov 06 olle 1142    */
1656 22 May 07 gregory 1143   public boolean coreFileExists(String s_file, boolean includeRemoved)
1656 22 May 07 gregory 1144   {
931 16 Nov 06 olle 1145     // *** Debug Info
1656 22 May 07 gregory 1146     log
1656 22 May 07 gregory 1147       .debug("FileAccess::coreFileExists(): Start - s_file = \"" + s_file + "\" includeRemoved = " + includeRemoved);
799 24 Oct 06 olle 1148     /*
1652 22 May 07 gregory 1149      * Argument s_file is absolute path. Get parent directory path and the
1652 22 May 07 gregory 1150      * parent core directory. Check if file or directory already exists,
799 24 Oct 06 olle 1151      */
799 24 Oct 06 olle 1152     String parentDirPath = new String("");
799 24 Oct 06 olle 1153     String newFileOrDirName = new String("");
1652 22 May 07 gregory 1154     // if (!s_file.equals(File.separator))
1656 22 May 07 gregory 1155     if (!s_file.equals(coreSeparator))
1656 22 May 07 gregory 1156     {
1652 22 May 07 gregory 1157       // parentDirPath =
1652 22 May 07 gregory 1158       // s_file.substring(0,s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 1159       // s_file.length()-2)+1);
1652 22 May 07 gregory 1160       // newFileOrDirName =
1652 22 May 07 gregory 1161       // s_file.substring(s_file.lastIndexOf(File.separatorChar,
1652 22 May 07 gregory 1162       // s_file.length()-2)+1);
1652 22 May 07 gregory 1163       parentDirPath = s_file.substring(0, s_file.lastIndexOf(
1656 22 May 07 gregory 1164         coreSeparatorChar, s_file.length() - 2) + 1);
1652 22 May 07 gregory 1165       newFileOrDirName = s_file.substring(s_file.lastIndexOf(
1656 22 May 07 gregory 1166         coreSeparatorChar, s_file.length() - 2) + 1);
799 24 Oct 06 olle 1167       /*
799 24 Oct 06 olle 1168        * Remove possible slash from end of name.
799 24 Oct 06 olle 1169        */
1652 22 May 07 gregory 1170       // if (newFileOrDirName.lastIndexOf(File.separator) ==
1652 22 May 07 gregory 1171       // (newFileOrDirName.length()-1))
1652 22 May 07 gregory 1172       if (newFileOrDirName.lastIndexOf(coreSeparator) == (newFileOrDirName
1656 22 May 07 gregory 1173         .length() - 1))
1656 22 May 07 gregory 1174       {
1652 22 May 07 gregory 1175         newFileOrDirName = newFileOrDirName.substring(0,
1656 22 May 07 gregory 1176           newFileOrDirName.length() - 1);
799 24 Oct 06 olle 1177       }
1656 22 May 07 gregory 1178     }
1656 22 May 07 gregory 1179     else
1656 22 May 07 gregory 1180     {
1652 22 May 07 gregory 1181       // parentDirPath = File.separator;
1052 08 Dec 06 olle 1182       parentDirPath = coreSeparator;
799 24 Oct 06 olle 1183     }
1656 22 May 07 gregory 1184     log
1656 22 May 07 gregory 1185       .debug("FileAccess::coreFileExists(): parentDirPath = \"" + parentDirPath + "\"");
1656 22 May 07 gregory 1186     log
1656 22 May 07 gregory 1187       .debug("FileAccess::coreFileExists(): newFileOrDirName = \"" + newFileOrDirName + "\"");
799 24 Oct 06 olle 1188     boolean fileExists = false;
1652 22 May 07 gregory 1189     org.proteios.core.Path coreDirPath = new org.proteios.core.Path(
1656 22 May 07 gregory 1190       parentDirPath, Type.DIRECTORY);
1676 25 May 07 olle 1191     DbControl dc = getSessionControl().newDbControl();
1656 22 May 07 gregory 1192     ItemFactory factory = new ItemFactory(dc);
799 24 Oct 06 olle 1193     Directory coreDir = null;
1656 22 May 07 gregory 1194     try
1656 22 May 07 gregory 1195     {
1656 22 May 07 gregory 1196       coreDir = factory.getByPath(coreDirPath);
1656 22 May 07 gregory 1197     }
1656 22 May 07 gregory 1198     catch (Exception e)
1656 22 May 07 gregory 1199     {
1680 25 May 07 olle 1200       /*
1680 25 May 07 olle 1201        * Close DbControl.
1680 25 May 07 olle 1202        */
1680 25 May 07 olle 1203       dc.close();
1652 22 May 07 gregory 1204       log
1656 22 May 07 gregory 1205         .debug("FileAccess::coreFileExists(): Could not get parent core directory, return false.");
799 24 Oct 06 olle 1206       return false;
799 24 Oct 06 olle 1207     }
799 24 Oct 06 olle 1208     /*
799 24 Oct 06 olle 1209      * Check if a file with the specified name exists.
799 24 Oct 06 olle 1210      */
799 24 Oct 06 olle 1211     /*
799 24 Oct 06 olle 1212      * Get ItemQuery for core files in core directory
799 24 Oct 06 olle 1213      */
799 24 Oct 06 olle 1214     ItemQuery fileQuery = coreDir.getFileQuery();
1656 22 May 07 gregory 1215     if (includeRemoved)
1656 22 May 07 gregory 1216     {
931 16 Nov 06 olle 1217       fileQuery.include(Include.REMOVED, Include.NOT_REMOVED);
931 16 Nov 06 olle 1218     }
799 24 Oct 06 olle 1219     int nFiles = fileQuery.count(dc);
1656 22 May 07 gregory 1220     log
1656 22 May 07 gregory 1221       .debug("FileAccess::coreFileExists(): fileQuery.count(dc) = " + nFiles);
931 16 Nov 06 olle 1222     /*
931 16 Nov 06 olle 1223      * The ItemResultList may exclude some items.
931 16 Nov 06 olle 1224      */
799 24 Oct 06 olle 1225     ItemResultList fileList = fileQuery.list(dc);
1656 22 May 07 gregory 1226     log.debug("FileAccess::coreFileExists(): fileList.size() = " + fileList
1656 22 May 07 gregory 1227       .size());
931 16 Nov 06 olle 1228     nFiles = fileList.size();
1656 22 May 07 gregory 1229     for (int i = 0; i < nFiles; i++)
1656 22 May 07 gregory 1230     {
1652 22 May 07 gregory 1231       org.proteios.core.File tmpCoreFile = (org.proteios.core.File) fileList
1656 22 May 07 gregory 1232         .get(i);
1695 29 May 07 olle 1233       //log
1695 29 May 07 olle 1234       //  .debug("FileAccess::coreFileExists(): fileList.get(" + i + ").getName() = \"" + tmpCoreFile
1695 29 May 07 olle 1235       //    .getName() + "\"");
1656 22 May 07 gregory 1236       if (tmpCoreFile.getName().equals(newFileOrDirName))
1656 22 May 07 gregory 1237       {
799 24 Oct 06 olle 1238         fileExists = true;
799 24 Oct 06 olle 1239       }
799 24 Oct 06 olle 1240     }
1680 25 May 07 olle 1241     /*
1680 25 May 07 olle 1242      * Close DbControl.
1680 25 May 07 olle 1243      */
1680 25 May 07 olle 1244     dc.close();
1646 16 May 07 olle 1245     log.debug("FileAccess::coreFileExists(): fileExists = " + fileExists);
799 24 Oct 06 olle 1246     return fileExists;
799 24 Oct 06 olle 1247   }
799 24 Oct 06 olle 1248
1656 22 May 07 gregory 1249
1656 22 May 07 gregory 1250   public boolean fileExists(File f_file)
1656 22 May 07 gregory 1251   {
741 10 Oct 06 olle 1252     return f_file.exists();
741 10 Oct 06 olle 1253   }
741 10 Oct 06 olle 1254
1656 22 May 07 gregory 1255
1656 22 May 07 gregory 1256   public UserData getUserData()
1656 22 May 07 gregory 1257   {
741 10 Oct 06 olle 1258     return ud_user;
741 10 Oct 06 olle 1259   }
741 10 Oct 06 olle 1260
1656 22 May 07 gregory 1261
1656 22 May 07 gregory 1262   public boolean isNotAllowedToCreateNewFile(String s_file)
1656 22 May 07 gregory 1263   {
1652 22 May 07 gregory 1264     return !createPermissionOK(s_file) || fileExists(s_file); // If [We
1656 22 May 07 gregory 1265     // are NOT
1656 22 May 07 gregory 1266     // allowed
1656 22 May 07 gregory 1267     // to create
1656 22 May 07 gregory 1268     // new
1656 22 May 07 gregory 1269     // files] OR
1656 22 May 07 gregory 1270     // [This
1656 22 May 07 gregory 1271     // file name
1656 22 May 07 gregory 1272     // does
1656 22 May 07 gregory 1273     // exists]...
1656 22 May 07 gregory 1274     // (then we
1656 22 May 07 gregory 1275     // are not
1656 22 May 07 gregory 1276     // allowed
1656 22 May 07 gregory 1277     // to create
1656 22 May 07 gregory 1278     // a new
1656 22 May 07 gregory 1279     // file)
741 10 Oct 06 olle 1280   }
741 10 Oct 06 olle 1281
1656 22 May 07 gregory 1282
1656 22 May 07 gregory 1283   public static UserDatabase getDataBase()
1656 22 May 07 gregory 1284   {
741 10 Oct 06 olle 1285     return udb_userDatabase;
741 10 Oct 06 olle 1286   }
741 10 Oct 06 olle 1287
1656 22 May 07 gregory 1288
1656 22 May 07 gregory 1289   public static void createDataBase()
1656 22 May 07 gregory 1290   {
1652 22 May 07 gregory 1291     if (udb_userDatabase == null)
1652 22 May 07 gregory 1292       udb_userDatabase = new UserDatabase();
741 10 Oct 06 olle 1293   }
790 23 Oct 06 olle 1294
1656 22 May 07 gregory 1295
790 23 Oct 06 olle 1296   /**
1652 22 May 07 gregory 1297    * Alternative method that sets the user login name. Not part of the
1652 22 May 07 gregory 1298    * original Xerver code.
790 23 Oct 06 olle 1299    * 
1656 22 May 07 gregory 1300    * @param userLogin String the user login name to add to the FTP database.
790 23 Oct 06 olle 1301    */
1656 22 May 07 gregory 1302   public static void createDataBase(String userLogin)
1656 22 May 07 gregory 1303   {
1652 22 May 07 gregory 1304     if (udb_userDatabase == null)
1652 22 May 07 gregory 1305       udb_userDatabase = new UserDatabase(userLogin);
790 23 Oct 06 olle 1306   }
741 10 Oct 06 olle 1307 }