<?php
// $Id: pubcookiesiteaccess.module,v 1.1.2.1 2009/05/13 18:03:39 jvandyk Exp $

/**
 * @file
 * Restricts logins to a list of usernames.
 */

/**
 * Implementation of hook_menu().
 */
function pubcookiesiteaccess_menu() {
  $items['admin/user/pubcookiesiteaccess'] = array(
    'title' => 'Change who may access this site',
    'description' => 'Edit the list of users who may access the site.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('pubcookiesiteaccess_settings'),
    'access arguments' => array('administer pubcookie site access')
  );

  return $items;
}

/**
 * Implementation of hook_perm().
 */
function pubcookiesiteaccess_perm() {
  return array('administer pubcookie site access');
}

/*
 * The pubcookie site access settings page.
 */
function pubcookiesiteaccess_settings() {
  if (!variable_get('pubcookie_id_is_email', 0)) {
    $form['warning']['#value'] = t('This functionality requires the ID/Email equivalency feature of the pubcookie module to be turned on. You can turn it on by visiting the <a href="@url">pubcookie settings</a> page.', array('@url' => url('admin/settings/pubcookie')));
    return $form;
  }

  $pubcookiesiteaccess_usernames = variable_get('pubcookiesiteaccess_usernames', '');
  $form['pubcookiesiteaccess_usernames'] = array(
    '#type' => 'textarea',
    '#cols' => 24,
    '#rows' => 30,
    '#title' => t('Who may access this site?'),
    '#default_value' => $pubcookiesiteaccess_usernames == '' ? '' : implode("\n", $pubcookiesiteaccess_usernames),
    '#description' => t('Enter the usernames (one per line) of those who should be able to access this site.'),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );

  return $form;
}

/**
 * Validate user list.
 */
function pubcookiesiteaccess_settings_validate($form, &$form_state) {
  // Change to an array.
  $users = explode("\n", $form_state['values']['pubcookiesiteaccess_usernames']);

  // Zap whitespace.
  $trimmed_users = array_map('trim', $users);

  // Zap empty lines.
  $nonempty_users = array_filter($trimmed_users);

  // Zap commas.
  $clean_users = array_map('_pubcookiesiteaccess_clean', $nonempty_users);

  // Validate names; e.g., j(**~ąz is a bad name.
  foreach($clean_users as $name) {
    if (user_validate_name($name)) {
      form_set_error('pubcookiesiteaccess_usernames', t("'%name' is not a valid username.", array('%name' => $name)));
    }
  }

  $form_state['values']['clean_users'] = $clean_users;
}

/**
 * Store user list in a persistent variable.
 *
 * @see pubcookiesiteaccess_settings
 */
function pubcookiesiteaccess_settings_submit($form, &$form_state) {
  variable_set('pubcookiesiteaccess_usernames', $form_state['values']['clean_users']);

  drupal_set_message(t('The changes have been saved.'));
}

/**
 * Remove trailing commas.
 *
 * @param string $s
 * @return
 *   String without trailing commas.
 */
function _pubcookiesiteaccess_clean($s) {
  return rtrim($s, ',');
}
