Skip to content
This repository was archived by the owner on Apr 20, 2024. It is now read-only.

Commit 4ebc499

Browse files
authored
Merge pull request #29 from nodes-vapor/develop
Develop
2 parents ba9b97f + 28a2abe commit 4ebc499

File tree

17 files changed

+514
-98
lines changed

17 files changed

+514
-98
lines changed

Sources/AdminPanel/Controllers/BackendUsersController.swift

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class BackendUsersController {
3030
*/
3131
public func index(request: Request) throws -> ResponseRepresentable {
3232
try BackendUser.query().limit = Fluent.Limit(count: 20)
33-
let users = try BackendUser.all() // todo pagination && search
33+
let users = try BackendUser.query().limit(50).all() // todo pagination && search
3434

3535
return try drop.view.make("BackendUsers/index", [
3636
"users": try users.makeNode()
@@ -44,9 +44,14 @@ public final class BackendUsersController {
4444
* - return: View
4545
*/
4646
public func create(request: Request) throws -> ResponseRepresentable {
47-
return try drop.view.make("BackendUsers/edit", [
47+
return try drop.view.make("Nodes/AdminPanel::BackendUsers/edit", [
4848
"roles": BackendUserRole.all().makeNode(),
49-
"fieldset": BackendUserForm.getFieldset(request)
49+
"array": try [
50+
"admin": "Administrator",
51+
"super-admin": "Extreme Super Uber Administrator"
52+
].makeNode(),
53+
"fieldset": BackendUserForm.getFieldset(request),
54+
"defaultRole": BackendUserRole.query().filter("is_default", true).first()?.makeNode() ?? nil
5055
], for: request)
5156
}
5257

@@ -62,7 +67,7 @@ public final class BackendUsersController {
6267
let backendUserForm = try BackendUserForm(validating: request.data)
6368

6469
// Store
65-
var backendUser = try BackendUser(form: backendUserForm)
70+
var backendUser = BackendUser(form: backendUserForm)
6671
try backendUser.save()
6772

6873
// Send welcome mail
@@ -73,8 +78,7 @@ public final class BackendUsersController {
7378

7479
return Response(redirect: "/admin/backend_users").flash(.success, "User created")
7580
}catch FormError.validationFailed(let fieldSet) {
76-
try request.session().data["_fieldset"] = try fieldSet.makeNode()
77-
return Response(redirect: "/admin/backend_users/create").flash(.error, "Validation error")
81+
return Response(redirect: "/admin/backend_users/create").flash(.error, "Validation error").withFieldset(fieldSet)
7882
}catch {
7983
return Response(redirect: "/admin/backend_users/create").flash(.error, "Failed to create user")
8084
}
@@ -92,7 +96,12 @@ public final class BackendUsersController {
9296
return try drop.view.make("BackendUsers/edit", [
9397
"fieldset": BackendUserForm.getFieldset(request),
9498
"backendUser": try user.makeNode(),
95-
"roles": BackendUserRole.all().makeNode()
99+
"array": try [
100+
"admin": "Administrator",
101+
"super-admin": "Extreme Super Uber Administrator"
102+
].makeNode(),
103+
"roles": BackendUserRole.all().makeNode(),
104+
"defaultRole": BackendUserRole.query().filter("is_default", true).first()?.makeNode() ?? nil
96105
], for: request)
97106
}
98107

@@ -112,15 +121,13 @@ public final class BackendUsersController {
112121
// Validate
113122
let backendUserForm = try BackendUserForm(validating: request.data)
114123

115-
// Assign
116-
backendUser.name = backendUserForm.name
117-
124+
// Store
125+
backendUser.fill(form: backendUserForm)
118126
try backendUser.save()
119127

120128
return Response(redirect: "/admin/backend_users").flash(.success, "User created")
121129
}catch FormError.validationFailed(let fieldSet) {
122-
try request.session().data["_fieldset"] = try fieldSet.makeNode()
123-
return Response(redirect: "/admin/backend_users/create").flash(.error, "Validation error")
130+
return Response(redirect: "/admin/backend_users/create").flash(.error, "Validation error").withFieldset(fieldSet)
124131
}catch {
125132
return Response(redirect: "/admin/backend_users/edit/" + String(id)).flash(.error, "Failed to create user")
126133
}

Sources/AdminPanel/Controllers/LoginController.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public final class LoginController {
139139
try token.save()
140140

141141
// Set new password & save
142-
try backendUser.setPassword(password)
142+
backendUser.setPassword(password)
143143
try backendUser.save()
144144

145145
return Response(redirect: "/admin/login").flash(.success, "Password is reset")
@@ -186,4 +186,38 @@ public final class LoginController {
186186
return Response(redirect: "/admin/login").flash(.error, "Failed to login")
187187
}
188188
}
189+
190+
/// SSO login
191+
///
192+
/// - Parameter request: request
193+
/// - Returns: return response
194+
/// - Throws: throws Abort.custom internalServerError for missing config or sso
195+
public func sso(request: Request) throws -> ResponseRepresentable {
196+
guard let config: Configuration = drop.storage["adminPanelConfig"] as? Configuration else {
197+
throw Abort.custom(status: .internalServerError, message: "AdminPanel missing configuration")
198+
}
199+
200+
guard let ssoProvider: SSOProtocol = config.ssoProvider else {
201+
throw Abort.custom(status: .internalServerError, message: "AdminPanel no SSO setup")
202+
}
203+
204+
return try ssoProvider.auth(request)
205+
}
206+
207+
/// SSO callback
208+
///
209+
/// - Parameter request: request
210+
/// - Returns: return response
211+
/// - Throws: throws Abort.custom internalServerError for missing config or sso
212+
public func ssoCallback(request: Request) throws -> ResponseRepresentable {
213+
guard let config: Configuration = drop.storage["adminPanelConfig"] as? Configuration else {
214+
throw Abort.custom(status: .internalServerError, message: "AdminPanel missing configuration")
215+
}
216+
217+
guard let ssoProvider: SSOProtocol = config.ssoProvider else {
218+
throw Abort.custom(status: .internalServerError, message: "AdminPanel no SSO setup")
219+
}
220+
221+
return try ssoProvider.callback(request)
222+
}
189223
}

Sources/AdminPanel/Models/BackendUsers/BackendUser.swift

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,33 +63,28 @@ public final class BackendUser: Auth.User, Model {
6363
self.createdAt = Date()
6464
}
6565

66-
public init(form: BackendUserForm) throws {
66+
public init(form: BackendUserForm){
6767
name = form.name
6868
email = form.email
6969
role = form.role
7070
password = BCrypt.hash(password: form.password)
71-
shouldResetPassword = false
72-
73-
/*
74-
if let shouldResetPasswordTemp: String = request.data["should_reset_password"]?.string {
75-
shouldResetPassword = shouldResetPasswordTemp == "true"
76-
}
77-
*/
78-
/*
79-
if let file: Multipart.File = request.multipart?["image"]?.file {
80-
do {
81-
//image = try Storage.upload(bytes: file.data)
82-
} catch {
83-
print(error)
84-
}
85-
}
86-
*/
71+
shouldResetPassword = form.shouldResetPassword
8772

8873
self.updatedAt = Date()
8974
self.createdAt = Date()
9075
}
9176

92-
public func setPassword(_ password: String) throws {
77+
public func fill(form: BackendUserForm) {
78+
name = form.name
79+
email = form.email
80+
role = form.role
81+
82+
if(!form.randomPassword) {
83+
setPassword(form.password)
84+
}
85+
}
86+
87+
public func setPassword(_ password: String) {
9388
self.password = BCrypt.hash(password: password)
9489
}
9590

Sources/AdminPanel/Models/BackendUsers/BackendUserForm.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public struct BackendUserForm: Form {
88
let password: String
99
let sendMail: Bool
1010
var randomPassword = false
11+
let shouldResetPassword: Bool
1112

1213
public static let fieldset = Fieldset([
1314
"name": StringField(
@@ -20,16 +21,16 @@ public struct BackendUserForm: Form {
2021
"role": StringField(
2122
label: "Role"
2223
),
23-
"should_reset_password": StringField(
24+
"should_reset_password": BoolField(
2425
label: "Should reset password"
2526
),
26-
"should_reset_password": StringField(
27-
label: "Should reset password"
28-
//
29-
)
27+
"send_mail": BoolField(
28+
label: "Send mail with info"
29+
),
3030
], requiring: ["name", "email", "role", "should_reset_password"])
3131

3232
public init(validatedData: [String: Node]) throws {
33+
3334
guard let name = validatedData["name"]?.string,
3435
let email = validatedData["email"]?.string,
3536
let role = validatedData["role"]?.string
@@ -49,5 +50,13 @@ public struct BackendUserForm: Form {
4950
password = String.randomAlphaNumericString(8)
5051
randomPassword = true
5152
}
53+
54+
if randomPassword {
55+
shouldResetPassword = true
56+
} else if validatedData["should_reset_password"] == "true" {
57+
shouldResetPassword = true
58+
} else {
59+
shouldResetPassword = false
60+
}
5261
}
5362
}

Sources/AdminPanel/Models/BackendUsers/BackendUserRoles/BackendUserRole.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public final class BackendUserRole: Model {
5858
"updated_at": try updatedAt.toDateTimeString()
5959
])
6060
}
61-
61+
6262
public static func prepare(_ database: Database) throws {
6363
try database.create("backend_user_roles") { table in
6464
table.id()

Sources/AdminPanel/Resources/Views/BackendUsers/edit.leaf

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,37 +36,22 @@
3636
<hr/>
3737
<div class="margin-vertical-sm">
3838
#form:textgroup("name", backendUser.name, fieldset)
39-
#form:textgroup("email", backendUser.email, fieldset)
39+
#form:emailgroup("email", backendUser.email, fieldset)
4040

41-
<div class="form-group">
42-
<label for="backendUserFormRole">Role</label>
43-
<select name="role" class="form-control id=backendUserFormRole">
44-
#loop(roles, "role") {
45-
<!--TODO AUTO SELECT selected or default-->
46-
#if(backendUser) {
47-
#if(role.slug == backendUser.role) { <!--DOES NOT WORK AT THE MOMENT -->
48-
<option value="#(role.slug)" selected>#(role.title)</option>
49-
} ##else() {
50-
<option value="#(role.slug)">#(role.title)</option>
51-
}
52-
} ##else() {
53-
<option value="#(role.slug)">#(role.title)</option>
54-
}
55-
}
56-
</select>
57-
58-
</div>
41+
foo:
42+
#form:selectgroup("role", array, fieldset, nil, "This is a placeholder", "class:form-control btn btn-primary lol", "disabled")
5943

6044
<!-- FIX IF & Make checkbox -->
6145
#if(backendUser) {
6246
} ##else() {
63-
<div class="form-group">
47+
#form:checkboxgroup("send_mail", backendUser.send_mail, fieldset)
48+
<!--<div class="form-group">
6449
<label for="backendUserFormSendMail">Send mail with information</label>
6550
<select name="send_mail" class="form-control" id="backendUserFormSendMail">
6651
<option value="true" selected>Yes</option>
6752
<option value="false">No</option>
6853
</select>
69-
</div>
54+
</div>-->
7055
}
7156

7257
</div>
@@ -87,13 +72,14 @@
8772
</div>
8873

8974
<!-- FIX Preselected & Make checkbox -->
90-
<div class="form-group">
75+
#form:checkboxgroup("should_reset_password", backendUser.should_reset_password, fieldset)
76+
<!--<div class="form-group">
9177
<label for="backendUserFormResetPwOnLogin">Reset password on next login</label>
9278
<select name="should_reset_password" class="form-control" id="backendUserFormResetPwOnLogin">
9379
<option value="true" selected>Yes</option>
9480
<option value="false">No</option>
9581
</select>
96-
</div>
82+
</div>-->
9783
</div>
9884
</div>
9985

Sources/AdminPanel/Resources/Views/Login/login.leaf

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33
#export("content") {
44
<div id="login" class="panel panel-default">
55
<div class="panel-body">
6-
6+
7+
#if(request.storage.adminPanel.sso) {
8+
<a href="/admin/login/sso" id="alternative-login" class="sso">
9+
<span class="sr-only">Nodes SSO</span>
10+
</a>
11+
}
12+
713
<div class="panel-heading">
814
<div class="logo">
915
#embed("Layout/Partials/Elements/logo")

Sources/AdminPanel/Routes/LoginRoutes.swift

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,38 @@ public struct LoginRoutes: RouteCollection {
77
public typealias Wrapped = Responder
88

99
let drop: Droplet
10+
let config: Configuration
1011

11-
public init(droplet: Droplet) {
12+
public init(droplet: Droplet, config: Configuration) {
1213
drop = droplet
14+
self.config = config
1315
}
1416

1517
public func build<Builder: RouteBuilder>(_ builder: Builder) where Builder.Value == Wrapped {
1618

1719
let controller = LoginController(droplet: drop)
1820

1921
// General
20-
builder.get("/", handler: controller.landing);
21-
builder.get("/admin", handler: controller.landing);
22+
builder.get("/", handler: controller.landing)
23+
builder.get("/admin", handler: controller.landing)
2224

2325
// Login
24-
builder.get("/admin/login", handler: controller.form);
25-
builder.post("/admin/login", handler: controller.submit);
26+
builder.get("/admin/login", handler: controller.form)
27+
builder.post("/admin/login", handler: controller.submit)
2628

2729
// Reset password
28-
builder.get("/admin/login/reset", handler: controller.resetPasswordForm);
29-
builder.post("/admin/login/reset", handler: controller.resetPasswordSubmit);
30-
builder.get("/admin/login/reset/:token", handler: controller.resetPasswordTokenForm);
31-
builder.post("/admin/login/reset/change", handler: controller.resetPasswordTokenSubmit);
30+
builder.get("/admin/login/reset", handler: controller.resetPasswordForm)
31+
builder.post("/admin/login/reset", handler: controller.resetPasswordSubmit)
32+
builder.get("/admin/login/reset/:token", handler: controller.resetPasswordTokenForm)
33+
builder.post("/admin/login/reset/change", handler: controller.resetPasswordTokenSubmit)
34+
35+
// SSO
36+
if config.ssoProvider != nil {
37+
builder.get("/admin/login/sso", handler: controller.sso)
38+
39+
if let ssoCallbackPath: String = config.ssoCallbackPath {
40+
builder.post(ssoCallbackPath, handler: controller.ssoCallback)
41+
}
42+
}
3243
}
3344
}

0 commit comments

Comments
 (0)