diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index c8e617a01..41bb1033c 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -6,7 +6,8 @@ class ScalatraBootstrap extends LifeCycle { override def init(context: ServletContext) { context.mount(new IndexController, "/") context.mount(new SignInController, "/*") - context.mount(new UsersController, "/*") + context.mount(new UserManagementController, "/*") + context.mount(new SystemSettingsController, "/*") context.mount(new CreateRepositoryController, "/*") context.mount(new AccountController, "/*") context.mount(new RepositoryViewerController, "/*") diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/app/SystemSettingsController.scala new file mode 100644 index 000000000..15185449b --- /dev/null +++ b/src/main/scala/app/SystemSettingsController.scala @@ -0,0 +1,30 @@ +package app + +import service.{AccountService, SystemSettingsService} +import SystemSettingsService._ +import util.AdminOnlyAuthenticator +import jp.sf.amateras.scalatra.forms._ + +class SystemSettingsController extends SystemSettingsControllerBase + with SystemSettingsService with AccountService with AdminOnlyAuthenticator + +trait SystemSettingsControllerBase extends ControllerBase { + self: SystemSettingsService with AccountService with AdminOnlyAuthenticator => + + private case class SystemSettingsForm(allowAccountRegistration: Boolean) + + private val form = mapping( + "allowAccountRegistration" -> trim(label("Account registration", boolean())) + )(SystemSettingsForm.apply) + + + get("/admin/system")(adminOnly { + admin.html.system(loadSystemSettings()) + }) + + post("/admin/system", form)(adminOnly { form => + saveSystemSettings(SystemSettings(form.allowAccountRegistration)) + redirect("/admin/system") + }) + +} diff --git a/src/main/scala/app/UsersController.scala b/src/main/scala/app/UserManagementController.scala similarity index 90% rename from src/main/scala/app/UsersController.scala rename to src/main/scala/app/UserManagementController.scala index a0acb63e2..9b30b2d17 100644 --- a/src/main/scala/app/UsersController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -5,9 +5,9 @@ import service._ import util.AdminOnlyAuthenticator import jp.sf.amateras.scalatra.forms._ -class UsersController extends UsersControllerBase with AccountService with AdminOnlyAuthenticator +class UserManagementController extends UserManagementControllerBase with AccountService with AdminOnlyAuthenticator -trait UsersControllerBase extends ControllerBase { self: AccountService with AdminOnlyAuthenticator => +trait UserManagementControllerBase extends ControllerBase { self: AccountService with AdminOnlyAuthenticator => case class UserForm(userName: String, password: String, mailAddress: String, isAdmin: Boolean, url: Option[String]) diff --git a/src/main/scala/service/SystemSettingsService.scala b/src/main/scala/service/SystemSettingsService.scala new file mode 100644 index 000000000..b425b348e --- /dev/null +++ b/src/main/scala/service/SystemSettingsService.scala @@ -0,0 +1,40 @@ +package service + +import util.Directory._ +import SystemSettingsService._ + +trait SystemSettingsService { + + def saveSystemSettings(settings: SystemSettings): Unit = { + val props = new java.util.Properties() + props.setProperty(AllowAccountRegistration, settings.allowAccountRegistration.toString) + props.store(new java.io.FileOutputStream(GitBucketConf), null) + } + + + def loadSystemSettings(): SystemSettings = { + val props = new java.util.Properties() + if(GitBucketConf.exists){ + props.load(new java.io.FileInputStream(GitBucketConf)) + } + SystemSettings(getBoolean(props, "allow_account_registration")) + } + +} + +object SystemSettingsService { + + case class SystemSettings(allowAccountRegistration: Boolean) + + private val AllowAccountRegistration = "allow_account_registration" + + private def getBoolean(props: java.util.Properties, key: String, default: Boolean = false): Boolean = { + val value = props.getProperty(key) + if(value == null || value.isEmpty){ + default + } else { + value.toBoolean + } + } + +} diff --git a/src/main/scala/util/Directory.scala b/src/main/scala/util/Directory.scala index e9c756750..6742528cb 100644 --- a/src/main/scala/util/Directory.scala +++ b/src/main/scala/util/Directory.scala @@ -10,6 +10,8 @@ import org.eclipse.jgit.lib.Ref object Directory { val GitBucketHome = new File(System.getProperty("user.home"), "gitbucket").getAbsolutePath + + val GitBucketConf = new File(GitBucketHome, "gitbucket.conf") val RepositoryHome = "%s/repositories".format(GitBucketHome) diff --git a/src/main/twirl/admin/menu.scala.html b/src/main/twirl/admin/menu.scala.html new file mode 100644 index 000000000..eec5ecb5e --- /dev/null +++ b/src/main/twirl/admin/menu.scala.html @@ -0,0 +1,17 @@ +@(active: String)(body: Html)(implicit context: app.Context) +@import context._ +
| Username | -Mail Address | -Type | -URL | -Registered | -Updated | -Last Login | -
|---|---|---|---|---|---|---|
| @account.userName | -@account.mailAddress | -- @if(account.isAdmin){ - Administrator - } else { - Normal - } - | -@account.url | -@helpers.datetime(account.registeredDate) | -@helpers.datetime(account.updatedDate) | -@account.lastLoginDate.map(helpers.datetime) | -
|
+
+ Edit
+
+
+ @account.userName
+ @if(account.isAdmin){
+ (Administrator)
+ } else {
+ (Normal)
+ }
+
+
+
+ + @account.mailAddress + @account.url.map { url => + @url + } +
+ Registered: @datetime(account.registeredDate)
+ Updated: @datetime(account.updatedDate)
+ Last Login: @account.lastLoginDate.map(datetime)
+
+ |
+