diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/app/SystemSettingsController.scala index 1d3718a..bfafca9 100644 --- a/src/main/scala/app/SystemSettingsController.scala +++ b/src/main/scala/app/SystemSettingsController.scala @@ -41,7 +41,11 @@ "tls" -> trim(label("Enable TLS", optional(boolean()))), "keystore" -> trim(label("Keystore", optional(text()))) )(Ldap.apply)) - )(SystemSettings.apply) + )(SystemSettings.apply).verifying { settings => + if(settings.ssh && settings.baseUrl.isEmpty){ + Seq("baseUrl" -> "Base URL is required if SSH access is enabled.") + } else Nil + } get("/admin/system")(adminOnly { @@ -51,8 +55,10 @@ post("/admin/system", form)(adminOnly { form => saveSystemSettings(form) - if(form.ssh && !SshServer.isActive){ - SshServer.start(request.getServletContext, form.sshPort.getOrElse(SystemSettingsService.DefaultSshPort)) + if(form.ssh && !SshServer.isActive && form.baseUrl.isDefined){ + SshServer.start(request.getServletContext, + form.sshPort.getOrElse(SystemSettingsService.DefaultSshPort), + form.baseUrl.get) } else if(!form.ssh && SshServer.isActive){ SshServer.stop() } diff --git a/src/main/scala/ssh/GitCommand.scala b/src/main/scala/ssh/GitCommand.scala index 46c9e49..6abbe63 100644 --- a/src/main/scala/ssh/GitCommand.scala +++ b/src/main/scala/ssh/GitCommand.scala @@ -96,10 +96,8 @@ } -class GitReceivePack(context: ServletContext, owner: String, repoName: String) extends GitCommand(context, owner, repoName) +class GitReceivePack(context: ServletContext, owner: String, repoName: String, baseUrl: String) extends GitCommand(context, owner, repoName) with SystemSettingsService with RepositoryService with AccountService { - // TODO Correct this info. where i get base url? - val BaseURL: String = loadSystemSettings().baseUrl.getOrElse("http://localhost:8080") override protected def runTask(user: String): Unit = { getRepository(owner, repoName, null).foreach { repositoryInfo => @@ -107,7 +105,7 @@ using(Git.open(getRepositoryDir(owner, repoName))) { git => val repository = git.getRepository val receive = new ReceivePack(repository) - receive.setPostReceiveHook(new CommitLogHook(owner, repoName, user, BaseURL)) + receive.setPostReceiveHook(new CommitLogHook(owner, repoName, user, baseUrl)) receive.receive(in, out, err) } } @@ -116,14 +114,14 @@ } -class GitCommandFactory(context: ServletContext) extends CommandFactory { +class GitCommandFactory(context: ServletContext, baseUrl: String) extends CommandFactory { private val logger = LoggerFactory.getLogger(classOf[GitCommandFactory]) override def createCommand(command: String): Command = { logger.debug(s"command: $command") command match { case GitCommand.CommandRegex("upload", owner, repoName) => new GitUploadPack(context, owner, repoName) - case GitCommand.CommandRegex("receive", owner, repoName) => new GitReceivePack(context, owner, repoName) + case GitCommand.CommandRegex("receive", owner, repoName) => new GitReceivePack(context, owner, repoName, baseUrl) case _ => new UnknownCommand(command) } } diff --git a/src/main/scala/ssh/SshServerListener.scala b/src/main/scala/ssh/SshServerListener.scala index 229a521..f8e08fd 100644 --- a/src/main/scala/ssh/SshServerListener.scala +++ b/src/main/scala/ssh/SshServerListener.scala @@ -12,17 +12,17 @@ private val server = org.apache.sshd.SshServer.setUpDefaultServer() private val active = new AtomicBoolean(false) - private def configure(context: ServletContext, port: Int) = { + private def configure(context: ServletContext, port: Int, baseUrl: String) = { server.setPort(port) server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(s"${Directory.GitBucketHome}/gitbucket.ser")) server.setPublickeyAuthenticator(new PublicKeyAuthenticator(context)) - server.setCommandFactory(new GitCommandFactory(context)) + server.setCommandFactory(new GitCommandFactory(context, baseUrl)) server.setShellFactory(new NoShell) } - def start(context: ServletContext, port: Int) = { + def start(context: ServletContext, port: Int, baseUrl: String) = { if(active.compareAndSet(false, true)){ - configure(context, port) + configure(context, port, baseUrl) server.start() logger.info(s"Start SSH Server Listen on ${server.getPort}") } @@ -48,7 +48,14 @@ override def contextInitialized(sce: ServletContextEvent): Unit = { val settings = loadSystemSettings() if(settings.ssh){ - SshServer.start(sce.getServletContext, settings.sshPort.getOrElse(SystemSettingsService.DefaultSshPort)) + if(settings.baseUrl.isEmpty){ + // TODO use logger? + println("Could not start SshServer because the baseUrl is not configured.") + } else { + SshServer.start(sce.getServletContext, + settings.sshPort.getOrElse(SystemSettingsService.DefaultSshPort), + settings.baseUrl.get) + } } } diff --git a/src/main/twirl/admin/system.scala.html b/src/main/twirl/admin/system.scala.html index fbc405d..0e94edf 100644 --- a/src/main/twirl/admin/system.scala.html +++ b/src/main/twirl/admin/system.scala.html @@ -22,9 +22,10 @@
+
-

+

The base URL is used for redirect, notification email, git repository URL box and more. If the base URL is empty, GitBucket generates URL from request information. You can use this property to adjust URL difference between the reverse proxy and GitBucket. @@ -75,6 +76,9 @@ +

+ Base URL is required if SSH access is enabled. +

diff --git a/src/main/twirl/repo/tab.scala.html b/src/main/twirl/repo/tab.scala.html index ebf4446..bce1b22 100644 --- a/src/main/twirl/repo/tab.scala.html +++ b/src/main/twirl/repo/tab.scala.html @@ -48,7 +48,7 @@ $('#repository-url-copy').attr('data-clipboard-text', $('#repository-url').val()); }); $('#repository-url-ssh').click(function(){ - $('#repository-url').val('@repository.sshUrl(settings.sshPort.get)'); // TODO apply default value for None? + $('#repository-url').val('@repository.sshUrl(settings.sshPort.getOrElse(service.SystemSettingsService.DefaultSshPort))'); $('#repository-url-copy').attr('data-clipboard-text', $('#repository-url').val()); }); });