Repository: airavata Updated Branches: refs/heads/grouper-integration 70f857953 -> 89e0fdc80
http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/log4j.properties b/modules/group-manager/src/main/resources/log4j.properties new file mode 100755 index 0000000..9cde476 --- /dev/null +++ b/modules/group-manager/src/main/resources/log4j.properties @@ -0,0 +1,154 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# will be substituted with the System property "grouper.home", which must have a trailing \ or / +# depending on your OS. Of course you can use absolute paths if you prefer + + +# +# log4j Configuration +# $Id: log4j.example.properties,v 1.13 2009-12-18 13:56:51 tzeller Exp $ +# + +# Appenders + +## Log messages to stderr +log4j.appender.grouper_stderr = org.apache.log4j.ConsoleAppender +log4j.appender.grouper_stderr.Target = System.err +log4j.appender.grouper_stderr.layout = org.apache.log4j.PatternLayout +log4j.appender.grouper_stderr.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n + +## Log messages to stdout +log4j.appender.grouper_stdout = org.apache.log4j.ConsoleAppender +log4j.appender.grouper_stdout.Target = System.out +log4j.appender.grouper_stdout.layout = org.apache.log4j.PatternLayout +log4j.appender.grouper_stdout.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n + +## Grouper API event logging +log4j.appender.grouper_event = org.apache.log4j.DailyRollingFileAppender +log4j.appender.grouper_event.File = logs/grouper_event.log +log4j.appender.grouper_event.DatePattern = '.'yyyy-MM-dd +log4j.appender.grouper_event.layout = org.apache.log4j.PatternLayout +log4j.appender.grouper_event.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n + +## Grouper API error logging +log4j.appender.grouper_error = org.apache.log4j.DailyRollingFileAppender +log4j.appender.grouper_error.File = logs/grouper_error.log +log4j.appender.grouper_error.DatePattern = '.'yyyy-MM-dd +log4j.appender.grouper_error.layout = org.apache.log4j.PatternLayout +log4j.appender.grouper_error.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n +#log4j.appender.grouper_error.layout.ConversionPattern = %d{ISO8601}: %m%n + +# Debug logging (Or: logging that I haven't cleaned up yet to send elsewhere) +log4j.appender.grouper_debug = org.apache.log4j.RollingFileAppender +log4j.appender.grouper_debug.File = logs/grouper_debug.log +log4j.appender.grouper_debug.MaxFileSize = 100KB +log4j.appender.grouper_debug.MaxBackupIndex = 1 +log4j.appender.grouper_debug.layout = org.apache.log4j.PatternLayout +#log4j.appender.grouper_debug.layout.ConversionPattern = %d{ISO8601} %5p %c{2}: %m%n +log4j.appender.grouper_debug.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n + +## Benchmark logging +log4j.appender.grouper_gb = org.apache.log4j.RollingFileAppender +log4j.appender.grouper_gb.File = logs/grouper_bench.log +log4j.appender.grouper_gb.MaxFileSize = 100KB +log4j.appender.grouper_gb.MaxBackupIndex = 1 +log4j.appender.grouper_gb.layout = org.apache.log4j.PatternLayout +#log4j.appender.grouper_gb.layout.ConversionPattern = %d{ISO8601} %5p %c{2}: %m%n +log4j.appender.grouper_gb.layout.ConversionPattern = %d{ISO8601}: [%t] %-5p %C{1}.%M(%L) - %x - %m%n + +# Loggers + +## Default logger; will log *everything* +log4j.rootLogger = ERROR, grouper_error + +## All Internet2 (warn to grouper_error per default logger) +log4j.logger.edu.internet2.middleware = WARN + + +# Provisioning : PSP (version 2.1+) +log4j.logger.edu.internet2.middleware.psp = INFO + +# Provisioning : vt-ldap +# log4j.logger.edu.vt.middleware.ldap = INFO + +# Provisioning : Grouper plugin to Shibboleth attribute resolver +# log4j.logger.edu.internet2.middleware.grouper.shibboleth = INFO + + +# For more precise (or verbose) logging, enable one or more of the +# following logging directives. To remove duplicate entries, just change the +# level, and not where to send the logs +# http://robertmarkbramprogrammer.blogspot.com/2007/06/log4j-duplicate-lines-in-output.html + +## Grouper Event Logging +## * Logs at _info_ only +log4j.logger.edu.internet2.middleware.grouper.log.EventLog = INFO, grouper_event +log4j.logger.edu.internet2.middleware.grouper.RegistryInstall = INFO, grouper_event, grouper_stderr + +## Grouper Error Logging +## * Logs at _warn_, _fatal_ and _error_ only (by default this is WARN due to internet2 below) +#log4j.logger.edu.internet2.middleware.grouper = WARN, grouper_error + +## Grouper Debug Logging +## * NOTE: There is currently VERY LITTLE (useful) information sent to this. +## * Logs at _info_ only currently +#log4j.logger.edu.internet2.middleware.grouper = INFO, grouper_debug + +## Grouper XML Export + Import Logging +## TODO Integrate with normal logging +log4j.logger.edu.internet2.middleware.grouper.xml.XmlExporter = INFO, grouper_event +log4j.logger.edu.internet2.middleware.grouper.xml.XmlImporter = INFO, grouper_event + +## Grouper Benchmark Logging +log4j.logger.edu.internet2.middleware.grouper.bench = INFO, grouper_gb, grouper_stderr + +## Grouper script to add missing group sets +log4j.logger.edu.internet2.middleware.grouper.misc.AddMissingGroupSets = INFO, grouper_event + +## Grouper Sync Point in Time Tables +log4j.logger.edu.internet2.middleware.grouper.misc.SyncPITTables = INFO, grouper_event + +## Grouper Sync Stem Set Table +log4j.logger.edu.internet2.middleware.grouper.misc.SyncStemSets = INFO, grouper_event + +## Grouper Migrate Legacy Attributes +log4j.logger.edu.internet2.middleware.grouper.misc.MigrateLegacyAttributes = INFO, grouper_event + +### Subject API +#log4j.logger.edu.internet2.middleware.subject = ERROR, grouper_error +#log4j.logger.edu.internet2.middleware.subject.provider = ERROR, grouper_error +### Hibernate +#log4j.logger.org.hibernate = ERROR, grouper_error +### ehcache +#log4j.logger.net.sf.ehcache = ERROR, grouper_error +### Spring +#log4j.logger.org.springframework = ERROR, grouper_error + +## Grouper Stress Testing +log4j.logger.edu.internet2.middleware.grouper.stress = INFO, grouper_debug, grouper_stderr + + +####################################################### +##Optional settings for debug logs +####################################################### + +## Hooks debug info +#log4j.logger.edu.internet2.middleware.grouper.hooks.examples.GroupTypeTupleIncludeExcludeHook = DEBUG +#log4j.logger.edu.internet2.middleware.grouper.Group = DEBUG + +#log4j.logger.edu.internet2.middleware.grouper.hooks.examples.GroupTypeSecurityHook = DEBUG + http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/morphString.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/morphString.properties b/modules/group-manager/src/main/resources/morphString.properties new file mode 100755 index 0000000..dbb9d60 --- /dev/null +++ b/modules/group-manager/src/main/resources/morphString.properties @@ -0,0 +1,21 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Put a random alphanumeric string (Case sensitive) for the password encryption. e.g. fh43IRJ4Nf5 +# or put a filename where the random alphanumeric string is. e.g. c:/whatever/key.txt +encrypt.key = +# set this to true if you have slashes in your passwords and dont want to look in external files or unencrypt +encrypt.disableExternalFileLookup = false http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/server.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/server.properties b/modules/group-manager/src/main/resources/server.properties new file mode 100755 index 0000000..e4a06b1 --- /dev/null +++ b/modules/group-manager/src/main/resources/server.properties @@ -0,0 +1,26 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# HSQLDB Server Configuration +# $Id: server.example.properties,v 1.1 2008-09-29 03:38:30 mchyzer Exp $ +server.address=127.0.0.1 +server.port=9001 +server.address=localhost +server.port=9001 +server.silent=true +server.database.0=file:dist/run/grouper +server.dbname.0=grouper +server.urlid.0=grouper http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/sources.xml ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/sources.xml b/modules/group-manager/src/main/resources/sources.xml new file mode 100755 index 0000000..3ae8b7b --- /dev/null +++ b/modules/group-manager/src/main/resources/sources.xml @@ -0,0 +1,875 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Copyright 2014 Internet2 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> +<!-- +Grouper's subject resolver configuration +$Id: sources.example.xml,v 1.8 2009-08-11 20:18:09 mchyzer Exp $ +--> + +<sources> + + <!-- Group Subject Resolver --> + + <!-- + You can flag a source as not throwing exception on a findAll (general search) i.e. if it is + ok if it is down. Generally you probably won't want to do this. It defaults to true if omitted. + + <init-param> + <param-name>throwErrorOnFindAllFailure</param-name> + <param-value>false</param-value> + </init-param> + --> + + <!-- + You can make virtual attributes (attributes with formatting or based on other attributes) like this: + init-param name is subjectVirtualAttribute_<index>_<name> where index is the order to be processed + if some depend on others (0 to 99). The value is the jexl expression language. You can use subjectUtils + methods (aliased with "subjectUtils", or you can register your own class (must have default constructor). + Here are examples: + + <init-param> + <param-name>subjectVirtualAttribute_0_loginIdLfName</param-name> + <param-value>Hey ${subject.getAttributeValue('LOGINID')} and ${subject.getAttributeValue('LFNAME')}</param-value> + </init-param> + <init-param> + <param-name>subjectVirtualAttribute_1_loginIdLfNameLoginId</param-name> + <param-value>${subject.getAttributeValue('loginIdLfName')} Hey ${subject.getAttributeValue('LOGINID')} and ${subject.getAttributeValue('LFNAME')}</param-value> + </init-param> + <init-param> + <param-name>subjectVirtualAttributeVariable_JDBCSourceAdapterTest</param-name> + <param-value>edu.internet2.middleware.subject.provider.JDBCSourceAdapterTest</param-value> + </init-param> + <init-param> + <param-name>subjectVirtualAttribute_2_loginIdSquared</param-name> + <param-value>${JDBCSourceAdapterTest.appendToSelf(subject.getAttributeValue('LOGINID'))}</param-value> + </init-param> + + The first virtual attribute is accessible via: subject.getAttributeValue("loginIdLfNameLoginId"); + + you can set these c3p0 settings: maxConnectionAge (seconds), testConnectionOnCheckout (true|false), + preferredTestQuery (e.g. select 1 from dual), idleConnectionTestPeriod (seconds) + + + <init-param> + <param-name>findSubjectByIdOnCheckConfig</param-name> + <param-value>true|false</param-value> + </init-param> + <init-param> + <param-name>subjectIdToFindOnCheckConfig</param-name> + <param-value>someSubjectIdWhichMightExistOrWhatever</param-value> + </init-param> + + <init-param> + <param-name>findSubjectByIdentifiedOnCheckConfig</param-name> + <param-value>true|false</param-value> + </init-param> + <init-param> + <param-name>subjectIdentifierToFindOnCheckConfig</param-name> + <param-value>someSubjectIdentifierWhichMightExistOrWhatever</param-value> + </init-param> + + <init-param> + <param-name>findSubjectByStringOnCheckConfig</param-name> + <param-value>true|false</param-value> + </init-param> + <init-param> + <param-name>stringToFindOnCheckConfig</param-name> + <param-value>someStringWhichMightExistOrWhatever</param-value> + </init-param> + --> + + <!-- + NOTE: It is recommended that you **not** change the default + values for this source adapter. + --> + <source adapterClass="edu.internet2.middleware.grouper.GrouperSourceAdapter"> + <id>g:gsa</id> + <name>Grouper: Group Source Adapter</name> + <type>group</type> + + <init-param> + <param-name>subjectVirtualAttribute_0_searchAttribute0</param-name> + <param-value>${subject.getAttributeValue('name')},${subject.getAttributeValue('displayName')},${subject.getAttributeValue('alternateName')}</param-value> + </init-param> + <init-param> + <param-name>sortAttribute0</param-name> + <param-value>displayExtension</param-value> + </init-param> + <init-param> + <param-name>searchAttribute0</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + <!-- on a findPage() this is the most results returned --> + <init-param> + <param-name>maxPageSize</param-name> + <param-value>100</param-value> + </init-param> + <internal-attribute>searchAttribute0</internal-attribute> + </source> + <!-- Group Subject Resolver --> + + <!-- + NOTE: It is recommended that you **not** change the default + values for this source adapter. + --> + <source adapterClass="edu.internet2.middleware.grouper.entity.EntitySourceAdapter"> + <id>grouperEntities</id> + <name>Grouper: Entity Source Adapter</name> + <type>application</type> + + <init-param> + <param-name>subjectVirtualAttribute_0_searchAttribute0</param-name> + <!-- TODO add attribute for subject identifier --> + <param-value>${subject.getAttributeValue('name')},${subject.getAttributeValue('displayName')},${subject.getAttributeValue('alternateName')}</param-value> + </init-param> + <init-param> + <param-name>sortAttribute0</param-name> + <param-value>name</param-value> + </init-param> + <init-param> + <param-name>searchAttribute0</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + <internal-attribute>searchAttribute0</internal-attribute> + </source> + <!-- Entity Subject Resolver --> + + <source adapterClass="edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter"> + <id>jdbc</id> + <name>Example JDBC Source Adapter</name> + <type>person</type> + + <!-- edu.internet2.middleware.subject.provider.C3p0JdbcConnectionProvider (default) + edu.internet2.middleware.subject.provider.DbcpJdbcConnectionProvider (legacy) + edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider + (same settings as grouper.hibernate.properties, the driver, url, pass, maxActive, maxIdle, maxWait are forbidden --> + <init-param> + <param-name>jdbcConnectionProvider</param-name> + <param-value>edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider </param-value> + </init-param> + + <!-- If using emails and need email addresses in sources, set which attribute has the email address in this source --> + <init-param> + <param-name>emailAttributeName</param-name> + <param-value>email</param-value> + </init-param> + + <!-- if more than this many results are returned, then throw a too many subjects exception --> + <init-param> + <param-name>maxResults</param-name> + <param-value>1000</param-value> + </init-param> + + <!-- on a findPage() this is the most results returned --> + <init-param> + <param-name>maxPageSize</param-name> + <param-value>100</param-value> + </init-param> + + <!-- note: again, if you use GrouperJdbcConnectionProvider, then you should not fill out maxActive, maxIdle, + maxWait, dbDriver, dbUrl, dbUser, dbPwd, since it will use the grouper.hibernate.properties db settings --> + + <!-- init-param> + <param-name>maxActive</param-name> + <param-value>16</param-value> + </init-param> + <init-param> + <param-name>maxIdle</param-name> + <param-value>16</param-value> + </init-param> + <init-param> + <param-name>maxWait</param-name> + <param-value>-1</param-value> + </init-param --> + + <!-- + e.g. mysql: com.mysql.jdbc.Driver + e.g. p6spy (log sql): com.p6spy.engine.spy.P6SpyDriver + for p6spy, put the underlying driver in spy.properties + e.g. oracle: oracle.jdbc.driver.OracleDriver + e.g. hsqldb: org.hsqldb.jdbcDriver + e.g. postgres: org.postgresql.Driver --> + + <!-- init-param> + <param-name>dbDriver</param-name> + <param-value>org.hsqldb.jdbcDriver</param-value> + </init-param --> + + <!-- + e.g. mysql: jdbc:mysql://localhost:3306/grouper + e.g. p6spy (log sql): [use the URL that your DB requires] + e.g. oracle: jdbc:oracle:thin:@server.school.edu:1521:sid + e.g. hsqldb (a): jdbc:hsqldb:dist/run/grouper;create=true + e.g. hsqldb (b): jdbc:hsqldb:hsql://localhost:9001 + e.g. postgres: jdbc:postgresql:grouper --> + + <!-- init-param> + <param-name>dbUrl</param-name> + <param-value>jdbc:hsqldb:C:/projects/GrouperI2MI_1-2/grouper/dist/run/grouper</param-value> + </init-param> + <init-param> + <param-name>dbUser</param-name> + <param-value>sa</param-value> + </init-param> + <init-param> + <param-name>dbPwd</param-name> + <param-value></param-value> + </init-param --> + + <init-param> + <param-name>SubjectID_AttributeType</param-name> + <param-value>id</param-value> + </init-param> + <init-param> + <param-name>Name_AttributeType</param-name> + <param-value>name</param-value> + </init-param> + <init-param> + <param-name>Description_AttributeType</param-name> + <param-value>description</param-value> + </init-param> + <init-param> + <param-name>subjectVirtualAttribute_0_searchAttribute0</param-name> + <param-value>${subject.name},${subjectUtils.defaultIfBlank(subject.getAttributeValue('LFNAME'), "")},${subjectUtils.defaultIfBlank(subject.getAttributeValue('LOGINID'), "")},${subjectUtils.defaultIfBlank(subject.description, "")},${subjectUtils.defaultIfBlank(subject.getAttributeValue('EMAIL'), "")}</param-value> + </init-param> + <init-param> + <param-name>sortAttribute0</param-name> + <param-value>LFNAME</param-value> + </init-param> + <init-param> + <param-name>sortAttribute1</param-name> + <param-value>LOGINID</param-value> + </init-param> + <init-param> + <param-name>searchAttribute0</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + <internal-attribute>searchAttribute0</internal-attribute> + + <!-- if you are going to use the inclause attribute + on the search to make the queries batchable when searching + by id or identifier --> + <init-param> + <param-name>useInClauseForIdAndIdentifier</param-name> + <param-value>true</param-value> + </init-param> + + <!-- comma separate the identifiers for this row, this is for the findByIdentifiers if using an in clause --> + <init-param> + <param-name>identifierAttributes</param-name> + <param-value>LOGINID</param-value> + </init-param> + + <!-- subject identifier to store in grouper's member table --> + <init-param> + <param-name>subjectIdentifierAttribute0</param-name> + <param-value>LOGINID</param-value> + </init-param> + + <search> + <searchType>searchSubject</searchType> + <param> + <param-name>sql</param-name> + <param-value> +select + s.subjectid as id, s.name as name, + (select sa2.value from subjectattribute sa2 where name='name' and sa2.SUBJECTID = s.subjectid) as lfname, + (select sa3.value from subjectattribute sa3 where name='loginid' and sa3.SUBJECTID = s.subjectid) as loginid, + (select sa4.value from subjectattribute sa4 where name='description' and sa4.SUBJECTID = s.subjectid) as description, + (select sa5.value from subjectattribute sa5 where name='email' and sa5.SUBJECTID = s.subjectid) as email +from + subject s +where + {inclause} + </param-value> + </param> + <param> + <param-name>inclause</param-name> + <param-value> +s.subjectid = ? + </param-value> + </param> + </search> + <search> + <searchType>searchSubjectByIdentifier</searchType> + <param> + <param-name>sql</param-name> + <param-value> +select + s.subjectid as id, s.name as name, + (select sa2.value from subjectattribute sa2 where name='name' and sa2.SUBJECTID = s.subjectid) as lfname, + (select sa3.value from subjectattribute sa3 where name='loginid' and sa3.SUBJECTID = s.subjectid) as loginid, + (select sa4.value from subjectattribute sa4 where name='description' and sa4.SUBJECTID = s.subjectid) as description, + (select sa5.value from subjectattribute sa5 where name='email' and sa5.SUBJECTID = s.subjectid) as email +from + subject s, subjectattribute a +where + a.name='loginid' and s.subjectid = a.subjectid and {inclause} + </param-value> + </param> + <param> + <param-name>inclause</param-name> + <param-value> + a.value = ? + </param-value> + </param> + </search> + <search> + <searchType>search</searchType> + <param> + <param-name>sql</param-name> + + <!-- for postgres, use this query since no concat() exists: + + select + subject.subjectid as id, subject.name as name, + lfnamet.lfname as lfname, loginidt.loginid as loginid, + desct.description as description, emailt.email as email +from + subject + left join (select subjectid, value as lfname from subjectattribute + where name='name') lfnamet + on subject.subjectid=lfnamet.subjectid + left join (select subjectid, value as loginid from subjectattribute + where name='loginid') loginidt + on subject.subjectid=loginidt.subjectid + left join (select subjectid, value as description from subjectattribute + where name='description') desct + on subject.subjectid=desct.subjectid + left join (select subjectid, value as email from subjectattribute + where name='email') emailt + on subject.subjectid=emailt.subjectid +where + (lower(name) like '%' || ? || '%') + or (lower(lfnamet.lfname) like '%' || ? || '%') + or (lower(loginidt.loginid) like '%' || ? || '%') + or (lower(desct.description) like '%' || ? || '%') + or (lower(emailt.email) like '%' || ? || '%') + +for SQL-server: + +select + subject.subjectid as id, subject.name as name, + lfnamet.lfname as lfname, loginidt.loginid as loginid, + desct.description as description, emailt.email as email +from + subject + left join (select subjectid, value as lfname from subjectattribute + where name='name') lfnamet + on subject.subjectid=lfnamet.subjectid + left join (select subjectid, value as loginid from subjectattribute + where name='loginid') loginidt + on subject.subjectid=loginidt.subjectid + left join (select subjectid, value as description from subjectattribute + where name='description') desct + on subject.subjectid=desct.subjectid + left join (select subjectid, value as email from subjectattribute + where name='email') emailt + on subject.subjectid=emailt.subjectid +where + (lower(name) like '%' + ? + '%') + or (lower(lfnamet.lfname) like '%' + ? + '%') + or (lower(loginidt.loginid) like '%' + ? + '%') + or (lower(desct.description) like '%' + ? + '%') + or (lower(emailt.email) like '%' + ? + '%') + + --> + + <param-value> +select + s.subjectid as id, s.name as name, + (select sa2.value from subjectattribute sa2 where name='name' and sa2.SUBJECTID = s.subjectid) as lfname, + (select sa3.value from subjectattribute sa3 where name='loginid' and sa3.SUBJECTID = s.subjectid) as loginid, + (select sa4.value from subjectattribute sa4 where name='description' and sa4.SUBJECTID = s.subjectid) as description, + (select sa5.value from subjectattribute sa5 where name='email' and sa5.SUBJECTID = s.subjectid) as email +from + subject s +where + s.subjectid in ( + select subjectid from subject where lower(name) like concat('%',concat(?,'%')) union + select subjectid from subjectattribute where searchvalue like concat('%',concat(?,'%')) + ) + </param-value> + </param> + </search> + </source> + + <!-- + <!- - This is an alternate jdbc source which allows for more complex searches, assumes + all data is in one table or view, and that all attributes are single valued. There are + not queries to configure in sources.xml - - > + <source adapterClass="edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter2"> + <id>sourceId</id> + <name>Source name</name> + <type>person</type> + <init-param> + <param-name>jdbcConnectionProvider</param-name> + <param-value>edu.internet2.middleware.grouper.subj.GrouperJdbcConnectionProvider</param-value> + </init-param> + + <init-param> + <param-name>maxResults</param-name> + <param-value>1000</param-value> + </init-param> + + <init-param> + <param-name>dbTableOrView</param-name> + <param-value>person_source_v</param-value> + </init-param> + <init-param> + <param-name>subjectIdCol</param-name> + <param-value>some_id</param-value> + </init-param> + <init-param> + <param-name>nameCol</param-name> + <param-value>name</param-value> + </init-param> + <init-param> + <param-name>descriptionCol</param-name> + <param-value>description</param-value> + </init-param> + <init-param> + <!- - search col where general searches take place, lower case - - > + <param-name>lowerSearchCol</param-name> + <param-value>description_lower</param-value> + </init-param> + <init-param> + <!- - optional col if you want the search results sorted in the API (note, UI might override) - - > + <param-name>defaultSortCol</param-name> + <param-value>description</param-value> + </init-param> + <init-param> + <!- - col which identifies the row, perhaps not subjectId, add multiple by incrementing the 0 index - - > + <param-name>subjectIdentifierCol0</param-name> + <param-value>pennname</param-value> + </init-param> + <init-param> + <!- - col which identifies the row, perhaps not subjectId, add multiple by incrementing the 0 index - - > + <param-name>subjectIdentifierCol1</param-name> + <param-value>penn_id</param-value> + </init-param> + <!- - now you can count up from 0 to N of attributes for various cols. + The name is how to reference in subject.getAttribute() - - > + <init-param> + <param-name>subjectAttributeCol0</param-name> + <param-value>pennname</param-value> + </init-param> + <init-param> + <param-name>subjectAttributeName0</param-name> + <param-value>PENNNAME</param-value> + </init-param> + <init-param> + <param-name>subjectAttributeCol1</param-name> + <param-value>description_lower</param-value> + </init-param> + <init-param> + <param-name>subjectAttributeName1</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + <init-param> + <param-name>sortAttribute0</param-name> + <param-value>description</param-value> + </init-param> + <init-param> + <param-name>searchAttribute0</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + <internal-attribute>searchAttribute0</internal-attribute> + <!- - ########################## STATUS SECTION for searches to filter out inactives and allow + the user to filter by status with e.g. status=all + this is optional, and advanced - -> + <!- - column or attribute which represents the status - - > + <!- - + <init-param> + <param-name>statusDatastoreFieldName</param-name> + <param-value>status</param-value> + </init-param> - - > + <!- - search string from user which represents the status. e.g. status=active - - > + <!- - + <init-param> + <param-name>statusLabel</param-name> + <param-value>status</param-value> + </init-param> - - > + <!- - available statuses from screen (if not specified, any will be allowed). comma separated list. + Note, this is optional and you probably dont want to configure it, it is mostly necessary + when you have multiple sources with statuses... if someone types an invalid status + and you have this configured, it will not filter by it - - > + <!- - + <init-param> + <param-name>statusesFromUser<param-name> + <param-value>Active, Inactive, Pending, All</param-value> + </init-param> - - > + <!- - all label from the user - - > + <!- - + <init-param> + <param-name>statusAllFromUser</param-name> + <param-value>All</param-value> + </init-param> - - > + <!- - if no status is specified, this will be used (e.g. for active only). Note, the value should be of the + form the user would type in - - > + <!- - + <init-param> + <param-name>statusSearchDefault</param-name> + <param-value>status=active</param-value> + </init-param> - - > + <!- - translate between screen values of status, and the data store value. Increment the 0 to 1, 2, etc for more translations. + so the user could enter: status=active, and that could translate to status_col=A. The 'user' is what the user types in, + the 'datastore' is what is in the datastore. The user part is not case-sensitive. Note, this could be a many to one - - > + <!- - + <init-param> + <param-name>statusTranslateUser0</param-name> + <param-value>active</param-value> + </init-param> + <init-param> + <param-name>statusTranslateDatastore0</param-name> + <param-value>A</param-value> + </init-param> - - > + <!- - ########################## END STATUS SECTION - - > + </source> + --> + + <!-- + <source adapterClass="edu.internet2.middleware.grouper.subj.GrouperJndiSourceAdapter"> + <id>example</id> + <name>Example Edu</name> + <type>person</type> + <init-param> + <param-name>INITIAL_CONTEXT_FACTORY</param-name> + <param-value>com.sun.jndi.ldap.LdapCtxFactory</param-value> + </init-param> + <init-param> + <param-name>PROVIDER_URL</param-name> + <param-value>ldap://localhost:389</param-value> + </init-param> + <init-param> + <param-name>SECURITY_AUTHENTICATION</param-name> + <param-value>simple</param-value> + </init-param> + <init-param> + <param-name>SECURITY_PRINCIPAL</param-name> + <param-value>cn=Manager,dc=example,dc=edu</param-value> + </init-param> + <init-param> + <param-name>SECURITY_CREDENTIALS</param-name> + <param-value>secret</param-value> + </init-param> + <init-param> + <param-name>SubjectID_AttributeType</param-name> + <param-value>exampleEduRegID</param-value> + </init-param> + <init-param> + <param-name>SubjectID_formatToLowerCase</param-name> + <param-value>false</param-value> + </init-param> + <init-param> + <param-name>Name_AttributeType</param-name> + <param-value>cn</param-value> + </init-param> + <init-param> + <param-name>Description_AttributeType</param-name> + <param-value>description</param-value> + </init-param> + + <init-param> + <param-name>VTLDAP_VALIDATOR</param-name> + <param-value>ConnectLdapValidator|CompareLdapValidator</param-value> + </init-param> + <init-param> + <param-name>VTLDAP_VALIDATOR_COMPARE_DN</param-name> + <param-value>ou=People,dc=vt,dc=edu</param-value> + </init-param> + <init-param> + <param-name>VTLDAP_VALIDATOR_COMPARE_SEARCH_FILTER_STRING</param-name> + <param-value>ou=People</param-value> + </init-param> + + /// Scope Values can be: OBJECT_SCOPE, ONELEVEL_SCOPE, SUBTREE_SCOPE + /// For filter use + + <search> + <searchType>searchSubject</searchType> + <param> + <param-name>filter</param-name> + <param-value> + (& (exampleEduRegId=%TERM%) (objectclass=exampleEduPerson)) + </param-value> + </param> + <param> + <param-name>scope</param-name> + <param-value> + SUBTREE_SCOPE + </param-value> + </param> + <param> + <param-name>base</param-name> + <param-value> + ou=people,dc=example,dc=edu + </param-value> + </param> + + </search> + <search> + <searchType>searchSubjectByIdentifier</searchType> + <param> + <param-name>filter</param-name> + <param-value> + (& (uid=%TERM%) (objectclass=exampleEduPerson)) + </param-value> + </param> + <param> + <param-name>scope</param-name> + <param-value> + SUBTREE_SCOPE + </param-value> + </param> + <param> + <param-name>base</param-name> + <param-value> + ou=people,dc=example,dc=edu + </param-value> + </param> + </search> + + <search> + <searchType>search</searchType> + <param> + <param-name>filter</param-name> + <param-value> + (& (|(|(uid=%TERM%)(cn=*%TERM%*))(exampleEduRegId=%TERM%))(objectclass=exampleEduPerson)) + </param-value> + </param> + <param> + <param-name>scope</param-name> + <param-value> + SUBTREE_SCOPE + </param-value> + </param> + <param> + <param-name>base</param-name> + <param-value> + ou=people,dc=example,dc=edu + </param-value> + </param> + </search> + <init-param> + <param-name>subjectVirtualAttribute_0_searchAttribute0</param-name> + <param-value>${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('uid'), "")},${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('cn'), "")},${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('exampleEduRegId'), "")}</param-value> + </init-param> + <init-param> + <param-name>sortAttribute0</param-name> + <param-value>cn</param-value> + </init-param> + <init-param> + <param-name>searchAttribute0</param-name> + <param-value>searchAttribute0</param-value> + </init-param> + + <!- - ########################## STATUS SECTION for searches to filter out inactives and allow + the user to filter by status with e.g. status=all + this is optional, and advanced - -> + <!- - column or attribute which represents the status - - > + <!- - + <init-param> + <param-name>statusDatastoreFieldName</param-name> + <param-value>status</param-value> + </init-param> - - > + <!- - search string from user which represents the status. e.g. status=active - - > + <!- - + <init-param> + <param-name>statusLabel</param-name> + <param-value>status</param-value> + </init-param> - - > + <!- - available statuses from screen (if not specified, any will be allowed). comma separated list. + Note, this is optional and you probably dont want to configure it, it is mostly necessary + when you have multiple sources with statuses... if someone types an invalid status + and you have this configured, it will not filter by it - - > + <!- - + <init-param> + <param-name>statusesFromUser<param-name> + <param-value>Active, Inactive, Pending, All</param-value> + </init-param> - - > + <!- - all label from the user - - > + <!- - + <init-param> + <param-name>statusAllFromUser</param-name> + <param-value>All</param-value> + </init-param> - - > + <!- - if no status is specified, this will be used (e.g. for active only). Note, the value should be of the + form the user would type in - - > + <!- - + <init-param> + <param-name>statusSearchDefault</param-name> + <param-value>status=active</param-value> + </init-param> - - > + <!- - translate between screen values of status, and the data store value. Increment the 0 to 1, 2, etc for more translations. + so the user could enter: status=active, and that could translate to status_col=A. The 'user' is what the user types in, + the 'datastore' is what is in the datastore. The user part is not case-sensitive. Note, this could be a many to one - - > + <!- - + <init-param> + <param-name>statusTranslateUser0</param-name> + <param-value>active</param-value> + </init-param> + <init-param> + <param-name>statusTranslateDatastore0</param-name> + <param-value>A</param-value> + </init-param> - - > + <!- - ########################## END STATUS SECTION - - > + + + <internal-attribute>searchAttribute0</internal-attribute> + + ///Attributes you would like to display when doing a search + <attribute>cn</attribute> + <attribute>sn</attribute> + <attribute>uid</attribute> + <attribute>department</attribute> + <attribute>exampleEduRegId</attribute> + + <!- - subject identifier to store in grouper's member table - - > + <init-param> + <param-name>subjectIdentifierAttribute0</param-name> + <param-value>uid</param-value> + </init-param> + + </source> +--> + + <source adapterClass="edu.internet2.middleware.grouper.subj.GrouperJdbcSourceAdapter2"> +Â Â Â Â <id>AIRAVATA_SUBJECT_SOURCE</id> +Â Â Â Â <name>AIRAVATA_SUBJECT_SOURCE</name> +Â Â Â Â Â <type>person</type>Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>jdbcConnectionProvider</param-name> +Â Â Â Â Â Â <param-value>edu.internet2.middleware.subject.provider.C3p0JdbcConnectionProvider</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>dbDriver</param-name> +Â Â Â Â Â Â <param-value>com.mysql.jdbc.Driver</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>dbUrl</param-name> +Â Â Â Â Â Â <param-value>jdbc:mysql://gw62.iu.xsede.org:3306/dev_expcatalog_gw56</param-value> +Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>dbUser</param-name> +Â Â Â Â Â Â <param-value>airavata_grouper_client</param-value> +Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>dbPwd</param-name> +Â Â Â Â Â Â <param-value>airavata_grouper_client</param-value> +Â Â Â Â </init-param> +Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>maxResults</param-name> +Â Â Â Â Â Â <param-value>1000</param-value> +Â Â Â Â Â </init-param> +Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>dbTableOrView</param-name> +Â Â Â Â Â Â <param-value>USERS</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>subjectIdCol</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>nameCol</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>descriptionCol</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>lowerSearchCol</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>defaultSortCol</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â + <!-- Â <init-param> +Â Â Â Â Â Â <param-name>subjectIdentifierCol0</param-name> +Â Â Â Â Â Â <param-value>subject_identifier</param-value> +Â Â Â Â Â </init-param> --> +Â Â Â Â Â +Â Â Â Â Â <!-- <init-param> +Â Â Â Â Â Â <param-name>subjectAttributeCol0</param-name> +Â Â Â Â Â Â <param-value>description</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>subjectAttributeName0</param-name> +Â Â Â Â Â Â <param-value>description</param-value> +Â Â Â Â Â </init-param> --> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>sortAttribute0</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>searchAttribute0</param-name> +Â Â Â Â Â Â <param-value>AIRAVATA_INTERNAL_USER_ID</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <!-- <internal-attribute>searchAttribute0</internal-attribute> --> +Â Â Â Â Â +Â Â Â Â Â <!-- <init-param> +Â Â Â Â Â Â <param-name>statusDatastoreFieldName</param-name> +Â Â Â Â Â Â <param-value>status</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>statusLabel</param-name> +Â Â Â Â Â Â <param-value>status</param-value> +Â Â Â Â Â </init-param> --> +Â Â Â Â Â +Â Â Â Â Â +Â Â Â Â Â <!-- <init-param> +Â Â Â Â Â Â <param-name>statusesFromUser</param-name> +Â Â Â Â Â Â <param-value>Active, Inactive, Pending, All</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>statusAllFromUser</param-name> +Â Â Â Â Â Â <param-value>All</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>statusSearchDefault</param-name> +Â Â Â Â Â Â <param-value>status=active</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>statusTranslateUser0</param-name> +Â Â Â Â Â Â <param-value>active</param-value> +Â Â Â Â Â </init-param> +Â Â Â Â Â <init-param> +Â Â Â Â Â Â <param-name>statusTranslateDatastore0</param-name> +Â Â Â Â Â Â <param-value>A</param-value> +Â Â Â Â Â </init-param> --> +Â Â Â Â </source>Â + +</sources> + http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/spy.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/spy.properties b/modules/group-manager/src/main/resources/spy.properties new file mode 100755 index 0000000..c5ba04e --- /dev/null +++ b/modules/group-manager/src/main/resources/spy.properties @@ -0,0 +1,54 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +#Wed Nov 14 17:17:49 EST 2007 +exclude= +include= +stringmatcher= +reloadproperties=false +log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender + +# e.g. mysql: com.mysql.jdbc.Driver +# e.g. p6spy (log sql): com.p6spy.engine.spy.P6SpyDriver +# for p6spy, put the underlying driver in spy.properties +# e.g. oracle: oracle.jdbc.driver.OracleDriver +# e.g. hsqldb: org.hsqldb.jdbcDriver +# e.g. postgres: org.postgresql.Driver +# e.g. SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver +realdriver=com.mysql.jdbc.Driver + +outagedetectioninterval= +log4j.logger.p6spy=INFO,STDOUT +log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n +deregisterdrivers=true +autoflush=true +outagedetection=false +useprefix=false +includecategories= +filter=false +excludecategories=info,debug,result,batch +logfile=c\:\\temp\\grouperSpy.log +module.log=com.p6spy.engine.logging.P6LogFactory +sqlexpression= +reloadpropertiesinterval=60 +dateformat=yyyy/MM/dd HH\:mm\:ss\:SSS +stacktrace=false +executionthreshold= +log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout +append=false +appender=com.p6spy.engine.logging.appender.FileLogger +stacktraceclass= http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/sqltool.rc ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/sqltool.rc b/modules/group-manager/src/main/resources/sqltool.rc new file mode 100755 index 0000000..270a3b4 --- /dev/null +++ b/modules/group-manager/src/main/resources/sqltool.rc @@ -0,0 +1,6 @@ +# This is a sample sqltool.rc file for use with hsqldb. +urlid grouper +url jdbc:hsqldb:hsql://127.0.0.1/grouper +username sa +password + http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/subject.base.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/subject.base.properties b/modules/group-manager/src/main/resources/subject.base.properties new file mode 100755 index 0000000..6e9fcef --- /dev/null +++ b/modules/group-manager/src/main/resources/subject.base.properties @@ -0,0 +1,46 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# Subject configuration +# $Id: subject.base.properties,v 1.24 2009-12-30 04:23:02 mchyzer Exp $ +# + +# The subject proprties uses Grouper Configuration Overlays (documented on wiki) +# By default the configuration is read from subject.base.properties +# (which should not be edited), and the subject.properties overlays +# the base settings. See the subject.base.properties for the possible +# settings that can be applied to the subject.properties + +######################################## +## Config chaining hierarchy +######################################## + +# comma separated config files that override each other (files on the right override the left) +# each should start with file: or classpath: +# e.g. classpath:subject.example.properties, file:c:/something/myconfig.properties +subject.config.hierarchy = classpath:subject.base.properties, classpath:subject.properties + +# seconds between checking to see if the config files are updated +subject.config.secondsBetweenUpdateChecks = 60 + +######################################## + +# enter the location of the sources.xml. Must start with classpath: or file: +# default is: classpath:sources.xml +# e.g. file:/dir1/dir2/sources.xml +subject.sources.xml.location = classpath:sources.xml + http://git-wip-us.apache.org/repos/asf/airavata/blob/89e0fdc8/modules/group-manager/src/main/resources/subject.properties ---------------------------------------------------------------------- diff --git a/modules/group-manager/src/main/resources/subject.properties b/modules/group-manager/src/main/resources/subject.properties new file mode 100755 index 0000000..98e54c7 --- /dev/null +++ b/modules/group-manager/src/main/resources/subject.properties @@ -0,0 +1,27 @@ +# +# Copyright 2014 Internet2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# Subject configuration +# $Id: subject.base.properties,v 1.24 2009-12-30 04:23:02 mchyzer Exp $ +# + +# The subject proprties uses Grouper Configuration Overlays (documented on wiki) +# By default the configuration is read from subject.base.properties +# (which should not be edited), and the subject.properties overlays +# the base settings. See the subject.base.properties for the possible +# settings that can be applied to the subject.properties +
