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 @@