in local/o365/classes/feature/usersync/main.php [533:664]
public static function apply_configured_fieldmap(array $aaddata, \stdClass $user, $eventtype) {
global $CFG;
require_once($CFG->dirroot . '/auth/oidc/lib.php');
if (PHPUNIT_TEST) {
$fieldmappings = [
'firstname' => [
'field_map' => 'givenName',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'lastname' => [
'field_map' => 'surname',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'email' => [
'field_map' => 'mail',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'idnumber' => [
'field_map' => 'userPrincipalName',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'city' => [
'field_map' => 'city',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'country' => [
'field_map' => 'country',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
'department' => [
'field_map' => 'department',
'field_lock' => 'unlocked',
'update_local' => 'always',
],
];
} else {
$fieldmappings = auth_oidc_get_field_mappings();
}
if (unified::is_configured() && (array_key_exists('id', $aaddata) && $aaddata['id'])) {
$objectidfieldname = 'id';
$userobjectid = $aaddata['id'];
} else {
$objectidfieldname = 'objectId';
$userobjectid = $aaddata['objectId'];
}
$usersync = new self();
foreach ($fieldmappings as $localfield => $fieldmapping) {
$remotefield = $fieldmapping['field_map'];
$behavior = $fieldmapping['update_local'];
if ($behavior !== 'on' . $eventtype && $behavior !== 'always') {
// Field mapping doesn't apply to this event type.
continue;
}
if ($remotefield == 'objectId') {
$remotefield = $objectidfieldname;
}
if (isset($aaddata[$remotefield])) {
switch ($remotefield) {
case 'country':
// Update country with two-letter country code.
$incoming = strtoupper($aaddata[$remotefield]);
$countrymap = get_string_manager()->get_list_of_countries();
if (isset($countrymap[$incoming])) {
$countrycode = $incoming;
} else {
$countrycode = array_search($aaddata[$remotefield], get_string_manager()->get_list_of_countries());
}
$user->$localfield = (!empty($countrycode)) ? $countrycode : '';
break;
case 'businessPhones':
$user->$localfield = implode(', ', $aaddata[$remotefield]);
break;
default:
$user->$localfield = $aaddata[$remotefield];
}
}
if (!PHPUNIT_TEST) {
switch ($remotefield) {
case 'manager':
$user->$localfield = $usersync->get_user_manager($userobjectid);
break;
case 'groups':
$user->$localfield = $usersync->get_user_group_names($userobjectid);
break;
case 'teams':
$user->$localfield = $usersync->get_user_teams($userobjectid);
break;
case 'roles':
$user->$localfield = $usersync->get_user_roles($userobjectid);
break;
case 'preferredName':
if (!isset($aaddata[$remotefield])) {
if (stripos($aaddata['userPrincipalName'], '_ext_') !== false) {
$user->$localfield = $usersync->get_preferred_name($userobjectid);
}
}
break;
default:
if (substr($remotefield, 0, 18) == 'extensionAttribute') {
$extensionattributeid = substr($remotefield, 18);
if (ctype_digit($extensionattributeid) && $extensionattributeid >= 1 && $extensionattributeid <= 15) {
if (isset($aaddata['onPremisesExtensionAttributes']) &&
isset($aaddata['onPremisesExtensionAttributes'][$remotefield])) {
$user->$localfield = $aaddata['onPremisesExtensionAttributes'][$remotefield];
}
}
}
}
}
}
// Lang cannot be longer than 2 chars.
if (!empty($user->lang) && strlen($user->lang) > 2) {
$user->lang = substr($user->lang, 0, 2);
}
return $user;
}