diff --git a/.externalToolBuilders/mvnw clean generate-sources.launch b/.externalToolBuilders/mvnw clean generate-sources.launch index b62026656baf3b7c682922706ed85d0947c554e3..42706358f64815063d28c620f37283482a03ee3f 100644 --- a/.externalToolBuilders/mvnw clean generate-sources.launch +++ b/.externalToolBuilders/mvnw clean generate-sources.launch @@ -2,8 +2,9 @@ <launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType"> <stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/gitsearch/target/generated-sources" type="2"/> <item path="/gitsearch/target/generated-test-sources" type="2"/> </resources>}"/> <booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/> + <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/gitsearch/mvnw.cmd}"/> - <stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,"/> + <stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="generate-sources"/> <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/gitsearch}"/> diff --git a/.project b/.project index 1b4a4eb108290395d77debd5e395d53dd3576679..6c9cf5fa2bbdf2f2bd2c600d1a4712e2ff3d8b93 100644 --- a/.project +++ b/.project @@ -13,6 +13,10 @@ <key>LaunchConfigHandle</key> <value><project>/.externalToolBuilders/mvnw clean generate-sources.launch</value> </dictionary> + <dictionary> + <key>incclean</key> + <value>true</value> + </dictionary> </arguments> </buildCommand> <buildCommand> diff --git a/pom.xml b/pom.xml index 3e9f4cbac7056f793a8897120b4622b515ac2037..215d225f9956aee241ee9f6d9961848b2c24ea1d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ <groupId>at.ac.uibk.gitsearch</groupId> <artifactId>gitsearch</artifactId> - <version>0.1.0-SNAPSHOT</version> + <version>1.0.0</version> <packaging>jar</packaging> <name>Gitsearch</name> diff --git a/src/main/docker/gitsearch.yml b/src/main/docker/gitsearch.yml index 9613d87770ca2ad91791b04beeb3821c29a031cf..911b5bfe532df900af9e4a90e941d47e109046c6 100644 --- a/src/main/docker/gitsearch.yml +++ b/src/main/docker/gitsearch.yml @@ -9,7 +9,7 @@ services: - SPRING_PROFILES_ACTIVE=staging,swagger - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true - SPRING_DATASOURCE_URL=jdbc:mysql://sharing_mysql:3306/gitsearch?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true - - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application + - JHIPSTER_SLEEP=10 # gives time for other services to boot before the application - SPRING_DATA_JEST_URI=http://sharing_elasticsearch:9200 - SPRING_ELASTICSEARCH_REST_URIS=http://sharing_elasticsearch:9200 # see https://stackoverflow.com/questions/62676762/how-can-a-variable-set-in-the-docker-env-file-be-used-in-application-yml diff --git a/src/main/java/at/ac/uibk/gitsearch/config/LoggingConfiguration.java b/src/main/java/at/ac/uibk/gitsearch/config/LoggingConfiguration.java index f2f72771e4491a00bdc431396740b43847a1875e..73612f56e3bfe20a568a4499e681a2cfeb72dfee 100644 --- a/src/main/java/at/ac/uibk/gitsearch/config/LoggingConfiguration.java +++ b/src/main/java/at/ac/uibk/gitsearch/config/LoggingConfiguration.java @@ -55,10 +55,12 @@ public class LoggingConfiguration { // disabling some nasty debug logging context.getLogger("io.netty.util.internal.PlatformDependent0").setLevel(Level.INFO); + context.getLogger("javax.management.mbeanserver").setLevel(Level.INFO); context.getLogger("org.glassfish.jersey.client.ClientExecutorProvidersConfigurator").setLevel(Level.INFO); context.getLogger("org.springframework.boot.liquibase.SpringPackageScanClassResolver").setLevel(Level.INFO); // zu spät hier :-( context.getLogger("org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener").setLevel(Level.INFO); context.getLogger("org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener").setLevel(Level.INFO); context.getLogger("io.netty").setLevel(Level.INFO); + context.getLogger("org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter").setLevel(Level.DEBUG); } } diff --git a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java index 0fd01c3dafa7f3ee20e15751e6fb14e4805ff8da..255fe72fe0760130af0085097286be22c56d617e 100644 --- a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java +++ b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java @@ -4,7 +4,9 @@ import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VAL import java.net.URI; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Optional; import java.util.Set; @@ -47,6 +49,7 @@ import org.springframework.security.oauth2.core.OAuth2TokenValidator; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationExchange; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.oauth2.core.endpoint.PkceParameterNames; +import org.springframework.security.oauth2.core.oidc.OidcUserInfo; import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.security.oauth2.jwt.Jwt; @@ -402,9 +405,13 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { userService.createUser(u); } - +// oidcUser.getUserInfo().getClaims().put(TokenProvider.GITLAB_ACCESS_TOKEN, userRequest.getAccessToken()); + Map<String, Object> claims = new HashMap<>( oidcUser.getUserInfo().getClaims()); + claims.put(TokenProvider.GITLAB_ACCESS_TOKEN, userRequest.getAccessToken().getTokenValue()); + claims.put(TokenProvider.GITLAB_ACCESS_ISSUER, userRequest.getClientRegistration().getRegistrationId()); + OidcUserInfo userInfo = new OidcUserInfo(claims); - oidcUser = new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo()); + oidcUser = new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), userInfo); return oidcUser; }; diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java index f637b4b0c9a03b03967deb1e47945d68eac34ca2..00a593cc4de69f61b927ff80c2b4b6ae8178f893 100644 --- a/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java +++ b/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java @@ -31,14 +31,9 @@ public class GitLabRepository { GitLabApi gitLabApi = null; if(isPresent) { String idToken = accessTokenO.get(); - final Optional<String> gitLabAccessIssuer = tokenProvider.getGitLabAccessIssuer(); - if(! gitLabAccessIssuer.isPresent()) { - log.warn("accessToken defined, but no gitlabAccess Issuer found?"); - } else { - - gitLabApi = new GitLabApi(gitLabAccessIssuer.get(), TokenType.OAUTH2_ACCESS, idToken); - - } + gitLabApi = new GitLabApi(applicationProperties.getGitLab().getUrl(), TokenType.OAUTH2_ACCESS, idToken); + } else { + gitLabApi = new GitLabApi(applicationProperties.getGitLab().getUrl(), TokenType.PRIVATE, applicationProperties.getGitLab().getGeneralAccessToken()); } return gitLabApi; } diff --git a/src/main/java/at/ac/uibk/gitsearch/security/jwt/TokenProvider.java b/src/main/java/at/ac/uibk/gitsearch/security/jwt/TokenProvider.java index a22f0e4edde88d77aca1e1df1b75f429e575328d..9809956c0fa7ed8fbd861862da4f48e4a32be37c 100644 --- a/src/main/java/at/ac/uibk/gitsearch/security/jwt/TokenProvider.java +++ b/src/main/java/at/ac/uibk/gitsearch/security/jwt/TokenProvider.java @@ -21,6 +21,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -144,14 +145,18 @@ public class TokenProvider { .setSubject(authentication.getName()) .claim(AUTHORITIES_KEY, authorities); // copy from preToken - final Object userDetails = authentication.getDetails(); String authenticationToken = null; String authenticationIssuer = null; - if (userDetails instanceof Map<?,?>) { + if (authentication.getDetails() instanceof Map) { @SuppressWarnings("unchecked") - Map<String, String> userDetailsMap = (Map<String, String>) userDetails; - authenticationToken = userDetailsMap.get(GITLAB_ACCESS_TOKEN); - authenticationIssuer = userDetailsMap.get(GITLAB_ACCESS_ISSUER); + Map<String, String> details = (Map) authentication.getDetails(); + authenticationToken = details.get(GITLAB_ACCESS_TOKEN); + authenticationIssuer = details.get(GITLAB_ACCESS_ISSUER); + } + if (authentication.getPrincipal() instanceof DefaultOidcUser) { + DefaultOidcUser oidcInfo = (DefaultOidcUser) authentication.getPrincipal(); + authenticationToken = oidcInfo.getClaimAsString(GITLAB_ACCESS_TOKEN); + authenticationIssuer = oidcInfo.getClaimAsString(GITLAB_ACCESS_ISSUER); } if (authenticationToken!=null) { diff --git a/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java b/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java index 8af78b28425b35a2d42e0062a1d74279279232d2..efe0af09a277b9fcc099f22a9d31ebc9bccd990a 100644 --- a/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java +++ b/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java @@ -4,24 +4,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.codeability.sharing.plugins.api.ShoppingBasket; -import org.codeability.sharing.plugins.api.ShoppingBasket.ExerciseInfo; -import org.codeability.sharing.plugins.api.ShoppingBasket.UserInfo; import org.gitlab4j.api.GitLabApi; import org.gitlab4j.api.GitLabApiException; import org.gitlab4j.api.ProjectApi; -import org.gitlab4j.api.RepositoryApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -29,13 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; - import at.ac.uibk.gitsearch.repository.gitlab.GitLabRepository; -import at.ac.uibk.gitsearch.security.jwt.TokenProvider.GitLabAccessInfo; -import at.ac.uibk.gitsearch.service.dto.SearchResultDTO; /** * Service for exercise/course search results @@ -44,22 +28,14 @@ import at.ac.uibk.gitsearch.service.dto.SearchResultDTO; @Service public class GitlabService { - @Autowired - private PluginManagementService pluginManagementService; @Autowired private GitLabRepository gitLabRepository; - - - - - - private final Logger log = LoggerFactory.getLogger(ShoppingBasketService.class); public Boolean repositoryExists(String projectID) { - final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(Optional.empty()); + final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(); final ProjectApi gitLabProjectApi = gitLabApi.getProjectApi(); try{ return gitLabProjectApi.getProject(projectID) != null;} diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml index 5e9c46f28a0fcb14ee670081b29c1ca35f297be1..b5cf61124a4a7d950c7437b9bbea0141a2f1df8b 100644 --- a/src/main/resources/config/application-prod.yml +++ b/src/main/resources/config/application-prod.yml @@ -68,11 +68,11 @@ spring: client: provider: gitlabOidc: - issuer-uri: TODO https://sharing.codeability-austria.uibk.ac.at + issuer-uri: ${SECURITY_OAUTH2_CLIENT_PROVIDER_GITLABOIDC_ISSUERURI} registration: gitlabOidc: - client-id: TODO 149276ac11138d9ba72fb3cd12815e3fa2f372866df0eac0f7d1aae5fdffea24 - client-secret: TODO 6f480635241f420a361581f4837594ea6f48f5ee6f515c1aa89f325dd922dbb0 + client-id: ${SECURITY_OAUTH2_CLIENT_REGISTRATION_GITLABOIDC_CLIENTID} + client-secret: ${SECURITY_OAUTH2_CLIENT_REGISTRATION_GITLABOIDC_CLIENTSECRET} # =================================================================== @@ -123,14 +123,10 @@ jhipster: # - In the JHipster Registry (which includes a Spring Cloud Config server) # - In a separate `application-prod.yml` file, in the same folder as your executable JAR file # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable - base64-secret: ZTY3OGIwZWZhMzdhYTQ2NjAwNTdlNDQ2NWM4YjQyMzlhMWVkMTJlYTExYzMwMzBjOWIzM2E1OTRmZWZkZmYzYzZhNWQ5N2EzZjMyNTFkMjM0ZjNmOWRhYTYzNGEzZDE3NThkYTNmZGVmNTQ1MmRlZjg1YWY4NTU4OGVmNDBkZDI= + base64-secret: ${JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64SECRET} # Token is valid 24 hours token-validity-in-seconds: 86400 token-validity-in-seconds-for-remember-me: 2592000 - oauth2: -# TODO: audience seems not really relevant, could be omitted? It is identical with client-id above - audience: - - TODO or omit mail: # specific JHipster mail property, for standard properties see MailProperties base-url: http://my-server-url-to-change # Modify according to your server's URL metrics: @@ -158,8 +154,7 @@ jhipster: application: registeredPlugins: - - "http://localhost:8081/api/sharing/config" - - "http://localhost:8082/api/sharingPluginConfig" + - "https://artemis.codeability.uibk.ac.at/api/sharing/config" gitlab: url: https://sharing-codeability.uibk.ac.at/ - generalAccessToken: ${APPLICATION_GITLAB_GENERALACCESSTOKEN} \ No newline at end of file + generalAccessToken: ${APPLICATION_GITLAB_GENERALACCESSTOKEN}