uid); if ($owned_resources = _wsauth_get_owned_resources($owner)) { // Sort resources according to title uasort( $owned_resources, function ($a, $b) { if (strtolower($a->title) == strtolower($b->title)) { return 0; } else { return (strtolower($a->title) < strtolower($b->title)) ? -1 : 1; } } ); // Fetch users that are permitted to access our resources $permitted_user_uids = array(); foreach ($owned_resources as $resource) { if ($field_permitted_users = field_get_items('node', $resource, 'field_permitted_users')) { foreach ($field_permitted_users as $uid) { $permitted_user_uids[$uid['target_id']] = $uid['target_id']; } } } $permitted_users = entity_load('user', $permitted_user_uids); // FIXA: Sorteringarna bör göras i databasen i stället uasort( $permitted_users, function ($a, $b) { if (strtolower($a->name) == strtolower($b->name)) { return 0; } else { return (strtolower($a->name) < strtolower($b->name)) ? -1 : 1; } } ); $form['permissions'] = array( '#theme' => 'wsauth_permissions_table', ); // Get current users and resources $options = array_fill_keys(array_keys($owned_resources), ''); $form['permissions']['users'] = array( '#tree' => TRUE, ); foreach ($permitted_users as $id => $permitted_user) { $permitted_resources = _wsauth_get_permitted_resources($permitted_user); $form['permissions']['users'][$id] = array( 'userinfo' => array( '#type' => 'item', '#markup' => theme('wsauth_permissions_form_userinfo', array('user' => $permitted_user)), ), 'resources' => array( '#type' => 'checkboxes', '#options' => $options, '#default_value' => array_combine(array_keys($permitted_resources), array_keys($permitted_resources)), ), ); } // Fields for adding users if (!isset($form_state['num_new_users'])) { $form_state['num_new_users'] = 0; } if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#name'] == 'add_another_user') { $form_state['num_new_users']++; } $languages = array(); foreach (language_list() as $language) { $languages[$language->language] = t($language->name); } $form['permissions']['new_users'] = array( '#tree' => TRUE, ); for ($i = 0; $i < $form_state['num_new_users']; $i++) { $form['permissions']['new_users'][$i] = array( 'userinfo' => array( 'name' => array( '#title' => t('Name'), '#type' => 'textfield', ), 'mail' => array( '#title' => t('E-mail address'), '#type' => 'textfield', ), 'language' => array( '#title' => t('Language'), '#type' => 'select', '#options' => $languages, '#default_value' => language_default('language'), ), ), 'resources' => array( '#type' => 'checkboxes', '#options' => $options, ), ); } // Misc foreach ($owned_resources as $id => $owned_resource) { $form['permissions']['owned_resources'][$id] = array( '#markup' => check_plain($owned_resource->title), '#tree' => TRUE, ); } $form['actions'] = array( '#type' => 'actions', 'submit' => array( '#type' => 'submit', '#name' => 'submit', '#value' => t('Save permissions'), ), 'add_another_user' => array( '#type' => 'button', '#name' => 'add_another_user', '#value' => t('Add user'), '#ajax' => array( 'callback' => 'wsauth_permissions_form_add_another_user_callback', 'wrapper' => 'permissions', 'method' => 'replace', ), ), ); $form['#validate'] = array('wsauth_permissions_form_validate'); $form['#submit'] = array('wsauth_permissions_form_submit'); } else { $form['noresources'] = array( '#markup' => t('No resources found'), ); } return $form; } function wsauth_permissions_form_add_another_user_callback($form, $form_state) { return $form['permissions']; } function theme_wsauth_permissions_table($variables) { // Inspired by user.admin.inc:theme_user_admin_permissions $form = $variables['table']; $rows = array(); if (isset($form['users'])) { foreach (element_children($form['users']) as $uid) { $row = array(); $row[] = array( 'data' => drupal_render($form['users'][$uid]['userinfo']), 'class' => array('permission'), ); foreach (element_children($form['users'][$uid]['resources']) as $resid) { $row[] = array( 'data' => drupal_render($form['users'][$uid]['resources'][$resid]), 'class' => array('checkbox'), ); } $rows[] = $row; } } if (isset($form['new_users'])) { foreach (element_children($form['new_users']) as $id) { $row = array(); $row[] = array( 'data' => drupal_render($form['new_users'][$id]['userinfo']), 'class' => array('permission', 'permission-new-user'), ); foreach (element_children($form['new_users'][$id]['resources']) as $resid) { $row[] = array( 'data' => drupal_render($form['new_users'][$id]['resources'][$resid]), 'class' => array('checkbox', 'checkbox-new-user'), ); } $rows[] = $row; } } $header = array(); if (isset($form['owned_resources'])) { $header[] = t('User'); foreach (element_children($form['owned_resources']) as $res) { $header[] = array( 'data' => drupal_render($form['owned_resources'][$res]), ); } } $output = theme( 'table', array( 'header' => $header, 'rows' => $rows, 'attributes' => array( 'id' => 'permissions', ), ) ); return $output; } function theme_wsauth_permissions_form_userinfo($variables) { $user = $variables['user']; $output = '
' . '' . check_plain($user->name) . '' . '
'; return $output; } function wsauth_permissions_form_validate($form, &$form_state) { if ($form_state['triggering_element']['#name'] == 'submit') { // Only do validation on submit if (isset($form_state['values']['new_users'])) { foreach ($form_state['values']['new_users'] as $i => $new_user) { $par = sprintf("new_users][%d", $i); $empty = TRUE; unset($new_user['userinfo']['language']); // Ignore language when checking for empty rows foreach (array_merge($new_user['userinfo'], $new_user['resources']) as $element) { if (!empty($element)) { $empty = FALSE; break; } } if (!$empty) { if (isset($form['permissions']['new_users'][$i]['userinfo']['mail'])) { if (!valid_email_address($new_user['userinfo']['mail'])) { form_set_error($par, t('You must enter a valid e-mail address.')); } if (($user = user_load_by_mail($new_user['userinfo']['mail'])) && (isset($form_state['values']['users'][$user->uid]))) { form_set_error($par, t('User @user already exists.', array('@user' => $user->mail))); } } if (isset($form['permissions']['new_users'][$i]['userinfo']['name'])) { if (empty($new_user['userinfo']['name'])) { form_set_error($par, t('You must enter a username.')); } if (($user = user_load_by_name($new_user['userinfo']['name'])) && (isset($form_state['values']['users'][$user->uid]))) { form_set_error($par, t('User @user already exists.', array('@user' => $user->name))); } } if (!array_sum($new_user['resources'])) { form_set_error($par, t('You must choose at least one resource.')); } } } } } } function wsauth_permissions_form_submit($form, &$form_state) { // Iterate through existing users and generate permitted users field content $resource_user_mapping = array(); if (isset($form_state['values']['users'])) { foreach ($form_state['values']['users'] as $uid => $userdata) { foreach ($userdata['resources'] as $resid => $grant) { if ($grant) { $resource_user_mapping[$resid][] = array('target_id' => $uid); } } } } // Iterate through new users, create them if necessary and add them to permitted users field content if (isset($form_state['values']['new_users'])) { foreach ($form_state['values']['new_users'] as $userdata) { if (empty($userdata['userinfo'])) { // An empty userinfo field is the current option for undo continue; } if (!($user = user_load_by_mail($userdata['userinfo']['mail']))) { // Add new user $edit = array('status' => 1); if (isset($userdata['userinfo']['mail'])) { $edit['mail'] = $userdata['userinfo']['mail']; } if (isset($userdata['userinfo']['name'])) { $name = $userdata['userinfo']['name']; // Append a number to the user name if it already exists $i = 1; while (user_load_by_name($name)) { $name = sprintf("%s%d", $userdata['userinfo']['name'], ++$i); } $edit['name'] = $name; } if (isset($userdata['userinfo']['language'])) { $edit['language'] = $userdata['userinfo']['language']; } if ($user = user_save(NULL, $edit)) { // FIXA: Bättre lösning _user_mail_notify('status_activated', $user); } else { // FIXA: Gör något vettigt här continue; } } foreach ($userdata['resources'] as $resid => $grant) { if ($grant) { $resource_user_mapping[$resid][] = array('target_id' => $user->uid); } } } } // Update the resources that have been modified $granted_msg = 'Granted usage of @resource to @user.'; $revoked_msg = 'Revoked usage of @resource from @user.'; $error_msg = 'Could not set permissions on @resource.'; $owned_resources = _wsauth_get_owned_resources($GLOBALS['user']); foreach ($owned_resources as $resource) { $granted_users = array(); $revoked_users = array(); if (!($old_perms = field_get_items('node', $resource, 'field_permitted_users'))) { $old_perms = array(); } if (!isset($resource_user_mapping[$resource->nid])) { $resource_user_mapping[$resource->nid] = array(); } foreach ($old_perms as $old_perm) { if (!in_array($old_perm, $resource_user_mapping[$resource->nid])) { $revoked_users[] = $old_perm['target_id']; } } foreach ($resource_user_mapping[$resource->nid] as $perm) { if (!in_array($perm, $old_perms)) { $granted_users[] = $perm['target_id']; } } if ($granted_users || $revoked_users) { $resource->field_permitted_users[LANGUAGE_NONE] = $resource_user_mapping[$resource->nid]; try { node_save($resource); $changed_users = entity_load('user', array_merge($granted_users, $revoked_users)); foreach ($granted_users as $granted_user) { drupal_set_message(t($granted_msg, array('@resource' => $resource->title, '@user' => $changed_users[$granted_user]->name))); } foreach ($revoked_users as $revoked_user) { drupal_set_message(t($revoked_msg, array('@resource' => $resource->title, '@user' => $changed_users[$revoked_user]->name))); } } catch (Exception $e) { drupal_set_message(t($error_msg, array('@resource' => $resource->title)), 'error'); } } } }