Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16

    ClassLoader..ProtectionDomain file Policy

    Ciao a tutti...Sto realizzando (ci sto sbattendo la testa) un metodo per il controllo dell accesso java basato sui Ruoli. Ora sono ancora alle fasi preliminari e ho incontrato dei problemi per i permessi.
    Ho creato un classLoader MYClassLoader che carica una classe TestClass.class allla quale verra associata anche un dominio di protezione con il permesso di leggere un file

    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.AccessController;
    import java.security.CodeSource;
    import java.security.Permission;
    import java.security.ProtectionDomain;
    import java.security.SecureClassLoader;
    import java.util.Hashtable;
    import java.util.StringTokenizer ;

    public class myClassLoader extends ClassLoader {
    private Hashtable classes = new Hashtable();
    protected String path ;
    protected String extension ;
    protected ProtectionDomain domain;
    protected URL url=null;


    public myClassLoader( String path, String extension) {
    this.path = path ;
    this.extension = extension ;

    }

    /* Carica il contenuto di un file .class */
    private byte getClassBytes(String className)[] {
    System.out.println("Lettura dati da file per la classe "+className);
    byte result[];
    try {
    result = loadClassBytes( className ) ;

    return result;
    } catch (Exception e) {
    return null;
    }
    }

    private byte[] loadClassBytes(String className) throws MalformedURLException {
    // System.out.println("Lettura dati da file per la classe " +
    // classname);
    String name="C:\\Users\\db2admin\\workspace\\Base\\src\\" +path+ "\\" +className + "." + extension;
    File classfile= new File (name);
    URL url=classfile.toURI().toURL();
    System.out.println(url.toString());
    System.out.println(name);
    byte result[] = null;
    FileInputStream fi = null;
    try {
    fi = new FileInputStream(classfile);

    result = new byte[(int) classfile.length()];
    fi.read(result);
    } catch (Exception e) {
    result = null;
    } finally {
    try {
    fi.close();
    } catch (Exception ex) {
    }
    }
    return result;
    }

    /* Questa e' la versione chiamata */
    public Class loadClass(String className) throws ClassNotFoundException {
    return (loadClass(className, true));
    }

    /* Questa e' la versione completa */
    public synchronized Class loadClass(String className, boolean resolveIt)
    throws ClassNotFoundException {
    Class result;
    byte classData[];

    System.out.println("Caricamento della classe : "+className);

    /* Prima si controlla la cache */
    result = (Class)classes.get(className);
    if (result != null) {
    System.out.println("Utilizzata la copia nella cache.");
    return result;
    }

    /* Prima si prova col primordial class loader */
    try {
    result = super.findSystemClass(className);
    System.out.println("Classe di sistema (CLASSPATH)");
    return result;
    } catch (ClassNotFoundException e) {
    System.out.println("Non e' una classe di sistema.");
    if ( className.startsWith( "java.") ) {
    System.out.println("Classe pericolosa : " + className ) ;
    System.out.println( "Caricamento abortito" ) ;
    throw new ClassNotFoundException();
    }
    }

    /* poi si prova a caricare la classe dal path specificato */
    classData = getClassBytes(className);
    if (classData == null) {
    throw new ClassNotFoundException();
    }

    this.domain=generadominio(className);
    /* viene eseguito il parsing, e costruito l'oggetto class */
    result = defineClass(className,classData, 0, classData.length,this.domain);
    if (result == null) {
    throw new ClassFormatError();
    }

    if (resolveIt) {
    resolveClass(result);
    }

    /* Si aggiorna la cache */
    classes.put(className, result);
    System.out.println("Classe caricata : " +className);
    return result;
    }

    private ProtectionDomain generadominio(String classname){
    java.security.cert.Certificate[] c=null;
    CodeSource cs=new CodeSource (url, c);

    Permission p1 = new FilePermission("C:\\luca.txt", "read");


    //AccessController.checkPermission(p1);
    TestPermissionCollection p= new TestPermissionCollection();
    p.add(p1);
    ProtectionDomain d=new ProtectionDomain (cs , p);
    return d;}
    }


    ovviamente c è un main che istanzia il classloader...ma quando la classe TestClass caricata prova ad aprire in lettura il file C:\\luca.txt il controller dell accesso mi dice accesso negato , nonostante il permesso sia nel propio dominio di protezione e nel file policy da me creato

    grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};

    stringa in questione.

    Perchèè?????? le ho provate di tutte ma niente...forse il class loader non associa bene la classe al dominio di protezione...bo non saprei..!
    per completezza vi allego il codice il main è nella classe Test

    Spero che qualcuno mi possa aiutareeeeee
    please


    questo è il main
    /* Esempio di utilizzo di myClassLoader */
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FilePermission;
    import java.io.IOException;
    import java.io.InputStreamReader;


    public class Test {
    public static void main( String args[] ) throws IOException {

    myClassLoader classLoader = new myClassLoader( "arch", "class" ) ;
    Object o ;
    String tst = "TestClass" ;
    // String tst = "java.Virus" ;

    System.out.println( "Utilizzo di myClassLoader." ) ;

    if ( args.length != 0 )
    tst = args[0] ;

    try {
    o = (classLoader.loadClass(tst)).newInstance() ;

    ((myInterface) o).start("niente") ;
    ((myInterface) o).leggifile();
    ((myInterface) o).creaConnection();
    } catch (Exception e ) {
    e.printStackTrace() ;
    }

    }
    }
    questa il .java della classe da caricare

    import java.sql.Statement;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.* ;

    public class TestClass implements myInterface {
    // viene caricata la classe Vector
    Vector v = new Vector() ;
    TestConnection c;
    public java.sql.Connection con;
    // Fa parte dell'interfaccia myInterface
    public void start( String opt ) {
    // Ancora non viene caricata la classe
    Hashtable ht ;

    System.out.println("TestClass "+ opt);
    System.out.println( "Istanzio una hashtable" ) ;

    // adesso viene caricata la classe Hashtable
    ht = new Hashtable() ;

    for (int i=0 ; i < 5; i++ )
    v.addElement( new Integer( i ) );

    // Non viene ricaricata la classe
    ht = new Hashtable() ;

    for( int i = 0 ; i < v.size() ; i++ ) {
    Integer z = (Integer) v.elementAt(i) ;
    System.out.println( i + ": " + z ) ;
    }
    }
    public void leggifile() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader (
    new FileInputStream("C:\\luca.txt")));
    String linea = br.readLine();
    System.out.println(linea);
    }
    public void creaConnection () throws ClassNotFoundException, SQLException, InterruptedException
    {
    c =new TestConnection();
    java.lang.Class.forName(c.Driver);
    con = DriverManager.getConnection(c.URL,c.User,c.Passwor ld);

    System.out.println("Connesso al db");
    Thread.sleep(100);
    // SQL statements processing object
    Statement stmt = con.createStatement();
    String query = "SELECT nome FROM prova";
    // submit the SQL query, get result set

    ResultSet rs = stmt.executeQuery( query );
    while ( rs.next() )
    {
    // get field values by field name
    String nome = rs.getString("nome");

    System.out.println("il nome "+nome);
    }

    con.close();

    }
    }

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Dovresti:
    - definire esattamente che tipo di anomalia incontri, possibilmente postando tutte le informazioni relative alle eventuali eccezione generate;
    - come da regolamento, indentare il codice tramite gli appositi tag CODE

    Senza questi due requisiti, difficilmente troverai qualcuno che ti aiuti

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16
    hai ragione.
    l eccezione sollevata è questa :


    codice:
    java.security.AccessControlException: access denied (java.io.FilePermission C:\l uca.txt read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at TestClass.leggifile(TestClass.java:39) at Test.main(Test.java:27)

    come dicevo riguarda il permesso di apertura in lettura del file.
    Per completezza posto le classi dell applicazione

    myclassLoader : questa classe estende il class loader e istanzia la classe TestClass con un dominio di protezione nel quale vi è (in teoria ) il permesso di aprire il file

    codice:
    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.AccessController;
    import java.security.CodeSource;
    import java.security.Permission;
    import java.security.ProtectionDomain;
    import java.security.SecureClassLoader;
    import java.util.Hashtable;
    import java.util.StringTokenizer ;
    
    public class myClassLoader extends ClassLoader {
        private Hashtable classes = new Hashtable();
        protected String path ;
        protected String extension ;
        protected ProtectionDomain domain;
        protected URL url=null;
    
        
        public myClassLoader( String path, String extension) {
            this.path = path ;
            this.extension = extension ;
          
          }
        
        /* Carica il contenuto di un file .class */
        private byte getClassBytes(String className)[] {
            System.out.println("Lettura dati da file per la classe "+className);
            byte result[];
            try {
                result = loadClassBytes( className ) ;
                
                return result;
            } catch (Exception e) {
                return null;
            }
        }
    
        private byte[] loadClassBytes(String className) throws MalformedURLException {
    		// System.out.println("Lettura dati da file per la classe " +
    		// classname);
        	String name="C:\\Users\\db2admin\\workspace\\Base\\src\\"+path+ "\\" +className  + "." + extension;
        	File classfile= new File (name);
        	URL url=classfile.toURI().toURL();
        	System.out.println(url.toString());
        	System.out.println(name);
        	byte result[] = null;
    		FileInputStream fi = null;
    		try {
    			fi = new FileInputStream(classfile);
    			
    			result = new byte[(int) classfile.length()];
    			fi.read(result);
    		} catch (Exception e) {
    			result = null;
    		} finally {
    			try {
    				fi.close();
    			} catch (Exception ex) {
    			}
    		}
    		return result;
    	}
    
        /* Questa e' la versione chiamata */
        public Class loadClass(String className) throws ClassNotFoundException {
            return (loadClass(className, true));
        }
    
        /* Questa e' la versione completa */
        public synchronized Class loadClass(String className, boolean resolveIt)
            throws ClassNotFoundException {
            Class result;
            byte  classData[];
    
            System.out.println("Caricamento della classe : "+className);
    
            /* Prima si controlla la cache */
            result = (Class)classes.get(className);
            if (result != null) {
                System.out.println("Utilizzata la copia nella cache.");
                return result;
            }
    
            /* Prima si prova col primordial class loader */
            try {
                result = super.findSystemClass(className);
                System.out.println("Classe di sistema (CLASSPATH)");
                return result;
            } catch (ClassNotFoundException e) {
                System.out.println("Non e' una classe di sistema.");
                if ( className.startsWith( "java.") ) {
                  System.out.println("Classe pericolosa : " + className ) ;
                  System.out.println( "Caricamento abortito" ) ;
                  throw new ClassNotFoundException();
                }
            }
    
            /* poi si prova a caricare la classe dal path specificato */
            classData = getClassBytes(className);
            if (classData == null) {
                throw new ClassNotFoundException();
            }
            
            this.domain=generadominio(className);
            /* viene eseguito il parsing, e costruito l'oggetto class  */
            result = defineClass(className,classData, 0, classData.length,this.domain);
            if (result == null) {
                throw new ClassFormatError();
            }
    
            if (resolveIt) {
                resolveClass(result);
            }
    
            /* Si aggiorna la cache */
            classes.put(className, result);
            System.out.println("Classe caricata : " +className);
            return result;
        }
       
    	private ProtectionDomain generadominio(String classname){
    		java.security.cert.Certificate[] c=null;
    		CodeSource cs=new CodeSource (url, c);
        
        Permission p1 = new FilePermission("C:\\luca.txt", "read");
          
         
           //AccessController.checkPermission(p1);
           TestPermissionCollection p= new TestPermissionCollection();
    		p.add(p1);
    		ProtectionDomain d=new ProtectionDomain (cs , p);
    		return d;}
    }
    la classe caricata TestClass che appunto prova , tra altre cose , prova ad aprire il file in questione generando la suddetta eccezione
    [/CODE]
    import java.sql.Statement;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.* ;

    public class TestClass implements myInterface {
    // viene caricata la classe Vector
    Vector v = new Vector() ;
    TestConnection c;
    public java.sql.Connection con;
    // Fa parte dell'interfaccia myInterface
    public void start( String opt ) {
    // Ancora non viene caricata la classe
    Hashtable ht ;

    System.out.println("TestClass "+ opt);
    System.out.println( "Istanzio una hashtable" ) ;

    // adesso viene caricata la classe Hashtable
    ht = new Hashtable() ;

    for (int i=0 ; i < 5; i++ )
    v.addElement( new Integer( i ) );

    // Non viene ricaricata la classe
    ht = new Hashtable() ;

    for( int i = 0 ; i < v.size() ; i++ ) {
    Integer z = (Integer) v.elementAt(i) ;
    System.out.println( i + ": " + z ) ;
    }
    }
    public void leggifile() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader (
    new FileInputStream("C:\\luca.txt")));
    String linea = br.readLine();
    System.out.println(linea);
    }
    public void creaConnection () throws ClassNotFoundException, SQLException, InterruptedException
    {
    c =new TestConnection();
    java.lang.Class.forName(c.Driver);
    con = DriverManager.getConnection(c.URL,c.User,c.Passwor ld);

    System.out.println("Connesso al db");
    Thread.sleep(100);
    // SQL statements processing object
    Statement stmt = con.createStatement();
    String query = "SELECT nome FROM Prova.prova";
    // submit the SQL query, get result set

    ResultSet rs = stmt.executeQuery( query );
    while ( rs.next() )
    {
    // get field values by field name
    String nome = rs.getString("nome");

    System.out.println("il nome "+nome);
    }

    con.close();

    }
    }
    [/CODE]

    la classe Test che implementa un main e si occupa di istanziare un myclassloader che caricherà la class TestClass . L 'oggetto di tale classe lancerà diversi metodi tra i quali leggifile() che provoca appunto l ' eccezzione
    [/CODE]
    /* Esempio di utilizzo di myClassLoader */
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FilePermission;
    import java.io.IOException;
    import java.io.InputStreamReader;


    public class Test {
    public static void main( String args[] ) throws IOException {

    myClassLoader classLoader = new myClassLoader( "arch", "class" ) ;
    Object o ;
    String tst = "TestClass" ;
    // String tst = "java.Virus" ;

    System.out.println( "Utilizzo di myClassLoader." ) ;

    if ( args.length != 0 )
    tst = args[0] ;

    try {
    o = (classLoader.loadClass(tst)).newInstance() ;

    ((myInterface) o).start("niente") ;
    ((myInterface) o).leggifile();
    ((myInterface) o).creaConnection();
    } catch (Exception e ) {
    e.printStackTrace() ;
    }

    }
    }
    [/CODE]
    a queste classi si aggiungono delle altre come un collezione di permessi PermitionCollection e un interfaccia myinterface implementata appunto TestClass .

    Il file di policy personale che viene caricato ha "per il momento" il seguente contento :

    [/CODE]
    grant {permission java.lang.RuntimePermission "createClassLoader";}; grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};
    [/CODE]

    e per finire vi posto anche il comando con il quale lancio l applicazione ...tanto per essere completi
    [/CODE]
    C:\Users\db2admin\workspace\Base\src>java -Djava.security.manager -Djava.securit
    y.policy=mypolicy.policy Test
    Utilizzo di myClassLoader.
    Caricamento della classe : TestClass
    Non e' una classe di sistema.
    Lettura dati da file per la classe TestClass
    file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class
    C:\Users\db2admin\workspace\Base\src\arch\TestClas s.class
    Caricamento della classe : myInterface
    Classe di sistema (CLASSPATH)
    Caricamento della classe : java.lang.Object
    eccc...........sino all accezione !!
    [/CODE]

    Spero fortemente che qualcuno mi aiuti....spero inoltre di essere stato chiaro ed aver rispettato i requisiti
    ciaoooo

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16
    hai ragione.
    l eccezione sollevata è questa :
    codice:
    java.security.AccessControlException: access denied (java.io.FilePermission C:\l
    uca.txt read)
            at java.security.AccessControlContext.checkPermission(Unknown Source)
            at java.security.AccessController.checkPermission(Unknown Source)
            at java.lang.SecurityManager.checkPermission(Unknown Source)
            at java.lang.SecurityManager.checkRead(Unknown Source)
            at java.io.FileInputStream.<init>(Unknown Source)
            at java.io.FileInputStream.<init>(Unknown Source)
            at TestClass.leggifile(TestClass.java:39)
            at Test.main(Test.java:27)
    come dicevo riguarda il permesso di apertura in lettura del file.
    Per completezza posto le classi dell applicazione

    myclassLoader : questa classe estende il class loader e istanzia la classe TestClass con un dominio di protezione nel quale vi è (in teoria ) il permesso di aprire il file
    codice:
    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.AccessController;
    import java.security.CodeSource;
    import java.security.Permission;
    import java.security.ProtectionDomain;
    import java.security.SecureClassLoader;
    import java.util.Hashtable;
    import java.util.StringTokenizer ;
    
    public class myClassLoader extends ClassLoader {
        private Hashtable classes = new Hashtable();
        protected String path ;
        protected String extension ;
        protected ProtectionDomain domain;
        protected URL url=null;
    
        
        public myClassLoader( String path, String extension) {
            this.path = path ;
            this.extension = extension ;
          
          }
        
        /* Carica il contenuto di un file .class */
        private byte getClassBytes(String className)[] {
            System.out.println("Lettura dati da file per la classe "+className);
            byte result[];
            try {
                result = loadClassBytes( className ) ;
                
                return result;
            } catch (Exception e) {
                return null;
            }
        }
    
        private byte[] loadClassBytes(String className) throws MalformedURLException {
    		// System.out.println("Lettura dati da file per la classe " +
    		// classname);
        	String name="C:\\Users\\db2admin\\workspace\\Base\\src\\"+path+ "\\" +className  + "." + extension;
        	File classfile= new File (name);
        	URL url=classfile.toURI().toURL();
        	System.out.println(url.toString());
        	System.out.println(name);
        	byte result[] = null;
    		FileInputStream fi = null;
    		try {
    			fi = new FileInputStream(classfile);
    			
    			result = new byte[(int) classfile.length()];
    			fi.read(result);
    		} catch (Exception e) {
    			result = null;
    		} finally {
    			try {
    				fi.close();
    			} catch (Exception ex) {
    			}
    		}
    		return result;
    	}
    
        /* Questa e' la versione chiamata */
        public Class loadClass(String className) throws ClassNotFoundException {
            return (loadClass(className, true));
        }
    
        /* Questa e' la versione completa */
        public synchronized Class loadClass(String className, boolean resolveIt)
            throws ClassNotFoundException {
            Class result;
            byte  classData[];
    
            System.out.println("Caricamento della classe : "+className);
    
            /* Prima si controlla la cache */
            result = (Class)classes.get(className);
            if (result != null) {
                System.out.println("Utilizzata la copia nella cache.");
                return result;
            }
    
            /* Prima si prova col primordial class loader */
            try {
                result = super.findSystemClass(className);
                System.out.println("Classe di sistema (CLASSPATH)");
                return result;
            } catch (ClassNotFoundException e) {
                System.out.println("Non e' una classe di sistema.");
                if ( className.startsWith( "java.") ) {
                  System.out.println("Classe pericolosa : " + className ) ;
                  System.out.println( "Caricamento abortito" ) ;
                  throw new ClassNotFoundException();
                }
            }
    
            /* poi si prova a caricare la classe dal path specificato */
            classData = getClassBytes(className);
            if (classData == null) {
                throw new ClassNotFoundException();
            }
            
            this.domain=generadominio(className);
            /* viene eseguito il parsing, e costruito l'oggetto class  */
            result = defineClass(className,classData, 0, classData.length,this.domain);
            if (result == null) {
                throw new ClassFormatError();
            }
    
            if (resolveIt) {
                resolveClass(result);
            }
    
            /* Si aggiorna la cache */
            classes.put(className, result);
            System.out.println("Classe caricata : " +className);
            return result;
        }
       
    	private ProtectionDomain generadominio(String classname){
    		java.security.cert.Certificate[] c=null;
    		CodeSource cs=new CodeSource (url, c);
        
        Permission p1 = new FilePermission("C:\\luca.txt", "read");
          
         
           //AccessController.checkPermission(p1);
           TestPermissionCollection p= new TestPermissionCollection();
    		p.add(p1);
    		ProtectionDomain d=new ProtectionDomain (cs , p);
    		return d;}
    }
    la classe caricata TestClass che appunto prova , tra altre cose , prova ad aprire il file in questione generando la suddetta eccezione
    codice:
    import java.sql.Statement;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.* ;
    
    public class TestClass implements myInterface {
    // viene caricata la classe Vector
    Vector v = new Vector() ;
    TestConnection c;
    public java.sql.Connection con;
    // Fa parte dell'interfaccia myInterface
    public void start( String opt ) {
    // Ancora non viene caricata la classe
    Hashtable ht ;
    
    System.out.println("TestClass "+ opt);
    System.out.println( "Istanzio una hashtable" ) ;
    
    // adesso viene caricata la classe Hashtable
    ht = new Hashtable() ;
    
    for (int i=0 ; i < 5; i++ )
    v.addElement( new Integer( i ) );
    
    // Non viene ricaricata la classe
    ht = new Hashtable() ;
    
    for( int i = 0 ; i < v.size() ; i++ ) {
    Integer z = (Integer) v.elementAt(i) ;
    System.out.println( i + ": " + z ) ;
    }
    }
    public void leggifile() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader (
    new FileInputStream("C:\\luca.txt")));
    String linea = br.readLine();
    System.out.println(linea);
    }
    public void creaConnection () throws ClassNotFoundException, SQLException, InterruptedException
    {
    c =new TestConnection();
    java.lang.Class.forName(c.Driver);
    con = DriverManager.getConnection(c.URL,c.User,c.Passworld); 
    
    System.out.println("Connesso al db");
    Thread.sleep(100);
    // SQL statements processing object
    Statement stmt = con.createStatement();
    String query = "SELECT nome FROM Prova.prova";
    // submit the SQL query, get result set
    
    ResultSet rs = stmt.executeQuery( query );
    while ( rs.next() )
    {
    // get field values by field name
    String nome = rs.getString("nome");
    
    System.out.println("il nome "+nome);
    }
    
    con.close();
    
    }
    }
    la classe Test che implementa un main e si occupa di istanziare un myclassloader che caricherà la class TestClass . L 'oggetto di tale classe lancerà diversi metodi tra i quali leggifile() che provoca appunto l ' eccezzione
    codice:
    /*	Esempio di utilizzo di myClassLoader */
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FilePermission;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    
    public class Test {
    public static void main( String args[] ) throws IOException {
    
    myClassLoader classLoader = new myClassLoader( "arch", "class" ) ;
    Object o ;
    String tst = "TestClass" ;
    // String tst = "java.Virus" ;
    
    System.out.println( "Utilizzo di myClassLoader." ) ;
    
    if ( args.length != 0 )
    tst = args[0] ;
    
    try {
    o = (classLoader.loadClass(tst)).newInstance() ;
    
    ((myInterface) o).start("niente") ;
    ((myInterface) o).leggifile();
    ((myInterface) o).creaConnection();
    } catch (Exception e ) {
    e.printStackTrace() ;
    }
    
    }
    }
    a queste classi si aggiungono delle altre come un collezione di permessi PermitionCollection e un interfaccia myinterface implementata appunto TestClass .

    Il file di policy personale che viene caricato ha "per il momento" il seguente contento :

    codice:
    grant {permission java.lang.RuntimePermission "createClassLoader";}; grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};
    e per finire vi posto anche il comando con il quale lancio l applicazione ...tanto per essere completi
    codice:
    C:\Users\db2admin\workspace\Base\src>java -Djava.security.manager -Djava.securit
    y.policy=mypolicy.policy Test
    Utilizzo di myClassLoader.
    Caricamento della classe : TestClass
    Non e' una classe di sistema.
    Lettura dati da file per la classe TestClass
    file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class
    C:\Users\db2admin\workspace\Base\src\arch\TestClass.class
    Caricamento della classe : myInterface
    Classe di sistema (CLASSPATH)
    Caricamento della classe : java.lang.Object
    eccc...........sino all accezione !!
    Spero fortemente che qualcuno mi aiuti....spero inoltre di essere stato chiaro ed aver rispettato i requisiti
    ciaoooo

  5. #5
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ok, ora meglio.

    Premetto che non sono familiare con l'argomento... ma a vedere l'eccezione che ti viene generata proverei a cercare l'errore per primo nel file di policy.

    Dando per scontato che il percorso del codebase è corretto, mi piace molto poco quel doppio backslash sul path del file. Lo usi nei sorgenti .java per far interpretare correttamente il carattere al compilatore... ma qui che c'entra?
    In realtà, ho anche il forte sospetto che potrebbe non essere una cattiva idea provare ad utilizzare come separatore lo "slash"...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16
    codebase accetta come argomento URL..e l URL di un file windows e in quel formato..ciò è anche dimostrato dal System.out.println che faccio nel myclassloader

    codice:
    String name="C:\\Users\\db2admin\\workspace\\Base\\src\\"+path+ "\\" +className  + "." + extension;
        	File classfile= new File (name);
        	URL url=classfile.toURI().toURL();
        	System.out.println(url.toString());
    come puoi vedere nella stampa a video che faccio viene riportato lo stesso URL

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16
    anche se inserisco nel file di policy una cosa simile
    codice:
    permission java.io.FilePermission "<<ALLFILES>>" , "read"
    che in teoria mi dovrebbe permettere a quell URL di aprire qualsiasi file in lettura , il Controller di Accesso mi genera la stessa eccezzione

    Secondo il mio modesto parere c è qualcosa che non va nel class loader...anche perchè da ciò che ho letto sono il privilegi nel dominio di protezione ad assicurare alla classe di poter leggere o non leggere un file
    non so che fare aiutoooooooooo

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ok, mi hai convinto: ho letto la documentazione e fa esplicito riferimento al doppio backslash sotto Windows, spiegando anche perchè deve essere così (viene letto da uno StringTokenizer).

    Mi vengono in mente 3 prove da fare:
    1) banale, ho visto che c'è un blank dopo il .class scritto nel codebase: ho seri dubbi che cambierà qualcosa, comunque;
    2) prova a specificare un percorso meno restrittivo nel codebase, come "file:/C:/-", che dovrebbe garantire i permessi a tutte le classi presenti sul disco C
    3) esegui la classe senza caricarla con il classloader, ma lanciandola - ad esempio - da linea di comando

    Cambia qualcosa?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16
    grazie per la risposta!
    allora il classloader lo devo utilizzare per forza...ho provato a modificare il code base nel file di policy in questo modo

    codice:
    grant {permission java.lang.RuntimePermission "createClassLoader";};
     grant  codeBase "file:/C:/Users/db2admin/workspace/Base/src/" {permission java.io.FilePermission "C:\\luca.txt" , "read";};
    ed va ok! ora il problema (come sempre ) secondo me è nel classloader perchè se inserisco come code base l'URL da dove il classloader carica il codice , ovvero C:\Users\db2admin\workspace\Base\src\arch\TestClas s.class (in formato URL naturalmente) non va , e non va neanche se mettto codeBase C:\Users\db2admin\workspace\Base\src\arch\-. ora però il problema è propio questo....lasciando cosi (come sopra ) il file di policy il permesso di aprire il file è per tutte le classi facenti parte del pacchetto src....main ...altre classi ecc...e a quel punto la sicurezza va a farsi fottere....!!!!

    Sto classLoader mi sta facendo impazzire...perche non so se tu ne sei a conoscenza ,ma in base a cio che ho letto dovrebbe bastare il ProtectionDomain (associato alla classe caricata ) a garantire che a quest ultima la lettura del file e non inserirlo nel file di policy...
    AIUTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.