You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ArchivaProxyRegistry.java 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package org.apache.archiva.proxy.base;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. import org.apache.archiva.configuration.provider.ArchivaConfiguration;
  20. import org.apache.archiva.configuration.model.NetworkProxyConfiguration;
  21. import org.apache.archiva.configuration.model.ProxyConnectorConfiguration;
  22. import org.apache.archiva.policies.Policy;
  23. import org.apache.archiva.policies.PolicyOption;
  24. import org.apache.archiva.policies.PolicyUtil;
  25. import org.apache.archiva.proxy.ProxyRegistry;
  26. import org.apache.archiva.proxy.model.NetworkProxy;
  27. import org.apache.archiva.proxy.model.ProxyConnector;
  28. import org.apache.archiva.proxy.model.RepositoryProxyHandler;
  29. import org.apache.archiva.repository.base.ArchivaRepositoryRegistry;
  30. import org.apache.archiva.repository.ManagedRepository;
  31. import org.apache.archiva.repository.RemoteRepository;
  32. import org.apache.archiva.repository.RepositoryType;
  33. import org.apache.archiva.event.EventHandler;
  34. import org.apache.archiva.repository.event.RepositoryRegistryEvent;
  35. import org.slf4j.Logger;
  36. import org.slf4j.LoggerFactory;
  37. import org.springframework.stereotype.Service;
  38. import javax.annotation.PostConstruct;
  39. import javax.inject.Inject;
  40. import java.util.*;
  41. import java.util.function.Function;
  42. import java.util.stream.Collectors;
  43. /**
  44. * Default proxy registry implementation. Uses the archiva configuration for accessing and storing the
  45. * proxy information.
  46. *
  47. */
  48. @SuppressWarnings( "SpringJavaInjectionPointsAutowiringInspection" )
  49. @Service("proxyRegistry#default")
  50. public class ArchivaProxyRegistry implements ProxyRegistry, EventHandler<RepositoryRegistryEvent> {
  51. private static final Logger log = LoggerFactory.getLogger(ArchivaProxyRegistry.class);
  52. @Inject
  53. ArchivaConfiguration archivaConfiguration;
  54. @Inject
  55. List<RepositoryProxyHandler> repositoryProxyHandlers;
  56. @Inject
  57. List<Policy> policies;
  58. @Inject
  59. ArchivaRepositoryRegistry repositoryRegistry;
  60. private Map<String, NetworkProxy> networkProxyMap = new HashMap<>();
  61. private Map<RepositoryType, List<RepositoryProxyHandler>> handlerMap = new HashMap<>();
  62. private ProxyConnectorOrderComparator comparator = ProxyConnectorOrderComparator.getInstance();
  63. private Map<String, List<ProxyConnector>> connectorMap = new HashMap<>();
  64. private List<ProxyConnector> connectorList = new ArrayList<>();
  65. private Map<Policy, PolicyOption> policyMap = new HashMap<>( );
  66. @PostConstruct
  67. private void init() {
  68. if (repositoryProxyHandlers == null) {
  69. repositoryProxyHandlers = new ArrayList<>();
  70. }
  71. updateHandler();
  72. updateConnectors();
  73. updateNetworkProxies();
  74. repositoryRegistry.registerEventHandler(RepositoryRegistryEvent.RELOADED, this);
  75. }
  76. private ArchivaConfiguration getArchivaConfiguration() {
  77. return archivaConfiguration;
  78. }
  79. private void updateNetworkProxies() {
  80. this.networkProxyMap.clear();
  81. List<NetworkProxyConfiguration> networkProxies = getArchivaConfiguration().getConfiguration().getNetworkProxies();
  82. for (NetworkProxyConfiguration networkProxyConfig : networkProxies) {
  83. String key = networkProxyConfig.getId();
  84. NetworkProxy proxy = new NetworkProxy();
  85. proxy.setProtocol(networkProxyConfig.getProtocol());
  86. proxy.setHost(networkProxyConfig.getHost());
  87. proxy.setPort(networkProxyConfig.getPort());
  88. proxy.setUsername(networkProxyConfig.getUsername());
  89. proxy.setPassword(networkProxyConfig.getPassword()==null? new char[0] : networkProxyConfig.getPassword().toCharArray());
  90. proxy.setUseNtlm(networkProxyConfig.isUseNtlm());
  91. this.networkProxyMap.put(key, proxy);
  92. }
  93. for (RepositoryProxyHandler proxyHandler : repositoryProxyHandlers) {
  94. proxyHandler.setNetworkProxies(this.networkProxyMap);
  95. }
  96. }
  97. private void updateHandler( ) {
  98. for (RepositoryProxyHandler handler : repositoryProxyHandlers) {
  99. List<RepositoryType> types = handler.supports();
  100. for (RepositoryType type : types) {
  101. if (!handlerMap.containsKey(type)) {
  102. handlerMap.put(type, new ArrayList<>());
  103. }
  104. handlerMap.get(type).add(handler);
  105. }
  106. handler.setPolicies( policies );
  107. }
  108. }
  109. private void updateConnectors() {
  110. List<ProxyConnectorConfiguration> proxyConnectorConfigurations =
  111. getArchivaConfiguration().getConfiguration().getProxyConnectors();
  112. connectorList = proxyConnectorConfigurations.stream()
  113. .map(this::buildProxyConnector)
  114. .filter(Optional::isPresent)
  115. .map(Optional::get)
  116. .sorted(comparator).collect(Collectors.toList());
  117. connectorMap = connectorList.stream().collect(Collectors.groupingBy(a -> a.getSourceRepository().getId()));
  118. for (RepositoryProxyHandler handler : repositoryProxyHandlers) {
  119. handler.setProxyConnectors( connectorList );
  120. }
  121. }
  122. private Map<Policy, PolicyOption> getPolicyMap(ProxyConnectorConfiguration configuration) {
  123. Map<String, String> policyConfig = configuration.getPolicies( );
  124. return policies.stream().collect( Collectors.toMap( Function.identity(), p -> PolicyUtil.findOption( policyConfig.get(p.getId()), p ) ) );
  125. }
  126. private Optional<ProxyConnector> buildProxyConnector(ProxyConnectorConfiguration configuration) {
  127. ProxyConnector proxyConnector = new ProxyConnector();
  128. proxyConnector.setOrder(configuration.getOrder());
  129. proxyConnector.setBlacklist(configuration.getBlackListPatterns());
  130. proxyConnector.setWhitelist(configuration.getWhiteListPatterns());
  131. if (configuration.isDisabled()) {
  132. proxyConnector.disable();
  133. } else {
  134. proxyConnector.enable();
  135. }
  136. proxyConnector.setPolicies(getPolicyMap( configuration ));
  137. proxyConnector.setProperties(configuration.getProperties());
  138. proxyConnector.setProxyId(configuration.getProxyId());
  139. ManagedRepository srcRepo = repositoryRegistry.getManagedRepository(configuration.getSourceRepoId());
  140. if (srcRepo==null) {
  141. return Optional.empty();
  142. }
  143. proxyConnector.setSourceRepository(srcRepo);
  144. RemoteRepository targetRepo = repositoryRegistry.getRemoteRepository(configuration.getTargetRepoId());
  145. if (targetRepo==null) {
  146. return Optional.empty();
  147. }
  148. proxyConnector.setTargetRepository(targetRepo);
  149. return Optional.of(proxyConnector);
  150. }
  151. @Override
  152. public NetworkProxy getNetworkProxy(String id) {
  153. return this.networkProxyMap.get(id);
  154. }
  155. @Override
  156. public Map<RepositoryType, List<RepositoryProxyHandler>> getAllHandler() {
  157. return this.handlerMap;
  158. }
  159. @Override
  160. public List<RepositoryProxyHandler> getHandler(RepositoryType type) {
  161. if (this.handlerMap.containsKey(type)) {
  162. return this.handlerMap.get(type);
  163. } else {
  164. return new ArrayList<>();
  165. }
  166. }
  167. @Override
  168. public boolean hasHandler(RepositoryType type) {
  169. return this.handlerMap.containsKey(type);
  170. }
  171. @Override
  172. public List<ProxyConnector> getProxyConnectors() {
  173. return connectorList;
  174. }
  175. @Override
  176. public Map<String, List<ProxyConnector>> getProxyConnectorAsMap() {
  177. return connectorMap;
  178. }
  179. @Override
  180. public void reload( )
  181. {
  182. init();
  183. }
  184. @Override
  185. public void handle(RepositoryRegistryEvent event) {
  186. log.debug("Reload happened, updating proxy list");
  187. if (event.getType()== RepositoryRegistryEvent.RELOADED) {
  188. init();
  189. }
  190. }
  191. }