    001    // $HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/tools/security/DRMAccess.java $
    002    /*----------------------------------------------------------------------------
    003     This file is part of deegree, http://deegree.org/
    004     Copyright (C) 2001-2009 by:
    005       Department of Geography, University of Bonn
    006     and
    007       lat/lon GmbH
    008
    009     This library is free software; you can redistribute it and/or modify it under
    010     the terms of the GNU Lesser General Public License as published by the Free
    011     Software Foundation; either version 2.1 of the License, or (at your option)
    012     any later version.
    013     This library is distributed in the hope that it will be useful, but WITHOUT
    014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
    016     details.
    017     You should have received a copy of the GNU Lesser General Public License
    018     along with this library; if not, write to the Free Software Foundation, Inc.,
    019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    020
    021     Contact information:
    022
    023     lat/lon GmbH
    024     Aennchenstr. 19, 53177 Bonn
    025     Germany
    026     http://lat-lon.de/
    027
    028     Department of Geography, University of Bonn
    029     Prof. Dr. Klaus Greve
    030     Postfach 1147, 53001 Bonn
    031     Germany
    032     http://www.geographie.uni-bonn.de/deegree/
    033
    034     e-mail: info@deegree.org
    035    ----------------------------------------------------------------------------*/
    036
    037    package org.deegree.tools.security;
    038
    039    import java.io.FileNotFoundException;
    040    import java.io.IOException;
    041    import java.io.InputStream;
    042    import java.io.RandomAccessFile;
    043    import java.io.StringReader;
    044    import java.util.ArrayList;
    045    import java.util.Arrays;
    046    import java.util.Iterator;
    047    import java.util.List;
    048    import java.util.Properties;
    049
    050    import org.deegree.framework.util.BootLogger;
    051    import org.deegree.framework.util.StringTools;
    052    import org.deegree.framework.xml.XMLTools;
    053    import org.deegree.model.filterencoding.AbstractFilter;
    054    import org.deegree.model.filterencoding.Filter;
    055    import org.deegree.security.GeneralSecurityException;
    056    import org.deegree.security.drm.SecurityAccess;
    057    import org.deegree.security.drm.SecurityAccessManager;
    058    import org.deegree.security.drm.SecurityTransaction;
    059    import org.deegree.security.drm.WrongCredentialsException;
    060    import org.deegree.security.drm.model.Group;
    061    import org.deegree.security.drm.model.Right;
    062    import org.deegree.security.drm.model.RightSet;
    063    import org.deegree.security.drm.model.RightType;
    064    import org.deegree.security.drm.model.Role;
    065    import org.deegree.security.drm.model.SecuredObject;
    066    import org.deegree.security.drm.model.User;
    067    import org.w3c.dom.Document;
    068
    069    /**
    070     * tool class to handle deegree sercurity administration using commandline calls:
    071     *
    072     * <pre>
    073     *   general definitions:
    074     *   -driver JDBC driver (e.g. sun.jdbc.odbc.JdbcOdbcDriver for ODBC databases)
    075     *   -logon jdbc:odbc:security logon to database (e.g. ODBC name)
    076     *   -user user name (optional)
    077     *   -password users password (optional)
    078     *
    079     *   possible actions:
    080     *   -action (addUser, addGroup, addRole, addUserToGroup, assignRoleWithGroup, addSecuredObject, assignRights, clean)
    081     *   defines the action be performed. possible actions are listed inn brackets.
    082     *
    083     *   action = addUser -&gt; adds a user to the right management
    084     *   -name users login name
    085     *   -password users password
    086     *   -firstName the first name of the user
    087     *   -lastName the last name of the user
    088     *   -emal email address of the user
    089     *
    090     *   action = removeUser -&gt; removes a user to the right management
    091     *   -name users login name
    092     *
    093     *   action = addGroup -&gt; adds a group to the right management system
    094     *   -name name of the group
    095     *   -title title of the group
    096     *
    097     *   action = removeGroup -&gt; removes a group to the right management
    098     *   -name groups login name
    099     *
    100     *   action = addRole -&gt; adds a role to the right management system
    101     *   -name name of the role
    102     *
    103     *   action = addUserToGroup -&gt; adds a user to a named group
    104     *   -userName name of the user
    105     *   -groupName name of the group
    106     *
    107     *   action = addUserToGroup -&gt; assignes a group with a role
    108     *   -groupName name of the group
    109     *   -roleName name of the role
    110     *
    111     *   action = addSecuredObject -&gt; adds a new secured object to the right management system
    112     *   -soType type of the secured object (e.g. Layer, FeatureType, Coverage ...)
    113     *   -soName name of the secured object
    114     *   -soTitle title of the secured object
    115     *
    116     *   action = removeSecuredObject -&gt; removes a new secured object from the right management system
    117     *   -soType type of the secured object (e.g. Layer, FeatureType, Coverage ...)
    118     *   -soName name of the secured object
    119     *
    120     *   action = assignRights -&gt; assigns rights on a named secured object to a role
    121     *   -constraints comma seperated list of absolut pathes to filter encoding files
    122     *   -rights comma seperated list of rights to assign. the number of rights must be equest to the number constraints
    123     *   -soName name of the secured object
    124     *   -soType type of the secured object
    125     *   -role name of the role the rights shall be given to
    126     *
    127     *   action = removeRights removes rights on a named secured object to a role
    128     *   -rights comma seperated list of rights to remove.
    129     *   -soName name of the secured object
    130     *   -soType type of the secured object
    131     *   -role name of the role the rights shall be given to
    132     *
    133     *   action = clean -&gt; cleans the complete right management system database by deleting all entries!
    134     * </pre>
    135     *
    136     *
    137     * @version $Revision: 18197 $
    138     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
    139     * @author last edited by: $Author: apoth $
    140     *
    141     * @version $Revision: 18197 $, $Date: 2009-06-19 13:32:15 +0200 (Fr, 19. Jun 2009) $
    142     */
    143    public class DRMAccess {
    144
    145        private static String secAdminPassword = "JOSE67";
    146
    147        private SecurityAccessManager manager;
    148
    149        private SecurityTransaction transaction;
    150
    151        static private Properties prop = new Properties();
    152
    153        /**
    154         * Initialization done at class loading time.
    155         */
    156        static {
    157            try {
    158                String fileName = "sec.properties";
    159                InputStream is = DRMAccess.class.getResourceAsStream( fileName );
    160                if ( is == null ) {
    161                    BootLogger.log( "Error while initializing " + DRMAccess.class.getName() + " : "
    162                                    + " default message file: '" + fileName + " not found." );
    163                }
    164                is = DRMAccess.class.getResourceAsStream( fileName );
    165                prop.load( is );
    166                is.close();
    167
    168                // override messages using file "/sec.properties"
    169                fileName = "/sec.properties";
    170                overrideMessages( fileName, prop );
    171
    172            } catch ( IOException e ) {
    173                BootLogger.logError( "Error while initializing " + DRMAccess.class.getName() + " : " + e.getMessage(), e );
    174            }
    175        }
    176
    177        /**
    178         * @throws IOException
    179         */
    180        public DRMAccess() throws IOException {
    181            secAdminPassword = prop.getProperty( "adminpass" );
    182        }
    183
    184        private static void overrideMessages( String propertiesFile, Properties props )
    185                                throws IOException {
    186            InputStream is = DRMAccess.class.getResourceAsStream( propertiesFile );
    187            if ( is != null ) {
    188                // override default messages
    189                Properties overrideProps = new Properties();
    190                overrideProps.load( is );
    191                is.close();
    192                Iterator<?> iter = overrideProps.keySet().iterator();
    193                while ( iter.hasNext() ) {
    194                    String key = (String) iter.next();
    195                    props.put( key, overrideProps.get( key ) );
    196                }
    197            }
    198        }
    199
    200        /**
    201         * @param driver
    202         * @param logon
    203         * @param user
    204         * @param password
    205         * @throws Exception
    206         */
    207        protected void setUp( String driver, String logon, String user, String password )
    208                                throws Exception {
    209            Properties properties = new Properties();
    210            properties.setProperty( "driver", driver );
    211            properties.setProperty( "url", logon );
    212            if ( user == null )
    213                user = "";
    214            properties.setProperty( "user", user );
    215            if ( password == null )
    216                password = "";
    217            properties.setProperty( "password", password );
    218            try {
    219                manager = SecurityAccessManager.getInstance();
    220            } catch ( GeneralSecurityException e ) {
    221                try {
    222                    System.out.println( properties );
    223                    SecurityAccessManager.initialize( "org.deegree.security.drm.SQLRegistry", properties, 60 * 1000 );
    224                    manager = SecurityAccessManager.getInstance();
    225
    226                } catch ( GeneralSecurityException e1 ) {
    227                    e1.printStackTrace();
    228                }
    229            }
    230        }
    231
    232        /**
    233         *
    234         */
    235        public void GetUsers() {
    236            try {
    237                User user = manager.getUserByName( "SEC_ADMIN" );
    238                user.authenticate( DRMAccess.secAdminPassword );
    239                transaction = manager.acquireTransaction( user );
    240                User[] users = transaction.getAllUsers();
    241                for ( int i = 0; i < users.length; i++ ) {
    242                    System.out.println( "User " + i + ": " + users[i].getName() );
    243                }
    244            } catch ( Exception e ) {
    245                e.printStackTrace();
    246            }
    247        }
    248
    249        /**
    250         *
    251         * @param name
    252         * @param password
    253         * @param firstName
    254         * @param lastName
    255         * @param email
    256         */
    257        public void addUser( String name, String password, String firstName, String lastName, String email ) {
    258            try {
    259                User user = manager.getUserByName( "SEC_ADMIN" );
    260                user.authenticate( DRMAccess.secAdminPassword );
    261                transaction = manager.acquireTransaction( user );
    262                transaction.registerUser( name, password, firstName, lastName, email );
    263
    264                manager.commitTransaction( transaction );
    265            } catch ( Exception e ) {
    266                e.printStackTrace();
    267                try {
    268                    manager.abortTransaction( transaction );
    269                } catch ( GeneralSecurityException me ) {
    270                    me.printStackTrace();
    271                }
    272
    273            }
    274        }
    275
    276        /**
    277         *
    278         * @param name
    279         */
    280        public void removeUser( String name ) {
    281            try {
    282                User user = manager.getUserByName( "SEC_ADMIN" );
    283                user.authenticate( DRMAccess.secAdminPassword );
    284                transaction = manager.acquireTransaction( user );
    285                user = transaction.getUserByName( name );
    286                transaction.deregisterUser( user );
    287                manager.commitTransaction( transaction );
    288            } catch ( Exception e ) {
    289                e.printStackTrace();
    290            }
    291        }
    292
    293        /**
    294         *
    295         * @param name
    296         * @param password
    297         * @return the user
    298         */
    299        public User login( String name, String password ) {
    300            User user = null;
    301            try {
    302                user = manager.getUserByName( "SEC_ADMIN" );
    303                user.authenticate( DRMAccess.secAdminPassword );
    304                transaction = manager.acquireTransaction( user );
    305                user = transaction.getUserByName( name );
    306                try {
    307                    user.authenticate( password );
    308                } catch ( WrongCredentialsException e ) {
    309                    System.out.println( "failed." );
    310                }
    311            } catch ( Exception e ) {
    312                e.printStackTrace();
    313                try {
    314                    manager.abortTransaction( transaction );
    315                } catch ( GeneralSecurityException me ) {
    316                    me.printStackTrace();
    317                }
    318            }
    319            return user;
    320        }
    321
    322        /**
    323         *
    324         * @param name
    325         * @param title
    326         * @return the group
    327         */
    328        public Group addGroup( String name, String title ) {
    329            Group humans = null;
    330            try {
    331                User user = manager.getUserByName( "SEC_ADMIN" );
    332                user.authenticate( DRMAccess.secAdminPassword );
    333                transaction = manager.acquireTransaction( user );
    334
    335                humans = transaction.registerGroup( name, title );
    336                manager.commitTransaction( transaction );
    337            } catch ( Exception e ) {
    338                e.printStackTrace();
    339                try {
    340                    manager.abortTransaction( transaction );
    341                } catch ( GeneralSecurityException me ) {
    342                    me.printStackTrace();
    343                }
    344            }
    345            return humans;
    346        }
    347
    348        /**
    349         *
    350         * @param name
    351         */
    352        public void removeGroup( String name ) {
    353
    354            try {
    355                User user = manager.getUserByName( "SEC_ADMIN" );
    356                user.authenticate( DRMAccess.secAdminPassword );
    357                transaction = manager.acquireTransaction( user );
    358
    359                Group group = transaction.getGroupByName( name );
    360                transaction.deregisterGroup( group );
    361                manager.commitTransaction( transaction );
    362            } catch ( Exception e ) {
    363                e.printStackTrace();
    364                try {
    365                    manager.abortTransaction( transaction );
    366                } catch ( GeneralSecurityException me ) {
    367                    me.printStackTrace();
    368                }
    369            }
    370        }
    371
    372        /**
    373         *
    374         * @param name
    375         * @return the role
    376         */
    377        public Role addRole( String name ) {
    378            Role role = null;
    379            try {
    380                User user = manager.getUserByName( "SEC_ADMIN" );
    381                user.authenticate( DRMAccess.secAdminPassword );
    382                transaction = manager.acquireTransaction( user );
    383
    384                role = transaction.registerRole( name );
    385                manager.commitTransaction( transaction );
    386            } catch ( Exception e ) {
    387                e.printStackTrace();
    388                try {
    389                    manager.abortTransaction( transaction );
    390                } catch ( GeneralSecurityException me ) {
    391                    me.printStackTrace();
    392                }
    393            }
    394            return role;
    395        }
    396
    397        /**
    398         *
    399         * @param name
    400         */
    401        public void removeRole( String name ) {
    402
    403            try {
    404                User user = manager.getUserByName( "SEC_ADMIN" );
    405                user.authenticate( DRMAccess.secAdminPassword );
    406                transaction = manager.acquireTransaction( user );
    407
    408                Role role = transaction.getRoleByName( name );
    409                transaction.deregisterRole( role );
    410                manager.commitTransaction( transaction );
    411            } catch ( Exception e ) {
    412                e.printStackTrace();
    413                try {
    414                    manager.abortTransaction( transaction );
    415                } catch ( GeneralSecurityException me ) {
    416                    me.printStackTrace();
    417                }
    418            }
    419
    420        }
    421
    422        /**
    423         * @param userName
    424         * @param group
    425         */
    426        public void setGroupMemberships( String userName, String group ) {
    427
    428            try {
    429                User user = manager.getUserByName( "SEC_ADMIN" );
    430                user.authenticate( DRMAccess.secAdminPassword );
    431                transaction = manager.acquireTransaction( user );
    432
    433                User jon = transaction.getUserByName( userName );
    434                Group humans = transaction.getGroupByName( group );
    435                User[] users = humans.getUsers( transaction );
    436                List<User> list = Arrays.asList( users );
    437                ArrayList<User> aList = new ArrayList<User>( list );
    438                aList.add( jon );
    439                users = aList.toArray( new User[aList.size()] );
    440                transaction.setUsersInGroup( humans, users );
    441
    442                manager.commitTransaction( transaction );
    443            } catch ( Exception e ) {
    444                e.printStackTrace();
    445                try {
    446                    manager.abortTransaction( transaction );
    447                } catch ( GeneralSecurityException me ) {
    448                    me.printStackTrace();
    449                }
    450
    451            }
    452        }
    453
    454        /**
    455         *
    456         * @param role
    457         * @param group
    458         */
    459        public void setRoleAssociation( String role, String group ) {
    460            try {
    461                User user = manager.getUserByName( "SEC_ADMIN" );
    462                user.authenticate( DRMAccess.secAdminPassword );
    463                transaction = manager.acquireTransaction( user );
    464
    465                Group humans = transaction.getGroupByName( group );
    466                Role canOpener = transaction.getRoleByName( role );
    467                Group[] groups = canOpener.getGroups( transaction );
    468                List<Group> list = Arrays.asList( groups );
    469                ArrayList<Group> aList = new ArrayList<Group>( list );
    470                aList.add( humans );
    471                groups = aList.toArray( new Group[aList.size()] );
    472                transaction.setGroupsWithRole( canOpener, groups );
    473                manager.commitTransaction( transaction );
    474            } catch ( Exception e ) {
    475                e.printStackTrace();
    476                try {
    477                    manager.abortTransaction( transaction );
    478                } catch ( GeneralSecurityException me ) {
    479                    me.printStackTrace();
    480                }
    481
    482            }
    483        }
    484
    485        /**
    486         *
    487         * @param role
    488         * @param user
    489         */
    490        public void setUserRoleAssociation( String role, String user ) {
    491            try {
    492                User u = manager.getUserByName( "SEC_ADMIN" );
    493                u.authenticate( DRMAccess.secAdminPassword );
    494                transaction = manager.acquireTransaction( u );
    495                User us = transaction.getUserByName( user );
    496                Role canOpener = transaction.getRoleByName( role );
    497                transaction.setUsersWithRole( canOpener, new User[] { us } );
    498                manager.commitTransaction( transaction );
    499            } catch ( Exception e ) {
    500                e.printStackTrace();
    501                try {
    502                    manager.abortTransaction( transaction );
    503                } catch ( GeneralSecurityException me ) {
    504                    me.printStackTrace();
    505                }
    506
    507            }
    508        }
    509
    510        /**
    511         *
    512         * @param type
    513         * @param name
    514         * @param title
    515         */
    516        public void addSecuredObject( String type, String name, String title ) {
    517            try {
    518                User user = manager.getUserByName( "SEC_ADMIN" );
    519                user.authenticate( DRMAccess.secAdminPassword );
    520                transaction = manager.acquireTransaction( user );
    521                transaction.registerSecuredObject( type, name, title );
    522                manager.commitTransaction( transaction );
    523            } catch ( Exception e ) {
    524                e.printStackTrace();
    525                try {
    526                    manager.abortTransaction( transaction );
    527                } catch ( GeneralSecurityException me ) {
    528                    me.printStackTrace();
    529                }
    530
    531            }
    532        }
    533
    534        /**
    535         *
    536         * @param type
    537         * @param name
    538         */
    539        public void removeSecuredObject( String type, String name ) {
    540            try {
    541                User user = manager.getUserByName( "SEC_ADMIN" );
    542                user.authenticate( DRMAccess.secAdminPassword );
    543                transaction = manager.acquireTransaction( user );
    544                SecuredObject so = transaction.getSecuredObjectByName( name, type );
    545                transaction.deregisterSecuredObject( so );
    546                manager.commitTransaction( transaction );
    547            } catch ( Exception e ) {
    548                e.printStackTrace();
    549                try {
    550                    manager.abortTransaction( transaction );
    551                } catch ( GeneralSecurityException me ) {
    552                    me.printStackTrace();
    553                }
    554
    555            }
    556        }
    557
    558        /**
    559         *
    560         * @param filter
    561         * @param secObj
    562         * @param soType
    563         * @param role
    564         * @param rights
    565         */
    566        public void assignRights( String[] filter, String secObj, String soType, String role, String[] rights ) {
    567            try {
    568                User user = manager.getUserByName( "SEC_ADMIN" );
    569                user.authenticate( DRMAccess.secAdminPassword );
    570                transaction = manager.acquireTransaction( user );
    571
    572                SecuredObject so = transaction.getSecuredObjectByName( secObj, soType );
    573
    574                Right[] rs = new Right[rights.length];
    575                for ( int i = 0; i < rs.length; i++ ) {
    576                    Filter constraints = null;
    577                    if ( filter[i] != null ) {
    578                        Document doc = XMLTools.parse( new StringReader( filter[i] ) );
    579                        constraints = AbstractFilter.buildFromDOM( doc.getDocumentElement(), false );
    580                    }
    581                    if ( rights[i].equalsIgnoreCase( "getmap" ) ) {
    582                        rs[i] = new Right( so, RightType.GETMAP, constraints );
    583                    } else if ( rights[i].equalsIgnoreCase( "getmap_response" ) ) {
    584                        rs[i] = new Right( so, RightType.GETMAP_RESPONSE, constraints );
    585                    } else if ( rights[i].equalsIgnoreCase( "getfeatureinfo" ) ) {
    586                        rs[i] = new Right( so, RightType.GETFEATUREINFO, constraints );
    587                    } else if ( rights[i].equalsIgnoreCase( "getfeatureinfo_response" ) ) {
    588                        rs[i] = new Right( so, RightType.GETFEATUREINFO_RESPONSE, constraints );
    589                    } else if ( rights[i].equalsIgnoreCase( "getlegendgraphic" ) ) {
    590                        rs[i] = new Right( so, RightType.GETLEGENDGRAPHIC, constraints );
    591                    } else if ( rights[i].equalsIgnoreCase( "getlegendgraphic_response" ) ) {
    592                        rs[i] = new Right( so, RightType.GETLEGENDGRAPHIC_RESPONSE, constraints );
    593                    } else if ( rights[i].equalsIgnoreCase( "getfeature" ) ) {
    594                        rs[i] = new Right( so, RightType.GETFEATURE, constraints );
    595                    } else if ( rights[i].equalsIgnoreCase( "getfeature_response" ) ) {
    596                        rs[i] = new Right( so, RightType.GETFEATURE_RESPONSE, constraints );
    597                    } else if ( rights[i].equalsIgnoreCase( "describefeaturetype" ) ) {
    598                        rs[i] = new Right( so, RightType.DESCRIBEFEATURETYPE, constraints );
    599                    } else if ( rights[i].equalsIgnoreCase( "describefeaturetype_response" ) ) {
    600                        rs[i] = new Right( so, RightType.DESCRIBEFEATURETYPE_RESPONSE, constraints );
    601                    } else if ( rights[i].equalsIgnoreCase( "getcoverage" ) ) {
    602                        rs[i] = new Right( so, RightType.GETCOVERAGE, constraints );
    603                    } else if ( rights[i].equalsIgnoreCase( "getcoverage_response" ) ) {
    604                        rs[i] = new Right( so, RightType.GETCOVERAGE_RESPONSE, constraints );
    605                    } else if ( rights[i].equalsIgnoreCase( "describecoverage" ) ) {
    606                        rs[i] = new Right( so, RightType.DESCRIBECOVERAGE, constraints );
    607                    } else if ( rights[i].equalsIgnoreCase( "describecoverage_response" ) ) {
    608                        rs[i] = new Right( so, RightType.DESCRIBECOVERAGE_RESPONSE, constraints );
    609                    } else if ( rights[i].equalsIgnoreCase( "getrecords" ) ) {
    610                        rs[i] = new Right( so, RightType.GETRECORDS, constraints );
    611                    } else if ( rights[i].equalsIgnoreCase( "getrecords_response" ) ) {
    612                        rs[i] = new Right( so, RightType.GETRECORDS_RESPONSE, constraints );
    613                    } else if ( rights[i].equalsIgnoreCase( "getrecordbyid" ) ) {
    614                        rs[i] = new Right( so, RightType.GETRECORDBYID, constraints );
    615                    } else if ( rights[i].equalsIgnoreCase( "getrecordbyid_response" ) ) {
    616                        rs[i] = new Right( so, RightType.GETRECORDBYID_RESPONSE, constraints );
    617                    } else if ( rights[i].equalsIgnoreCase( "describerecordtype" ) ) {
    618                        rs[i] = new Right( so, RightType.DESCRIBERECORDTYPE, constraints );
    619                    } else if ( rights[i].equalsIgnoreCase( "describerecordtype_response" ) ) {
    620                        rs[i] = new Right( so, RightType.DESCRIBERECORDTYPE_RESPONSE, constraints );
    621                    } else if ( rights[i].equalsIgnoreCase( "delete" ) ) {
    622                        rs[i] = new Right( so, RightType.DELETE, constraints );
    623                    } else if ( rights[i].equalsIgnoreCase( "delete_response" ) ) {
    624                        rs[i] = new Right( so, RightType.DELETE_RESPONSE, constraints );
    625                    } else if ( rights[i].equalsIgnoreCase( "update" ) ) {
    626                        rs[i] = new Right( so, RightType.UPDATE, constraints );
    627                    } else if ( rights[i].equalsIgnoreCase( "update_response" ) ) {
    628                        rs[i] = new Right( so, RightType.UPDATE_RESPONSE, constraints );
    629                    } else if ( rights[i].equalsIgnoreCase( "insert" ) ) {
    630                        rs[i] = new Right( so, RightType.INSERT, constraints );
    631                    } else if ( rights[i].equalsIgnoreCase( "insert_response" ) ) {
    632                        rs[i] = new Right( so, RightType.INSERT_RESPONSE, constraints );
    633                    } else if ( rights[i].equalsIgnoreCase( "GetRepositoryItem" ) ) {
    634                        rs[i] = new Right( so, RightType.GETREPOSITORYITEM, constraints );
    635                    } else if ( rights[i].equalsIgnoreCase( "GetRepositoryItem_response" ) ) {
    636                        rs[i] = new Right( so, RightType.GETREPOSITORYITEM_RESPONSE, constraints );
    637                    } else {
    638                        System.out.println( "unknown right: " + rights[i] );
    639                    }
    640                }
    641
    642                transaction.addRights( so, transaction.getRoleByName( role ), rs );
    643                manager.commitTransaction( transaction );
    644            } catch ( Exception e ) {
    645                e.printStackTrace();
    646                try {
    647                    manager.abortTransaction( transaction );
    648                } catch ( GeneralSecurityException me ) {
    649                    me.printStackTrace();
    650                }
    651            }
    652        }
    653
    654        /**
    655         * @param secObj
    656         * @param soType
    657         * @param role
    658         * @param rights
    659         */
    660        public void removeRights( String secObj, String soType, String role, String[] rights ) {
    661            try {
    662                User user = manager.getUserByName( "SEC_ADMIN" );
    663                user.authenticate( DRMAccess.secAdminPassword );
    664                transaction = manager.acquireTransaction( user );
    665
    666                SecuredObject so = transaction.getSecuredObjectByName( secObj, soType );
    667
    668                RightType[] rs = new RightType[rights.length];
    669                for ( int i = 0; i < rs.length; i++ ) {
    670                    rs[i] = transaction.getRightByName( rights[i] );
    671                }
    672
    673                transaction.removeRights( so, transaction.getRoleByName( role ), rs );
    674                manager.commitTransaction( transaction );
    675            } catch ( Exception e ) {
    676                e.printStackTrace();
    677                try {
    678                    manager.abortTransaction( transaction );
    679                } catch ( GeneralSecurityException me ) {
    680                    me.printStackTrace();
    681                }
    682            }
    683        }
    684
    685        /**
    686         *
    687         */
    688        public void clean() {
    689            try {
    690                User user = manager.getUserByName( "SEC_ADMIN" );
    691                user.authenticate( DRMAccess.secAdminPassword );
    692                transaction = manager.acquireTransaction( user );
    693                transaction.clean();
    694                manager.commitTransaction( transaction );
    695            } catch ( Exception e ) {
    696                e.printStackTrace();
    697            }
    698        }
    699
    700        /**
    701         * @param user
    702         * @param password
    703         * @param securedObject
    704         * @param type
    705         * @param right
    706         */
    707        public void hasRight( String user, String password, String securedObject, String type, String right ) {
    708            try {
    709                SecurityAccessManager sam = SecurityAccessManager.getInstance();
    710                User usr = sam.getUserByName( user );
    711                usr.authenticate( password );
    712                SecurityAccess access = sam.acquireAccess( usr );
    713                SecuredObject secObj = access.getSecuredObjectByName( securedObject, type );
    714                if ( !usr.hasRight( access, right, secObj ) ) {
    715                    System.out.println( "You try to access a feature/resource on a "
    716                                        + "securedObject you are not allowed to: " + securedObject );
    717                } else {
    718                    System.out.println( "the user '" + user + "' has the requested right" );
    719                }
    720            } catch ( WrongCredentialsException e ) {
    721                e.printStackTrace();
    722            } catch ( GeneralSecurityException e ) {
    723                e.printStackTrace();
    724            }
    725        }
    726
    727        private String fillString( String begin, int length ) {
    728            StringBuffer sb = new StringBuffer();
    729            for ( int i = 0; i < length - begin.length(); i++ ) {
    730                sb.append( ' ' );
    731            }
    732            return begin + sb;
    733        }
    734
    735        /**
    736         * @param userName
    737         * @param secObjectType
    738         */
    739        public void printRights( String userName, String secObjectType ) {
    740            try {
    741                User secAdminUser = manager.getUserByName( "SEC_ADMIN" );
    742                secAdminUser.authenticate( DRMAccess.secAdminPassword );
    743                SecurityAccess access = manager.acquireAccess( secAdminUser );
    744
    745                User user = access.getUserByName( userName );
    746                SecuredObject[] secObjects = access.getAllSecuredObjects( secObjectType );
    747                Role[] roles = user.getRoles( access );
    748
    749                System.out.println( "ROLE                    SEC_OBJECT                RIGHT            CONSTRAINTS\n" );
    750                for ( int i = 0; i < roles.length; i++ ) {
    751                    String roleString = fillString( roles[i].getName(), 24 );
    752                    for ( int j = 0; j < secObjects.length; j++ ) {
    753                        String secObjectString = fillString( secObjects[j].getName(), 26 );
    754                        RightSet rightSet = roles[i].getRights( access, secObjects[j] );
    755                        Right[] rights = rightSet.toArray( secObjects[j] );
    756                        for ( int k = 0; k < rights.length; k++ ) {
    757                            String rightString = fillString( rights[k].getType().getName(), 16 );
    758                            Filter filter = rights[k].getConstraints();
    759                            String constraintsString = " 0";
    760                            if ( filter != null ) {
    761                                constraintsString = " 1";
    762                            }
    763                            System.out.println( roleString + secObjectString + rightString + constraintsString );
    764                        }
    765                    }
    766                }
    767            } catch ( Exception e ) {
    768                e.printStackTrace();
    769            }
    770        }
    771
    772        /**
    773         *
    774         *
    775         */
    776        private static void printHelp() {
    777            System.out.println( "general definitions:" );
    778            System.out.println( "-driver JDBC driver (e.g. sun.jdbc.odbc.JdbcOdbcDriver for ODBC databases)" );
    779            System.out.println( "-logon jdbc:odbc:security logon to database (e.g. ODBC name)" );
    780            System.out.println( "-user user name (optional)" );
    781            System.out.println( "-pw users password (optional)" );
    782            System.out.println();
    783            System.out.println( "possible actions:" );
    784            System.out.println( "-action (addUser, addGroup, addRole, addUserToGroup, assignRoleWithGroup, addSecuredObject, assignRights, clean)" );
    785            System.out.println( "defines the action be performed. possible actions are listed inn brackets." );
    786            System.out.println();
    787            System.out.println( "action = addUser -> adds a user to the right management" );
    788            System.out.println( "-name users login name" );
    789            System.out.println( "-password users password" );
    790            System.out.println( "-firstName the first name of the user" );
    791            System.out.println( "-lastName the last name of the user" );
    792            System.out.println( "-emal email address of the user" );
    793            System.out.println();
    794            System.out.println( "action = removeUser -> removes a user to the right management" );
    795            System.out.println( "-name users login name" );
    796            System.out.println();
    797            System.out.println( "action = addGroup -> adds a group to the right management system" );
    798            System.out.println( "-name name of the group" );
    799            System.out.println( "-title title of the group" );
    800            System.out.println();
    801            System.out.println( "action = removeGroup -> removes a group to the right management" );
    802            System.out.println( "-name groups login name" );
    803            System.out.println();
    804            System.out.println( "action = addRole -> adds a role to the right management system" );
    805            System.out.println( "-name name of the role" );
    806            System.out.println();
    807            System.out.println( "action = addUserToGroup -> adds a user to a named group" );
    808            System.out.println( "-userName name of the user" );
    809            System.out.println( "-groupName name of the group" );
    810            System.out.println();
    811            System.out.println( "action = addUserToGroup -> assignes a group with a role" );
    812            System.out.println( "-groupName name of the group" );
    813            System.out.println( "-roleName name of the role" );
    814            System.out.println();
    815            System.out.println( "action = addSecuredObject -> adds a new secured object to the right management system" );
    816            System.out.println( "-soType type of the secured object (e.g. Layer, FeatureType, Coverage ...)" );
    817            System.out.println( "-soName name of the secured object" );
    818            System.out.println( "-soTitle title of the secured object" );
    819            System.out.println();
    820            System.out.println( "action = removeSecuredObject -> removes a new secured object from the right management system" );
    821            System.out.println( "-soType type of the secured object (e.g. Layer, FeatureType, Coverage ...)" );
    822            System.out.println( "-soName name of the secured object" );
    823            System.out.println();
    824            System.out.println( "action = assignRights -> assigns rights on a named secured object to a role" );
    825            System.out.println( "-constraints comma seperated list of absolut pathes to filter encoding files" );
    826            System.out.println( "-rights comma seperated list of rights to assign. the number of rights must be equest to the number constraints" );
    827            System.out.println( "-soName name of the secured object" );
    828            System.out.println( "-soType type of the secured object" );
    829            System.out.println( "-role name of the role the rights shall be given to" );
    830            System.out.println();
    831            System.out.println( "action = removeRights removes rights on a named secured object to a role" );
    832            System.out.println( "-rights comma seperated list of rights to remove." );
    833            System.out.println( "-soName name of the secured object" );
    834            System.out.println( "-soType type of the secured object" );
    835            System.out.println( "-role name of the role the rights shall be given to" );
    836            System.out.println();
    837            System.out.println( "action = printRights -> print roles and associated rights of a user" );
    838            System.out.println( "-userName name of the user" );
    839            System.out.println( "-soType type of the secured object" );
    840            System.out.println();
    841            System.out.println( "action = clean -> cleans the complete right management system "
    842                                + "database by deleting all entries!" );
    843        }
    844
    845        /**
    846         * @param args
    847         */
    848        public static void main( String[] args ) {
    849            try {
    850                Properties map = new Properties();
    851
    852                for ( int i = 0; i < args.length; i += 2 ) {
    853                    if ( args.length >= i + 2 ) {
    854                        map.put( args[i], args[i + 1] );
    855                    } else {
    856                        map.put( args[i], "" );
    857                    }
    858                }
    859
    860                if ( map.containsKey( "-help" ) || map.containsKey( "-h" ) || map.containsKey( "-?" ) ) {
    861                    printHelp();
    862                }
    863
    864                String driver = map.getProperty( "-driver" );
    865                String logon = map.getProperty( "-logon" );
    866                String user = map.getProperty( "-user" );
    867                String password = map.getProperty( "-pw" );
    868
    869                DRMAccess sac = new DRMAccess();
    870                sac.setUp( driver, logon, user, password );
    871
    872                String action = map.getProperty( "-action" );
    873
    874                if ( action.equals( "addUser" ) ) {
    875                    sac.addUser( map.getProperty( "-name" ), map.getProperty( "-password" ),
    876                                 map.getProperty( "-firstName" ), map.getProperty( "-lastName" ),
    877                                 map.getProperty( "-email" ) );
    878                } else if ( action.equals( "removeUser" ) ) {
    879                    sac.removeUser( map.getProperty( "-name" ) );
    880                } else if ( action.equals( "addGroup" ) ) {
    881                    sac.addGroup( map.getProperty( "-name" ), map.getProperty( "-title" ) );
    882                } else if ( action.equals( "removeGroup" ) ) {
    883                    sac.removeGroup( map.getProperty( "-name" ) );
    884                } else if ( action.equals( "addRole" ) ) {
    885                    sac.addRole( map.getProperty( "-name" ) );
    886                } else if ( action.equals( "removeRole" ) ) {
    887                    sac.removeRole( map.getProperty( "-name" ) );
    888                } else if ( action.equals( "addUserToGroup" ) ) {
    889                    sac.setGroupMemberships( map.getProperty( "-userName" ), map.getProperty( "-groupName" ) );
    890                } else if ( action.equals( "assignRoleWithGroup" ) ) {
    891                    sac.setRoleAssociation( map.getProperty( "-roleName" ), map.getProperty( "-groupName" ) );
    892                } else if ( action.equals( "assignRoleWithUser" ) ) {
    893                    sac.setUserRoleAssociation( map.getProperty( "-roleName" ), map.getProperty( "-userName" ) );
    894                } else if ( action.equals( "addSecuredObject" ) ) {
    895                    sac.addSecuredObject( map.getProperty( "-soType" ), map.getProperty( "-soName" ),
    896                                          map.getProperty( "-soTitle" ) );
    897                } else if ( action.equals( "removeSecuredObject" ) ) {
    898                    sac.removeSecuredObject( map.getProperty( "-soType" ), map.getProperty( "-soName" ) );
    899                } else if ( action.equals( "assignRights" ) ) {
    900                    String[] filter = StringTools.toArray( map.getProperty( "-constraints" ), ",;:", false );
    901                    for ( int i = 0; i < filter.length; i++ ) {
    902                        if ( filter[i] != null && !filter[i].trim().equals( "-" ) && !filter[i].trim().equals( "." ) ) {
    903                            RandomAccessFile raf = new RandomAccessFile( filter[i], "r" );
    904                            long l = raf.length();
    905                            byte[] b = new byte[(int) l];
    906                            raf.read( b );
    907                            raf.close();
    908                            filter[i] = new String( b );
    909                        } else {
    910                            filter[i] = null;
    911                        }
    912                    }
    913                    String[] rights = StringTools.toArray( map.getProperty( "-rights" ), ",:;", false );
    914                    sac.assignRights( filter, map.getProperty( "-soName" ), map.getProperty( "-soType" ),
    915                                      map.getProperty( "-role" ), rights );
    916                } else if ( action.equals( "removeRights" ) ) {
    917                    String[] rights = StringTools.toArray( map.getProperty( "-rights" ), ",", false );
    918                    sac.removeRights( map.getProperty( "-soName" ), map.getProperty( "-soType" ),
    919                                      map.getProperty( "-role" ), rights );
    920                } else if ( action.equals( "hasRight" ) ) {
    921                    sac.hasRight( map.getProperty( "-userName" ), map.getProperty( "-password" ),
    922                                  map.getProperty( "-soName" ), map.getProperty( "-soType" ), map.getProperty( "-right" ) );
    923                } else if ( action.equals( "clean" ) ) {
    924                    sac.clean();
    925                } else if ( action.equals( "printRights" ) ) {
    926                    sac.printRights( map.getProperty( "-userName" ), map.getProperty( "-soType" ) );
    927                }
    928
    929                try {
    930                    Thread.sleep( 100 );
    931                } catch ( Exception e ) {
    932                    // just waiting
    933                }
    934                System.out.println( "finished" );
    935                System.exit( 0 );
    936            } catch ( FileNotFoundException e ) {
    937                e.printStackTrace();
    938            } catch ( IOException e ) {
    939                e.printStackTrace();
    940            } catch ( Exception e ) {
    941                e.printStackTrace();
    942            }
    943        }
    944    }