From 5edf988a740ea79aef63030e85ced58441e62e80 Mon Sep 17 00:00:00 2001
From: Fabio Roberto Vitello <fabio.vitello@inaf.it>
Date: Wed, 12 Apr 2017 10:11:25 +0200
Subject: [PATCH] initial release

---
 README.md                                     | 164 +++++++++
 pom.xml                                       |  95 +++++
 .../security/auth/ShibbolethAutoLogin.java    | 340 ++++++++++++++++++
 .../sso/shibboleth/ShibbolethFilter.java      | 218 +++++++++++
 .../shibboleth/util/ShibbolethPropsKeys.java  |  48 +++
 .../util/ShibbolethPropsValues.java           |  48 +++
 .../liferay/portal/shibboleth/util/Util.java  | 120 +++++++
 src/main/resources/language.properties        |  17 +
 src/main/resources/portal.properties          |  19 +
 .../portlet/login/navigation/shibboleth.jsp   |  18 +
 .../authentication/shibboleth.jsp             |  96 +++++
 src/main/webapp/WEB-INF/liferay-hook.xml      |  20 ++
 .../WEB-INF/liferay-plugin-package.properties |  10 +
 .../webapp/WEB-INF/liferay-plugin-package.xml |  23 ++
 src/main/webapp/WEB-INF/web.xml               |   5 +
 src/main/webapp/images/shibboleth.png         | Bin 0 -> 3514 bytes
 .../security/auth/ShibbolethAutoLogin.class   | Bin 0 -> 12844 bytes
 .../sso/shibboleth/ShibbolethFilter.class     | Bin 0 -> 7439 bytes
 .../shibboleth/util/ShibbolethPropsKeys.class | Bin 0 -> 1977 bytes
 .../util/ShibbolethPropsValues.class          | Bin 0 -> 2453 bytes
 .../liferay/portal/shibboleth/util/Util.class | Bin 0 -> 4333 bytes
 target/classes/language.properties            |  17 +
 target/classes/portal.properties              |  19 +
 target/maven-archiver/pom.properties          |   5 +
 target/shibboleth-plugin-hook.war             | Bin 0 -> 24920 bytes
 .../security/auth/ShibbolethAutoLogin.class   | Bin 0 -> 12844 bytes
 .../sso/shibboleth/ShibbolethFilter.class     | Bin 0 -> 7439 bytes
 .../shibboleth/util/ShibbolethPropsKeys.class | Bin 0 -> 1977 bytes
 .../util/ShibbolethPropsValues.class          | Bin 0 -> 2453 bytes
 .../liferay/portal/shibboleth/util/Util.class | Bin 0 -> 4333 bytes
 .../WEB-INF/classes/language.properties       |  17 +
 .../WEB-INF/classes/portal.properties         |  19 +
 .../portlet/login/navigation/shibboleth.jsp   |  18 +
 .../authentication/shibboleth.jsp             |  96 +++++
 .../WEB-INF/liferay-hook.xml                  |  20 ++
 .../WEB-INF/liferay-plugin-package.properties |  10 +
 .../WEB-INF/liferay-plugin-package.xml        |  23 ++
 target/shibboleth-plugin-hook/WEB-INF/web.xml |   5 +
 .../images/shibboleth.png                     | Bin 0 -> 3514 bytes
 39 files changed, 1490 insertions(+)
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/liferay/portal/security/auth/ShibbolethAutoLogin.java
 create mode 100644 src/main/java/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.java
 create mode 100644 src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.java
 create mode 100644 src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.java
 create mode 100644 src/main/java/com/liferay/portal/shibboleth/util/Util.java
 create mode 100644 src/main/resources/language.properties
 create mode 100644 src/main/resources/portal.properties
 create mode 100644 src/main/webapp/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
 create mode 100644 src/main/webapp/WEB-INF/liferay-hook.xml
 create mode 100644 src/main/webapp/WEB-INF/liferay-plugin-package.properties
 create mode 100644 src/main/webapp/WEB-INF/liferay-plugin-package.xml
 create mode 100644 src/main/webapp/WEB-INF/web.xml
 create mode 100644 src/main/webapp/images/shibboleth.png
 create mode 100644 target/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class
 create mode 100644 target/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class
 create mode 100644 target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class
 create mode 100644 target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class
 create mode 100644 target/classes/com/liferay/portal/shibboleth/util/Util.class
 create mode 100644 target/classes/language.properties
 create mode 100644 target/classes/portal.properties
 create mode 100644 target/maven-archiver/pom.properties
 create mode 100644 target/shibboleth-plugin-hook.war
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/Util.class
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/language.properties
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/classes/portal.properties
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/liferay-hook.xml
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.properties
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.xml
 create mode 100644 target/shibboleth-plugin-hook/WEB-INF/web.xml
 create mode 100644 target/shibboleth-plugin-hook/images/shibboleth.png

