blob: cdddb077fd90f928946485785746bc42b836eab0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.catalog.config;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.catalog.api.dao.CatalogDao;
import org.apache.logging.log4j.catalog.api.util.CatalogEventFilter;
import org.apache.logging.log4j.catalog.git.dao.GitCatalogDao;
import org.apache.logging.log4j.catalog.security.LocalAuthorizationInterceptor;
import org.eclipse.jgit.api.TransportConfigCallback;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.Transport;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FS;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.core.annotation.Order;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafView;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
@Configuration
@ComponentScan(basePackages = {"org.apache.logging.log4j.catalog"})
//@PropertySource(value = "classpath:catalog-${env:}config.properties", ignoreResourceNotFound = true)
public class WebMvcAppContext extends WebMvcConfigurerAdapter implements ApplicationContextAware {
private static final Logger LOGGER = LogManager.getLogger(WebMvcAppContext.class);
@Autowired
ConfigurationService configurationService;
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
registry.addResourceHandler("/images/**").addResourceLocations("classpath:/static/images/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("products").setViewName("products");
registry.addViewController("categories").setViewName("categories");
registry.addViewController("events").setViewName("events");
registry.addViewController("attributes").setViewName("attributes");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jsonMessageConverter());
}
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(true);
return proxyCreator;
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
@Bean
public LocalAuthorizationInterceptor localAuthorizationInterceptor() {
return new LocalAuthorizationInterceptor(configurationService.getCatalogServiceAuthToken());
}
public ObjectMapper objectMapper() {
LOGGER.debug("Creating custom ObjectMapper");
ObjectMapper mapper = JsonObjectMapperFactory.createMapper();
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("catalogEvent", new CatalogEventFilter());
mapper.setFilterProvider(filterProvider);
return mapper;
}
public MappingJackson2HttpMessageConverter jsonMessageConverter() {
return new MappingJackson2HttpMessageConverter(objectMapper());
}
@Value("${gitUserName}")
private String gitUserName;
@Value("${gitPassword:#{null}}")
private String gitPassword;
@Value("${gitPassPhrase:#{null}}")
private String gitPassPhrase;
@Value("${localRepoUrl:#{null}}")
private String localRepoUrl;
@Value("${branch:#{null}}")
private String branch;
@Value("${privateKeyPath:#{null}}")
private String privateKeyPath;
@Value("${remoteRepoUrl}")
private String remoteRepoUrl;
@Value("${remoteRepoCatalogPath:#{null}}")
private String remoteRepoCatalogPath;
@Bean
public CatalogDao catalogDao() {
GitCatalogDao dataSource = new GitCatalogDao();
if (isNotBlank(gitUserName) && isNotBlank(gitPassword)) {
dataSource.setCredentialsProvider(new UsernamePasswordCredentialsProvider(gitUserName, gitPassword));
}
if (isNotBlank(remoteRepoUrl)) {
try {
URI uri = new URI(remoteRepoUrl);
if (uri.getScheme().equalsIgnoreCase("SSH")) {
TransportConfigCallback transportConfigCallback = new TransportConfigCallback() {
final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected JSch createDefaultJSch( FS fs ) throws JSchException {
JSch defaultJSch = super.createDefaultJSch( fs );
if (isNotBlank(privateKeyPath)) {
defaultJSch.addIdentity(privateKeyPath);
}
return defaultJSch;
}
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
if (isNotBlank(gitPassPhrase)) {
session.setUserInfo(new UserInfo() {
@Override
public String getPassphrase() {
return gitPassPhrase;
}
@Override
public String getPassword() {return null;}
@Override
public boolean promptPassword(String message) {return false;}
@Override
public boolean promptPassphrase(String message) {return true;}
@Override
public boolean promptYesNo(String message) {return false;}
@Override
public void showMessage(String message) {}
});
}
}
};
@Override
public void configure(Transport transport) {
SshTransport sshTransport = ( SshTransport )transport;
sshTransport.setSshSessionFactory( sshSessionFactory );
}
};
dataSource.setTransportConfigCallback(transportConfigCallback);
}
} catch (URISyntaxException ex) {
LOGGER.error("Invalid URI {}:", remoteRepoUrl, ex);
}
} else {
LOGGER.error("No remote repo URL provided.");
}
if (isNotBlank(branch)) {
dataSource.setBranch(branch);
}
if (isNotBlank(localRepoUrl)) {
dataSource.setLocalRepoPath(localRepoUrl);
} else {
String localRepoPath = System.getProperty("java.io.tmpdir") + "/audit/catalog";
File file = new File(localRepoPath);
File parent = file.getParentFile();
parent.mkdirs();
dataSource.setLocalRepoPath(localRepoPath);
}
dataSource.setRemoteRepoUri(remoteRepoUrl);
if (isNotBlank(remoteRepoCatalogPath)) {
dataSource.setCatalogPath(remoteRepoCatalogPath);
}
return dataSource;
}
}