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/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..8f2e37b6392db1ee2633abb58a69f6531a90d6af 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 @@ -14,6 +14,7 @@ import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -21,9 +22,11 @@ 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; +import at.ac.uibk.gitsearch.config.ApplicationProperties; import io.github.jhipster.config.JHipsterProperties; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; @@ -87,10 +90,14 @@ public class TokenProvider { private long tokenValidityInMillisecondsForRememberMe; + @Autowired private final JHipsterProperties jHipsterProperties; + @Autowired + private final ApplicationProperties applicationProperties; - public TokenProvider(JHipsterProperties jHipsterProperties) { + public TokenProvider(JHipsterProperties jHipsterProperties, ApplicationProperties applicationProperties) { this.jHipsterProperties = jHipsterProperties; + this.applicationProperties = applicationProperties; } @PostConstruct @@ -144,14 +151,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) { @@ -256,7 +267,7 @@ public class TokenProvider { if(accessToken.isPresent()) { final Optional<String> accessIssuer = getGitLabAccessIssuer(); if(accessIssuer.isPresent()) { - return Optional.of(new GitLabAccessInfo(accessToken.get(), accessIssuer.get(), getCurrentPrincipal()) ); + return Optional.of(new GitLabAccessInfo(accessToken.get(), applicationProperties.getGitLab().getUrl(), getCurrentPrincipal()) ); } } return Optional.empty(); 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/webapp/app/search/search.component.ts b/src/main/webapp/app/search/search.component.ts index 9e7407b6a2d1f1951ec077e0c2f65a800419b801..65502041d93b5f8903e5b665777f20e6d9de5236 100644 --- a/src/main/webapp/app/search/search.component.ts +++ b/src/main/webapp/app/search/search.component.ts @@ -30,6 +30,7 @@ export class SearchComponent implements OnInit { searchInput.page = 0; this.searchInput = searchInput; this.results = []; + this.hitCount = 0; this.search(); } diff --git a/src/main/webapp/app/search/service/search-service.ts b/src/main/webapp/app/search/service/search-service.ts index 096425a46930084f2e65d9b7240781bc1869559e..64719cff3cbd53c344702dba2f22dec85c87260b 100644 --- a/src/main/webapp/app/search/service/search-service.ts +++ b/src/main/webapp/app/search/service/search-service.ts @@ -40,7 +40,7 @@ export class SearchService { } downloadFile(projectID: string): Observable<Object> { - return this.http.post(SERVER_API_URL + 'download/${projectID}', { + return this.http.post(SERVER_API_URL + 'download/' + projectID, { observe: 'response', responseType: 'blob', }); diff --git a/src/main/webapp/app/shared/login/login.component.html b/src/main/webapp/app/shared/login/login.component.html index 4fd8e77d08a6f12606c11049919b05b5df766003..a81c8c83d1bd566bc386ac8c16bd7d06f9f6bbec 100644 --- a/src/main/webapp/app/shared/login/login.component.html +++ b/src/main/webapp/app/shared/login/login.component.html @@ -39,9 +39,10 @@ </form> <br/> <div *ngFor="let config of configs"> - <img src="{{'oauth2.'+config.registrationId + '.icon'| translate}}" alt="oAuth2Image"/> + <img src="{{'oauth2.'+config.registrationId + '.icon'| translate}}" alt="oAuth2Image" style="width: 50px;"/> <button type="submit" class="btn btn-primary" (click)="loginWithGitLab(config.registrationId)" jhiTranslate="oauth2.{{config.registrationId}}.text">Login With GitLab</button> </div> + <!-- <div class="mt-3 alert alert-warning"> <a class="alert-link" (click)="requestResetPassword()" jhiTranslate="login.password.forgot">Did you forget your password?</a> </div> @@ -50,6 +51,7 @@ <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span> <a class="alert-link" (click)="register()" jhiTranslate="global.messages.info.register.link">Register a new account</a> </div> + --> </div> </div> </div> diff --git a/src/main/webapp/app/shared/model/exercise.model.ts b/src/main/webapp/app/shared/model/exercise.model.ts index 5a54565fd2419a3d6f138d4d44941e6578bd3edf..d4b781889fdfd2138a1833eff5b81ef5b92ab4b7 100644 --- a/src/main/webapp/app/shared/model/exercise.model.ts +++ b/src/main/webapp/app/shared/model/exercise.model.ts @@ -56,7 +56,7 @@ export interface Exercise { lastUpdate: string; originalResult: SearchResultDTO; - //thesis + // thesis views: number; downloads: number; } diff --git a/src/main/webapp/app/teaserContent/teaserContent.component.html b/src/main/webapp/app/teaserContent/teaserContent.component.html index bc3c3d65adf969c3ffe926fe752efdecc8554494..8ae15560c830bbb6dae251ebe0c60c696309bf4b 100644 --- a/src/main/webapp/app/teaserContent/teaserContent.component.html +++ b/src/main/webapp/app/teaserContent/teaserContent.component.html @@ -1,21 +1,21 @@ <div class="row" style="width: 80%;margin-left: auto; margin-right: auto;"> <div class="col-sm-3"> - <p style="padding-left: 30px;"><strong>Keywords</strong></p> + <p style="padding-left: 30px;"><strong jhiTranslate="teaser.headings.keywords">Keywords</strong></p> <ul style="list-style-type: circle;"> <li *ngFor="let keyWord of keywords"><a (click)="clickKeyword(keyWord.target)" style="cursor:pointer;">{{keyWord.target}} ({{keyWord.hitCount}})</a></li> </ul> </div> <div class="col-sm-3"> - <p style="padding-left: 30px;"><strong>Programming Languages</strong></p> + <p style="padding-left: 30px;"><strong jhiTranslate="teaser.headings.programmingLanguages">Programming Languages</strong></p> <ul style="list-style-type: circle;"> <li *ngFor="let programmingLanguage of programmingLanguages"><a (click)="clickLanguage(programmingLanguage.target)" style="cursor:pointer;">{{programmingLanguage.target}} ({{programmingLanguage.hitCount}})</a></li> </ul> </div> <div class="col-sm-3"> - <p style="padding-left: 30px;"><strong>Contributors</strong></p> + <p style="padding-left: 30px;"><strong jhiTranslate="teaser.headings.contributors">Contributors</strong></p> <ul style="list-style-type: circle;"> <li *ngFor="let contributor of contributors"><a (click)="clickContributor(contributor.target)" style="cursor:pointer;">{{contributor.target}} ({{contributor.hitCount}})</a></li> </ul> </div> -</div> \ No newline at end of file +</div> diff --git a/src/main/webapp/i18n/de/teaser.json b/src/main/webapp/i18n/de/teaser.json new file mode 100644 index 0000000000000000000000000000000000000000..6be7e8cc01729b46f45c050dcd7cedb5434f1894 --- /dev/null +++ b/src/main/webapp/i18n/de/teaser.json @@ -0,0 +1,9 @@ +{ + "teaser": { + "headings": { + "keywords": "Schlüsselwörter", + "programmingLanguages": "Programmiersprachen", + "contributors": "Mitwirkende" + } + } +} diff --git a/src/main/webapp/i18n/en/teaser.json b/src/main/webapp/i18n/en/teaser.json new file mode 100644 index 0000000000000000000000000000000000000000..9fe47b7c9db540c5367efe490e59b0c85da36459 --- /dev/null +++ b/src/main/webapp/i18n/en/teaser.json @@ -0,0 +1,9 @@ +{ + "teaser": { + "headings": { + "keywords": "Keywords", + "programmingLanguages": "Programming languages", + "contributors": "Contributors" + } + } +} diff --git a/src/test/java/at/ac/uibk/gitsearch/security/jwt/JWTFilterTest.java b/src/test/java/at/ac/uibk/gitsearch/security/jwt/JWTFilterTest.java index 15cf8cb3f841afe178fa5dec62e8a6b20a30e7e5..d05bbdf8e4a2dfd1ebb5b49f97d73f15dfeec9dd 100644 --- a/src/test/java/at/ac/uibk/gitsearch/security/jwt/JWTFilterTest.java +++ b/src/test/java/at/ac/uibk/gitsearch/security/jwt/JWTFilterTest.java @@ -1,5 +1,6 @@ package at.ac.uibk.gitsearch.security.jwt; +import at.ac.uibk.gitsearch.config.ApplicationProperties; import at.ac.uibk.gitsearch.security.AuthoritiesConstants; import io.github.jhipster.config.JHipsterProperties; import io.jsonwebtoken.io.Decoders; @@ -29,7 +30,8 @@ public class JWTFilterTest { @BeforeEach public void setup() { JHipsterProperties jHipsterProperties = new JHipsterProperties(); - tokenProvider = new TokenProvider(jHipsterProperties); + ApplicationProperties appProperties = new ApplicationProperties(); + tokenProvider = new TokenProvider(jHipsterProperties, appProperties); ReflectionTestUtils.setField(tokenProvider, "key", Keys.hmacShaKeyFor(Decoders.BASE64 .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"))); diff --git a/src/test/java/at/ac/uibk/gitsearch/security/jwt/TokenProviderTest.java b/src/test/java/at/ac/uibk/gitsearch/security/jwt/TokenProviderTest.java index 54720fa7691414f4bd5a373054cc6129d04a2bd6..8d969ed0b9b6324c3310a085c2c3fe76f4393887 100644 --- a/src/test/java/at/ac/uibk/gitsearch/security/jwt/TokenProviderTest.java +++ b/src/test/java/at/ac/uibk/gitsearch/security/jwt/TokenProviderTest.java @@ -1,5 +1,6 @@ package at.ac.uibk.gitsearch.security.jwt; +import at.ac.uibk.gitsearch.config.ApplicationProperties; import at.ac.uibk.gitsearch.security.AuthoritiesConstants; import java.security.Key; @@ -30,7 +31,8 @@ public class TokenProviderTest { @BeforeEach public void setup() { - tokenProvider = new TokenProvider( new JHipsterProperties()); + ApplicationProperties appProperties = new ApplicationProperties(); + tokenProvider = new TokenProvider( new JHipsterProperties(), appProperties); key = Keys.hmacShaKeyFor(Decoders.BASE64 .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"));