Skip to content

Commit 4770e46

Browse files
authored
Merge pull request grokability#17650 from grokability/add-displayName-to-users
Add display name to users for LDAP/SCIM, added new sync fields
2 parents 29a18c7 + fc091c1 commit 4770e46

File tree

20 files changed

+1136
-785
lines changed

20 files changed

+1136
-785
lines changed

app/Console/Commands/LdapSync.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public function handle()
5555
ini_set('max_execution_time', env('LDAP_TIME_LIM', 600)); //600 seconds = 10 minutes
5656
ini_set('memory_limit', env('LDAP_MEM_LIM', '500M'));
5757

58+
59+
// Map the LDAP attributes to the Snipe-IT user fields.
5860
$ldap_map = [
5961
"username" => Setting::getSettings()->ldap_username_field,
6062
"last_name" => Setting::getSettings()->ldap_lname_field,
@@ -63,11 +65,17 @@ public function handle()
6365
"emp_num" => Setting::getSettings()->ldap_emp_num,
6466
"email" => Setting::getSettings()->ldap_email,
6567
"phone" => Setting::getSettings()->ldap_phone_field,
68+
"mobile" => Setting::getSettings()->ldap_mobile,
6669
"jobtitle" => Setting::getSettings()->ldap_jobtitle,
70+
"address" => Setting::getSettings()->ldap_address,
71+
"city" => Setting::getSettings()->ldap_city,
72+
"state" => Setting::getSettings()->ldap_state,
73+
"zip" => Setting::getSettings()->ldap_zip,
6774
"country" => Setting::getSettings()->ldap_country,
6875
"location" => Setting::getSettings()->ldap_location,
6976
"dept" => Setting::getSettings()->ldap_dept,
7077
"manager" => Setting::getSettings()->ldap_manager,
78+
"display_name" => Setting::getSettings()->ldap_display_name,
7179
];
7280

7381
$ldap_default_group = Setting::getSettings()->ldap_default_group;
@@ -234,18 +242,25 @@ public function handle()
234242
}
235243

236244

