From 7f6432f4e812b4e6f70eda798301f7b04e9498d6 Mon Sep 17 00:00:00 2001 From: Peter Hormanns <peter.hormanns@hostsharing.net> Date: Tue, 07 Sep 2010 19:42:12 +0200 Subject: [PATCH] Share project "authenticator" --- authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorSsoView.jsp | 14 authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator$SmtpAuthException.class | 0 authenticator/lib/cas-server-core-3.4.2.1.jar | 0 authenticator/.settings/org.eclipse.jst.jsp.core.prefs | 30 + authenticator/build.xml | 35 + authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLogoutView.jsp | 30 + authenticator/src/de/hsadmin/cas/SmtpAuthenticator.java | 143 +++++++ authenticator/webapp/themes/hostsharing/favicon.ico | 0 authenticator/.settings/org.eclipse.jdt.core.prefs | 12 authenticator/webapp/themes/hostsharing/logo.png | 0 authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator.class | 0 authenticator/webapp/WEB-INF/deployerConfigContext.xml | 171 +++++++++ authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/bottom.jsp | 8 authenticator/webapp/WEB-INF/classes/hostsharing_views.properties | 38 ++ authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casGenericSuccess.jsp | 8 authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorView.jsp | 6 authenticator/.project | 17 authenticator/webapp/WEB-INF/classes/hostsharing.properties | 2 authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casBlockedView.jsp | 8 authenticator/webapp/themes/hostsharing/cas.css | 381 +++++++++++++++++++++ authenticator/lib/commons-codec-1.4.jar | 0 authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/top.jsp | 37 ++ authenticator/webapp/WEB-INF/cas.properties | 11 authenticator/.classpath | 8 authenticator/.settings/org.eclipse.wst.validation.prefs | 18 + authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casConfirmView.jsp | 3 authenticator/.settings/org.eclipse.wst.xsl.core.prefs | 12 authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLoginView.jsp | 68 +++ 28 files changed, 1,060 insertions(+), 0 deletions(-) diff --git a/authenticator/.classpath b/authenticator/.classpath new file mode 100644 index 0000000..ad56917 --- /dev/null +++ b/authenticator/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> + <classpathentry kind="lib" path="lib/cas-server-core-3.4.2.1.jar"/> + <classpathentry kind="lib" path="lib/commons-codec-1.4.jar"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/authenticator/.project b/authenticator/.project new file mode 100644 index 0000000..6cd9e3c --- /dev/null +++ b/authenticator/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>authenticator</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/authenticator/.settings/org.eclipse.jdt.core.prefs b/authenticator/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b2e1563 --- /dev/null +++ b/authenticator/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Tue Sep 07 14:25:06 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/authenticator/.settings/org.eclipse.jst.jsp.core.prefs b/authenticator/.settings/org.eclipse.jst.jsp.core.prefs new file mode 100644 index 0000000..cd0f548 --- /dev/null +++ b/authenticator/.settings/org.eclipse.jst.jsp.core.prefs @@ -0,0 +1,30 @@ +#Tue Sep 07 16:36:06 CEST 2010 +eclipse.preferences.version=1 +validateFragments=false +validation.actions-missing-required-attribute=-1 +validation.actions-non-empty-inline-tag=-1 +validation.actions-unexpected-rtexprvalue=-1 +validation.actions-unknown-attribute=-1 +validation.directive-include-fragment-file-not-found=-1 +validation.directive-include-fragment-file-not-specified=-1 +validation.directive-taglib-duplicate-prefixes-different-uris=-1 +validation.directive-taglib-duplicate-prefixes-same-uris=-1 +validation.directive-taglib-missing-prefix=-1 +validation.directive-taglib-missing-uri-or-tagdir=-1 +validation.directive-taglib-unresolvable-uri-or-tagdir=-1 +validation.el-general-syntax=-1 +validation.el-lexical-failure=-1 +validation.java-=-1 +validation.java-local-variable-is-never-used=-1 +validation.java-null-local-variable-reference=-1 +validation.java-potential-null-local-variable-reference=-1 +validation.java-unused-import=-1 +validation.translation-tag-class-not-found=-1 +validation.translation-tei-class-not-found=-1 +validation.translation-tei-class-not-instantiated=-1 +validation.translation-tei-class-runtime-exception=-1 +validation.translation-tei-message=-1 +validation.translation-usebean-ambiguous-type-info=-1 +validation.translation-usebean-invalid-id=-1 +validation.translation-usebean-missing-type-info=-1 +validation.use-project-settings=true diff --git a/authenticator/.settings/org.eclipse.wst.validation.prefs b/authenticator/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..938a9d4 --- /dev/null +++ b/authenticator/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,18 @@ +#Tue Sep 07 16:37:46 CEST 2010 +DELEGATES_PREFERENCE=delegateValidatorList +USER_BUILD_PREFERENCE=enabledBuildValidatorList +USER_MANUAL_PREFERENCE=enabledManualValidatorList +USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationtrueversion1.2.200.v201005271900 +eclipse.preferences.version=1 +override=true +suspend=true +vals/org.eclipse.jst.jsp.core.JSPBatchValidator/global=FF01 +vals/org.eclipse.jst.jsp.core.JSPContentValidator/global=FF01 +vals/org.eclipse.jst.jsp.core.TLDValidator/global=FF01 +vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01 +vals/org.eclipse.wst.html.ui.HTMLValidator/global=FF01 +vals/org.eclipse.wst.wsdl.validation.wsdl/global=FF02158org.eclipse.wst.wsdl.validation.internal.eclipse.Validator +vals/org.eclipse.wst.xml.core.xml/global=FF03 +vals/org.eclipse.wst.xsd.core.xsd/global=FF02162org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator +vals/org.eclipse.wst.xsl.core.xsl/global=FF02 +vf.version=3 diff --git a/authenticator/.settings/org.eclipse.wst.xsl.core.prefs b/authenticator/.settings/org.eclipse.wst.xsl.core.prefs new file mode 100644 index 0000000..cf6206b --- /dev/null +++ b/authenticator/.settings/org.eclipse.wst.xsl.core.prefs @@ -0,0 +1,12 @@ +#Tue Sep 07 16:36:08 CEST 2010 +CHECK_CALL_TEMPLATES=2 +CHECK_XPATHS=2 +CIRCULAR_REF=2 +DUPLICATE_PARAMETER=2 +EMPTY_PARAM=1 +MISSING_INCLUDE=2 +MISSING_PARAM=1 +NAME_ATTRIBUTE_EMPTY=2 +NAME_ATTRIBUTE_MISSING=2 +TEMPLATE_CONFLICT=2 +eclipse.preferences.version=1 diff --git a/authenticator/build.xml b/authenticator/build.xml new file mode 100644 index 0000000..2d3696d --- /dev/null +++ b/authenticator/build.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<project name="authenticator" default="default" basedir="."> + + <property file="${user.home}/.ant.hsar.properties" /> + <property name="lib.home" value="${basedir}/lib" /> + <property name="src.home" value="${basedir}/src" /> + <property name="war.home" value="${basedir}/webapp" /> + <property name="cls.home" value="${war.home}/WEB-INF/classes" /> + <property name="compile.debug" value="true" /> + + <path id="compile.classpath"> + <fileset dir="lib"> + <include name="*.jar" /> + </fileset> + </path> + + <target name="default" depends="compile" description="Patch WAR File"> + <echo message="target war: ${cas.openedwar}"/> + <copy todir="${cas.openedwar}"> + <fileset dir="${war.home}"/> + </copy> + </target> + + <target name="compile" description="Compile Authenticator"> + <javac srcdir="${src.home}" destdir="${cls.home}" debug="${compile.debug}"> + <classpath refid="compile.classpath" /> + </javac> + </target> + + <target name="clean" description="Remove compiled classes"> + <delete dir="${cls.home}/de"/> + </target> + +</project> diff --git a/authenticator/lib/cas-server-core-3.4.2.1.jar b/authenticator/lib/cas-server-core-3.4.2.1.jar new file mode 100644 index 0000000..0dda4b6 --- /dev/null +++ b/authenticator/lib/cas-server-core-3.4.2.1.jar Binary files differ diff --git a/authenticator/lib/commons-codec-1.4.jar b/authenticator/lib/commons-codec-1.4.jar new file mode 100644 index 0000000..458d432 --- /dev/null +++ b/authenticator/lib/commons-codec-1.4.jar Binary files differ diff --git a/authenticator/src/de/hsadmin/cas/SmtpAuthenticator.java b/authenticator/src/de/hsadmin/cas/SmtpAuthenticator.java new file mode 100644 index 0000000..f1f5596 --- /dev/null +++ b/authenticator/src/de/hsadmin/cas/SmtpAuthenticator.java @@ -0,0 +1,143 @@ +package de.hsadmin.cas; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; + +import org.apache.commons.codec.binary.Base64; +import org.jasig.cas.authentication.handler.AuthenticationException; +import org.jasig.cas.authentication.handler.AuthenticationHandler; +import org.jasig.cas.authentication.principal.Credentials; +import org.jasig.cas.authentication.principal.UsernamePasswordCredentials; + +public class SmtpAuthenticator implements AuthenticationHandler { + + private static final int SMTPS_PORT = 465; + + public boolean authenticate(Credentials creds) + throws AuthenticationException { + UsernamePasswordCredentials ucreds = (UsernamePasswordCredentials) creds; + try { + return isAuthenticated(ucreds.getUsername(), ucreds.getPassword()); + } catch (SmtpAuthException e) { + return false; + } + } + + public boolean supports(Credentials creds) { + return creds instanceof UsernamePasswordCredentials; + } + + public boolean isAuthenticated(String user, String passwd) + throws SmtpAuthException { + boolean isAuth = false; + Socket socket = null; + try { + SSLContext sc = SSLContext.getInstance("SSLv3"); + sc.init(null, null, null); + SSLSocketFactory ssf = sc.getSocketFactory(); + if ( user == null || user.length() < 2 || user.length() == 4 ) { + return false; + } + if (user.indexOf('@') > 0) { + return false; + } + try { + if (user.length() == 2) { + user = "hsh01-" + user; + } + if (user.length() == 3) { + user = "hsh00-" + user; + } + socket = ssf.createSocket(user.substring(0, 5) + + ".hostsharing.net", SMTPS_PORT); + } catch (StringIndexOutOfBoundsException e) { + return false; + } + Writer out = new OutputStreamWriter(socket.getOutputStream(), + "ISO-8859-1"); + BufferedReader sin = new BufferedReader(new InputStreamReader( + socket.getInputStream(), "ISO-8859-1")); + write(out, "EHLO login.hostsharing.net\r\n"); + String answer = read(sin, "220 "); + answer = read(sin, "250-"); + StringBuffer userPasswd = new StringBuffer(); + userPasswd.append('\000'); + userPasswd.append(user); + userPasswd.append('\000'); + userPasswd.append(passwd); + write(out, "AUTH PLAIN " + + new String(Base64.encodeBase64(userPasswd.toString().getBytes())) + "\r\n"); + answer = read(sin, "000"); + isAuth = answer.startsWith("235"); + write(out, "QUIT\r\n"); + } catch (NoSuchAlgorithmException e) { + throw new SmtpAuthException(e.getMessage()); + } catch (KeyManagementException e) { + throw new SmtpAuthException(e.getMessage()); + } catch (UnknownHostException e) { + throw new SmtpAuthException(e.getMessage()); + } catch (IOException e) { + throw new SmtpAuthException(e.getMessage()); + } finally { + if (socket != null) { + try { + socket.close(); + } catch (IOException e) { + } + } + } + return isAuth; + } + + private void write(Writer wr, String line) { + try { + wr.write(line); + wr.flush(); + } catch (IOException e) { + } + } + + private String read(BufferedReader rd, String returnCode) { + try { + String line = rd.readLine(); + while (line != null && line.startsWith(returnCode)) { + line = rd.readLine(); + } + return line; + } catch (IOException e) { + } + return ""; + } + + public class SmtpAuthException extends Exception { + + private static final long serialVersionUID = 2394310295147904537L; + + public SmtpAuthException(String message) { + super(message); + } + } + + public static void main(String[] args) { + SmtpAuthenticator auth = new SmtpAuthenticator(); + try { + if (auth.isAuthenticated(args[0], args[1])) { + System.out.println("Login " + args[0] + " Ok"); + } else { + System.out.println("Falsches Login"); + } + } catch (SmtpAuthException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/authenticator/webapp/WEB-INF/cas.properties b/authenticator/webapp/WEB-INF/cas.properties new file mode 100644 index 0000000..560b01b --- /dev/null +++ b/authenticator/webapp/WEB-INF/cas.properties @@ -0,0 +1,11 @@ +cas.securityContext.serviceProperties.service=http://login.hostsharing.net/cas/services/j_acegi_cas_security_check +# Names of roles allowed to access the CAS service manager +cas.securityContext.serviceProperties.adminRoles=ROLE_ADMIN +cas.securityContext.casProcessingFilterEntryPoint.loginUrl=http://login.hostsharing.net/cas/login +cas.securityContext.ticketValidator.casServerUrlPrefix=http://login.hostsharing.net/cas +cas.themeResolver.defaultThemeName=hostsharing +cas.viewResolver.basename=hostsharing_views +host.name=login.hostsharing.net +#database.hibernate.dialect=org.hibernate.dialect.OracleDialect +#database.hibernate.dialect=org.hibernate.dialect.MySQLDialect +database.hibernate.dialect=org.hibernate.dialect.HSQLDialect diff --git a/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator$SmtpAuthException.class b/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator$SmtpAuthException.class new file mode 100644 index 0000000..3bf3954 --- /dev/null +++ b/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator$SmtpAuthException.class Binary files differ diff --git a/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator.class b/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator.class new file mode 100644 index 0000000..c70dab4 --- /dev/null +++ b/authenticator/webapp/WEB-INF/classes/de/hsadmin/cas/SmtpAuthenticator.class Binary files differ diff --git a/authenticator/webapp/WEB-INF/classes/hostsharing.properties b/authenticator/webapp/WEB-INF/classes/hostsharing.properties new file mode 100644 index 0000000..d4cdf0c --- /dev/null +++ b/authenticator/webapp/WEB-INF/classes/hostsharing.properties @@ -0,0 +1,2 @@ +mobile.custom.css.file=css/default-mobile-custom.css +standard.custom.css.file=themes/hostsharing/cas.css diff --git a/authenticator/webapp/WEB-INF/classes/hostsharing_views.properties b/authenticator/webapp/WEB-INF/classes/hostsharing_views.properties new file mode 100644 index 0000000..ee03dbf --- /dev/null +++ b/authenticator/webapp/WEB-INF/classes/hostsharing_views.properties @@ -0,0 +1,38 @@ +### Login view (/login) +casLoginView.(class)=org.springframework.web.servlet.view.JstlView +casLoginView.url=/WEB-INF/view/jsp/hostsharing/ui/casLoginView.jsp + +### Login confirmation view (logged in, warn=true) +casLoginConfirmView.(class)=org.springframework.web.servlet.view.JstlView +casLoginConfirmView.url=/WEB-INF/view/jsp/hostsharing/ui/casConfirmView.jsp + +### Logged-in view (logged in, no service provided) +casLoginGenericSuccessView.(class)=org.springframework.web.servlet.view.JstlView +casLoginGenericSuccessView.url=/WEB-INF/view/jsp/hostsharing/ui/casGenericSuccess.jsp + +### Logout view (/logout) +casLogoutView.(class)=org.springframework.web.servlet.view.JstlView +casLogoutView.url=/WEB-INF/view/jsp/hostsharing/ui/casLogoutView.jsp + +### CAS error view +viewServiceErrorView.(class)=org.springframework.web.servlet.view.JstlView +viewServiceErrorView.url=/WEB-INF/view/jsp/hostsharing/ui/serviceErrorView.jsp + +viewServiceSsoErrorView.(class)=org.springframework.web.servlet.view.JstlView +viewServiceSsoErrorView.url=/WEB-INF/view/jsp/hostsharing/ui/serviceErrorSsoView.jsp + +### Services Management Views +addServiceView.(class)=org.springframework.web.servlet.view.JstlView +addServiceView.url=/WEB-INF/view/jsp/services/add.jsp + +editServiceView.(class)=org.springframework.web.servlet.view.JstlView +editServiceView.url=/WEB-INF/view/jsp/services/add.jsp + +manageServiceView.(class)=org.springframework.web.servlet.view.JstlView +manageServiceView.url=/WEB-INF/view/jsp/services/manage.jsp + +serviceLogoutView.(class)=org.springframework.web.servlet.view.JstlView +serviceLogoutView.url=/WEB-INF/view/jsp/services/logout.jsp + +viewStatisticsView.(class)=org.springframework.web.servlet.view.JstlView +viewStatisticsView.url=/WEB-INF/view/jsp/services/viewStatistics.jsp diff --git a/authenticator/webapp/WEB-INF/deployerConfigContext.xml b/authenticator/webapp/WEB-INF/deployerConfigContext.xml new file mode 100644 index 0000000..c7d7ff9 --- /dev/null +++ b/authenticator/webapp/WEB-INF/deployerConfigContext.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + | deployerConfigContext.xml centralizes into one file some of the declarative configuration that + | all CAS deployers will need to modify. + | + | This file declares some of the Spring-managed JavaBeans that make up a CAS deployment. + | The beans declared in this file are instantiated at context initialization time by the Spring + | ContextLoaderListener declared in web.xml. It finds this file because this + | file is among those declared in the context parameter "contextConfigLocation". + | + | By far the most common change you will need to make in this file is to change the last bean + | declaration to replace the default SimpleTestUsernamePasswordAuthenticationHandler with + | one implementing your approach for authenticating usernames and passwords. + +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:p="http://www.springframework.org/schema/p" + xmlns:sec="http://www.springframework.org/schema/security" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> + <!-- + | This bean declares our AuthenticationManager. The CentralAuthenticationService service bean + | declared in applicationContext.xml picks up this AuthenticationManager by reference to its id, + | "authenticationManager". Most deployers will be able to use the default AuthenticationManager + | implementation and so do not need to change the class of this bean. We include the whole + | AuthenticationManager here in the userConfigContext.xml so that you can see the things you will + | need to change in context. + +--> + <bean id="authenticationManager" + class="org.jasig.cas.authentication.AuthenticationManagerImpl"> + <!-- + | This is the List of CredentialToPrincipalResolvers that identify what Principal is trying to authenticate. + | The AuthenticationManagerImpl considers them in order, finding a CredentialToPrincipalResolver which + | supports the presented credentials. + | + | AuthenticationManagerImpl uses these resolvers for two purposes. First, it uses them to identify the Principal + | attempting to authenticate to CAS /login . In the default configuration, it is the DefaultCredentialsToPrincipalResolver + | that fills this role. If you are using some other kind of credentials than UsernamePasswordCredentials, you will need to replace + | DefaultCredentialsToPrincipalResolver with a CredentialsToPrincipalResolver that supports the credentials you are + | using. + | + | Second, AuthenticationManagerImpl uses these resolvers to identify a service requesting a proxy granting ticket. + | In the default configuration, it is the HttpBasedServiceCredentialsToPrincipalResolver that serves this purpose. + | You will need to change this list if you are identifying services by something more or other than their callback URL. + +--> + <property name="credentialsToPrincipalResolvers"> + <list> + <!-- + | UsernamePasswordCredentialsToPrincipalResolver supports the UsernamePasswordCredentials that we use for /login + | by default and produces SimplePrincipal instances conveying the username from the credentials. + | + | If you've changed your LoginFormAction to use credentials other than UsernamePasswordCredentials then you will also + | need to change this bean declaration (or add additional declarations) to declare a CredentialsToPrincipalResolver that supports the + | Credentials you are using. + +--> + <bean + class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" /> + <!-- + | HttpBasedServiceCredentialsToPrincipalResolver supports HttpBasedCredentials. It supports the CAS 2.0 approach of + | authenticating services by SSL callback, extracting the callback URL from the Credentials and representing it as a + | SimpleService identified by that callback URL. + | + | If you are representing services by something more or other than an HTTPS URL whereat they are able to + | receive a proxy callback, you will need to change this bean declaration (or add additional declarations). + +--> + <bean + class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" /> + </list> + </property> + + <!-- + | Whereas CredentialsToPrincipalResolvers identify who it is some Credentials might authenticate, + | AuthenticationHandlers actually authenticate credentials. Here we declare the AuthenticationHandlers that + | authenticate the Principals that the CredentialsToPrincipalResolvers identified. CAS will try these handlers in turn + | until it finds one that both supports the Credentials presented and succeeds in authenticating. + +--> + <property name="authenticationHandlers"> + <list> + <!-- + | This is the authentication handler that authenticates services by means of callback via SSL, thereby validating + | a server side SSL certificate. + +--> + <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" + p:httpClient-ref="httpClient" /> + <!-- + | This is the authentication handler declaration that every CAS deployer will need to change before deploying CAS + | into production. The default SimpleTestUsernamePasswordAuthenticationHandler authenticates UsernamePasswordCredentials + | where the username equals the password. You will need to replace this with an AuthenticationHandler that implements your + | local authentication strategy. You might accomplish this by coding a new such handler and declaring + | edu.someschool.its.cas.MySpecialHandler here, or you might use one of the handlers provided in the adaptors modules. + +--> + <bean + class="de.hsadmin.cas.SmtpAuthenticator" /> + </list> + </property> + </bean> + + + <!-- + This bean defines the security roles for the Services Management application. Simple deployments can use the in-memory version. + More robust deployments will want to use another option, such as the Jdbc version. + + The name of this should remain "userDetailsService" in order for Spring Security to find it. + + To use this, you should add an entry similar to the following between the two value tags: + battags=notused,ROLE_ADMIN + + where battags is the username you want to grant access to. You can put one entry per line. + --> + <!-- <sec:user name="@@THIS SHOULD BE REPLACED@@" password="notused" authorities="ROLE_ADMIN" />--> + + <sec:user-service id="userDetailsService"> + <sec:user name="pe" password="notused" authorities="ROLE_ADMIN" /> + </sec:user-service> + + <!-- + Bean that defines the attributes that a service may return. This example uses the Stub/Mock version. A real implementation + may go against a database or LDAP server. The id should remain "attributeRepository" though. + --> + <bean id="attributeRepository" + class="org.jasig.services.persondir.support.StubPersonAttributeDao"> + <property name="backingMap"> + <map> + <entry key="uid" value="uid" /> + <entry key="eduPersonAffiliation" value="eduPersonAffiliation" /> + <entry key="groupMembership" value="groupMembership" /> + </map> + </property> + </bean> + + <!-- + Sample, in-memory data store for the ServiceRegistry. A real implementation + would probably want to replace this with the JPA-backed ServiceRegistry DAO + The name of this bean should remain "serviceRegistryDao". + --> + <bean + id="serviceRegistryDao" + class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"> + <property name="registeredServices"> + <list> + <bean class="org.jasig.cas.services.RegisteredServiceImpl"> + <property name="id" value="0" /> + <property name="name" value="HTTP" /> + <property name="description" value="Only Allows HTTP Urls" /> + <property name="serviceId" value="http://**" /> + </bean> + + <bean class="org.jasig.cas.services.RegisteredServiceImpl"> + <property name="id" value="1" /> + <property name="name" value="HTTPS" /> + <property name="description" value="Only Allows HTTPS Urls" /> + <property name="serviceId" value="https://**" /> + </bean> + + <bean class="org.jasig.cas.services.RegisteredServiceImpl"> + <property name="id" value="2" /> + <property name="name" value="IMAPS" /> + <property name="description" value="Only Allows HTTPS Urls" /> + <property name="serviceId" value="imaps://**" /> + </bean> + + <bean class="org.jasig.cas.services.RegisteredServiceImpl"> + <property name="id" value="3" /> + <property name="name" value="IMAP" /> + <property name="description" value="Only Allows IMAP Urls" /> + <property name="serviceId" value="imap://**" /> + </bean> + </list> + </property> + </bean> +</beans> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casBlockedView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casBlockedView.jsp new file mode 100644 index 0000000..44a2214 --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casBlockedView.jsp @@ -0,0 +1,8 @@ +<jsp:directive.include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp" /> + + <div id="status" class="errors"> + <h2><spring:message code="screen.blocked.header" /></h2> + + <p><spring:message code="screen.blocked.message" /></p> + </div> +<jsp:directive.include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" /> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casConfirmView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casConfirmView.jsp new file mode 100644 index 0000000..513e8d9 --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casConfirmView.jsp @@ -0,0 +1,3 @@ +<jsp:directive.include file="includes/top.jsp" /> +<div class="info"><p><spring:message code="screen.confirmation.message" arguments="${fn:escapeXml(param.service)}${fn:indexOf(param.service, '?') eq -1 ? '?' : '&'}ticket=${serviceTicketId}" /></p></div> +<jsp:directive.include file="includes/bottom.jsp" /> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casGenericSuccess.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casGenericSuccess.jsp new file mode 100644 index 0000000..a9919fd --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casGenericSuccess.jsp @@ -0,0 +1,8 @@ +<jsp:directive.include file="includes/top.jsp" /> + <div id="msg" class="success"> + <h2><spring:message code="screen.success.header" /></h2> + <p><spring:message code="screen.success.success" /></p> + <p><spring:message code="screen.success.security" /></p> + </div> +<jsp:directive.include file="includes/bottom.jsp" /> + diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLoginView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLoginView.jsp new file mode 100644 index 0000000..8abed75 --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLoginView.jsp @@ -0,0 +1,68 @@ +<%-- + + Licensed to Jasig under one or more contributor license + agreements. See the NOTICE file distributed with this work + for additional information regarding copyright ownership. + Jasig licenses this file to you 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. + +--%> + +<%@ page contentType="text/html; charset=UTF-8" %> +<jsp:directive.include file="includes/top.jsp" /> + <form:form method="post" id="fm1" cssClass="fm-v clearfix" commandName="${commandName}" htmlEscape="true"> + <form:errors path="*" cssClass="errors" id="status" element="div" /> + <div class="box fl-panel" id="login"> + <!-- <spring:message code="screen.welcome.welcome" /> --> + <h2>Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein.</h2> + <div class="row fl-controls-left"> + <label for="username" class="fl-label">Benutzername</label> + <c:if test="${not empty sessionScope.openIdLocalId}"> + <strong>${sessionScope.openIdLocalId}</strong> + <input type="hidden" id="username" name="username" value="${sessionScope.openIdLocalId}" /> + </c:if> + + <c:if test="${empty sessionScope.openIdLocalId}"> + <spring:message code="screen.welcome.label.netid.accesskey" var="userNameAccessKey" /> + <form:input cssClass="required" cssErrorClass="error" id="username" size="25" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="false" htmlEscape="true" /> + </c:if> + </div> + <div class="row fl-controls-left"> + <label for="password" class="fl-label">Passwort</label> + <%-- + NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute, + "autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more + information, see the following web page: + http://www.geocities.com/technofundo/tech/web/ie_autocomplete.html + --%> + <spring:message code="screen.welcome.label.password.accesskey" var="passwordAccessKey" /> + <form:password cssClass="required" cssErrorClass="error" id="password" size="25" tabindex="2" path="password" accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" /> + </div> + <div class="row check"> + <input id="warn" name="warn" value="true" tabindex="3" accesskey="<spring:message code="screen.welcome.label.warn.accesskey" />" type="checkbox" checked="checked" /> + <label for="warn"><spring:message code="screen.welcome.label.warn" /></label> + </div> + <div class="row btn-row"> + <input type="hidden" name="lt" value="${flowExecutionKey}" /> + <input type="hidden" name="_eventId" value="submit" /> + + <input class="btn-submit" name="submit" accesskey="l" value="<spring:message code="screen.welcome.button.login" />" tabindex="4" type="submit" /> + <input class="btn-reset" name="reset" accesskey="c" value="<spring:message code="screen.welcome.button.clear" />" tabindex="5" type="reset" /> + </div> + </div> + </form:form> + + <div id="sidebar"> + </div> +<jsp:directive.include file="includes/bottom.jsp" /> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLogoutView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLogoutView.jsp new file mode 100644 index 0000000..e0e7ada --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/casLogoutView.jsp @@ -0,0 +1,30 @@ +<%-- + + Licensed to Jasig under one or more contributor license + agreements. See the NOTICE file distributed with this work + for additional information regarding copyright ownership. + Jasig licenses this file to you 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. + +--%> + +<jsp:directive.include file="includes/top.jsp" /> + + <div id="msg" class="success"> + <h2><spring:message code="screen.logout.header" /></h2> + + <p><spring:message code="screen.logout.success" /></p> + <p><spring:message code="screen.logout.security" /></p> + </div> +<jsp:directive.include file="includes/bottom.jsp" /> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/bottom.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/bottom.jsp new file mode 100644 index 0000000..b58d45e --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/bottom.jsp @@ -0,0 +1,8 @@ + </div> + <div id="footer" class="fl-panel fl-note fl-bevel-white fl-font-size-80"> + <a href="https://www.hostsharing.net/impressum" title="Impressum">Impressum</a> + </div> + </div> + </div> + </body> +</html> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/top.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/top.jsp new file mode 100644 index 0000000..467508c --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/includes/top.jsp @@ -0,0 +1,37 @@ +<%@ page session="true" %> +<%@ page pageEncoding="UTF-8" %> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<spring:theme code="mobile.custom.css.file" var="mobileCss" text="" /> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> + <head> + <title>Hostsharing - Central Authentication Service (CAS)</title> + <c:choose> + <c:when test="${not empty requestScope['isMobile'] and not empty mobileCss}"> + <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" /> + <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-status-bar-style" content="black" /> + <link type="text/css" rel="stylesheet" media="screen" href="<c:url value="/css/fss-framework-1.1.2.css" />" /> + <link type="text/css" rel="stylesheet" href="<c:url value="/css/fss-mobile-${requestScope['browserType']}-layout.css" />" /> + <link type="text/css" rel="stylesheet" href="${mobileCss}" /> + </c:when> + <c:otherwise> + <link type="text/css" rel="stylesheet" href="<spring:theme code="standard.custom.css.file" />" /> + <script type="text/javascript" src="js/common_rosters.js"></script> + </c:otherwise> + </c:choose> + <link rel="icon" href="<c:url value="/themes/hostsharing/favicon.ico" />" type="image/x-icon" /> + </head> + <body id="cas" onload="init();" class="fl-theme-iphone"> + <div class="flc-screenNavigator-view-container"> + <div class="fl-screenNavigator-view"> + <div id="logo"> + </div> + <div id="header" class="flc-screenNavigator-navbar fl-navbar fl-table"> + <h1 id="app-name" class="fl-table-cell">Hostsharing - Central Authentication Service (CAS)</h1> + </div> + <div id="content" class="fl-screenNavigator-scroll-container"> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorSsoView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorSsoView.jsp new file mode 100644 index 0000000..e8d1f16 --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorSsoView.jsp @@ -0,0 +1,14 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<jsp:directive.include file="includes/top.jsp" /> + +<c:url var="url" value="/login"> + <c:param name="service" value="${param.service}" /> + <c:param name="renew" value="true" /> +</c:url> + <div id="status" class="errors"> + <h2><spring:message code="screen.service.sso.error.header" /></h2> + <p><spring:message code="screen.service.sso.error.message" arguments="${url}" /></p> + </div> +<jsp:directive.include file="includes/bottom.jsp" /> diff --git a/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorView.jsp b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorView.jsp new file mode 100644 index 0000000..4af6f90 --- /dev/null +++ b/authenticator/webapp/WEB-INF/view/jsp/hostsharing/ui/serviceErrorView.jsp @@ -0,0 +1,6 @@ +<jsp:directive.include file="includes/top.jsp" /> + <div id="status" class="errors"> + <h2><spring:message code="screen.service.error.header" /></h2> + <p><spring:message code="screen.service.error.message" /></p> + </div> +<jsp:directive.include file="includes/bottom.jsp" /> diff --git a/authenticator/webapp/themes/hostsharing/cas.css b/authenticator/webapp/themes/hostsharing/cas.css new file mode 100644 index 0000000..048e107 --- /dev/null +++ b/authenticator/webapp/themes/hostsharing/cas.css @@ -0,0 +1,381 @@ +html,body { + margin:0; + padding:0; + border:0; + background:transparent; + color:#000; + } + +body { + font:normal 76% Arial,Helvetica,Verdana,sans-serif; +} + +acronym { + border-bottom:1px dotted #ccc; + cursor:help; + } + +a img,#header img { + border:0; + display:block; + } + +.bold {font-weight:bold;} + +.important {color:#b00;} + +.center {text-align:center;} + +.right {text-align:right;} + +.left {text-align:left;} + +/*************************************** HEADER */ +#header{ + margin:0; + padding:0; + width:100%; + clear:both; + } + +#header a { + display:block; + margin:0; + padding:0 0 0 3px; + text-decoration:none; + background-color:#b00; + color:#ffc; + font-size:1em; + line-height:19px; + } + +#header a.task { + float:right; + margin:0 0 0 1px; + padding:0 5px 0 20px; + line-height:20px; + text-decoration:none; + color:#ffc; + } + +#header a:hover.task, #header a:focus.task {background-color:#c33 !important;} + +#header a.task#helpBtn { + background:#b00 url(../../images/help.gif) 5px 5px no-repeat scroll; +/* display:none; */ + } + +#header a.task#aboutBtn {background:#b00 url(../../images/about.gif) 5px 5px no-repeat scroll;} + +#header a.task#menuBtn {background:#b00 url(../../images/menu.gif) 5px 5px no-repeat scroll;} + +#header a.task#logoutBtn {background:#b00 url(../../images/logout.gif) 5px 5px no-repeat scroll;} + +#logo { + margin:0 0 0 5%; + padding:0; + width:90%; + height:100px; + clear:both; + background: #005094 url(logo.png) no-repeat scroll; + } + +#header h1 { + margin:20px 0 0 5%; + padding:0; + letter-spacing:1px; + background:transparent; + font-size:2.0em; + } + +/*************************************** CONTENT */ +#content { + border-top:1px solid #fff; /* REMOVES VERTICAL MARGIN COLLAPSING */ + margin:0 5%; + padding:0; + width:auto !important; + width /**/:100%; + clear:both; + } + +#content .dataset { + margin:30px 0 0 0; + padding:10px; + border:1px solid #eee; + clear:both; + width:auto !important; + width /**/:100%; + } + +#content .dataset h2 { + position:relative; + top:-20px; + left:-20px; + width:350px; + margin:0; + padding:0 0 1px 5px; + border:1px solid #ccc; + background-color:#eee; + color:#066; + font-weight:bold; + font-size:1em; + line-height:1.3em; + } + +#content .dataset .leftCol { + float:left; + width:50%; + min-width:50%; + margin:0; + padding:0; + } + +#appStatus .dataset .rightCol { + float:right; + width:50%; + } + +html>body .clear:after { + content:" "; + display:block; + height:0px; + line-height:0px; + clear:both; + visibility:hidden; /* HIDES THE ELEMENT, BUT STILL TAKES UP SPACE */ + } + +#content p { + line-height:1.6em; + + } + +#content ul { + margin:0; + padding:0; + list-style:none; + } + +#content ul li { + background:url(../images/bullet_orange.gif) 0px 2px no-repeat scroll; + padding-left:20px; + margin-top:.5em; + } + +#content h2 { + margin:0; + padding:0; + font-size:1.8em; + } + +#content h3 { + margin:0; + padding:0; + font-size:1.5em; + color:#333; + } + +#content p.top { + text-align:right; + font:bold 1em Verdana,Helvetica,sans-serif; + } + +/*************************************** FOOTER */ +#footer { + margin:2em 5% 10px 5%; + padding:0; + clear:both; + } + +#footer hr { + margin:0; + padding:0; + height:1px; + background:#ccc; + color:#ccc; + border:0; + } + +#footer p { + margin:0; + padding:0; + font-size:1em; + line-height:1.2em; + color:#999; + } + +#footer p#copyright {margin-top:1em;} + +/*************************************** LINK STYLES */ +#content a:hover, #content a:focus, #content ul li a:hover, #content ul li a:focus, +#menu ul li a:hover, #menu ul li a:focus, +#footer a:hover, #footer a:focus { + background:transparent; + color:#b00; + text-decoration:underline; + } + +/*************************************** TABLE FORMATTING */ +table { + border-right:solid 1px #999; + border-bottom:solid 1px #999; + background-color:#fff; + font-size:1em; + } + +th { + border-left:solid 1px #ccc; + border-top:solid 1px #ccc; + background-color:#eee; + color:#066; + font-weight:normal; + font-size:1em; + vertical-align:middle; + text-align:left; + padding:0 0 0 2px; + } + +td { + border-left:solid 1px #ccc; + border-top:solid 1px #ccc; + font-size:1em; + padding:0 0 0 2px; + } + +/*************************************** FORMS */ +form {display:inline;} + +input:focus, textarea:focus, select:focus {background:#fc3 !important;} + +input.numeric {text-align:right;} + +/*************************************** BUTTON STYLES */ +#content a.button, #content a.button:link, #content a.button:hover, #content a.button:active, #content .button { + text-decoration:none; + background-color:#d0d0d0; + border:1px outset #d0d0d0; + color: #000; + padding:1px 1em; + font-size:1.2em; + line-height:1.2em; + } + +/*************************************** HELP */ +#help { + background-color:#ffc; + border:1px solid #ccc; + margin:0 0 15px 0; + padding:0 0 10px 0; + } + +#help h4 { + margin:0 0 10px 0; + border-bottom:1px solid #ccc; + background-color:#fc3; + color:#b00; + font-size:1em; + font-weight:bold; + line-height:19px; + padding:0 0 0 3px; + } + +#help p { + margin:10px; + padding:0; + } + +/* #help #closeHelp {display:none;} */ + +#help h4 a, #help h4 a:visited { + float:right; + margin:0; + padding:0 5px 0 20px; + text-decoration:none !important; + color:#ffc !important; + font-weight:normal; + line-height:19px; + background:#b00 url(../images/close.gif) 5px 5px no-repeat scroll; + } + +#help h4 a:hover, #help h4 a:focus {background:#c33 url(../images/close.gif) 5px 5px no-repeat scroll !important;} + +fieldset { + border-top:solid 1px #ccc; + border-bottom:0; + border-right:0; + border-left:0; + margin:0; + padding:0; + padding-bottom: 1.5em; + } +form{ + display: inline; + } +.accesskey {text-decoration:underline;} +fieldset div {padding-top:10px;} + +legend {color:#066;} + +input, select,textarea { + font-family:monospace; + font-size:11px; + margin:0; + padding:0; + } + +#content .button { + padding:3px 0px; + font-size:11px; + width:11em; + cursor:pointer; + } + +label { + margin:0 5px 0 0; + font-weight:bold; + cursor:pointer; + } + +.required {background:#ffc;} +.important {color:#b00;font-family:monospace;font-weight:bold;font-size:1.2em;} +.evenrow {background-color:#eee;} + +table .appHeadingRow th { + border-top:5px solid #ccc; + background-color:#666; + color:#fff; + text-align:left; + padding:0 0 0 2px; + } + + +#content .button#add {background:#d0d0d0 url(../../images/arrowd.gif) right center no-repeat scroll;} +#content .button#update {background:#d0d0d0 url(../../images/update.gif) right center no-repeat scroll;margin-top:10px;} + +#login {float:left; margin:0 -296px 0 0; padding:15px; width:258px; min-height:15em; background:#eee; position:relative; border:0;} +#login:before {line-height:0.1; font-size:1px; background:transparent url("../../images/key-point_tr.gif") no-repeat top right; margin:-15px -15px 0 -15px; height:15px; display:block; content:url("../images/key-point_tl.gif");} +#login:after {display:block; clear:both; padding-top:15px; line-height:0.1; font-size:1px; content:url("../../images/key-point_bl.gif"); margin:-15px; height:8px; background:transparent url("../images/key-point_br.gif") scroll no-repeat bottom right;} +#login h2 {border-bottom:1px solid #ddd; padding:3px 0; font:normal 400 17px Georgia, "Times New Roman", Times, serif; color:#333;} +#login label {font-size:11px;} +#login label span.accesskey {text-decoration:underline;} +#login input {letter-spacing:1px;} +#login .check input {position:relative; left:-4px; height:auto;} +#login .check label {float:none; xwidth:auto; line-height:1.8;} +#login .btn-row {position:relative; top:15px; padding-top:10px; border-top:1px solid #ddd;} +#login .btn-row {top:5px;} /* IE6 */ +#login .btn-submit {float:none; clear:none; display:inline; letter-spacing:0;} +#login .btn-submit {background:#ffd;} +#login .btn-reset {float:none; clear:none; margin-left:5px; border:0; border-left:1px solid #ddd; background:transparent; color:#777; text-transform:lowercase; letter-spacing:0;} + +/* MESSAGES --------------------------------- */ +.info, .errors, .success {clear:both; margin:18px 0; padding:20px 20px 20px 100px; font-size:10px; line-height:1.5;} +.info {border:1px dotted 008; background:#eff url(../images/info.gif) no-repeat 20px 18px; color:#008;} +.errors {border:1px dotted #d21033; background:#fed url(../images/error.gif) no-repeat 20px 18px; color:#d21033; padding-bottom: 40px;} +.success {border:1px dotted #390; background:#dfa url(../images/confirm.gif) no-repeat 20px 18px; color:#390;} +#content .errors h2, #content .success h2 {font-family:Georgia,"Times New Roman",Times,serif; font-size:18px; line-height:48px; font-weight:400; margin:0 18px 0 0; padding:0;} +#content .success h2 {color: #008 !important;} +#content .errors h2 {color:#b00 !important;} +#content .success h2 {color:#060 !important;} + + +/* static messages */ +#content #msg p {padding:0;} diff --git a/authenticator/webapp/themes/hostsharing/favicon.ico b/authenticator/webapp/themes/hostsharing/favicon.ico new file mode 100644 index 0000000..38254d6 --- /dev/null +++ b/authenticator/webapp/themes/hostsharing/favicon.ico Binary files differ diff --git a/authenticator/webapp/themes/hostsharing/logo.png b/authenticator/webapp/themes/hostsharing/logo.png new file mode 100644 index 0000000..f0d4dbc --- /dev/null +++ b/authenticator/webapp/themes/hostsharing/logo.png Binary files differ -- Gitblit v1.9.0-SNAPSHOT