From f0b95daad30459d5516a845b969cc2486ffe8ca9 Mon Sep 17 00:00:00 2001
From: Mirco Nasuti <mirco.nasuti@chuv.ch>
Date: Fri, 8 Jul 2016 15:26:46 +0200
Subject: [PATCH] big refactoring step 1

---
 config/application.yml                        | 21 ++++--
 pom.xml                                       | 73 +++----------------
 src/main/java/org/hbp/mip/MIPApplication.java | 26 ++++---
 src/main/resources/hibernate.cfg.xml          | 13 ----
 .../resources/spring/application-context.xml  | 36 ---------
 .../java/org/hbp/mip/MIPApplicationTests.java |  2 +-
 6 files changed, 42 insertions(+), 129 deletions(-)
 delete mode 100644 src/main/resources/spring/application-context.xml

diff --git a/config/application.yml b/config/application.yml
index 6f752d822..f1470a8e9 100644
--- a/config/application.yml
+++ b/config/application.yml
@@ -1,9 +1,14 @@
-# Configuration for the portal running inside a Docker container for development
+# Configuration for the portal running inside a Docker container
 
-connection:
-  url: "jdbc:postgresql://portaldb:5432/postgres"
-  username: "postgres"
-  password: "test"
+spring:
+  datasource:
+    url: jdbc:postgresql://portaldb:5432/postgres
+    username: postgres
+    password: test
+    driver-class-name: org.postgresql.Driver
+  jpa:
+    hibernate:
+      dialect: org.hibernate.dialect.PostgreSQL9Dialect
 
 security:
   enabled: false
@@ -17,9 +22,6 @@ hbp:
     tokenName: oauth_token
     authenticationScheme: query
     clientAuthenticationScheme: form
-    # use-current-uri: false  # For both production and HBPS1 deployments
-    # pre-established-redirect-uri: https://mip.humanbrainproject.eu/services/login/hbp  # For production deployment
-    # pre-established-redirect-uri: http://hbps1.chuv.ch/services/login/hbp  # For HBPS1 deployment
   resource:
     userInfoUri: https://services.humanbrainproject.eu/oidc/userinfo
 
@@ -45,3 +47,6 @@ workflow:
   miningMipUrl: http://dockerhost:8087/mining
   miningExaremeUrl: http://hbps2.chuv.ch:9090/mining/query
 
+frontend:
+  redirect:
+    url: http://frontend/home
diff --git a/pom.xml b/pom.xml
index f568cd012..79d2b9802 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,59 +17,17 @@
         <version>1.3.2.RELEASE</version>
         <relativePath /> <!-- lookup parent from repository -->
     </parent>
-    <profiles>
-        <profile>
-            <id>prod</id>
-            <properties>
-                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-                <java.version>1.8</java.version>
-                <connection.driver_class>org.postgresql.Driver</connection.driver_class>
-                <connection.url>jdbc:postgresql://hbpmdw1.chuv.ch:31432/portal</connection.url>
-                <connection.username>portal</connection.username>
-                <connection.password>iaezXODVLb1e70I</connection.password>
-                <hibernate.dialect>org.hibernate.dialect.PostgreSQL82Dialect</hibernate.dialect>
-                <schema.deploy>false</schema.deploy>
-                <frontend.redirect>https://mip.humanbrainproject.eu/home</frontend.redirect>
-                <flyway.url>${connection.url}</flyway.url>
-                <flyway.user>${connection.username}</flyway.user>
-                <flyway.password>${connection.password}</flyway.password>
-            </properties>
-        </profile>
-        <profile>
-            <id>dev</id>
-            <properties>
-                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-                <java.version>1.8</java.version>
-                <connection.driver_class>org.postgresql.Driver</connection.driver_class>
-                <connection.url>jdbc:postgresql://portaldb:5432/postgres</connection.url>
-                <connection.username>postgres</connection.username>
-                <connection.password>test</connection.password>
-                <hibernate.dialect>org.hibernate.dialect.PostgreSQL82Dialect</hibernate.dialect>
-                <schema.deploy>false</schema.deploy>
-                <frontend.redirect>http://frontend/home</frontend.redirect>
-                <flyway.url>${connection.url}</flyway.url>
-                <flyway.user>${connection.username}</flyway.user>
-                <flyway.password>${connection.password}</flyway.password>
-            </properties>
-        </profile>
-        <profile>
-            <id>hbps1</id>
-            <properties>
-                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-                <java.version>1.8</java.version>
-                <connection.driver_class>org.postgresql.Driver</connection.driver_class>
-                <connection.url>jdbc:postgresql://portaldb:5432/postgres</connection.url>
-                <connection.username>postgres</connection.username>
-                <connection.password>test</connection.password>
-                <hibernate.dialect>org.hibernate.dialect.PostgreSQL82Dialect</hibernate.dialect>
-                <schema.deploy>false</schema.deploy>
-                <frontend.redirect>http://hbps1.chuv.ch/home</frontend.redirect>
-                <flyway.url>${connection.url}</flyway.url>
-                <flyway.user>${connection.username}</flyway.user>
-                <flyway.password>${connection.password}</flyway.password>
-            </properties>
-        </profile>
-    </profiles>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>1.8</java.version>
+        <asciidoctor.maven.plugin.version>1.5.3</asciidoctor.maven.plugin.version>
+        <asciidoctorj.pdf.version>1.5.0-alpha.11</asciidoctorj.pdf.version>
+        <asciidoctorj.version>1.5.4</asciidoctorj.version>
+        <sonar.host.url>http://dockerhost:9000</sonar.host.url>
+        <sonar.projectName>MIP Backend</sonar.projectName>
+        <sonar.sources>src/main/java/</sonar.sources>
+    </properties>
 
     <dependencies>
         <dependency>
