diff --git a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index cd0371a..303cd56 100644 --- a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -2,7 +2,7 @@ import gitbucket.core.settings.html import gitbucket.core.model.WebHook -import gitbucket.core.service.{RepositoryService, AccountService, WebHookService, ProtectedBranchService, CommitStatusService} +import gitbucket.core.service._ import gitbucket.core.service.WebHookService._ import gitbucket.core.util._ import gitbucket.core.util.JGitUtil._ @@ -19,11 +19,11 @@ class RepositorySettingsController extends RepositorySettingsControllerBase - with RepositoryService with AccountService with WebHookService with ProtectedBranchService with CommitStatusService + with RepositoryService with AccountService with WebHookService with ProtectedBranchService with CommitStatusService with DeployKeyService with OwnerAuthenticator with UsersAuthenticator trait RepositorySettingsControllerBase extends ControllerBase { - self: RepositoryService with AccountService with WebHookService with ProtectedBranchService with CommitStatusService + self: RepositoryService with AccountService with WebHookService with ProtectedBranchService with CommitStatusService with DeployKeyService with OwnerAuthenticator with UsersAuthenticator => // for repository options @@ -37,7 +37,7 @@ externalWikiUrl: Option[String], allowFork: Boolean ) - + val optionsForm = mapping( "repositoryName" -> trim(label("Repository Name" , text(required, maxlength(100), identifier, renameRepositoryName))), "description" -> trim(label("Description" , optional(text()))), @@ -56,12 +56,14 @@ "defaultBranch" -> trim(label("Default Branch" , text(required, maxlength(100)))) )(DefaultBranchForm.apply) -// // for collaborator addition -// case class CollaboratorForm(userName: String) -// -// val collaboratorForm = mapping( -// "userName" -> trim(label("Username", text(required, collaborator))) -// )(CollaboratorForm.apply) + + // for deploy key + case class DeployKeyForm(title: String, publicKey: String) + + val deployKeyForm = mapping( + "title" -> trim(label("Title", text(required, maxlength(100)))), + "publicKey" -> trim(label("Key" , text(required))) + )(DeployKeyForm.apply) // for web hook url addition case class WebHookForm(url: String, events: Set[WebHook.Event], ctype: WebHookContentType, token: Option[String]) @@ -382,6 +384,24 @@ redirect(s"/${repository.owner}/${repository.name}/settings/danger") }) + /** List deploy keys */ + get("/:owner/:repository/settings/deploykey")(ownerOnly { repository => + html.deploykey(repository, getDeployKeys(repository.owner, repository.name)) + }) + + /** Register a deploy key */ + post("/:owner/:repository/settings/deploykey", deployKeyForm)(ownerOnly { (form, repository) => + addDeployKey(repository.owner, repository.name, form.title, form.publicKey) + redirect(s"/${repository.owner}/${repository.name}/settings/deploykey") + }) + + /** Delete a deploy key */ + get("/:owner/:repository/settings/deploykey/delete/:id")(ownerOnly { repository => + val deployKeyId = params("id").toInt + deleteDeployKey(repository.owner, repository.name, deployKeyId) + redirect(s"/${repository.owner}/${repository.name}/settings/deploykey") + }) + /** * Provides duplication check for web hook url. */ diff --git a/src/main/scala/gitbucket/core/service/DeployKeyService.scala b/src/main/scala/gitbucket/core/service/DeployKeyService.scala new file mode 100644 index 0000000..998c572 --- /dev/null +++ b/src/main/scala/gitbucket/core/service/DeployKeyService.scala @@ -0,0 +1,22 @@ +package gitbucket.core.service + +import gitbucket.core.model.DeployKey +import gitbucket.core.model.Profile._ +import gitbucket.core.model.Profile.profile.blockingApi._ + +trait DeployKeyService { + + def addDeployKey(userName: String, repositoryName: String, title: String, publicKey: String)(implicit s: Session): Unit = + DeployKeys.insert(DeployKey(userName = userName, repositoryName = repositoryName, title = title, publicKey = publicKey)) + + def getDeployKeys(userName: String, repositoryName: String)(implicit s: Session): List[DeployKey] = + DeployKeys.filter(x => (x.userName === userName.bind) && (x.repositoryName === repositoryName.bind)).sortBy(_.deployKeyId).list + + def getAllDeployKeys()(implicit s: Session): List[DeployKey] = + DeployKeys.filter(_.publicKey.trim =!= "").list + + def deleteDeployKey(userName: String, repositoryName: String, deployKeyId: Int)(implicit s: Session): Unit = + DeployKeys.filter(_.byPrimaryKey(userName, repositoryName, deployKeyId)).delete + + +} diff --git a/src/main/scala/gitbucket/core/service/SshKeyService.scala b/src/main/scala/gitbucket/core/service/SshKeyService.scala index 477413f..5c7dc9d 100644 --- a/src/main/scala/gitbucket/core/service/SshKeyService.scala +++ b/src/main/scala/gitbucket/core/service/SshKeyService.scala @@ -7,7 +7,7 @@ trait SshKeyService { def addPublicKey(userName: String, title: String, publicKey: String)(implicit s: Session): Unit = - SshKeys insert SshKey(userName = userName, title = title, publicKey = publicKey) + SshKeys.insert(SshKey(userName = userName, title = title, publicKey = publicKey)) def getPublicKeys(userName: String)(implicit s: Session): List[SshKey] = SshKeys.filter(_.userName === userName.bind).sortBy(_.sshKeyId).list @@ -16,6 +16,6 @@ SshKeys.filter(_.publicKey.trim =!= "").list def deletePublicKey(userName: String, sshKeyId: Int)(implicit s: Session): Unit = - SshKeys filter (_.byPrimaryKey(userName, sshKeyId)) delete + SshKeys.filter(_.byPrimaryKey(userName, sshKeyId)).delete } diff --git a/src/main/twirl/gitbucket/core/account/ssh.scala.html b/src/main/twirl/gitbucket/core/account/ssh.scala.html index 2a87dfa..cccfdfe 100644 --- a/src/main/twirl/gitbucket/core/account/ssh.scala.html +++ b/src/main/twirl/gitbucket/core/account/ssh.scala.html @@ -20,7 +20,7 @@
-
Add an SSH Key
+
Add a SSH Key
diff --git a/src/main/twirl/gitbucket/core/settings/deploykey.scala.html b/src/main/twirl/gitbucket/core/settings/deploykey.scala.html new file mode 100644 index 0000000..7f5d7de --- /dev/null +++ b/src/main/twirl/gitbucket/core/settings/deploykey.scala.html @@ -0,0 +1,42 @@ +@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo, deployKeys: List[gitbucket.core.model.DeployKey])(implicit context: gitbucket.core.controller.Context) +@import gitbucket.core.ssh.SshUtil +@import gitbucket.core.view.helpers +@gitbucket.core.html.main("Deploy keys", Some(repository)){ + @gitbucket.core.html.menu("settings", repository){ + @gitbucket.core.settings.html.menu("deploykeys", repository){ +
+
Deploy keys
+
+ @if(deployKeys.isEmpty){ + No keys + } + @deployKeys.zipWithIndex.map { case (key, i) => + @if(i != 0){ +
+ } + @key.title (@SshUtil.fingerPrint(key.publicKey).getOrElse("Key is invalid.")) + Delete + } +
+
+ +
+
Add a deploy key
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + } + } +} diff --git a/src/main/twirl/gitbucket/core/settings/menu.scala.html b/src/main/twirl/gitbucket/core/settings/menu.scala.html index 5a8895c..b81bcd3 100644 --- a/src/main/twirl/gitbucket/core/settings/menu.scala.html +++ b/src/main/twirl/gitbucket/core/settings/menu.scala.html @@ -15,6 +15,9 @@ Service Hooks + + Deploy Keys + Danger Zone