diff --git a/README.md b/README.md
index e69de29..def2025 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,164 @@
+Shibboleth Authentication Plugin for Liferay
+============================================
+
+* This plugin is derived from an initial version of rsheshi@gmail.com. See: http://code.google.com/p/liferay-shibboleth-plugin/
+* The first major extension was done by Ivan Novakov. https://github.com/ivan-novakov
+* Further upgrades were made by Mihály Héder. https://github.com/mheder
+* The latest extensions were made by Szabolcs Tenczer https://github.com/burgosz
+
+Additional features has been added:
+
+* auto create users using Shibboleth attributes (email, first name, last name)
+* auto update user information upon login
+* added options to specify the headers (Shibboleth attributes) to be used for extracting email, first name and last name
+* basic attribute to role mapping
+
+Requirements
+------------
+
+* Apache 2.x with mod_ssl and mod_proxy_ajp
+* Shibboleth SP 2.x
+
+Introduction
+------------
+
+Currently, there is no native Java Shibboleth service provider. If you need to protect your Java web
+with Shibboleth, you have to run Apache with mod_shib in front of your servlet container (Tomcat, JBoss, ...).
+The protected application must not be accessible directly, it must be run on a private address. Apache will intercept
+requests, and after performing all authentication related tasks, it will pass the request to the backend servlet
+container using AJP (Apache JServ Protocol).
+
+Shibboleth Service Provider
+---------------------------
+
+A standard Shibboleth Service Provider instance may be used with one difference - the attribute preffix must bes
+set to "AJP_", otherwise user attributes from Shibboleh will not be accessible in the application.
+
+    <ApplicationDefaults entityID="https://liferay-test/shibboleth"
+        REMOTE_USER="uid eppn persistent-id targeted-id" 
+        attributePrefix="AJP_">
+
+
+Apache configuration
+--------------------
+
+First, we need to set the AJP communication with the backend in our virtual host configuration:
+
+    ProxyPass / ajp://localhost:8009/
+    ProxyPassReverse / ajp://localhost:8009/
+    
+Then we'll configure Shibboleth to be "activated" for the whole site:
+
+    <Location />
+        AuthType shibboleth
+        require shibboleth
+    </Location>
+    
+And require a Shibboleth session at the "login" location:
+
+    <Location /c/portal/login>
+        AuthType shibboleth
+        ShibRequireSession On
+        require valid-user
+    </Location>
+
+
+Container's AJP connector
+---------------------
+
+Make sure, the backend servlet container has properly configured AJP connector. For example, in JBoss it is not enabled by default and you have to explicitly enable it:
+
+    # cd $JBOSS_HOME/bin
+    # ./jboss-cli.sh 
+    You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
+    [disconnected /] connect
+    [standalone@localhost:9999 /] /subsystem=web:read-children-names(child-type=connector)
+    {
+        "outcome" => "success",
+        "result" => ["http"]
+    }
+    [standalone@localhost:9999 /] /subsystem=web/connector=ajp:add(socket-binding=ajp, protocol="AJP/1.3", enabled=true, scheme=ajp)
+    {"outcome" => "success"}
+    [standalone@localhost:9999 /] /subsystem=web:read-children-names(child-type=connector)
+    {
+        "outcome" => "success",
+        "result" => [
+            "ajp",
+            "http" 
+        ]
+    }
+
+
+Plugin installation and configuration
+-------------------------------------
+
+Clone the repository and run the Maven install script:
+
+    # git clone https://github.com/mheder/liferay-shibboleth-plugin
+    # cd liferay-shibboleth-plugin
+    # mvn install
+
+Then deploy the WAR file to your servlet container.
+After a successful installation a new "Shibboleth" section appears in the Liferay's Control panel at "Portal Settings / Authentication". You can adjust Shibboleth authentication there. The most important setting is the name of the attribute from with the user identity is taken.
+At the same time, in "Portal Settings --> Authentication --> General", disable all "Allow..." options.
+
+Further steps
+-------------
+
+If you plan to use Shibboleth autehtnication only, it will be a good idea to prevent your users from changing their personal info (especially the screen name which holds the identity). 
+
+If you choose to auto-create users, you need to disable the "terms of use" page and the "security question", which appear to the new users. Add these directives to your portal-ext.properties:
+
+    #
+    # Set this to true to enable reminder queries that are used to help reset a
+    # user's password.
+    #
+    users.reminder.queries.enabled=false
+    users.reminder.queries.custom.question.enabled=false
+    
+    #
+    # Set this to true if all users are required to agree to the terms of use.
+    #
+    terms.of.use.required=false
+
+Logging can be enabled at "Control panel --> Server Administration --> Log Levels" by adding these categories:
+
+    com.liferay.portal.security.auth.ShibbolethAutoLogin
+    com.liferay.portal.servlet.filters.sso.shibboleth.ShibbolethFilter
+    
+These settings will work untill server reboot only. To make them permanent you need to create a special configuration file placed at `$JBOSS_HOME/standalone/deployments/ROOT.war/WEB-INF/classes/META-INF/portal-log4j-ext.xml`:
+
+    <?xml version="1.0"?>
+    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+    
+    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+    
+        <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+            <layout class="org.apache.log4j.PatternLayout">
+                <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />
+            </layout>
+        </appender>
+    
+        <category name="com.liferay.portal.security.auth.ShibbolethAutoLogin">
+            <priority value="INFO" />
+        </category>
+    
+        <category name="com.liferay.portal.servlet.filters.sso.shibboleth.ShibbolethFilter">
+            <priority value="INFO" />
+        </category>
+    
+    </log4j:configuration>
+
+
+
+Licence
+-------
+
+[MIT Licence](http://opensource.org/licenses/mit-license.php)
+
+
+Contact
+-------
+
+* homepage: https://github.com/ivan-novakov/liferay-shibboleth-plugin
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0fdd6ea
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.github.ivan-novakov.liferay-shibboleth-plugin</groupId>
+    <artifactId>liferay-shibboleth-plugin</artifactId>
+    <packaging>war</packaging>
+    <name>liferay-shibboleth-plugin</name>
+    <url>https://github.com/ivan-novakov/liferay-shibboleth-plugin</url>
+    <version>1.2</version>
+    <properties>
+        <liferay.auto.deploy.dir>/opt/lr/deploy</liferay.auto.deploy.dir>
+        <liferay.version>6.2.0-RC5</liferay.version>
+    </properties>
+    <build>
+        <finalName>shibboleth-plugin-hook</finalName>
+        <plugins>
+            <plugin>
+                <groupId>com.liferay.maven.plugins</groupId>
+                <artifactId>liferay-maven-plugin</artifactId>
+                <version>${liferay.version}</version>
+                <configuration>
+                    <autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir>
+                    <liferayVersion>${liferay.version}</liferayVersion>
+                    <pluginType>hook</pluginType>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <webResources>
+                        <resource>
+                            <filtering>true</filtering>
+                            <directory>src/main/webapp</directory>
+                            <includes>
+                                <include>**/liferay-plugin-package.xml</include>
+                                <include>**/web.xml</include>
+                            </includes>
+                        </resource>
+                    </webResources>
+                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
+                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <dependencies>
+        <dependency>
+            <groupId>com.liferay.portal</groupId>
+            <artifactId>portal-service</artifactId>
+            <version>${liferay.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.liferay.portal</groupId>
+            <artifactId>util-java</artifactId>
+            <version>${liferay.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.portlet</groupId>
+            <artifactId>portlet-api</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet.jsp</groupId>
+            <artifactId>jsp-api</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/src/main/java/com/liferay/portal/security/auth/ShibbolethAutoLogin.java b/src/main/java/com/liferay/portal/security/auth/ShibbolethAutoLogin.java
new file mode 100644
index 0000000..7fea490
--- /dev/null
+++ b/src/main/java/com/liferay/portal/security/auth/ShibbolethAutoLogin.java
@@ -0,0 +1,340 @@
+package com.liferay.portal.security.auth;
+
+import com.liferay.portal.NoSuchUserException;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.util.StringPool;
+import com.liferay.portal.kernel.util.Validator;
+import com.liferay.portal.model.CompanyConstants;
+import com.liferay.portal.model.Role;
+import com.liferay.portal.model.User;
+import com.liferay.portal.security.ldap.PortalLDAPImporterUtil;
+import com.liferay.portal.service.RoleLocalServiceUtil;
+import com.liferay.portal.service.ServiceContext;
+import com.liferay.portal.service.UserLocalServiceUtil;
+import com.liferay.portal.shibboleth.util.ShibbolethPropsKeys;
+import com.liferay.portal.shibboleth.util.Util;
+import com.liferay.portal.util.PortalUtil;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.*;
+
+/**
+ * Performs autologin based on the header values passed by Shibboleth.
+ * 
+ * The Shibboleth user ID header set in the configuration must contain the user
+ * ID, if users are authenticated by screen name or the user email, if the users
+ * are authenticated by email (Portal settings --> Authentication --> General).
+ * 
+ * @author Romeo Sheshi
+ * @author Ivan Novakov <ivan.novakov@debug.cz>
+ */
+public class ShibbolethAutoLogin implements AutoLogin {
+
+	private static Log _log = LogFactoryUtil.getLog(ShibbolethAutoLogin.class);
+
+    @Override
+    public String[] handleException(HttpServletRequest request, HttpServletResponse response, Exception e) throws AutoLoginException {
+        // taken from BaseAutoLogin
+        if (Validator.isNull(request.getAttribute(AutoLogin.AUTO_LOGIN_REDIRECT))) {
+            throw new AutoLoginException(e);
+        }
+        _log.error(e, e);
+        return null;
+    }
+
+    @Override
+    public String[] login(HttpServletRequest req, HttpServletResponse res) throws AutoLoginException {
+
+        User user;
+        String[] credentials = null;
+        HttpSession session = req.getSession(false);
+        long companyId = PortalUtil.getCompanyId(req);
+
+
+        try {
+            _log.info("Shibboleth Autologin [modified 2]");
+
+            if (!Util.isEnabled(companyId)) {
+                return credentials;
+            }
+
+            user = loginFromSession(companyId, session);
+            if (Validator.isNull(user)) {
+                return credentials;
+            }
+
+            credentials = new String[3];
+            credentials[0] = String.valueOf(user.getUserId());
+            credentials[1] = user.getPassword();
+            credentials[2] = Boolean.TRUE.toString();
+            return credentials;
+
+        } catch (NoSuchUserException e) {
+            logError(e);
+        } catch (Exception e) {
+            logError(e);
+            throw new AutoLoginException(e);
+        }
+
+        return credentials;
+    }
+
+    private User loginFromSession(long companyId, HttpSession session) throws Exception {
+        String login;
+        User user = null;
+
+        login = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_LOGIN);
+        if (Validator.isNull(login)) {
+            return null;
+        }
+
+        String authType = Util.getAuthType(companyId);
+
+        try {
+            if (authType.equals(CompanyConstants.AUTH_TYPE_SN)) {
+                _log.info("Trying to find user with screen name: " + login);
+                user = UserLocalServiceUtil.getUserByScreenName(companyId, login);
+            } else if (authType.equals(CompanyConstants.AUTH_TYPE_EA)) {
+
+                String emailAddress = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL);
+                if (Validator.isNull(emailAddress)) {
+                    return null;
+                }
+
+                _log.info("Trying to find user with email: " + emailAddress);
+                user = UserLocalServiceUtil.getUserByEmailAddress(companyId, emailAddress);
+            } else {
+                throw new NoSuchUserException();
+            }
+
+            _log.info("User found: " + user.getScreenName() + " (" + user.getEmailAddress() + ")");
+
+            if (Util.autoUpdateUser(companyId)) {
+                _log.info("Auto-updating user...");
+                updateUserFromSession(user, session);
+            }
+
+        } catch (NoSuchUserException e) {
+            _log.error("User "  + login + " not found");
+
+            if (Util.autoCreateUser(companyId)) {
+                _log.info("Importing user from session...");
+                user = createUserFromSession(companyId, session);
+                _log.info("Created user with ID: " + user.getUserId());
+            } else if (Util.importUser(companyId)) {
+                _log.info("Importing user from LDAP...");
+                user = PortalLDAPImporterUtil.importLDAPUser(companyId, StringPool.BLANK, login);
+            }
+        }
+
+        try {
+            updateUserRolesFromSession(companyId, user, session);
+        } catch (Exception e) {
+            _log.error("Exception while updating user roles from session: " + e.getMessage());
+        }
+
+        return user;
+    }
+
+    /**
+     * Create user from session
+     */
+    protected User createUserFromSession(long companyId, HttpSession session) throws Exception {
+        User user = null;
+
+        String screenName = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_LOGIN);
+        if (Validator.isNull(screenName)) {
+            _log.error("Cannot create user - missing screen name");
+            return user;
+        }
+
+        String emailAddress = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL);
+        if (Validator.isNull(emailAddress)) {
+            _log.error("Cannot create user - missing email");
+            return user;
+        }
+
+        String firstname = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_FIRSTNAME);
+        if (Validator.isNull(firstname)) {
+            _log.error("Cannot create user - missing firstname");
+            return user;
+        }
+
+        String surname = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_SURNAME);
+        if (Validator.isNull(surname)) {
+            _log.error("Cannot create user - missing surname");
+            return user;
+        }
+
+        _log.info("Creating user: screen name = [" + screenName + "], emailAddress = [" + emailAddress
+                + "], first name = [" + firstname + "], surname = [" + surname + "]");
+
+        return addUser(companyId, screenName, emailAddress, firstname, surname);
+    }
+
+    /**
+     * Store user
+     */
+    private User addUser(long companyId, String screenName, String emailAddress, String firstName, String lastName)
+            throws Exception {
+
+        long creatorUserId = 0;
+        boolean autoPassword = true;
+        String password1 = null;
+        String password2 = null;
+        boolean autoScreenName = false;
+        long facebookId = 0;
+        String openId = StringPool.BLANK;
+        Locale locale = Locale.US;
+        String middleName = StringPool.BLANK;
+        int prefixId = 0;
+        int suffixId = 0;
+        boolean male = true;
+        int birthdayMonth = Calendar.JANUARY;
+        int birthdayDay = 1;
+        int birthdayYear = 1970;
+        String jobTitle = StringPool.BLANK;
+
+        long[] groupIds = null;
+        long[] organizationIds = null;
+        long[] roleIds = null;
+        long[] userGroupIds = null;
+
+        boolean sendEmail = false;
+        ServiceContext serviceContext = null;
+
+        return UserLocalServiceUtil.addUser(creatorUserId, companyId, autoPassword, password1, password2,
+                autoScreenName, screenName, emailAddress, facebookId, openId, locale, firstName, middleName, lastName,
+                prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds,
+                organizationIds, roleIds, userGroupIds, sendEmail, serviceContext);
+    }
+
+    protected void updateUserFromSession(User user, HttpSession session) throws Exception {
+        boolean modified = false;
+
+        String emailAddress = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL);
+        if (Validator.isNotNull(emailAddress) && !user.getEmailAddress().equals(emailAddress)) {
+            _log.info("User [" + user.getScreenName() + "]: update email address [" + user.getEmailAddress()
+                    + "] --> [" + emailAddress + "]");
+            user.setEmailAddress(emailAddress);
+            modified = true;
+        }
+
+        String firstname = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_FIRSTNAME);
+        if (Validator.isNotNull(firstname) && !user.getFirstName().equals(firstname)) {
+            _log.info("User [" + user.getScreenName() + "]: update first name [" + user.getFirstName() + "] --> ["
+                    + firstname + "]");
+            user.setFirstName(firstname);
+            modified = true;
+        }
+
+        String surname = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_SURNAME);
+        if (Validator.isNotNull(surname) && !user.getLastName().equals(surname)) {
+            _log.info("User [" + user.getScreenName() + "]: update last name [" + user.getLastName() + "] --> ["
+                    + surname + "]");
+            user.setLastName(surname);
+            modified = true;
+        }
+
+        if (modified) {
+            UserLocalServiceUtil.updateUser(user);
+        }
+    }
+
+    private void updateUserRolesFromSession(long companyId, User user, HttpSession session) throws Exception {
+        if (!Util.autoAssignUserRole(companyId)) {
+            return;
+        }
+
+        List<Role> currentFelRoles = getRolesFromSession(companyId, session);
+        long[] currentFelRoleIds = roleListToLongArray(currentFelRoles);
+
+        List<Role> felRoles = getAllRolesWithConfiguredSubtype(companyId);
+        long[] felRoleIds = roleListToLongArray(felRoles);
+
+        RoleLocalServiceUtil.unsetUserRoles(user.getUserId(), felRoleIds);
+        RoleLocalServiceUtil.addUserRoles(user.getUserId(), currentFelRoleIds);
+
+        _log.info("User '" + user.getScreenName() + "' has been assigned " + currentFelRoleIds.length + " role(s): "
+                + Arrays.toString(currentFelRoleIds));
+    }
+
+    private long[] roleListToLongArray(List<Role> roles) {
+        long[] roleIds = new long[roles.size()];
+
+        for (int i = 0; i < roles.size(); i++) {
+            roleIds[i] = roles.get(i).getRoleId();
+        }
+
+        return roleIds;
+    }
+
+    private List<Role> getAllRolesWithConfiguredSubtype(long companyId) throws Exception {
+        String roleSubtype = Util.autoAssignUserRoleSubtype(companyId);
+        return RoleLocalServiceUtil.getSubtypeRoles(roleSubtype);
+    }
+
+    private List<Role> getRolesFromSession(long companyId, HttpSession session) throws SystemException {
+        List<Role> currentFelRoles = new ArrayList<Role>();
+        String affiliation = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION);
+
+        if (Validator.isNull(affiliation)) {
+            return currentFelRoles;
+        }
+
+        String[] affiliationList = affiliation.split(";");
+        for (String roleName : affiliationList) {
+            Role role;
+            try {
+                role = RoleLocalServiceUtil.getRole(companyId, roleName);
+            } catch (PortalException e) {
+                _log.info("Exception while getting role with name '" + roleName + "': " + e.getMessage());
+                try{
+                    if(Util.isCreateRoleEnabled(companyId)){
+                        List<Role> roleList = RoleLocalServiceUtil.getRoles(companyId);
+                        long [] roleIds = roleListToLongArray(roleList);
+                        Arrays.sort(roleIds);
+                        long newId = roleIds[roleIds.length-1];
+                        newId = newId+1;
+                        role = RoleLocalServiceUtil.createRole(newId);
+
+                        long classNameId = 0;
+                        try{
+                        	classNameId = RoleLocalServiceUtil.getRole(roleIds[roleIds.length-1]).getClassNameId();
+                        }catch (PortalException ex){
+                        	_log.info("classname error");
+                        }
+                        role.setClassNameId(classNameId);
+        				role.setCompanyId(companyId);
+        				role.setClassPK(newId);
+        				role.setDescription(null);
+        				role.setTitleMap(null);
+        				role.setName(roleName);
+        				role.setType(1);
+        				RoleLocalServiceUtil.addRole(role);
+                    }else continue;
+                }catch (Exception exc){
+                    continue;
+                }        
+            }
+
+            currentFelRoles.add(role);
+        }
+
+        return currentFelRoles;
+    }
+
+    private void logError(Exception e) {
+        _log.error("Exception message = " + e.getMessage() + " cause = " + e.getCause());
+        if (_log.isDebugEnabled()) {
+            _log.error(e);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.java b/src/main/java/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.java
new file mode 100644
index 0000000..2b00b16
--- /dev/null
+++ b/src/main/java/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.java
@@ -0,0 +1,218 @@
+package com.liferay.portal.servlet.filters.sso.shibboleth;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.servlet.BaseFilter;
+import com.liferay.portal.kernel.util.Validator;
+import com.liferay.portal.shibboleth.util.ShibbolethPropsKeys;
+import com.liferay.portal.shibboleth.util.Util;
+import com.liferay.portal.util.PortalUtil;
+
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+/**
+ * @author Romeo Sheshi
+ * @author Ivan Novakov <ivan.novakov@debug.cz>
+ */
+public class ShibbolethFilter extends BaseFilter {
+
+    @Override
+    public boolean isFilterEnabled(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            long companyId = PortalUtil.getCompanyId(request);
+            if (Util.isEnabled(companyId)) {
+                return true;
+            }
+        } catch (Exception e) {
+            _log.error(e, e);
+        }
+        return false;
+    }
+
+    @Override
+    protected Log getLog() {
+        return _log;
+    }
+
+    @Override
+    protected void processFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+            throws Exception {
+
+        _log.info("Shibboleth filter");
+
+        String pathInfo = request.getPathInfo();
+        HttpSession session = request.getSession();
+        long companyId = PortalUtil.getCompanyId(request);
+
+        if (pathInfo.contains("/portal/logout")) {
+            if (Util.isLogoutEnabled(companyId)) {
+                session.invalidate();
+                String logoutUrl = Util.getLogoutUrl(companyId);
+                response.sendRedirect(logoutUrl);
+                return;
+            }
+        } else {
+            extractData(session, companyId, request);
+        }
+        processFilter(ShibbolethFilter.class, request, response, filterChain);
+    }
+
+    /**
+     * Extracts user data from AJP or HTTP header
+     *
+     * @return true if any data is present
+     */
+    protected boolean extractData(HttpSession session, long companyId, HttpServletRequest request) throws Exception {
+        String login = (String) session.getAttribute(ShibbolethPropsKeys.SHIBBOLETH_LOGIN);
+        if (Validator.isNull(login)) {
+
+            boolean headersEnabled = Util.isHeadersEnabled(companyId);
+
+            if (headersEnabled) {
+                _log.info("Using HTTP headers as source for attribute values");
+            } else {
+                _log.info("Using Environment variables as source for attribute values");
+            }
+
+            //String aaiProvidedLoginName = getHeader(Util.getHeaderName(companyId), request, headersEnabled);
+	   
+           //MODIFIED FV
+	    String aaiProvidedLoginName = getHeader(Util.getHeaderName(companyId), request, headersEnabled);
+
+            System.out.println ("ORIGINAL: "+aaiProvidedLoginName);
+            aaiProvidedLoginName=aaiProvidedLoginName.split("@")[0];
+            System.out.println ("SPLITTED: "+aaiProvidedLoginName);
+
+            String aaiProvidedEmail = getHeader(Util.getEmailHeaderName(companyId), request, headersEnabled);
+
+            String aaiProvidedFirstname = getHeader(Util.getFirstnameHeaderName(companyId), request, headersEnabled);
+
+            String aaiProvidedSurname = getHeader(Util.getSurnameHeaderName(companyId), request, headersEnabled);
+
+            String aaiProvidedAffiliation = getHeader(Util.getAffiliationHeaderName(companyId), request, headersEnabled);
+
+
+            if (Validator.isNull(aaiProvidedLoginName)) {
+                _log.error("Required header [" + Util.getHeaderName(companyId) + "] not found");
+                _log.error("AAI authentication failed as login name header is empty.");
+                return false;
+            }
+            if (Util.isScreenNameTransformEnabled(companyId)) {
+                _log.info("ScreenName transform is enabled.");
+                //check validity of screen name 
+              
+                    // most probably it is an eduPersonPrincipalName. Make transformations
+                if(aaiProvidedLoginName.contains("@")){
+                    _log.info("The login name provided by AAI looks like an "
+                            + "email (or eduPersonPrincipalName): "
+                            + aaiProvidedLoginName
+                            + " It needs to be converted to be a Liferay screen name.");
+                    aaiProvidedLoginName = aaiProvidedLoginName.replaceAll("@", ".at.");
+                    _log.info("Login name is converted to:" + aaiProvidedLoginName);
+                } else _log.info("error");
+                //Liferay does not like underscores
+                if (aaiProvidedLoginName.contains("_")) {
+                    _log.info("The login name provided by AAI contains underscores:"
+                            + aaiProvidedLoginName
+                            + "It needs to be converted to be a Liferay screen name.");
+                    aaiProvidedLoginName = aaiProvidedLoginName.replaceAll("_", "-");
+                    _log.info("Login name is converted to:" + aaiProvidedLoginName);
+                }
+            }
+            else {
+                _log.info("ScreenName transform is disabled.");
+            }
+            
+            _log.info("AAI-provided screen name is:" + aaiProvidedLoginName);
+            session.setAttribute(ShibbolethPropsKeys.SHIBBOLETH_LOGIN, aaiProvidedLoginName);
+
+            //get the first of multi-valued email address
+            if (aaiProvidedEmail.contains(";")) {
+                _log.info("The email address string provided by AAI is multi-valued:"
+                        + aaiProvidedEmail
+                        + " Using the first value.");
+                String[] emails = aaiProvidedEmail.split(";");
+                aaiProvidedEmail = emails[0];
+            }
+            _log.info("AAI-provided email is:" + aaiProvidedEmail);
+            session.setAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL, aaiProvidedEmail);
+
+            if (Validator.isNull(aaiProvidedFirstname)) {
+                _log.error("No First name provided in: "
+                        + Util.getFirstnameHeaderName(companyId)
+                        + " using a default value instead.");
+                aaiProvidedFirstname = "MissingFirstName";
+            }
+            _log.info("AAI-provided first name is:" + aaiProvidedFirstname);
+            session.setAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_FIRSTNAME, aaiProvidedFirstname);
+
+            if (Validator.isNull(aaiProvidedSurname)) {
+                _log.error("No Surname provided in: "
+                        + Util.getSurnameHeaderName(companyId)
+                        + " using a default value instead.");
+                aaiProvidedSurname = "MissingSurname";
+            }
+            _log.info("AAI-provided Surname is:" + aaiProvidedSurname);
+            session.setAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_SURNAME, aaiProvidedSurname);
+
+            if (Validator.isNull(aaiProvidedAffiliation)) {
+                _log.debug("No affiliation provided");
+                aaiProvidedAffiliation = "";
+            }
+            if (Util.isAffiliationTruncateEnabled(companyId) && aaiProvidedAffiliation.contains(":")) {
+                _log.info("affiliation contains ':' characters: "
+                        + aaiProvidedAffiliation
+                        + " assuming eduPersonEntitlement format");
+                // AAI-provided affiliation is multi-valued
+                if (aaiProvidedAffiliation.contains(";")) {
+                    _log.info("AAI-provided affiliation is multi-valued:"
+                            + aaiProvidedAffiliation
+                            + " Processing each vale");
+                    String[] affiliations = aaiProvidedAffiliation.split(";");
+                    aaiProvidedAffiliation = "";
+
+                    for (int i = 0; i < affiliations.length; i++) {
+                        String[] parts = affiliations[i].split(":");
+                        aaiProvidedAffiliation += parts[parts.length - 1];
+                        if (i < affiliations.length - 1) {
+                            aaiProvidedAffiliation += ";";
+                        }
+                    }
+
+                } else {
+                    String[] parts = aaiProvidedAffiliation.split(":");
+                    aaiProvidedAffiliation = parts[parts.length - 1];
+                }
+            }
+            _log.info("AAI-provided affiliation is:" + aaiProvidedAffiliation);
+            session.setAttribute(ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION, aaiProvidedAffiliation);
+
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    protected String getHeader(String headerName, HttpServletRequest request, boolean headersEnabled) {
+        if (Validator.isNull(headerName)) {
+            return null;
+        }
+        String headerValue;
+
+        if (headersEnabled) {
+            headerValue = request.getHeader(headerName);
+        } else {
+            headerValue = (String) request.getAttribute(headerName);
+        }
+
+        _log.info("Header [" + headerName + "]: " + headerValue);
+
+        return headerValue;
+    }
+
+    private static final Log _log = LogFactoryUtil.getLog(ShibbolethFilter.class);
+
+}
diff --git a/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.java b/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.java
new file mode 100644
index 0000000..d77ef5f
--- /dev/null
+++ b/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.java
@@ -0,0 +1,48 @@
+package com.liferay.portal.shibboleth.util;
+
+/**
+ * @author Romeo Sheshi
+ * @author Ivan Novakov <ivan.novakov@debug.cz>
+ */
+public class ShibbolethPropsKeys {
+
+	public static final String SHIBBOLETH_ENABLED = "shibboleth.enabled";
+
+	public static final String SHIBBOLETH_HEADER = "shibboleth.header";
+
+	public static final String SHIBBOLETH_HEADER_EMAIL = "shibboleth.header.email";
+
+	public static final String SHIBBOLETH_HEADER_FIRSTNAME = "shibboleth.header.firstname";
+
+	public static final String SHIBBOLETH_HEADER_SURNAME = "shibboleth.header.surname";
+
+	public static final String SHIBBOLETH_HEADER_AFFILIATION = "shibboleth.header.affiliation";
+
+	public static final String SHIBBOLETH_USER_AUTO_CREATE = "shibboleth.user.auto.create";
+
+	public static final String SHIBBOLETH_USER_AUTO_UPDATE = "shibboleth.user.auto.update";
+
+	public static final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN = "shibboleth.user.role.auto.assign";
+
+	public static final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE = "shibboleth.user.role.auto.assign.subtype";
+
+	public static final String SHIBBOLETH_LOGIN = "shibboleth.login";
+
+	public static final String SHIBBOLETH_USER_LDAP_IMPORT = "shibboleth.user.ldap.import";
+
+	public static final String SHIBBOLETH_LOGIN_URL = "shibboleth.login.url";
+
+	public static final String SHIBBOLETH_LOGOUT_ENABLE = "shibboleth.logout.enabled";
+
+	public static final String SHIBBOLETH_LOGOUT_URL = "shibboleth.logout.url";
+
+    public static final String SHIBBOLETH_HEADERS_ENABLE = "shibboleth.headers.enabled";
+
+    public static final String SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE = "shibboleth.affiliation.truncate.enabled";
+
+    public static final String SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE = "shibboleth.screenname.transform.enabled";
+
+   	public static final String SHIBBOLETH_HEADER_AFFILIATION_PREFIX = "shibboleth.header.affiliation.prefix";
+
+   	public static final String SHIBBOLETH_USER_ROLE_AUTO_CREATE = "shibboleth.user.role.auto.create";
+}
diff --git a/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.java b/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.java
new file mode 100644
index 0000000..e7b0684
--- /dev/null
+++ b/src/main/java/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.java
@@ -0,0 +1,48 @@
+package com.liferay.portal.shibboleth.util;
+
+import com.liferay.portal.kernel.util.GetterUtil;
+import com.liferay.portal.kernel.util.PropsUtil;
+
+/**
+ * @author Romeo Sheshi
+ * @author Ivan Novakov <ivan.novakov@debug.cz>
+ */
+public class ShibbolethPropsValues {
+    public static final boolean SHIBBOLETH_ENABLED = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_ENABLED));
+
+    public static final String SHIBBOLETH_HEADER = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER);
+    
+    public static final String SHIBBOLETH_HEADER_EMAIL = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL);
+    
+    public static final String SHIBBOLETH_HEADER_FIRSTNAME = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER_FIRSTNAME);
+    
+    public static final String SHIBBOLETH_HEADER_SURNAME = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER_SURNAME);
+    
+    public static final String SHIBBOLETH_HEADER_AFFILIATION = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION);
+    
+    public static final boolean SHIBBOLETH_USER_AUTO_CREATE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_AUTO_CREATE));
+    
+    public static final boolean SHIBBOLETH_USER_AUTO_UPDATE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_AUTO_UPDATE));
+
+    public static final boolean SHIBBOLETH_USER_LDAP_IMPORT = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_LDAP_IMPORT));
+    
+    public static final boolean SHIBBOLETH_USER_ROLE_AUTO_ASSIGN = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN));
+    
+    public static final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE);
+
+    public static final boolean SHIBBOLETH_LOGOUT_ENABLE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_LOGOUT_ENABLE));
+
+    public static final boolean SHIBBOLETH_HEADERS_ENABLE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADERS_ENABLE));
+
+    public static final boolean SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE));
+
+    public static final boolean SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE));
+
+    public static final String SHIBBOLETH_LOGIN_URL = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_LOGIN_URL);
+
+    public static final String SHIBBOLETH_LOGOUT_URL = PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_LOGOUT_URL);
+
+    public static final String SHIBBOLETH_HEADER_AFFILIATION_PREFIX= PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION_PREFIX);
+   
+    public static final boolean SHIBBOLETH_USER_ROLE_AUTO_CREATE = GetterUtil.getBoolean(PropsUtil.get(ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_CREATE));
+}
diff --git a/src/main/java/com/liferay/portal/shibboleth/util/Util.java b/src/main/java/com/liferay/portal/shibboleth/util/Util.java
new file mode 100644
index 0000000..bd99320
--- /dev/null
+++ b/src/main/java/com/liferay/portal/shibboleth/util/Util.java
@@ -0,0 +1,120 @@
+package com.liferay.portal.shibboleth.util;
+
+import com.liferay.portal.kernel.util.GetterUtil;
+import com.liferay.portal.kernel.util.PrefsPropsUtil;
+import com.liferay.portal.kernel.util.PropsKeys;
+import com.liferay.portal.model.CompanyConstants;
+
+/**
+ * 
+ * @author Romeo Sheshi
+ * @author Ivan Novakov <ivan.novakov@debug.cz>
+ */
+public final class Util {
+	private Util() {
+	}
+
+	public static boolean isEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_ENABLED),
+				ShibbolethPropsValues.SHIBBOLETH_ENABLED);
+	}
+
+	public static boolean isLogoutEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_LOGOUT_ENABLE),
+				ShibbolethPropsValues.SHIBBOLETH_LOGOUT_ENABLE);
+	}
+
+	public static boolean isHeadersEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADERS_ENABLE),
+				ShibbolethPropsValues.SHIBBOLETH_HEADERS_ENABLE);
+	}
+
+	public static boolean isAffiliationTruncateEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE),
+				ShibbolethPropsValues.SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE);
+	}
+
+	public static boolean isScreenNameTransformEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE),
+				ShibbolethPropsValues.SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE);
+	}
+
+	public static boolean importUser(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_LDAP_IMPORT),
+				ShibbolethPropsValues.SHIBBOLETH_USER_LDAP_IMPORT);
+	}
+
+	public static String getLoginUrl(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_LOGIN_URL),
+				ShibbolethPropsValues.SHIBBOLETH_LOGIN_URL);
+	}
+
+	public static String getLogoutUrl(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_LOGOUT_URL),
+				ShibbolethPropsValues.SHIBBOLETH_LOGOUT_URL);
+	}
+
+	public static String getHeaderName(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER);
+	}
+
+	public static String getEmailHeaderName(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER_EMAIL),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER_EMAIL);
+	}
+
+	public static String getFirstnameHeaderName(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER_FIRSTNAME),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER_FIRSTNAME);
+	}
+
+	public static String getSurnameHeaderName(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER_SURNAME),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER_SURNAME);
+	}
+
+	public static String getAffiliationHeaderName(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER_AFFILIATION);
+	}
+
+	public static boolean autoCreateUser(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_AUTO_CREATE),
+				ShibbolethPropsValues.SHIBBOLETH_USER_AUTO_CREATE);
+	}
+
+	public static boolean autoUpdateUser(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_AUTO_UPDATE),
+				ShibbolethPropsValues.SHIBBOLETH_USER_AUTO_UPDATE);
+	}
+
+	public static boolean autoAssignUserRole(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN),
+				ShibbolethPropsValues.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN);
+	}
+
+	public static String autoAssignUserRoleSubtype(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE),
+				ShibbolethPropsValues.SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE);
+	}
+
+	public static String getAuthType(long companyId) throws Exception {
+		return GetterUtil.getString(getValue(companyId, PropsKeys.COMPANY_SECURITY_AUTH_TYPE),
+				CompanyConstants.AUTH_TYPE_EA);
+	}
+
+	private static String getValue(long companyId, String key) throws Exception {
+		return PrefsPropsUtil.getString(companyId, key);
+	}
+
+	public static String getAffiliationHeaderPrefix(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_HEADER_AFFILIATION_PREFIX),
+				ShibbolethPropsValues.SHIBBOLETH_HEADER_AFFILIATION_PREFIX);
+	}
+
+	public static boolean isCreateRoleEnabled(long companyId) throws Exception {
+		return GetterUtil.get(getValue(companyId, ShibbolethPropsKeys.SHIBBOLETH_USER_ROLE_AUTO_CREATE),
+				ShibbolethPropsValues.SHIBBOLETH_USER_ROLE_AUTO_CREATE);
+	}
+}
diff --git a/src/main/resources/language.properties b/src/main/resources/language.properties
new file mode 100644
index 0000000..f4af834
--- /dev/null
+++ b/src/main/resources/language.properties
@@ -0,0 +1,17 @@
+shibboleth-logout-enable=Logout enable
+shibboleth-headers-enable=Extract attributes from HTTP Headers instead of environment variables (see: https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPJavaInstall , the "AJP_" prefix part)
+shibboleth-affiliation-truncate-enable=Truncate affiliation values and keep only the last segment after ':'. Useful for standard eduPersonEntilement values. ('foo:bar:baz:qux:RoleName' becomes 'RoleName')
+shibboleth-screenname-transform-enable=Transform login ID to make it valid screen name. Replace '@' to '.at.' and '_' to '-'. ('foo_bar@baz.org' becomes 'foo-bar.at.baz.org')
+import-shibboleth-users-from-ldap=Import from LDAP
+shibboleth-user-header=Shibboleth header name
+shibboleth-user-id-header=Shibboleth user ID header
+shibboleth-user-header-email=Shibboleth user email header
+shibboleth-user-header-firstname=Shibboleth user first name header
+shibboleth-user-header-surname=Shibboleth user surname header
+shibboleth-user-header-affiliation=Shibboleth user affiliation header
+auto-create-users=Auto-create users
+auto-update-users=Auto-update users
+auto-assign-user-role=Auto-assign roles to users (based on the affiliation)
+auto-assign-user-role-subtype=Role subtype for auto-assign roles
+shibboleth=Shibboleth
+shibboleth-user-header-affiliation-prefix=Shibboleth user affiliation header prefix
diff --git a/src/main/resources/portal.properties b/src/main/resources/portal.properties
new file mode 100644
index 0000000..8059041
--- /dev/null
+++ b/src/main/resources/portal.properties
@@ -0,0 +1,19 @@
+auto.login.hooks=com.liferay.portal.security.auth.ShibbolethAutoLogin
+
+shibboleth.enabled=true
+shibboleth.header=eppn
+shibboleth.header.email=eppn
+shibboleth.header.firstname=givenName
+shibboleth.header.surname=sn
+shibboleth.user.auto.create=true
+shibboleth.user.auto.update=true
+shibboleth.user.ldap.import=false
+shibboleth.logout.enabled=true
+shibboleth.headers.enabled=false
+shibboleth.affiliation.truncate.enabled=false
+shibboleth.screenname.transform.enabled=true
+shibboleth.login.url=/c/portal/login/shibboleth
+shibboleth.logout.url=/Shibboleth.sso/Logout?return=/
+company.settings.form.authentication=shibboleth
+
+login.form.navigation.pre=shibboleth
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp b/src/main/webapp/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
new file mode 100644
index 0000000..48fa3ba
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
@@ -0,0 +1,18 @@
+<%@ include file="/html/portlet/login/init.jsp"%>
+
+<%
+
+	final String SHIBBOLETH_ENABLED = "shibboleth.enabled";
+	final String SHIBBOLETH_LOGIN_URL = "shibboleth.login.url";
+
+	boolean shibbolethEnabled = GetterUtil.getBoolean(PrefsPropsUtil.getString(PortalUtil.getCompanyId(renderRequest), SHIBBOLETH_ENABLED));
+    String shibbolethLoginUrl = PrefsPropsUtil.getString(company.getCompanyId(), "shibboleth.login.url", "");
+%>
+
+<c:if test="<%=shibbolethEnabled%>">
+
+	<liferay-ui:icon
+		src="/liferay-shibboleth-plugin-hook/images/shibboleth.png"
+		url="<%= shibbolethLoginUrl %>" message="shibboleth" />
+
+</c:if>
diff --git a/src/main/webapp/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp b/src/main/webapp/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
new file mode 100644
index 0000000..10cea50
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
@@ -0,0 +1,96 @@
+<%@ include file="/html/portlet/portal_settings/init.jsp" %>
+<%
+    final String SHIBBOLETH_ENABLED = "shibboleth.enabled";
+    final String SHIBBOLETH_HEADER = "shibboleth.header";
+    final String SHIBBOLETH_USER_LDAP_IMPORT = "shibboleth.user.ldap.import";
+    final String SHIBBOLETH_LOGOUT_ENABLE = "shibboleth.logout.enabled";
+    final String SHIBBOLETH_LOGOUT_URL = "shibboleth.logout.url";
+    final String SHIBBOLETH_LOGIN_URL = "shibboleth.login.url";
+    final String SHIBBOLETH_HEADERS_ENABLE = "shibboleth.headers.enabled";
+    final String SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE = "shibboleth.affiliation.truncate.enabled";
+    final String SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE = "shibboleth.screenname.transform.enabled";
+
+    final String SHIBBOLETH_HEADER_EMAIL = "shibboleth.header.email";
+    final String SHIBBOLETH_HEADER_FIRSTNAME = "shibboleth.header.firstname";
+    final String SHIBBOLETH_HEADER_SURNAME = "shibboleth.header.surname";
+    final String SHIBBOLETH_HEADER_AFFILIATION = "shibboleth.header.affiliation";
+    final String SHIBBOLETH_USER_AUTO_CREATE  = "shibboleth.user.auto.create";
+    final String SHIBBOLETH_USER_AUTO_UPDATE = "shibboleth.user.auto.update";
+    final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN = "shibboleth.user.role.auto.assign";
+    final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE = "shibboleth.user.role.auto.assign.subtype";
+    final String SHIBBOLETH_HEADER_AFFILIATION_PREFIX = "shibboleth.header.affiliation.prefix";
+    final String SHIBBOLETH_USER_ROLE_AUTO_CREATE = "shibboleth.user.role.auto.create";
+
+    String shibbolethEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_ENABLED, "false");
+    String shibbolethHeader = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER, "");
+    String shibbolethUserLdapImport = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_LDAP_IMPORT, "false");
+    String shibbolethLogoutEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGOUT_ENABLE, "false");
+    String shibbolethLogoutUrl = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGOUT_URL, "");
+    String shibbolethLoginUrl = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGIN_URL, "");
+    String shibbolethHeadersEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADERS_ENABLE, "false");
+    String shibbolethAffiliationTruncateEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE, "false");
+    String shibbolethScreenNameTransformEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE, "false");
+    
+    String shibbolethHeaderEmail = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_EMAIL, "mail");
+    String shibbolethHeaderFirtsname = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_FIRSTNAME, "givenname");
+    String shibbolethHeaderSurname = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_SURNAME, "sn");
+    String shibbolethHeaderAffiliation = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_AFFILIATION, "affiliation");
+    String shibbolethUserAutoCreate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_AUTO_CREATE, "false");
+    String shibbolethUserAutoUpdate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_AUTO_UPDATE, "false");
+    String shibbolethUserRoleAutoAssign = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_ASSIGN, "false");
+    String shibbolethUserRoleAutoAssignSubtype = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE, "");
+    String shibbolethHeaderAffiliationPrefix = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_AFFILIATION_PREFIX, "");
+    String shibbolethUserRoleAutoCreate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_CREATE, "false");
+%>
+<aui:fieldset>
+        <aui:input label="enabled" name='<%="settings--" + SHIBBOLETH_ENABLED + "--" %>' type="checkbox"
+                   value="<%= shibbolethEnabled %>"/>
+        <aui:input cssCLass="lfr-input-text-container" label="login-url"
+                   name='<%= "settings--" + SHIBBOLETH_LOGIN_URL + "--" %>' type="text"
+                   value="<%= shibbolethLoginUrl %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-id-header"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER + "--" %>' type="text" value="<%= shibbolethHeader %>"/>
+        <aui:input label="shibboleth-screenname-transform-enable" name='<%= "settings--" + SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethScreenNameTransformEnabled %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-email"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_EMAIL + "--" %>' type="text" value="<%= shibbolethHeaderEmail %>"/>    
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-firstname"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_FIRSTNAME + "--" %>' type="text" value="<%= shibbolethHeaderFirtsname %>"/>  
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-surname"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_SURNAME + "--" %>' type="text" value="<%= shibbolethHeaderSurname %>"/>    
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-affiliation"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_AFFILIATION + "--" %>' type="text" value="<%= shibbolethHeaderAffiliation %>"/>        
+        <aui:input label="shibboleth-affiliation-truncate-enable" name='<%= "settings--" + SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethAffiliationTruncateEnabled %>"/>
+        <aui:input label="auto-create-users"
+                   name='<%= "settings--" + SHIBBOLETH_USER_AUTO_CREATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserAutoCreate %>"/>
+        <aui:input label="auto-update-users"
+                   name='<%= "settings--" + SHIBBOLETH_USER_AUTO_UPDATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserAutoUpdate %>"/>
+        <aui:input label="import-shibboleth-users-from-ldap"
+                   name='<%= "settings--" + SHIBBOLETH_USER_LDAP_IMPORT + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserLdapImport %>"/>
+        <aui:input label="auto-create-user-role"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_CREATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserRoleAutoCreate %>"/>
+        <aui:input label="auto-assign-user-role"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_ASSIGN + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserRoleAutoAssign %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="auto-assign-user-role-subtype"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE + "--" %>' type="text"
+                   value="<%= shibbolethUserRoleAutoAssignSubtype %>"/>             
+        <aui:input label="shibboleth-logout-enable" name='<%= "settings--" + SHIBBOLETH_LOGOUT_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethLogoutEnabled %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="logout-url"
+                   name='<%= "settings--" + SHIBBOLETH_LOGOUT_URL + "--" %>' type="text"
+                   value="<%= shibbolethLogoutUrl %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-affiliation-prefix"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_AFFILIATION_PREFIX + "--" %>' type="text"
+                   value="<%= shibbolethHeaderAffiliationPrefix %>"/>   
+        <aui:input label="shibboleth-headers-enable" name='<%= "settings--" + SHIBBOLETH_HEADERS_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethHeadersEnabled %>"/>
+</aui:fieldset>
+
+
+
diff --git a/src/main/webapp/WEB-INF/liferay-hook.xml b/src/main/webapp/WEB-INF/liferay-hook.xml
new file mode 100644
index 0000000..d230f19
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-hook.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
+
+<hook>
+    <portal-properties>portal.properties</portal-properties>
+    <language-properties>language.properties</language-properties>
+    <custom-jsp-dir>/WEB-INF/jsps</custom-jsp-dir>
+    <servlet-filter>
+        <servlet-filter-name>shibboleth</servlet-filter-name>
+        <servlet-filter-impl>com.liferay.portal.servlet.filters.sso.shibboleth.ShibbolethFilter</servlet-filter-impl>
+    </servlet-filter>
+    <servlet-filter-mapping>
+        <servlet-filter-name>shibboleth</servlet-filter-name>
+        <after-filter>Auto Login Filter</after-filter>
+        <url-pattern>/c/portal/login</url-pattern>
+        <url-pattern>/c/portal/logout</url-pattern>
+        <dispatcher>FORWARD</dispatcher>
+        <dispatcher>REQUEST</dispatcher>
+    </servlet-filter-mapping>
+</hook>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties
new file mode 100644
index 0000000..86d6fe2
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties
@@ -0,0 +1,10 @@
+name=Shibboleth Plugin
+module-group-id=liferay 7.1.1
+module-incremental-version=1
+tags=
+short-description=
+change-log=
+page-url=https://github.com/ivan-novakov/liferay-shibboleth-plugin
+author=Ivan Novakov ivan.novakov@debug.cz
+page-url=http://code.google.com/p/liferay-shibboleth-plugin/
+author=Romeo Sheshi rsheshi@gmail.com
diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.xml b/src/main/webapp/WEB-INF/liferay-plugin-package.xml
new file mode 100644
index 0000000..80a18d1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-plugin-package.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plugin-package PUBLIC "-//Liferay//DTD Plugin Package 6.2.0//EN"
+        "http://www.liferay.com/dtd/liferay-plugin-package_6_2_0.dtd">
+<plugin-package>
+    <name>Shibboleth Plugin</name>
+    <module-id>${project.groupId}/${project.artifactId}/${project.version}/${project.packaging}</module-id>
+    <types>
+        <type>portlets</type>
+    </types>
+    <tags>
+        <tag>shibboleth</tag>
+    </tags>
+    <short-description/>
+    <change-log/>
+    <page-url>https://github.com/ivan-novakov/liferay-shibboleth-plugin</page-url>
+    <author>Ivan Novakov ivan.novakov@debug.cz</author>
+    <licenses>
+        <license osi-approved="true">LGPL</license>
+    </licenses>
+    <liferay-versions>
+        <liferay-version>6.2.0+</liferay-version>
+    </liferay-versions>
+</plugin-package>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..e067cae
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+</web-app>
\ No newline at end of file
diff --git a/src/main/webapp/images/shibboleth.png b/src/main/webapp/images/shibboleth.png
new file mode 100644
index 0000000000000000000000000000000000000000..b706062e24071a25c7f70ec9770fe7191b7d4768
GIT binary patch
literal 3514
zcmeAS@N?(olHy`uVBq!ia0y~yVBlk5U=ZM7V_;xVo8o81z`)R66%tVrlvu7%P?VpR
znUkteQdy9ykXn(M#=uZ<E41$>=V1pPm;a%y-WRr7o#IU6eW~y?Iw@CXfB!{;j)@8X
z_Oa*iDmL@+dmHPRnEnh_D^Tn>;$iD8eqBWCxIfRK(-Ccp?YgU;nmg;fDJb2ZxchC)
zTbouDuiY!6H{L(7fA!~oFXmp}E&Y(iqfE!`LrP#Y0|Qq~W=KRygs+cPa(=E}VoH8e
zs$NBI0Rsrw*jE%JCTFLXC?ut(XXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdi
zxhgx^GDXSWj?1RPsv@@_H?<^Dp&~aYuh^=>RtapbRbH_bNLXJ<0j#7X+g2&UH$cHT
zzbI9~M9)OeK-aY*v&=}zj!VI&C?(A*$i)q6L{Unbtx`rwNr9EVetCJhUb(Seeo?x<
zp{1pzzJZaxk&$juN}6tQWnM{Qg>GK4GRO#s87`^C$wiq3C7Jno3LrBRlk!VTY?YL_
z6ciMohF9bkzzxqUhK50Mey)B+Vu8M)o`F8HVo+RRR}GTEP+pRmhHyEG;UF1=@`~I7
zE9aur#FG4?ko^1{TP5Gb<f8oC)RfFb1-Hzi)bjkI>|zDq2(VK?HdzH^R;1=cxMb$0
z<`rk==h-S5nxIKWB1@WqB|(;2dFCdjr-o;ylw`m)A;djWGt)ClY?Ta=H24=~rskC-
zg2K>N$xulj6hHc)zzlM6v*WVS2gfETX6?YC3JO_T;!#UT3f<A*8VxRzLVzU2qp52&
zxJU{Ck`#}ouAvoNT!<!PYF>)1Qn`}7og|A%1_J{FOR<w@2nPoTM-4|x2Ll6BnWu|m
zh{pNcNzopc6D5w-&$d2VkiFV+qvU6SWz*8!RGTtyaT<%T^3N4$UBJ!Tt#qV&*9Wur
zTFSg{7}ClWPdMl@Z&kdvq;2LhgIgyprx&YluNODHaJBgJf!}-W?>+y!kN=;CQ_rQK
zEusxt%XHM)Jo0iiO;?5(wcmbtP2=jvy4Zp{<_1SDezcThm@-Y`)c!L&zTbW$-M_ur
z`(Qx9r+{hu9^MdC&W<zXHm=^e<<GC#x(lqYPI#MfYx>)LZ*GT_-g+Z#t*rL4W$miX
zS~1t;d-fU^Ctd5*y%%sZX7T#-v1J}%N<oQf=PV`Oio4%kaevK$&!V+QdT#AGwI<rJ
zYM;$Lb4%68&j%N!{(ZVj-9m8pVn5x|EE#WY6;EajZq{v1b!lz;mA^K6w(PFgDB>4L
zQfG@5oBbf3H*uqj#}tP&iDl0n)!IWe1-G_vIf$@6{<q8izCfPO1opDiOp1Ih3R@UU
z+aFeFP074bsyMOxaoDyscE`3gN6bADtTN@~HN{9aLGd$|j<dNx32=nDv>CKAhs|TW
zml3i_)#BJ0may0saajW^{`cYs7B_T=spSO7x#<Z9@;KaHyXaVW>@oG&QXP+@OEg5E
ze2+UEy(mR+$E?Z6+W%Sqh*uF3D&eRyG-o`rSbq9p`}&o8ZPW6un2FfDe|yTPc3a}F
zCrcOn{r9qO-||Y=V6(vU8|FGL7k(qCb8*U|&*?q=yKb8*OTOH7?bWF(eJ|do%3Ya%
z`qYIO_D9waa^)+^{=~QTOy&;d_!=emN&czBJ&qq;58v6hdugm~+n2UOx7|g-kBd|H
z!Z)@U(+fNQ%DNiv*}<9h{lHXSgA7HT){}WJwjKEL?b!X}7VrDY%--z-^=~{~{an^L
HB{Ts5qf$Jp

literal 0
HcmV?d00001

diff --git a/target/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class b/target/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class
new file mode 100644
index 0000000000000000000000000000000000000000..64c7e80bd14ece4dd68368dddcbfc5947d0f8ebf
GIT binary patch
literal 12844
zcmX^0Z`VEs1_mQ02`+|SMnMinA#O%tMiDMXQARO#MsY3%Rz?X<hHgelZbm6aX^@-@
z7o#kr90#L3NJN2)QIS!Ji=mrQnVnIEn^Bcfjf;VwQ60q6;AGTf)Z${)WYlJ7)B&l{
zWoOjmVASVkG=SJ(2-0oD!LSdc$C#bbgo{BA<OWj^Z3ZH=xfsnEEjSo<axhwQFj|3l
z)?5stAVoGHJ8U@^?Lf3W2crYXFh>qXCy-6f9E>g;jIJOjx`D*qIT$@a;+`CgULbS5
zL4rOUjJ_O<eq4<Hi~%6YKn}(rE(USNU=GF*4#rRp#xM@Xa1O=@4#r3h#wZTPXb#30
z4#rpx#yF7bcuvLy#zc^dl0c!A%)yw#!I;Xym<DoBI*7>NV9W&3Ss)^tgE0q0=Yn+P
zfvnF5nNk2E3PD5>7h^GF35Y1=U@YTcEC;!>f`hS=i?NEanwznPu@*$su`||lGo&*%
zfQ)DaDQ{wDZ02If28Brr2V*NJEZach?d*&l9E_bDj9pv|g^a-<_1z%x9*}{(AXXoU
z=m(iLfrD`(h@J!@CWDA6AYv+rm<A%IgNPX*^)o@Pn8m?3n}cx<D75B++&K>v((^&Y
z0(QoQT#Snt7qc@iVP{;*$iNbxlb_DWpzM>JpR1pfnU-3VSgBu-UsRHqqo18xl$V;L
zpOc@i?~|Wy&B(xJlbM%UV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7<l9-f}%E%z(
zlb@WJ6P8$%3F1QqSxPc8iy0Zru-R0cnp|3xSyHK=SXz>yADoeyl$4*7T9V;dT9WUR
zpPrd#&B(x?k(if~lj>TLoLW$lnV-kVP^saQl~|Top<kR@RF;!kqMuPxQlRfqQc@5M
z5eP~xEKMygu_majxFA2TI2EE!KPNFST_0|ZwPrL}J486Rq$o2F6cp@55VIK>)WOn(
z9l^-JQIra?h>?M?%ONVQ85tN;85u;uc0infa2X>5Z*WOsa<*?`0W^%c;F86R46Hez
zkYi*>A#53G!Gt|TSW1giix?T?vBht0eoAVNerR!Oku}KgSkjtbesF1W21o_m3)YMb
z%tfh%V6vEzfjhY<H6=B#Br`Fmn2|vkd#n_v78irlh5|Umu*M2lg*77sXL5dSL1JE|
zX9^<&qZd2lLUzVw?2OCV8CJ0~u3%?e$<C<5&Zx)8AOH?Wx1#*qV3_Gn8eW9V*CZGY
zJgK>fnK_OrDMhKp#h^?BO3aWrh9@%)P=*MpEJ$T%RAFQgO)g4JEJ+205{h%Uij#{{
zQ}g^1b5j`^IMXtVic9jqZ1&>PA}A{{B?Y99ks%A}b`+byz9CtJupc3gfjEpKC$YE$
z!sG>eB)<scB2e)2B$k%s2P763m**FOVk3%?fwKV0HAG??F*5Lhlm;XDmn$tXIW;Li
zKO1BaTYf=m9+;5>DuTde5ja>&OEPox!NpRlH6sI8Ze~hKPAbGP90f(GX_*xuU5uWL
z3>?L!X;3apZX&2S<4wveD#=Jmtn|&#E6HGF;D+&C5-S-QcwoH9)Wjl229B)!q>#)K
zkUoy|qWsbV&y-?D2Bv5)Mh5=;qV&YP%&J6C@dXxUFUrqJ1+#cSxyK!@p0hYLFU1v<
zJ{TGJK*d{Ta;kHFUP)?22_u6xwxk7Bqz@|k5Q?oC8AMA9Qm`c&Ck<@IAmvnWn!uBT
zKve)oZhlH;T4rhrBZCyeo}m1k)MAtr>a5{K1>5+OON)w9^Ge)ObHG+GG6;YjsSk<W
z%;FMjMg~DtMc~loNQ3L(f-=G4V&D`3uc#^uQlSN@A)2{1xLpr&iM5?IBZDv~GJP_O
zOG5H}^7GOii;6(WLj+R#A~{hLlol8>85vkX8j9H&ZZa}(24|+{C6<&Hr7|*@qU#`R
zIoL>r^wbi^97xE7XO?6*=jWwmrk56_rUaKJl~fj_GBOBjcxj^f%$kvb8{`hS8WT)4
zgdM=hAe^3B0tyP$csGU?Hu#berh`~O4#HcNfNZj6WME3IU}P}G7B|qgODe3jpdSEk
z(;!za93Wdj@x{o%nwMG*%KzNSIf=!^pke{UV@|C|2G!d6u#$o$v8YIek%1*AHBW_+
zfhkjkk%2ogEiE%A6P%?P8TgTSAd}e{SFtm8urt=PGp=T22q8T%hzWU)ocwgxqN4mF
zMg|FJ(m`*+gfTL3*d*sbTW?&!`K3k4scxB|LP`QlYfBGQWb!afWSGRrAnX_#;veth
z@9yarALQ!d8RY65!p^vihj9(#T6V^DJdEoZH!w07W2w?n8+Gue96Snm7$!1q<YDM%
zn841siHC7B;}#yqt&H2)8MpH=?qJ->$e@UDngU2WxE@xBh7~yqMzK7MyBK$~Gw$JG
z+{?I+hhaOz4n_t6kmHf7GIqw5JdFDp5AZM^WIV*fc$o1BJL6Fv#$$}fc^FSH9${oq
z!{T@>?GYYE9!6e924RHxaIY{j2o%E`t$JX0vNNvWVO-C6l85mW$kx-KP!dOIh1Bp)
zrI|S?pjMMwNKs{GUb;d_zCv1NUWx*!Hc%+fEXh!SRP73&THH#3hw%*KS$4*AJdEcV
zFEBEQBUze}nwXMWq?Zb*GZb)|2UY+w=_1Gk9#9Rekd|MXmjV*I1PTr&1q~j?%ODn`
zCJ*Bk#(j(oqM+c{1sCujSAtxpr>Dom@POeVBLgeg3`Pbng}nR{h*_Z6+|9#y6{J_r
zGZ)mKfaz06E6UGRfVR`XhU^8!nwT@VX@l%@PZyAr&M;o%VZ079NE(|#J}!;{dU|?{
z3=HgyH+UFtGT!20c+BvGk--QaISS<&nK`KnD6Urk<^5t5w}33W4f3^yb7CIIC*U?p
zDkLg&6>>9+i$Q)siVsExCA><(LCwe@jTuWwO*A#UMj$Da#54xpx>Lbx2wa&QIFLcU
z0L7pca@ta`RfuL}5RTPR0J|F6Dusv&#_A}59Rf~;5HY@39R;Yl5CO(m9)^Pqhu9hK
z@G#zGILE_qkntW5<9)`Hj0|kx1QN~2AQ@`~iH1~&EeeT{#xKZf_E-g7T|0$n9>xcZ
z4|y0Lfnq`op&rTpXdcGLASF*gN<<M#K+Q{t3!`}$pMq38V|>oT_ySZid}sK<!|;aT
zEf2$IhA-@lFL@YWF}~(ue8cz}<~(&q1`&0IjKpGvq}0?rg~a0G%=Em}6mXV%3rgIe
z6r)kBX{Er<_zqNXyk}=z#l!f4@goo8C&tf=46;~C5lCwaR9W#begTz0UqNNTH^%R<
zVg%f90k;%D)deGiEM_DlRVj=NjMhAiKNx@VF#clvjlI+*RPiw~XrSke^wg3PP@(|&
z5K`!XN*e`rMh0eeP_FpHxQ~bNFT)oe#(#|ed6*cO7<m|fF){KmF)<!sWZ(zanP45M
zpjwEBiJ6Iohlv$Luz?76#)mvi988=%Ok5xqHxmyJ6E71V4--GAOcX)5CO5UXI59m{
z!B&Bhfm0zlv9uV(=3x?G669e#!z9GRB+MiNDq1!&GMHcqZPW?}QF(w0FYqV=JCi66
zlNggYN+sc+l$DxX!pNXS&_uX7j0~!vk{oNJ20Ri09e7}5P$Q%c(#>aNki)4E++D?&
zyg<2&k%13n0HT#iWa0>}EG|jSg+~D+0}rSXSyEDznN(Vm%E+LG+@OHeS=P`NB)E+M
z2|Q4z9!uy!lOi~chb87@rX-et8Yyg<#eStZIgAXV$c95r(u_iD#e`%O<(Gqok*q=e
z4Mp76K!>Rq8Cb!|kdZ+Pi}8@QCfMny26LsSmcYCB${JA+PhyQ>aD-ShGALnj3)rua
zre<hKW)37goe|><P&Z*U7dhovYkDy<uw>??<>LsZFh&M-EcPRc4@gpgID#{?*fkFn
zhAE5;EE-;*Fy>58EdeDQa64B6WE*=~VoqtQe;UX_ST6w_P|#>+WZ+IuEkShBMKmB`
zgxu5ub-%#r5UkNDKR+imF^`dfB_t@+m61UhDfFRo){G1sCHW8=Ko%pZfCyTH91F78
zv9u%uG!Vkbz?NEA3LXPuODrfz%}Zfq&_#}Em_7`npp7kSMh1OsA(vWImYJLi9;5>I
z3ZWfoNC<*@H=y8hsze@oFo8DcQG$T*pol0m?42sXJ$z_g%gDeBN`puv8~o|1C8#RE
zgCC*r{ycOv1YE0wM}-&}WZ=Cwa1=lS1L1S7OmJfi<P}B+bF9Gt9f{3JNi2YNnm}zV
zNZTv52ofB85Mw|R5To3%g#<<nSQ8E#P(Jj9)B~_m8l0!VQIg8Yz!VzH$S9)W<rRf#
zI;IFwiXcOIC~*ie3CUvQp<zgv5+&m48RhBe2{8>RKCGj?ATSDB*A>S|4&kul%q;fH
zFM*V;{Ke>L2c@)y`T<m=f=Yb1%p%y(98Ym-2@)5S^?cytcHG6OB?ulDxJeC7cn*Yy
zlL)(C2sE_k2yS?RQWdD#gg>u>RDcr(N?zqF%`1i!ZXo$$Mg}$wuV^o@SD}NTP;nUz
zPs}0=kyjucNpK<nx6q0i8N@WAu@{Xj#hF#9;CT^GMh52e)Dlo(hGIIjeq&?+mAoJa
zfJ$CTOdrF?VL-Vb$^j`aW@J#oUCe=932H)GGcvFi7vyA?FfyoPQ;vPu96ENx$Utg|
z267o_=qs}rQV4<g@T!IbYHTqh150s!Q3)dhD=7TJ7#X-AeJhY^Mg}ENk%grwLNuPO
z85#J}Q%jtY2WR+-(F8yhTNon)DE%T;xLh!00p8$|)DoA};^d-C=nN7lJ%a~peG>~9
z8HAt#1`bT$!~$@OgS|KvI%o}IL24it4Np*VVoyv-fp`I5;s>d~SMY)585x)pQ&Jci
zKtbjVYWOlTh@;f6h}H^Pbq7sX_!2T-X0c0ZQfWFoVwg2RwW<!5Fo!nTplvC)#N?9v
zqDn}a&z7EA;scs1G=l~cxIhEP33l(Hnq|$P$k5Hu%fQIc$H2(I1se8YU|`^7U<3^_
zF)%VrW?*2@XJBMtWME)m)!NR$xRHT@fr()X0|NsaSWtywDgy%p517r$FpXh40|Nsi
z!wiO*3`}6n4Ghc-EDQ_`%GyFqI~kan7<MqQ%w*u%&A=L|yPbh;|0V`@UEQ4w9Lx-i
z8yFZEn88L1fwgEe@G<Bxh%@LhC^G1St<eIDD?_beU{Ge5#V{LewKBsThPez(Ad490
zG0bORW>^3=jZvIoAp-*g3j-qqD+43LB8J5fcQM{zU}4~7U|?urv|`a_-pRnp#9+m$
zy@P?voNW^WyAbzI1|B8`F}58Hyt5eCBw03SiLpttZfD^0(*=6~B*eCtf!~Tnl7(4!
zCxZYZ!wv?)U`ZAh-JJ|Vj10k&EUcRtgtsw>1WU4Pu;S2?<k-$2wwyr}#smcbNQ`a2
zB+CW{HU=REHHH)hQ3iDeOE7K4kPN0l;`t2XU~v!)5(m+cfC^&}Wnf@1V_;@5XW(J5
zU=U)kVUS_4V^CqRXHaKwVlZHEW-w=PVX$IwXK-NfVDM$|WC&;QVn}50W=LW1Wk_T2
zW5{6$V#sIkXDDO{U?^t@WN2gv0S9&r11Ez4g9*bDhNTS53~3B(4D%S4F>o*xG6;Z!
zm;)4g@Th2ESPqSf7KRnzs9<JjWLU|tih+fJhoORDHNzSPRt6!4B8IgL>loO;(G$YJ
z`kz6aft{UUJv+k&c7}}%><pXO88)*pF#Kl_LK0_Z*n%XZi6jHp!N|_A)r*~Bn;=qr
zGl7O4A@R-hnt_#pgMoo@Hlr1*u8_n|21zD{1CaRJ!5}r0ft7KC{0;_bD>g|sA(?Fq
zvNIX9HZid8W{`{A&LA(Ou#G`cl4To%;x+~)aLSOEWZA)>Y{j~qAy|@4NCm9HQCCP6
zZZ5kdJIq`pbJRfQu%np6zJoy>WDfUk2GPjv3>u&u0kc*Uq?~mpgBByhHU>o@Z75d<
z!qr7KX9t7cOa>89($xn$P)m|kcN>Gja)vr9b|eQFf{XxpM92uH+n9+#eg}ieOa@Dk
zZc~VEdEIRcW>&07I?X{kS-~lN8-oQb9F{Z4$?ssWoXH>#(rg9REH7jY3LP6ORxNo+
zR^9Ckw#yk*P+VaLGK+m1gFTWPBw05wFf%AH6f%5d5M?N0cn6{xa~Mk)%NfL><w75W
zG6MrcBm*-;G=l&`41)wiEQ1t70)qlWGJ_UF3WFO%DnlSc8bdTg215ozCPM*37DEw3
zE<+zf9>X+-e1@3}1q=%riW#mklrr39C}VieP|om<p_SnyLlwhkhH6F;hFV5xhB`)7
zhI&R_h6ct!hDOE+h9<@&hGxbbh7QIOhHl1khEB#xhAze#488DdlEI+Iu#;gI13SZK
zhDvZYVP~vlkOyZIc2J^&WfR8P;N;H;76WAoW(EPqZiYn+yBJs)m>Fk)GaD;|0%JA9
zZiZdZY+}H`{g*+Cona3<!<Ih`X6y`m{xB%8Gwk`rpvL~2!N-Z6Ve21;cy@-ZzZj%I
zSwI1v1;iOx81^#kfMfy2%?#||BJT#H6$^3}V3lMACshGZ6guo=FlJ(qWZ8h6nAs%R
z5GouIDx5HqJJ<|ogbEk93JysQgc+_d6-Wup4U{NYLFwEb#9{-nJU}c^ei8Bnu{c0t
zUa&;N!^8keV3KT-?4Xj=8&QAwF$gm-Fic@!W|+nxz%ZRbf?)=O62nXeRfahXMhtTq
ztQh7oxG>CTaA#P=5W=vSA%<ZILmI<UhD?SP3}p-}8R{5TF?2AjX6R;E$8d^aBRHOe
zK*a~c4OmPv+<?U-!wqoZ#>~LXa1|VXEDQn+Cm8lI>|$VLFk)B+P8n<rAq*`H`@w0X
zj3J5P0K+Z@4sanT%fRxNK^0uW?fJu?2##F@i4>Jgpn+USR5A%N$T7$>FfcT7nzOT*
zae@|kS#dL)@o<{+3Rzq6Z({JV5)iVs5@a?LVm1?IF%w}n6J;?I6J+0HCN5-cCBbMV
z$!I0TXeG^PCBtkc%V;Gh#x5_)Daj?tEy|-S$s)!p$uB7&$to!*$tEf!Dl94@Dk>@_
zDlRD@DJdx>DJ>}@Dk~|sgTWUR=8)z<9D_Im1H&!`W`^AiYz%uCI2rab@G$IS;Ahy+
zAjEKhL5$%bgEYe-26=|V3`z_~7*rXKGH5UyW6)+e&Y;I|g29;KB!fA_X$C8XGYqy2
zXBiwA&M`PMTwrixxX9qia2XT_j8Y6TAWy^Npb;Jijo|QR2FrqSBB;sH$Z!}O2Mi32
z3`fAZiJ75};V8p826hHEhH8dm496Kb88{g#7)~(kV&G!nVJKxd$*_xon}MI9h~X5&
zaRwd+A%=X0(+ukvcp1bPvKh`W>|)?&kY-3@ILmO3L4ZM?A&KEU!!8Cv1|^1gh6@ZA
z8H5;A8DbbNF<fL2X3$`WWVp<5oI!*^n<0$h3d2PPQ3gGRV1}y<7a7DDj2ZkGt}$F>
z5N9xF@M5^mu!}(gTut9#xXB>NV9VgbaEsw4gA{`UgCoOjhMNr149*O840jlAGRQEv
zF<3L)WjM|t%izgi!Ele^K7$-mLSX?-06`Oq2m><%s08w2w$nkXomfBxwBJmI2<@E=
zI*bgUs!etlgBMb6^xwvys12`q0w6qS#S;k1i{MHGIWKBUvg~9CVq##i(-A@x4B)~A
zYEv*HgCy%V2D~<fKx_(zRB>RNz-0oeO{_Z^LLoLG3K(!91+^)RkwKD;fKA~Lo5GN6
z0+%_cHnHtwhyd9nJClJ!dj~^gIH&;(X?#ISnOh7@40jm#8SXNuGTdWGVtBxi#qf|J
zhv5lBCBsvOeuifZXBb{ETw!?0aE;*&!()cG3_ls(F`6-aV6<cS$mqcEh0%rKE2AgF
zcTfsv@PNb?EQK?AflCxnec=TzWkAFH9t@8djx#Vb@H1M2%N7=fN`{LJpt6OP;W0xx
zxNLzmu*5)ROAaHrOv!|k97t(}2{bJSNh^#7&?a%Y{0@ewSqv;2wd5sPwlhRqv1);u
zzA;v8TJqZ&Vy)P<B-yt!#8`1a+P$E1Jr2rb+rbczl!y|xF(~T76Hy{4*|6=~#*ieG
z3})_NNI@#gK>^DGZvJaAa4|42{9<5d_|3q<@Q*=|;Xi{UBO`+XBNKxLBMXBuBP)X)
zBRfMGBPTe}AVqUIEYKLr;l)BZIQT%tLOD42SQrEu(iomHJY!&GkYtEsc+PN>fsH|d
zA)Mg_!!rhU1`P&(hL;RC88{eTF)%QQF)%^ZgIbReRj(P?!NoQ+10!lUzF~L^2}g$2
z3@qS&ioW(vhEzs|J>0&`cCrxmA_i$4S#8;!3~8X&XZlWt3`T~47G}of{~zjric*OG
z#TZx_7#MjNI2rjEL>c)R)EW60bQy)feg$=bxEYif-Z5Nc0QpNF?rVL9_YBV%7#TPj
z)W8J>6W9-so*78)H3K8q<va{be;K&h89p%nVo+rG2=32)VqgMI!7(s{`)oc8OkfXi
z$?ssu1a)|_KyHH+^IV`#7NZygE2B8rJqln~aKT-{1r2*v23Cfz;OYR@{}PAV^^Jjv
z;XA_*h+WKo8CV!Z7#J80cQa&1ZfD2=HBEBijRtV(AvF`+1CwMG%G<_}4{D)Xu}iY=
zGvi=3;}qo-<yge<MUq{V)5wZTUXp7ELxC0da)wJ*JV@!V2$bBoK#hlD5Q}FULkUvC
zli$HmI+J0l{0@dPD_$*0UQpWRljPgMP%g<Q$+wRsMc<rXjGrqJMDAdyu;S)47lg^|
zV5r>5P{qh#F1Vb5-%1$Nf~wvL>N-ktiwW*zs9|Q1<d)ybPz$2P_;)hYff$TC8S0rB
zB)J)PGBki_Nv@p?jUWcgPKG8By@R1Sd^rQ#at6`m3>;Rx%NckjStPl4GPE!;gtu@q
zF8|LB>NGMlxG?yDJ8tV34lo>MC}gN&6lRoU0JZu+9rS4ostgQ_(hQu8G7Msjatv~e
z@(hZMN(@?z$_y@yY79P%E)4#R>I{L58Vps8S`3Yh+6?WCIt=}cx(rho^%&+c>N6~1
zG+<cGXvDCN(S+duqdCK2MpK5PjAjhy87&xYFj_J^V6<X*$!N{+k<o_XC!;MR6Qdm?
z7o$C+0HXt=7^5?zB%>pvG@}!v9HSef2BR{g9-}8X*<4`|W$<BOX86hQi-DWrC<7P6
zZ-ze%!VK*UoeX~&o-yz;^fNSqlQAE|Jcc5Me+=sw_!-tQBr*JFSjQm9u$mzQqL)z&
zW(uP;12ZE7!+Zu_hCqh14D%TNFz_(SF>pcDF}N^1VPpi?^LmU7j7$ux7}yz%8GbV|
zGhAfgU@&9&!N|gJ5!60rG=wE)Mnh;~W?(b~7az<FoQxXa;)8`jj8U4A72LkiVq|Az
zV_3z&2F`GxLIdK9*9^Q+^{*LNKv|Db0MwFKWM^b&XV~+fL4<*monbu-JHuv(2)K*8
ziIEZ1`;}ne!Yaqku!n(>osr`|LotH@E*0#Ioa~GoU_(E!uz=Nb|7UP!;K8MVft`^9
zWGfSHB@i<SC<2?q$j-3sKLZP>h{57HP&bB=lY!wU1LqG0R#;8M$OS1J7`egI*r4$z
z(8yB<12d?&VX#Na%dMbl8`5<YYJ;%bw=r~pJEX=;44W9(cQSM`GR$NE6#&{h8M>Gl
zKs5`b$_5WCG5RuSG5Rr>GWs*vF$RH?BPh}s80=vY&tMPkx<SfIW(Gz(1`b9(hDp%z
oFeUJa69WU6FhlnahMvs~>>vvm!BrPzP)v=1k&z!%urdk&0JiH|{{R30

literal 0
HcmV?d00001

diff --git a/target/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class b/target/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class
new file mode 100644
index 0000000000000000000000000000000000000000..fcf3394bd41b00be8bb984e100a6e6a9441779b6
GIT binary patch
literal 7439
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

literal 0
HcmV?d00001

diff --git a/target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class b/target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class
new file mode 100644
index 0000000000000000000000000000000000000000..1c81cd108a748ee4c78dca59f68f355c9afedc29
GIT binary patch
literal 1977
zcmX^0Z`VEs1_mPrKQ0Dl26J`>3w8!eMh2l^4^Jm2e;?Nnk9b!<M<*Xw7e)plpRB~P
zME#t^ymbBGlA_GKbZbTiUg!M0;*!L?lCZ>_(o_xxD@F!EB+VYKjxMf291PZs4B{BV
z@vgp(o<1B5HjE6?n38UuLBSz@j=ruO47Q96l9&pDLxUjFc8m<Nn9`1JZk|4#jv=1@
zejE(;s8)mqy9UKOhKBgZI|sQshPZMtIN(wc8sGv};K<0JfMf~Sgdl$(SBNo=!NH#H
zejE%=j0_rtRK*8}I)y|AxN<N!GcpJusrK=A_w?gnaKYjf9~Z}fcu(H||DX^K23JM~
z5p-?wp+P<z3~r1J5~wo%p&`&1<X~`TWDv!a1#9%c7Q(@Bot}&gYDhYff;K)RDAdo{
zF~k+F)(cf_uyc^Bs~;$$;zNQQ{es>6gM8s?y%`x)kj#aomUv|21A<)LJR>+5eDDT8
zEEatk8Q5$x^D;~97#Wx~G{YDfSe)}yQW+WeeKPY>{YrC_Qj0<olX6l)sX0G6F()js
zC=<ko3bK@BWEL|rSokF8=j!KVrll4oR_Yhz7nLOD=oe>XCMD(Pq?TmpmzHGa=m*33
z0Y&)*#onov#ny}rT*3LJMaijdnIJnPu&B`kWg;F1JqCS71~c-kVPp^h83M_P{z+M>
z$t8>oLJ0TirRIVBl)}g$h$NVinwXMW#K<6yA*Pp_o0yry$RLd=la^UjT#}cVo65)_
zi78uLS_F}k#gt1-OUum3Of1RF&qFo2v^cd$FR`>FUoW{RHL)ZWmuzW43RqSF$!xIR
zqWqjxhyjVk#hK}Oj0_rtl;{<gCY4kcq%txHASunsPtU~WxSW*40=>*!P`ooTh@flG
zD=o@F4UL@q^!(BiM5v3RY5~cC^++L!Lt>*Cp-CM{5-IHTN{UMJk`qf(v8yajE=o<!
z14V*fNl{{6aaw*+E<&XWl9><-^^lD&C`wJstYBoo6T*-vVo+pYVqj)qU=U%DWME-n
zWng4rV_;xlVqj;GWZ*#Jb23OWa3S%z86+8akodd|k_>!Ee0~N=1_30#AcG`>5E5UQ
zL6SiPi7(0^$smTr7iW-UkU-)~GDtE=A@QXdBpGCo__7R=401?(c?L-a1th*AgCv6z
z5?`4?l0gNDugW0FpoYX(XOLvjK;mmMNHS<4@wFKw8FY~Nx(tjAjG(;Fz{p_0z`&pn
x<})y`YHep=+z1X*Lk0#0HU>rp1_pKpBL)Tr9x$7g!I;5>fq{XM!4#~@3;?eR@uL6$

literal 0
HcmV?d00001

diff --git a/target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class b/target/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class
new file mode 100644
index 0000000000000000000000000000000000000000..0c55c04ba3d01f9eb49f94125ea3925b030560f1
GIT binary patch
literal 2453
zcmX^0Z`VEs1_mRBIxYrn25$}qA1(%820tzae}(`~1}%m_4u&8Q9n8TH0-{4X7{Wkw
zI0r)nh>ql7hyu~k91JlaI+lYW4n)UuFeHHJL=J`|5S`4ykOHDpIT+GFbUFt^28hn&
zV8{Z|*&GZxAUc<WArD07b1)Qu=t2&LA`o57!B7ICOW7I9*cr+h8H9p8Je{2UeOyC4
z;$8h5oqSwf7#SF&7#ReSBs^RlU0j108H9YY63Y_xa}x8?^@B@_GV{`{85zVe6vn&y
zI(qsrGDu^}xOoNzhxj@Ax-v3IV#)@G20`RxG36ZH+&q0e9YZ|*{ZLH~4R#HRcMJ{j
zk9Q7obqsOEB^w&xf?d|f#W5h>(>K6BD1?zg0m){t$wB@;t`OrLgM&TY{TLZE2q}pV
z4s{BN3~*&+kU&!E<L~Yt8UhVuY~Bxs%c&u0L-KcgNKmMsvtx)WR)xXNL9VWTpzw<i
z33BuccJmMNg)0<6GSSE1-P12VG{}dMK@?RO<UX*t3X(V^^5c=+5fJ3+<{5!EuwZe)
zW|NthSz^b?z^tJe#>l|poS%})$iVNDnV0HUnwykb6q1;flL|^&`N@enVTnbVAU;%(
zr6eP>n32KCCpkY?KPNLSwJ5PtzaYP;Br!+7I3qJDDL*H*BtyTnBr``p7|stU$}cDm
zOUx-vEw*N4;IK)~fjWUJIKQ+gIn^x_WT6yR4SJvi&cooy;Kaxvgs?&{H4o&h6n2IR
z9)?PWDt3ly9)=o*S{?=+23<x5K_rzKsfj76MLZ084El@=;usQoskw=nIXnyoAZck#
z>9owE;*z|?+*BS0Ly!_lOeMvoMGyr>AO*6R3KG-OGIKH$OEUBGco>X9ijXZTElw@c
zODrwP*Gn!+O)N>}VK4#t0lSjYf)ub4Q>;pIQW6XFGIK#O!oy$&Qlfz58n8u0`8lZ&
z+Y*b5Gt={U7|cQHGzh8FD=tkcsVqq4VXy#s067?P^3(H6OJGsL!(a(APzuRFNE8$!
zR9Jyjs3WOB3L(9cqSCzN#FA8ma%*(u#mPmfsd=D4*DEPX%qvdIFUmzIw*e^^K{7oj
zKRq)~ue2zKhrt%)cu`b2kmJFUb|6U=BuR+F^^jdxP?VaMS;50#4^oRKbYXGn0CJ24
zx%q{WK>(BiASJwiQdVkm2_u6B7Spm*i}F%)AUO}5-$F|=a~K(z(^E?r8Pqf|>j_Ov
zAw~vG0w%ksmXxFxL5$`~Pc3oE&(BFs%wuE_#b!ekgCc_#gEj*LgD`_6C}T1(Fi3*(
zA(%E`&<E3oP}&Ge8$)Rm23@ecDU>#Y(&kXw0;<ju%C~~j)==68O4~x!*+FT0DD422
zXJTLk6)p^n49*M;4EhX=42%p646It)85lP*FfcGNxG*p<uz>}+7+e_`7<j;JRt7f)
zcLoLq4h9bfCx~W7aj*;n!*(I29SqDn7+5wlunMv5U|`<Nz%IlAra6VUz%;iI518f^
z;sewCLIN-?f<i(trm&C*j43K424ji~Nr3f83Q56)q=jT)Oj#j07*k$I0mf7mQUdEy
z7E%GzszPdDT3tv3rbH9uT}H5X{TPH97#O%2xEXjEgc<l5q!|Pmlo^B>v>8Mhj2Xlk
z>=+~&JQ<`JLKtKj;u+)_(is#PiWrm`Y8g}+IvCU$CNpR<%x2JLSj?cyuo@hup5UPL
F0st)iasdDU

literal 0
HcmV?d00001

diff --git a/target/classes/com/liferay/portal/shibboleth/util/Util.class b/target/classes/com/liferay/portal/shibboleth/util/Util.class
new file mode 100644
index 0000000000000000000000000000000000000000..d6baffff35d7f4c16c6575b228cf40a43e1a7629
GIT binary patch
literal 4333
zcmX^0Z`VEs1_mRB<y;H~3=td*kz5S=3{jj6(F`$M46zJx91QUwP67u*B8X1nU`Phh
zDI5%`AUchMAss|#a4=+o=q!+?Yz~GT5GR*|ArD07b1)Qu=t2&LA`o57!B7ICOF0<I
zKy*0=Lj{Pg<Y1@*(bXIbH6Xf{gP{&Y*Mkgg;9zLvU})lEXl7{PU}y!2w{bAEgXj)+
zhE8^dE=C46o6Nk-5<5l)W)00SMg|t={FGEi27aH+yi~u^+@#c^ki?{%R7M6NpZw&+
zoUp{AOb{O`$WoG#S<J|w>64tFtDlpZmRgipsb7#^RFasZU!0Mdl$4*7T9Tn(T9TQg
zA6k-`W6j9GnOW?b2Qngsk%2|SOEZd*fipQjw;(aE(ldpTfzgYRfy=cbIkli9Ge57G
zouQkNfj_g@CqF&Ev;?kEAhXybH8CZ%2w|2?X0c;hT4qjWB1mIMQE6UsVo54ohfHR1
zaB@*<YMx(WZfZzTVqS4teo-!5nkzFG<m}Mm)FMU(?)20WpZxU9ywIW?Mg~z0FHN7U
z#Ii*FoW#6z{os<K%)E4KMg|^;s{GOturl8C)DnoBKsGQk2&Jc%xaKBi<{%4-rKgs-
zWfm2e<R#{&B1?#*r<Mel7NHAEq^Fi3`3hMFUt(!VzH?D(Vo55*)nI|pf)u!b5J-h%
zadBpP9!Nz{J}4R`F$IH5lS(QJQX&3!EG@|h0rNQ0Q%k}Ub4pVg8PqkrFhc-qpfG2r
zR)W$Bmhh6o=9hq?)U?bBMh4-`Vu)Wru0+I2aDHh~a;jS<$mN`%1f&Ntn1{iT!HAJT
z2$90{QXxr-harF=ke#82hoP6DkDZ~PhhYN4L`DWlB$YYfl!VYQiJ^~?K?+Gh1|(r2
zR7?h`P)Aach)8F8CD4S1P(B4+c`-QMfudHg1eWj+%BO;qOCy<HTAW&>my?oMpa)5l
zJPgx7N<@&9<bV>VUTIMd55shZU>=4U3^N%SL{SywmzF?O%wh;;WDrD>gm{pLVKzuY
z9794c6_jdu80LVaksSunr<VpxzdQ_cK}wJV7pkNfl9G8C=7AK*Vp@R|f;<fKL5h$q
z0*3%7o$4in(>D*p0#FEGS5gX2@jMI*K}r;mtOA=-l%JET2R14ZoDp~!7J<}h5K^aC
z49OHc42wYlJOLEIQqW>buQ)Ziv?#Nr5@c|O9whJZfJ4nOC8a2}xR{+`2`Ewm85vZN
zEP@6OlHc_Tz{#J7VJRpG@Hie84$DA}S0}QtWn>Tl<rYY><)4(5nq0!jAdC=#m$Hlu
z7DN~s3@^_Eit-DJ!9_zcBZE+|ho_U1zmIE(N4%?_qmz%T3nK$#6eEKs7BjO`i}F%)
zAoYQJYDr0I5hznLGBBs7mM}7iX<(KzQJ@M!0?7^^e|P`T5U5p*43bDv9<Giqu0g?Y
zIW;6XM>jW5A5X^+Pk+Dokf2aMXU7m%tO|pjgIrzx{2YB<<3oZR{es>6gM8r%rIAbw
z4R#HR_i=Fyi1+jj@DB=MWDr4;_3?N2^otJ-@?m7)1eNXJT7!|n0*e<hJ&m<!6-6~2
z6bNAB1(C!dA;8EWjv*HB>g(v~!^nW_1BmK)H_xEp5Riwlg=TzkXb?nB7Sl|mKt(kf
z95#-jA^!2sL9UJ=uDE1F16;te3P@&y^#=L-xW<DGa10LiboXOq&>*BFJ~-4VBr?F2
zkwKS0$^%t8#o$B?Nqs6vMnl5{$!GBaL9T9|5sVCY90~CygCT=Hg8>5wh%qpMDk%m=
z24e;W24e<B21W)323D=@42&BY7#NrsOc)p#xEPoi7#R2%SQz*jOc@v$cp!=x%oxlW
z7#KJiEEp^qn7{^@GcbeI^2!M@?O<Tu#K5wHfprbsAU3c@AtXb18LSwr85kIB7#J8>
z7#JCB88{j2uo=e&HjW*OapDAwv&Uu}2iQ1HEXK(YFwOy+aa>^IxUm?gNWeHpY{v0`
zjpM~)oEib+oUj?k2R4o$i*ecnjB{pi!Hih}uyKMr7=$*U#jF7V<6N;BCk!@D1dDN|
z1dMaTW}GP4I58~7SrIVK9h-6DVB;jP7-vtwI1g;bNrH`&!eX2Y0pmQe87B=kP6mr{
zo&=2Z!e*Q-*f=>X#`zI2&Kq00lLs58fF<1p6EMyPn{kR@<CL%%7eT-{Uu?!HgN;+c
zVq7c%<NUCNohsNkwH*xV=(!?^fN}nC<IJGNCy$(v#tsH%Ax$hXk&a{<4@T+91?pHp
zv#b>ZGXpaN0|T3!&JG4GbXVno%>kAF3=C{gb3m*hhF}IJl=3(P?mndAT^sCO9W350
h02>UcBd`_kq1Ylr7i^p!mdGf@YaAm(7`O}y2LOoVo^=2K

literal 0
HcmV?d00001

diff --git a/target/classes/language.properties b/target/classes/language.properties
new file mode 100644
index 0000000..f4af834
--- /dev/null
+++ b/target/classes/language.properties
@@ -0,0 +1,17 @@
+shibboleth-logout-enable=Logout enable
+shibboleth-headers-enable=Extract attributes from HTTP Headers instead of environment variables (see: https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPJavaInstall , the "AJP_" prefix part)
+shibboleth-affiliation-truncate-enable=Truncate affiliation values and keep only the last segment after ':'. Useful for standard eduPersonEntilement values. ('foo:bar:baz:qux:RoleName' becomes 'RoleName')
+shibboleth-screenname-transform-enable=Transform login ID to make it valid screen name. Replace '@' to '.at.' and '_' to '-'. ('foo_bar@baz.org' becomes 'foo-bar.at.baz.org')
+import-shibboleth-users-from-ldap=Import from LDAP
+shibboleth-user-header=Shibboleth header name
+shibboleth-user-id-header=Shibboleth user ID header
+shibboleth-user-header-email=Shibboleth user email header
+shibboleth-user-header-firstname=Shibboleth user first name header
+shibboleth-user-header-surname=Shibboleth user surname header
+shibboleth-user-header-affiliation=Shibboleth user affiliation header
+auto-create-users=Auto-create users
+auto-update-users=Auto-update users
+auto-assign-user-role=Auto-assign roles to users (based on the affiliation)
+auto-assign-user-role-subtype=Role subtype for auto-assign roles
+shibboleth=Shibboleth
+shibboleth-user-header-affiliation-prefix=Shibboleth user affiliation header prefix
diff --git a/target/classes/portal.properties b/target/classes/portal.properties
new file mode 100644
index 0000000..8059041
--- /dev/null
+++ b/target/classes/portal.properties
@@ -0,0 +1,19 @@
+auto.login.hooks=com.liferay.portal.security.auth.ShibbolethAutoLogin
+
+shibboleth.enabled=true
+shibboleth.header=eppn
+shibboleth.header.email=eppn
+shibboleth.header.firstname=givenName
+shibboleth.header.surname=sn
+shibboleth.user.auto.create=true
+shibboleth.user.auto.update=true
+shibboleth.user.ldap.import=false
+shibboleth.logout.enabled=true
+shibboleth.headers.enabled=false
+shibboleth.affiliation.truncate.enabled=false
+shibboleth.screenname.transform.enabled=true
+shibboleth.login.url=/c/portal/login/shibboleth
+shibboleth.logout.url=/Shibboleth.sso/Logout?return=/
+company.settings.form.authentication=shibboleth
+
+login.form.navigation.pre=shibboleth
\ No newline at end of file
diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..908d59d
--- /dev/null
+++ b/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Tue Jul 05 11:42:51 CEST 2016
+version=1.2
+groupId=com.github.ivan-novakov.liferay-shibboleth-plugin
+artifactId=liferay-shibboleth-plugin
diff --git a/target/shibboleth-plugin-hook.war b/target/shibboleth-plugin-hook.war
new file mode 100644
index 0000000000000000000000000000000000000000..332fa5e5f67614f68ce8e9a71567d35edf1ddcab
GIT binary patch
literal 24920
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
C8p-tl

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class b/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/security/auth/ShibbolethAutoLogin.class
new file mode 100644
index 0000000000000000000000000000000000000000..64c7e80bd14ece4dd68368dddcbfc5947d0f8ebf
GIT binary patch
literal 12844
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

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class b/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/servlet/filters/sso/shibboleth/ShibbolethFilter.class
new file mode 100644
index 0000000000000000000000000000000000000000..fcf3394bd41b00be8bb984e100a6e6a9441779b6
GIT binary patch
literal 7439
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

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class b/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsKeys.class
new file mode 100644
index 0000000000000000000000000000000000000000..1c81cd108a748ee4c78dca59f68f355c9afedc29
GIT binary patch
literal 1977
zcmX^0Z`VEs1_mPrKQ0Dl26J`>3w8!eMh2l^4^Jm2e;?Nnk9b!<M<*Xw7e)plpRB~P
zME#t^ymbBGlA_GKbZbTiUg!M0;*!L?lCZ>_(o_xxD@F!EB+VYKjxMf291PZs4B{BV
z@vgp(o<1B5HjE6?n38UuLBSz@j=ruO47Q96l9&pDLxUjFc8m<Nn9`1JZk|4#jv=1@
zejE(;s8)mqy9UKOhKBgZI|sQshPZMtIN(wc8sGv};K<0JfMf~Sgdl$(SBNo=!NH#H
zejE%=j0_rtRK*8}I)y|AxN<N!GcpJusrK=A_w?gnaKYjf9~Z}fcu(H||DX^K23JM~
z5p-?wp+P<z3~r1J5~wo%p&`&1<X~`TWDv!a1#9%c7Q(@Bot}&gYDhYff;K)RDAdo{
zF~k+F)(cf_uyc^Bs~;$$;zNQQ{es>6gM8s?y%`x)kj#aomUv|21A<)LJR>+5eDDT8
zEEatk8Q5$x^D;~97#Wx~G{YDfSe)}yQW+WeeKPY>{YrC_Qj0<olX6l)sX0G6F()js
zC=<ko3bK@BWEL|rSokF8=j!KVrll4oR_Yhz7nLOD=oe>XCMD(Pq?TmpmzHGa=m*33
z0Y&)*#onov#ny}rT*3LJMaijdnIJnPu&B`kWg;F1JqCS71~c-kVPp^h83M_P{z+M>
z$t8>oLJ0TirRIVBl)}g$h$NVinwXMW#K<6yA*Pp_o0yry$RLd=la^UjT#}cVo65)_
zi78uLS_F}k#gt1-OUum3Of1RF&qFo2v^cd$FR`>FUoW{RHL)ZWmuzW43RqSF$!xIR
zqWqjxhyjVk#hK}Oj0_rtl;{<gCY4kcq%txHASunsPtU~WxSW*40=>*!P`ooTh@flG
zD=o@F4UL@q^!(BiM5v3RY5~cC^++L!Lt>*Cp-CM{5-IHTN{UMJk`qf(v8yajE=o<!
z14V*fNl{{6aaw*+E<&XWl9><-^^lD&C`wJstYBoo6T*-vVo+pYVqj)qU=U%DWME-n
zWng4rV_;xlVqj;GWZ*#Jb23OWa3S%z86+8akodd|k_>!Ee0~N=1_30#AcG`>5E5UQ
zL6SiPi7(0^$smTr7iW-UkU-)~GDtE=A@QXdBpGCo__7R=401?(c?L-a1th*AgCv6z
z5?`4?l0gNDugW0FpoYX(XOLvjK;mmMNHS<4@wFKw8FY~Nx(tjAjG(;Fz{p_0z`&pn
x<})y`YHep=+z1X*Lk0#0HU>rp1_pKpBL)Tr9x$7g!I;5>fq{XM!4#~@3;?eR@uL6$

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class b/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/ShibbolethPropsValues.class
new file mode 100644
index 0000000000000000000000000000000000000000..0c55c04ba3d01f9eb49f94125ea3925b030560f1
GIT binary patch
literal 2453
zcmX^0Z`VEs1_mRBIxYrn25$}qA1(%820tzae}(`~1}%m_4u&8Q9n8TH0-{4X7{Wkw
zI0r)nh>ql7hyu~k91JlaI+lYW4n)UuFeHHJL=J`|5S`4ykOHDpIT+GFbUFt^28hn&
zV8{Z|*&GZxAUc<WArD07b1)Qu=t2&LA`o57!B7ICOW7I9*cr+h8H9p8Je{2UeOyC4
z;$8h5oqSwf7#SF&7#ReSBs^RlU0j108H9YY63Y_xa}x8?^@B@_GV{`{85zVe6vn&y
zI(qsrGDu^}xOoNzhxj@Ax-v3IV#)@G20`RxG36ZH+&q0e9YZ|*{ZLH~4R#HRcMJ{j
zk9Q7obqsOEB^w&xf?d|f#W5h>(>K6BD1?zg0m){t$wB@;t`OrLgM&TY{TLZE2q}pV
z4s{BN3~*&+kU&!E<L~Yt8UhVuY~Bxs%c&u0L-KcgNKmMsvtx)WR)xXNL9VWTpzw<i
z33BuccJmMNg)0<6GSSE1-P12VG{}dMK@?RO<UX*t3X(V^^5c=+5fJ3+<{5!EuwZe)
zW|NthSz^b?z^tJe#>l|poS%})$iVNDnV0HUnwykb6q1;flL|^&`N@enVTnbVAU;%(
zr6eP>n32KCCpkY?KPNLSwJ5PtzaYP;Br!+7I3qJDDL*H*BtyTnBr``p7|stU$}cDm
zOUx-vEw*N4;IK)~fjWUJIKQ+gIn^x_WT6yR4SJvi&cooy;Kaxvgs?&{H4o&h6n2IR
z9)?PWDt3ly9)=o*S{?=+23<x5K_rzKsfj76MLZ084El@=;usQoskw=nIXnyoAZck#
z>9owE;*z|?+*BS0Ly!_lOeMvoMGyr>AO*6R3KG-OGIKH$OEUBGco>X9ijXZTElw@c
zODrwP*Gn!+O)N>}VK4#t0lSjYf)ub4Q>;pIQW6XFGIK#O!oy$&Qlfz58n8u0`8lZ&
z+Y*b5Gt={U7|cQHGzh8FD=tkcsVqq4VXy#s067?P^3(H6OJGsL!(a(APzuRFNE8$!
zR9Jyjs3WOB3L(9cqSCzN#FA8ma%*(u#mPmfsd=D4*DEPX%qvdIFUmzIw*e^^K{7oj
zKRq)~ue2zKhrt%)cu`b2kmJFUb|6U=BuR+F^^jdxP?VaMS;50#4^oRKbYXGn0CJ24
zx%q{WK>(BiASJwiQdVkm2_u6B7Spm*i}F%)AUO}5-$F|=a~K(z(^E?r8Pqf|>j_Ov
zAw~vG0w%ksmXxFxL5$`~Pc3oE&(BFs%wuE_#b!ekgCc_#gEj*LgD`_6C}T1(Fi3*(
zA(%E`&<E3oP}&Ge8$)Rm23@ecDU>#Y(&kXw0;<ju%C~~j)==68O4~x!*+FT0DD422
zXJTLk6)p^n49*M;4EhX=42%p646It)85lP*FfcGNxG*p<uz>}+7+e_`7<j;JRt7f)
zcLoLq4h9bfCx~W7aj*;n!*(I29SqDn7+5wlunMv5U|`<Nz%IlAra6VUz%;iI518f^
z;sewCLIN-?f<i(trm&C*j43K424ji~Nr3f83Q56)q=jT)Oj#j07*k$I0mf7mQUdEy
z7E%GzszPdDT3tv3rbH9uT}H5X{TPH97#O%2xEXjEgc<l5q!|Pmlo^B>v>8Mhj2Xlk
z>=+~&JQ<`JLKtKj;u+)_(is#PiWrm`Y8g}+IvCU$CNpR<%x2JLSj?cyuo@hup5UPL
F0st)iasdDU

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/Util.class b/target/shibboleth-plugin-hook/WEB-INF/classes/com/liferay/portal/shibboleth/util/Util.class
new file mode 100644
index 0000000000000000000000000000000000000000..d6baffff35d7f4c16c6575b228cf40a43e1a7629
GIT binary patch
literal 4333
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

literal 0
HcmV?d00001

diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/language.properties b/target/shibboleth-plugin-hook/WEB-INF/classes/language.properties
new file mode 100644
index 0000000..f4af834
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/classes/language.properties
@@ -0,0 +1,17 @@
+shibboleth-logout-enable=Logout enable
+shibboleth-headers-enable=Extract attributes from HTTP Headers instead of environment variables (see: https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPJavaInstall , the "AJP_" prefix part)
+shibboleth-affiliation-truncate-enable=Truncate affiliation values and keep only the last segment after ':'. Useful for standard eduPersonEntilement values. ('foo:bar:baz:qux:RoleName' becomes 'RoleName')
+shibboleth-screenname-transform-enable=Transform login ID to make it valid screen name. Replace '@' to '.at.' and '_' to '-'. ('foo_bar@baz.org' becomes 'foo-bar.at.baz.org')
+import-shibboleth-users-from-ldap=Import from LDAP
+shibboleth-user-header=Shibboleth header name
+shibboleth-user-id-header=Shibboleth user ID header
+shibboleth-user-header-email=Shibboleth user email header
+shibboleth-user-header-firstname=Shibboleth user first name header
+shibboleth-user-header-surname=Shibboleth user surname header
+shibboleth-user-header-affiliation=Shibboleth user affiliation header
+auto-create-users=Auto-create users
+auto-update-users=Auto-update users
+auto-assign-user-role=Auto-assign roles to users (based on the affiliation)
+auto-assign-user-role-subtype=Role subtype for auto-assign roles
+shibboleth=Shibboleth
+shibboleth-user-header-affiliation-prefix=Shibboleth user affiliation header prefix
diff --git a/target/shibboleth-plugin-hook/WEB-INF/classes/portal.properties b/target/shibboleth-plugin-hook/WEB-INF/classes/portal.properties
new file mode 100644
index 0000000..8059041
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/classes/portal.properties
@@ -0,0 +1,19 @@
+auto.login.hooks=com.liferay.portal.security.auth.ShibbolethAutoLogin
+
+shibboleth.enabled=true
+shibboleth.header=eppn
+shibboleth.header.email=eppn
+shibboleth.header.firstname=givenName
+shibboleth.header.surname=sn
+shibboleth.user.auto.create=true
+shibboleth.user.auto.update=true
+shibboleth.user.ldap.import=false
+shibboleth.logout.enabled=true
+shibboleth.headers.enabled=false
+shibboleth.affiliation.truncate.enabled=false
+shibboleth.screenname.transform.enabled=true
+shibboleth.login.url=/c/portal/login/shibboleth
+shibboleth.logout.url=/Shibboleth.sso/Logout?return=/
+company.settings.form.authentication=shibboleth
+
+login.form.navigation.pre=shibboleth
\ No newline at end of file
diff --git a/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp b/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
new file mode 100644
index 0000000..48fa3ba
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/login/navigation/shibboleth.jsp
@@ -0,0 +1,18 @@
+<%@ include file="/html/portlet/login/init.jsp"%>
+
+<%
+
+	final String SHIBBOLETH_ENABLED = "shibboleth.enabled";
+	final String SHIBBOLETH_LOGIN_URL = "shibboleth.login.url";
+
+	boolean shibbolethEnabled = GetterUtil.getBoolean(PrefsPropsUtil.getString(PortalUtil.getCompanyId(renderRequest), SHIBBOLETH_ENABLED));
+    String shibbolethLoginUrl = PrefsPropsUtil.getString(company.getCompanyId(), "shibboleth.login.url", "");
+%>
+
+<c:if test="<%=shibbolethEnabled%>">
+
+	<liferay-ui:icon
+		src="/liferay-shibboleth-plugin-hook/images/shibboleth.png"
+		url="<%= shibbolethLoginUrl %>" message="shibboleth" />
+
+</c:if>
diff --git a/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp b/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
new file mode 100644
index 0000000..10cea50
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/jsps/html/portlet/portal_settings/authentication/shibboleth.jsp
@@ -0,0 +1,96 @@
+<%@ include file="/html/portlet/portal_settings/init.jsp" %>
+<%
+    final String SHIBBOLETH_ENABLED = "shibboleth.enabled";
+    final String SHIBBOLETH_HEADER = "shibboleth.header";
+    final String SHIBBOLETH_USER_LDAP_IMPORT = "shibboleth.user.ldap.import";
+    final String SHIBBOLETH_LOGOUT_ENABLE = "shibboleth.logout.enabled";
+    final String SHIBBOLETH_LOGOUT_URL = "shibboleth.logout.url";
+    final String SHIBBOLETH_LOGIN_URL = "shibboleth.login.url";
+    final String SHIBBOLETH_HEADERS_ENABLE = "shibboleth.headers.enabled";
+    final String SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE = "shibboleth.affiliation.truncate.enabled";
+    final String SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE = "shibboleth.screenname.transform.enabled";
+
+    final String SHIBBOLETH_HEADER_EMAIL = "shibboleth.header.email";
+    final String SHIBBOLETH_HEADER_FIRSTNAME = "shibboleth.header.firstname";
+    final String SHIBBOLETH_HEADER_SURNAME = "shibboleth.header.surname";
+    final String SHIBBOLETH_HEADER_AFFILIATION = "shibboleth.header.affiliation";
+    final String SHIBBOLETH_USER_AUTO_CREATE  = "shibboleth.user.auto.create";
+    final String SHIBBOLETH_USER_AUTO_UPDATE = "shibboleth.user.auto.update";
+    final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN = "shibboleth.user.role.auto.assign";
+    final String SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE = "shibboleth.user.role.auto.assign.subtype";
+    final String SHIBBOLETH_HEADER_AFFILIATION_PREFIX = "shibboleth.header.affiliation.prefix";
+    final String SHIBBOLETH_USER_ROLE_AUTO_CREATE = "shibboleth.user.role.auto.create";
+
+    String shibbolethEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_ENABLED, "false");
+    String shibbolethHeader = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER, "");
+    String shibbolethUserLdapImport = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_LDAP_IMPORT, "false");
+    String shibbolethLogoutEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGOUT_ENABLE, "false");
+    String shibbolethLogoutUrl = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGOUT_URL, "");
+    String shibbolethLoginUrl = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_LOGIN_URL, "");
+    String shibbolethHeadersEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADERS_ENABLE, "false");
+    String shibbolethAffiliationTruncateEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE, "false");
+    String shibbolethScreenNameTransformEnabled = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE, "false");
+    
+    String shibbolethHeaderEmail = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_EMAIL, "mail");
+    String shibbolethHeaderFirtsname = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_FIRSTNAME, "givenname");
+    String shibbolethHeaderSurname = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_SURNAME, "sn");
+    String shibbolethHeaderAffiliation = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_AFFILIATION, "affiliation");
+    String shibbolethUserAutoCreate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_AUTO_CREATE, "false");
+    String shibbolethUserAutoUpdate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_AUTO_UPDATE, "false");
+    String shibbolethUserRoleAutoAssign = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_ASSIGN, "false");
+    String shibbolethUserRoleAutoAssignSubtype = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE, "");
+    String shibbolethHeaderAffiliationPrefix = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_HEADER_AFFILIATION_PREFIX, "");
+    String shibbolethUserRoleAutoCreate = PrefsPropsUtil.getString(company.getCompanyId(), SHIBBOLETH_USER_ROLE_AUTO_CREATE, "false");
+%>
+<aui:fieldset>
+        <aui:input label="enabled" name='<%="settings--" + SHIBBOLETH_ENABLED + "--" %>' type="checkbox"
+                   value="<%= shibbolethEnabled %>"/>
+        <aui:input cssCLass="lfr-input-text-container" label="login-url"
+                   name='<%= "settings--" + SHIBBOLETH_LOGIN_URL + "--" %>' type="text"
+                   value="<%= shibbolethLoginUrl %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-id-header"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER + "--" %>' type="text" value="<%= shibbolethHeader %>"/>
+        <aui:input label="shibboleth-screenname-transform-enable" name='<%= "settings--" + SHIBBOLETH_SCREENNAME_TRANSFORM_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethScreenNameTransformEnabled %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-email"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_EMAIL + "--" %>' type="text" value="<%= shibbolethHeaderEmail %>"/>    
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-firstname"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_FIRSTNAME + "--" %>' type="text" value="<%= shibbolethHeaderFirtsname %>"/>  
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-surname"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_SURNAME + "--" %>' type="text" value="<%= shibbolethHeaderSurname %>"/>    
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-affiliation"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_AFFILIATION + "--" %>' type="text" value="<%= shibbolethHeaderAffiliation %>"/>        
+        <aui:input label="shibboleth-affiliation-truncate-enable" name='<%= "settings--" + SHIBBOLETH_AFFILIATION_TRUNCATE_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethAffiliationTruncateEnabled %>"/>
+        <aui:input label="auto-create-users"
+                   name='<%= "settings--" + SHIBBOLETH_USER_AUTO_CREATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserAutoCreate %>"/>
+        <aui:input label="auto-update-users"
+                   name='<%= "settings--" + SHIBBOLETH_USER_AUTO_UPDATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserAutoUpdate %>"/>
+        <aui:input label="import-shibboleth-users-from-ldap"
+                   name='<%= "settings--" + SHIBBOLETH_USER_LDAP_IMPORT + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserLdapImport %>"/>
+        <aui:input label="auto-create-user-role"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_CREATE + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserRoleAutoCreate %>"/>
+        <aui:input label="auto-assign-user-role"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_ASSIGN + "--" %>' type="checkbox"
+                   value="<%= shibbolethUserRoleAutoAssign %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="auto-assign-user-role-subtype"
+                   name='<%= "settings--" + SHIBBOLETH_USER_ROLE_AUTO_ASSIGN_SUBTYPE + "--" %>' type="text"
+                   value="<%= shibbolethUserRoleAutoAssignSubtype %>"/>             
+        <aui:input label="shibboleth-logout-enable" name='<%= "settings--" + SHIBBOLETH_LOGOUT_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethLogoutEnabled %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="logout-url"
+                   name='<%= "settings--" + SHIBBOLETH_LOGOUT_URL + "--" %>' type="text"
+                   value="<%= shibbolethLogoutUrl %>"/>
+        <aui:input cssClass="lfr-input-text-container" label="shibboleth-user-header-affiliation-prefix"
+                   name='<%= "settings--" + SHIBBOLETH_HEADER_AFFILIATION_PREFIX + "--" %>' type="text"
+                   value="<%= shibbolethHeaderAffiliationPrefix %>"/>   
+        <aui:input label="shibboleth-headers-enable" name='<%= "settings--" + SHIBBOLETH_HEADERS_ENABLE + "--" %>'
+                   type="checkbox" value="<%= shibbolethHeadersEnabled %>"/>
+</aui:fieldset>
+
+
+
diff --git a/target/shibboleth-plugin-hook/WEB-INF/liferay-hook.xml b/target/shibboleth-plugin-hook/WEB-INF/liferay-hook.xml
new file mode 100644
index 0000000..d230f19
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/liferay-hook.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
+
+<hook>
+    <portal-properties>portal.properties</portal-properties>
+    <language-properties>language.properties</language-properties>
+    <custom-jsp-dir>/WEB-INF/jsps</custom-jsp-dir>
+    <servlet-filter>
+        <servlet-filter-name>shibboleth</servlet-filter-name>
+        <servlet-filter-impl>com.liferay.portal.servlet.filters.sso.shibboleth.ShibbolethFilter</servlet-filter-impl>
+    </servlet-filter>
+    <servlet-filter-mapping>
+        <servlet-filter-name>shibboleth</servlet-filter-name>
+        <after-filter>Auto Login Filter</after-filter>
+        <url-pattern>/c/portal/login</url-pattern>
+        <url-pattern>/c/portal/logout</url-pattern>
+        <dispatcher>FORWARD</dispatcher>
+        <dispatcher>REQUEST</dispatcher>
+    </servlet-filter-mapping>
+</hook>
\ No newline at end of file
diff --git a/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.properties b/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.properties
new file mode 100644
index 0000000..86d6fe2
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.properties
@@ -0,0 +1,10 @@
+name=Shibboleth Plugin
+module-group-id=liferay 7.1.1
+module-incremental-version=1
+tags=
+short-description=
+change-log=
+page-url=https://github.com/ivan-novakov/liferay-shibboleth-plugin
+author=Ivan Novakov ivan.novakov@debug.cz
+page-url=http://code.google.com/p/liferay-shibboleth-plugin/
+author=Romeo Sheshi rsheshi@gmail.com
diff --git a/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.xml b/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.xml
new file mode 100644
index 0000000..dbf08c8
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/liferay-plugin-package.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plugin-package PUBLIC "-//Liferay//DTD Plugin Package 6.2.0//EN"
+        "http://www.liferay.com/dtd/liferay-plugin-package_6_2_0.dtd">
+<plugin-package>
+    <name>Shibboleth Plugin</name>
+    <module-id>com.github.ivan-novakov.liferay-shibboleth-plugin/liferay-shibboleth-plugin/1.2/war</module-id>
+    <types>
+        <type>portlets</type>
+    </types>
+    <tags>
+        <tag>shibboleth</tag>
+    </tags>
+    <short-description/>
+    <change-log/>
+    <page-url>https://github.com/ivan-novakov/liferay-shibboleth-plugin</page-url>
+    <author>Ivan Novakov ivan.novakov@debug.cz</author>
+    <licenses>
+        <license osi-approved="true">LGPL</license>
+    </licenses>
+    <liferay-versions>
+        <liferay-version>6.2.0+</liferay-version>
+    </liferay-versions>
+</plugin-package>
\ No newline at end of file
diff --git a/target/shibboleth-plugin-hook/WEB-INF/web.xml b/target/shibboleth-plugin-hook/WEB-INF/web.xml
new file mode 100644
index 0000000..e067cae
--- /dev/null
+++ b/target/shibboleth-plugin-hook/WEB-INF/web.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+</web-app>
\ No newline at end of file
diff --git a/target/shibboleth-plugin-hook/images/shibboleth.png b/target/shibboleth-plugin-hook/images/shibboleth.png
new file mode 100644
index 0000000000000000000000000000000000000000..b706062e24071a25c7f70ec9770fe7191b7d4768
GIT binary patch
literal 3514
zcmeAS@N?(olHy`uVBq!ia0y~yVBlk5U=ZM7V_;xVo8o81z`)R66%tVrlvu7%P?VpR
znUkteQdy9ykXn(M#=uZ<E41$>=V1pPm;a%y-WRr7o#IU6eW~y?Iw@CXfB!{;j)@8X
z_Oa*iDmL@+dmHPRnEnh_D^Tn>;$iD8eqBWCxIfRK(-Ccp?YgU;nmg;fDJb2ZxchC)
zTbouDuiY!6H{L(7fA!~oFXmp}E&Y(iqfE!`LrP#Y0|Qq~W=KRygs+cPa(=E}VoH8e
zs$NBI0Rsrw*jE%JCTFLXC?ut(XXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdi
zxhgx^GDXSWj?1RPsv@@_H?<^Dp&~aYuh^=>RtapbRbH_bNLXJ<0j#7X+g2&UH$cHT
zzbI9~M9)OeK-aY*v&=}zj!VI&C?(A*$i)q6L{Unbtx`rwNr9EVetCJhUb(Seeo?x<
zp{1pzzJZaxk&$juN}6tQWnM{Qg>GK4GRO#s87`^C$wiq3C7Jno3LrBRlk!VTY?YL_
z6ciMohF9bkzzxqUhK50Mey)B+Vu8M)o`F8HVo+RRR}GTEP+pRmhHyEG;UF1=@`~I7
zE9aur#FG4?ko^1{TP5Gb<f8oC)RfFb1-Hzi)bjkI>|zDq2(VK?HdzH^R;1=cxMb$0
z<`rk==h-S5nxIKWB1@WqB|(;2dFCdjr-o;ylw`m)A;djWGt)ClY?Ta=H24=~rskC-
zg2K>N$xulj6hHc)zzlM6v*WVS2gfETX6?YC3JO_T;!#UT3f<A*8VxRzLVzU2qp52&
zxJU{Ck`#}ouAvoNT!<!PYF>)1Qn`}7og|A%1_J{FOR<w@2nPoTM-4|x2Ll6BnWu|m
zh{pNcNzopc6D5w-&$d2VkiFV+qvU6SWz*8!RGTtyaT<%T^3N4$UBJ!Tt#qV&*9Wur
zTFSg{7}ClWPdMl@Z&kdvq;2LhgIgyprx&YluNODHaJBgJf!}-W?>+y!kN=;CQ_rQK
zEusxt%XHM)Jo0iiO;?5(wcmbtP2=jvy4Zp{<_1SDezcThm@-Y`)c!L&zTbW$-M_ur
z`(Qx9r+{hu9^MdC&W<zXHm=^e<<GC#x(lqYPI#MfYx>)LZ*GT_-g+Z#t*rL4W$miX
zS~1t;d-fU^Ctd5*y%%sZX7T#-v1J}%N<oQf=PV`Oio4%kaevK$&!V+QdT#AGwI<rJ
zYM;$Lb4%68&j%N!{(ZVj-9m8pVn5x|EE#WY6;EajZq{v1b!lz;mA^K6w(PFgDB>4L
zQfG@5oBbf3H*uqj#}tP&iDl0n)!IWe1-G_vIf$@6{<q8izCfPO1opDiOp1Ih3R@UU
z+aFeFP074bsyMOxaoDyscE`3gN6bADtTN@~HN{9aLGd$|j<dNx32=nDv>CKAhs|TW
zml3i_)#BJ0may0saajW^{`cYs7B_T=spSO7x#<Z9@;KaHyXaVW>@oG&QXP+@OEg5E
ze2+UEy(mR+$E?Z6+W%Sqh*uF3D&eRyG-o`rSbq9p`}&o8ZPW6un2FfDe|yTPc3a}F
zCrcOn{r9qO-||Y=V6(vU8|FGL7k(qCb8*U|&*?q=yKb8*OTOH7?bWF(eJ|do%3Ya%
z`qYIO_D9waa^)+^{=~QTOy&;d_!=emN&czBJ&qq;58v6hdugm~+n2UOx7|g-kBd|H
z!Z)@U(+fNQ%DNiv*}<9h{lHXSgA7HT){}WJwjKEL?b!X}7VrDY%--z-^=~{~{an^L
HB{Ts5qf$Jp

literal 0
HcmV?d00001

-- 
GitLab