@@ -176,14 +134,7 @@
         </pluginRepository>
     </pluginRepositories>
 
-    <properties>
-        <asciidoctor.maven.plugin.version>1.5.3</asciidoctor.maven.plugin.version>
-        <asciidoctorj.pdf.version>1.5.0-alpha.11</asciidoctorj.pdf.version>
-        <asciidoctorj.version>1.5.4</asciidoctorj.version>
-        <sonar.host.url>http://dockerhost:9000</sonar.host.url>
-        <sonar.projectName>MIP Backend</sonar.projectName>
-        <sonar.sources>src/main/java/</sonar.sources>
-    </properties>
+
 
     <build>
         <resources>
diff --git a/src/main/java/org/hbp/mip/MIPApplication.java b/src/main/java/org/hbp/mip/MIPApplication.java
index f6d5aeb3d..3cf85c2c4 100644
--- a/src/main/java/org/hbp/mip/MIPApplication.java
+++ b/src/main/java/org/hbp/mip/MIPApplication.java
@@ -18,11 +18,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
+import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices;
 import org.springframework.boot.context.embedded.FilterRegistrationBean;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.ImportResource;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -31,6 +31,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.oauth2.client.OAuth2ClientContext;
+import org.springframework.security.oauth2.client.OAuth2RestTemplate;
 import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter;
 import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter;
 import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
@@ -39,6 +40,7 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.E
 import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.security.web.access.channel.ChannelProcessingFilter;
 import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
 import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
 import org.springframework.security.web.csrf.CsrfFilter;
 import org.springframework.security.web.csrf.CsrfToken;
@@ -71,7 +73,6 @@ import java.security.Principal;
 
 @SpringBootApplication
 @Configuration
-@ImportResource("classpath:spring/application-context.xml")
 @RestController
 @EnableOAuth2Client
 @EnableSwagger2
@@ -83,12 +84,6 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     @Autowired
     OAuth2ClientContext oauth2ClientContext;
 
-    @Autowired
-    HttpSessionCsrfTokenRepository httpSessionCsrfTokenRepository;
-
-    @Autowired
-    OAuth2ClientAuthenticationProcessingFilter hbpFilter;
-
 
     public static void main(String[] args) {
         SpringApplication.run(MIPApplication.class, args);
@@ -216,7 +211,16 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
                 .and().logout().logoutUrl("/logout").permitAll()
                 .and().csrf().ignoringAntMatchers("/logout").csrfTokenRepository(csrfTokenRepository())
                 .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
-                .addFilterBefore(hbpFilter, BasicAuthenticationFilter.class);
+                .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
+    }
+
+    private Filter ssoFilter() {
+        OAuth2ClientAuthenticationProcessingFilter hbpFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/hbp");
+        OAuth2RestTemplate hbpTemplate = new OAuth2RestTemplate(hbp(), oauth2ClientContext);
+        hbpFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("http://frontend/#/home"));
+        hbpFilter.setRestTemplate(hbpTemplate);
+        hbpFilter.setTokenServices(new UserInfoTokenServices(hbpResource().getUserInfoUri(), hbp().getClientId()));
+        return hbpFilter;
     }
 
     @Bean