245+
// Assign the mapped LDAP attributes for each user to the Snipe-IT user fields
237246
for ($i = 0; $i < $results['count']; $i++) {
238247
$item = [];
239248
$item['username'] = $results[$i][$ldap_map["username"]][0] ?? '';
249+
$item['display_name'] = $results[$i][$ldap_map["display_name"]][0] ?? '';
240250
$item['employee_number'] = $results[$i][$ldap_map["emp_num"]][0] ?? '';
241251
$item['lastname'] = $results[$i][$ldap_map["last_name"]][0] ?? '';
242252
$item['firstname'] = $results[$i][$ldap_map["first_name"]][0] ?? '';
243253
$item['email'] = $results[$i][$ldap_map["email"]][0] ?? '';
244254
$item['ldap_location_override'] = $results[$i]['ldap_location_override'] ?? '';
245255
$item['location_id'] = $results[$i]['location_id'] ?? '';
246256
$item['telephone'] = $results[$i][$ldap_map["phone"]][0] ?? '';
257+
$item['mobile'] = $results[$i][$ldap_map["mobile"]][0] ?? '';
247258
$item['jobtitle'] = $results[$i][$ldap_map["jobtitle"]][0] ?? '';
259+
$item['address'] = $results[$i][$ldap_map["ldap_address"]][0] ?? '';
260+
$item['city'] = $results[$i][$ldap_map["city"]][0] ?? '';
261+
$item['state'] = $results[$i][$ldap_map["state"]][0] ?? '';
248262
$item['country'] = $results[$i][$ldap_map["country"]][0] ?? '';
263+
$item['zip'] = $results[$i][$ldap_map["zip"]][0] ?? '';
249264
$item['department'] = $results[$i][$ldap_map["dept"]][0] ?? '';
250265
$item['manager'] = $results[$i][$ldap_map["manager"]][0] ?? '';
251266
$item['location'] = $results[$i][$ldap_map["location"]][0] ?? '';
@@ -278,6 +293,9 @@ public function handle()
278293
if($ldap_map["username"] != null){
279294
$user->username = $item['username'];
280295
}
296+
if($ldap_map["display_name"] != null){
297+
$user->display_name = $item['display_name'];
298+
}
281299
if($ldap_map["last_name"] != null){
282300
$user->last_name = $item['lastname'];
283301
}
@@ -293,6 +311,9 @@ public function handle()
293311
if($ldap_map["phone"] != null){
294312
$user->phone = $item['telephone'];
295313
}
314+
if($ldap_map["mobile"] != null){
315+
$user->mobile = $item['mobile'];
316+
}
296317
if($ldap_map["jobtitle"] != null){
297318
$user->jobtitle = $item['jobtitle'];
298319
}

app/Http/Controllers/Api/SettingsController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function ldaptest() : JsonResponse
5151
})->slice(0, 10)->map(function ($item) use ($settings) {
5252
return (object) [
5353
'username' => $item[$settings['ldap_username_field']][0] ?? null,
54+
'display_name' => $item[$settings['ldap_display_name']][0] ?? null,
5455
'employee_number' => $item[$settings['ldap_emp_num']][0] ?? null,
5556
'lastname' => $item[$settings['ldap_lname_field']][0] ?? null,
5657
'firstname' => $item[$settings['ldap_fname_field']][0] ?? null,

app/Http/Controllers/Api/UsersController.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public function index(Request $request) : array
6464
'users.jobtitle',
6565
'users.last_login',
6666
'users.last_name',
67+
'users.display_name',
6768
'users.locale',
6869
'users.location_id',
6970
'users.manager_id',
@@ -154,6 +155,10 @@ public function index(Request $request) : array
154155
$users = $users->where('users.last_name', '=', $request->input('last_name'));
155156
}
156157

158+
if ($request->filled('display_name')) {
159+
$users = $users->where('users.display_name', '=', $request->input('display_name'));
160+
}
161+
157162
if ($request->filled('employee_num')) {
158163
$users = $users->where('users.employee_num', '=', $request->input('employee_num'));
159164
}
@@ -284,6 +289,7 @@ public function index(Request $request) : array
284289
[
285290
'last_name',
286291
'first_name',
292+
'display_name',
287293
'email',
288294
'jobtitle',
289295
'username',
@@ -511,6 +517,10 @@ public function update(SaveUserRequest $request, User $user): JsonResponse
511517
$user->username = $request->input('username');
512518
}
513519

520+
if ($request->filled('display_name')) {
521+
$user->display_name = $request->input('display_name');
522+
}
523+
514524
if ($request->filled('email')) {
515525
$user->email = $request->input('email');
516526
}

app/Http/Controllers/SettingsController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,7 @@ public function postLdapSettings(StoreLdapSettings $request) : RedirectResponse
873873
$setting->ldap_default_group = $request->input('ldap_default_group');
874874
$setting->ldap_filter = $request->input('ldap_filter');
875875
$setting->ldap_username_field = $request->input('ldap_username_field');
876+
$setting->ldap_display_name = $request->input('ldap_display_name');
876877
$setting->ldap_lname_field = $request->input('ldap_lname_field');
877878
$setting->ldap_fname_field = $request->input('ldap_fname_field');
878879
$setting->ldap_auth_filter_query = $request->input('ldap_auth_filter_query');
@@ -889,7 +890,12 @@ public function postLdapSettings(StoreLdapSettings $request) : RedirectResponse
889890
$setting->ldap_pw_sync = $request->input('ldap_pw_sync', '0');
890891
$setting->custom_forgot_pass_url = $request->input('custom_forgot_pass_url');
891892
$setting->ldap_phone_field = $request->input('ldap_phone');
893+
$setting->ldap_mobile = $request->input('ldap_mobile');
892894
$setting->ldap_jobtitle = $request->input('ldap_jobtitle');
895+
$setting->ldap_address = $request->input('ldap_address');
896+
$setting->ldap_city = $request->input('ldap_city');
897+
$setting->ldap_state = $request->input('ldap_state');
898+
$setting->ldap_zip = $request->input('ldap_zip');
893899
$setting->ldap_country = $request->input('ldap_country');
894900
$setting->ldap_location = $request->input('ldap_location');
895901
$setting->ldap_dept = $request->input('ldap_dept');

app/Http/Controllers/Users/UsersController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public function store(SaveUserRequest $request)
8888
//Username, email, and password need to be handled specially because the need to respect config values on an edit.
8989
$user->email = trim($request->input('email'));
9090
$user->username = trim($request->input('username'));
91+
$user->display_name = $request->input('display_name');
9192
if ($request->filled('password')) {
9293
$user->password = bcrypt($request->input('password'));
9394
}
@@ -240,6 +241,7 @@ public function update(SaveUserRequest $request, User $user)
240241

241242
$user->first_name = $request->input('first_name');
242243
$user->last_name = $request->input('last_name');
244+
$user->display_name = $request->input('display_name');
243245
$user->two_factor_optin = $request->input('two_factor_optin') ?: 0;
244246
$user->locale = $request->input('locale');
245247
$user->employee_num = $request->input('employee_num');

app/Http/Transformers/UsersTransformer.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ public function transformUser(User $user)
3131
$array = [
3232
'id' => (int) $user->id,
3333
'avatar' => e($user->present()->gravatar) ?? null,
34-
'name' => e($user->getFullNameAttribute()),
35-
'first_name' => e($user->first_name),
36-
'last_name' => e($user->last_name),
37-
'username' => e($user->username),
34+
'name' => e($user->getFullNameAttribute()) ?? null,
35+
'first_name' => e($user->first_name) ?? null,
36+
'last_name' => e($user->last_name) ?? null,
37+
'display_name' => e($user->display_name) ?? null,
38+
'username' => e($user->username) ?? null,
3839
'remote' => ($user->remote == '1') ? true : false,
3940
'locale' => ($user->locale) ? e($user->locale) : null,
4041
'employee_num' => ($user->employee_num) ? e($user->employee_num) : null,
@@ -138,6 +139,7 @@ public function transformUserCompact(User $user) : array
138139
'first_name' => e($user->first_name),
139140
'last_name' => e($user->last_name),
140141
'username' => e($user->username),
142+
'display_name' => e($user->display_name),
141143
'created_by' => $user->adminuser ? [
142144
'id' => (int) $user->adminuser->id,
143145
'name'=> e($user->adminuser->present()->fullName),

app/Importer/UserImporter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public function createUserIfNotExists(array $row)
4747
// Pull the records from the CSV to determine their values
4848
$this->item['id'] = trim($this->findCsvMatch($row, 'id'));
4949
$this->item['username'] = trim($this->findCsvMatch($row, 'username'));
50+
$this->item['display_name'] = trim($this->findCsvMatch($row, 'display_name'));
5051
$this->item['first_name'] = trim($this->findCsvMatch($row, 'first_name'));
5152
$this->item['last_name'] = trim($this->findCsvMatch($row, 'last_name'));
5253
$this->item['email'] = trim($this->findCsvMatch($row, 'email'));

app/Livewire/Importer.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ public function mount()
339339
'start_date' => trans('general.start_date'),
340340
'state' => trans('general.state'),
341341
'username' => trans('admin/users/table.username'),
342+
'display_name' => trans('admin/users/table.display_name'),
342343
'vip' => trans('general.importer.vip'),
343344
'website' => trans('general.website'),
344345
'zip' => trans('general.zip'),
@@ -485,6 +486,13 @@ public function mount()
485486
'username',
486487
trans('general.importer.checked_out_to_username'),
487488
],
489+
'display_name' =>
490+
[
491+
'display name',
492+
'displayName',
493+
'display',
494+
trans('admin/users/table.display_name'),
495+
],
488496
'first_name' =>
489497
[
490498
'first name',

app/Models/SnipeModel.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Models;
44

55
use App\Helpers\Helper;
6+
use Illuminate\Database\Eloquent\Casts\Attribute;
67
use Illuminate\Database\Eloquent\Model;
78

89
class SnipeModel extends Model
@@ -155,9 +156,19 @@ public function setStatusIdAttribute($value)
155156
$this->attributes['status_id'] = $value;
156157
}
157158

158-
//
159-
public function getDisplayNameAttribute()
159+
// This gets a little twitchy since *most* things have a property in the table called "name" (but users don't)
160+
// AND we want to be able to use the actual display_name value from the database if it's set (usually via SCIM)
161+
protected function displayNameAttribute(): Attribute
160162
{
161-
return $this->name;
163+
// This override should only kick in if the model has a display_name property (users)
164+
if (isset($this->display_name)) {
165+
return Attribute::make(
166+
get: fn (string $value) => $this->display_name,
167+
);
168+
}
169+
return Attribute::make(
170+
get: fn (string $value) => $this->name,
171+
);
162172
}
173+
163174
}

app/Models/SnipeSCIMConfig.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function getUserConfig()
3434

3535
'validations' => [
3636
$user_prefix . 'userName' => 'required',
37+
$user_prefix . 'displayName' => 'nullable|string',
3738
$user_prefix . 'name.givenName' => 'required',
3839
$user_prefix . 'name.familyName' => 'nullable|string',
3940
$user_prefix . 'externalId' => 'nullable|string',
@@ -121,7 +122,7 @@ function (&$object) {
121122
'honorificSuffix' => null
122123
],
123124

124-
'displayName' => null,
125+
'displayName' => AttributeMapping::eloquent("display_name"),
125126
'nickName' => null,
126127
'profileUrl' => null,
127128
'title' => AttributeMapping::eloquent('jobtitle'),

0 commit comments

Comments
 (0)