diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index a235d78..69168ec 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -94,9 +94,16 @@ ), "skinName" -> trim(label("AdminLTE skin name", text(required))), "showMailAddress" -> trim(label("Show mail address", boolean())), - "pluginNetworkInstall" -> new SingleValueType[Boolean] { - override def convert(value: String, messages: Messages): Boolean = context.settings.pluginNetworkInstall - } + "pluginNetworkInstall" -> trim(label("Network plugin installation", boolean())), + "proxy" -> optionalIfNotChecked( + "useProxy", + mapping( + "host" -> trim(label("Proxy host", text(required))), + "port" -> trim(label("Proxy port", number())), + "user" -> trim(label("Keystore", optional(text()))), + "password" -> trim(label("Keystore", optional(text()))) + )(Proxy.apply) + ) )(SystemSettings.apply).verifying { settings => Vector( if (settings.ssh.enabled && settings.baseUrl.isEmpty) { @@ -380,11 +387,6 @@ }) post("/admin/plugins/_reload")(adminOnly { - // Update configuration - val pluginNetworkInstall = params.get("pluginNetworkInstall").map(_.toBoolean).getOrElse(false) - saveSystemSettings(context.settings.copy(pluginNetworkInstall = pluginNetworkInstall)) - - // Reload plugins PluginRegistry.reload(request.getServletContext(), loadSystemSettings(), request2Session(request).conn) flash += "info" -> "All plugins were reloaded." redirect("/admin/plugins") diff --git a/src/main/scala/gitbucket/core/plugin/PluginRepository.scala b/src/main/scala/gitbucket/core/plugin/PluginRepository.scala index 22208ea..c1e4b48 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRepository.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRepository.scala @@ -1,7 +1,12 @@ package gitbucket.core.plugin +import java.net.{InetSocketAddress, PasswordAuthentication} +import java.net.{Proxy => JProxy} + +import gitbucket.core.controller.Context import org.json4s._ import org.apache.commons.io.IOUtils +import java.net.Authenticator object PluginRepository { implicit val formats = DefaultFormats @@ -10,9 +15,27 @@ org.json4s.jackson.JsonMethods.parse(json).extract[Seq[PluginMetadata]] } - def getPlugins(): Seq[PluginMetadata] = { + def getPlugins()(implicit context: Context): Seq[PluginMetadata] = { val url = new java.net.URL("https://plugins.gitbucket-community.org/releases/plugins.json") - val str = IOUtils.toString(url, "UTF-8") + + val in = context.settings.proxy match { + case Some(proxy) => + (proxy.user, proxy.password) match { + case (Some(user), Some(password)) => + Authenticator.setDefault(new Authenticator() { + override def getPasswordAuthentication = new PasswordAuthentication(user, password.toCharArray) + }) + case _ => + Authenticator.setDefault(null) + } + + url + .openConnection(new JProxy(JProxy.Type.HTTP, new InetSocketAddress(proxy.host, proxy.port))) + .getInputStream + case None => url.openStream() + } + + val str = IOUtils.toString(in, "UTF-8") parsePluginJson(str) } diff --git a/src/main/twirl/gitbucket/core/admin/plugins.scala.html b/src/main/twirl/gitbucket/core/admin/plugins.scala.html index f95ad25..afe2f83 100644 --- a/src/main/twirl/gitbucket/core/admin/plugins.scala.html +++ b/src/main/twirl/gitbucket/core/admin/plugins.scala.html @@ -3,8 +3,6 @@ @gitbucket.core.admin.html.menu("plugins") { @gitbucket.core.helper.html.information(info)