@@ -261,7 +265,9 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     }
 
     private CsrfTokenRepository csrfTokenRepository() {
-        return httpSessionCsrfTokenRepository;
+        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
+        repository.setHeaderName("X-XSRF-TOKEN");
+        return repository;
     }
 
 }
diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml
index e769d47db..500d34155 100644
--- a/src/main/resources/hibernate.cfg.xml
+++ b/src/main/resources/hibernate.cfg.xml
@@ -5,18 +5,6 @@
 
 <hibernate-configuration>
     <session-factory>
-        <property name="connection.driver_class">${connection.driver_class}</property>
-        <property name="connection.url">${connection.url}</property>
-        <property name="connection.username">${connection.username}</property>
-        <property name="connection.password">${connection.password}</property>
-        <property name="hibernate.format_sql">true</property>
-        <property name="connection.pool_size">1</property>
-        <property name="hibernate.dialect">${hibernate.dialect}</property>
-        <property name="current_session_context_class">thread</property>
-        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
-        <property name="hibernate.show_sql">false</property>
-        <property name="hibernate.hbm2ddl.auto">update</property>
-
         <mapping class="org.hbp.mip.model.Article"/>
         <mapping class="org.hbp.mip.model.Dataset"/>
         <mapping class="org.hbp.mip.model.Model"/>
@@ -31,6 +19,5 @@
         <mapping class="org.hbp.mip.model.Config"/>
         <mapping class="org.hbp.mip.model.App"/>
         <mapping class="org.hbp.mip.model.Vote"/>
-
     </session-factory>
 </hibernate-configuration>
diff --git a/src/main/resources/spring/application-context.xml b/src/main/resources/spring/application-context.xml
deleted file mode 100644
index 9d283991f..000000000
--- a/src/main/resources/spring/application-context.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:context="http://www.springframework.org/schema/context"
-	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
-	
-	<context:component-scan base-package="org.hbp.mip" />
-
-	<bean id="httpSessionCsrfTokenRepository" class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository">
-		<property name="headerName" value="X-XSRF-TOKEN" />
-	</bean>
-	
-	<bean id="hbpFilter" class="org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter">
-		<constructor-arg value="/login/hbp"></constructor-arg>
-		<property name="authenticationSuccessHandler">
-			<bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
-				<property name="defaultTargetUrl" value="${frontend.redirect}" />
-			</bean>
-		</property>
-		<property name="restTemplate">
-			<bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate">
-				<constructor-arg name="resource" ref="hbp" />
-				<constructor-arg name="context" ref="oauth2ClientContext" />
-			</bean>
-		</property>
-		<property name="tokenServices">
-			<bean class="org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices">
-				<constructor-arg name="clientId" value="996f97c5-a3ca-460e-b18b-00df3e2be89a" />
-				<constructor-arg name="userInfoEndpointUrl" value="https://services.humanbrainproject.eu/oidc/userinfo" />
-			</bean>
-		</property>
-	</bean>
-	
-
-</beans>
diff --git a/src/test/java/org/hbp/mip/MIPApplicationTests.java b/src/test/java/org/hbp/mip/MIPApplicationTests.java
index bfe983216..75e1991fa 100644
--- a/src/test/java/org/hbp/mip/MIPApplicationTests.java
+++ b/src/test/java/org/hbp/mip/MIPApplicationTests.java
@@ -22,6 +22,6 @@ import org.springframework.test.context.web.WebAppConfiguration;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @WebAppConfiguration
-@SpringApplicationConfiguration(classes=MIPApplication.class, locations={"classpath:spring/application-context.xml"})
+@SpringApplicationConfiguration(classes=MIPApplication.class)
 public class MIPApplicationTests {
 }
-- 
GitLab