plugins/yubikey/auth.php
author Dan
Thu, 26 Feb 2009 01:19:45 -0500
changeset 2 6edc6ebb3b39
parent 0 9d2c4f04a0d0
child 3 d0fe7acaf0e8
permissions -rw-r--r--
Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     1
<?php
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     2
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     3
// hook into auth
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     4
$plugins->attachHook('login_process_userdata_json', 'return yubikey_auth_hook_json($userinfo, $req["level"], @$req["remember"]);');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     5
// hook into special page init
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     6
$plugins->attachHook('session_started', 'yubikey_add_special_pages();');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     7
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     8
function yubikey_auth_hook_json(&$userdata, $level, $remember)
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
     9
{
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    10
  global $db, $session, $paths, $template, $plugins; // Common objects
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    11
  global $lang;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    12
  
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    13
  $do_validate_otp = false;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    14
  $do_validate_user = false;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    15
  $do_validate_pass = false;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    16
  
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    17
  $user_flag = ( $level >= USER_LEVEL_CHPREF ) ? YK_SEC_ELEV_USERNAME : YK_SEC_NORMAL_USERNAME;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    18
  $pass_flag = ( $level >= USER_LEVEL_CHPREF ) ? YK_SEC_ELEV_PASSWORD : YK_SEC_NORMAL_PASSWORD;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    19
  
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    20
  $auth_log_prefix = ( $level >= USER_LEVEL_CHPREF ) ? 'admin_' : '';
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    21
  
2
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    22
  // Sort of a hack: if the password looks like an OTP and the OTP field is empty, use the password as the OTP
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    23
  if ( empty($userdata['yubikey_otp']) && preg_match('/^[cbdefghijklnrtuv]{44}$/', $userdata['password'] ) )
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    24
  {
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    25
    $userdata['yubikey_otp'] = $userdata['password'];
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    26
  }
6edc6ebb3b39 Minor: if input OTP is empty and password looks like OTP, now copies password to OTP in memory and treats password field as OTP. Will require patch in Enano trunk to work for html login.
Dan
parents: 0
diff changeset
    27
  
0
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    28
  if ( !empty($userdata['username']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    29
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    30
    // get flags
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    31
    $q = $db->sql_query('SELECT user_id, user_yubikey_flags FROM ' . table_prefix . "users WHERE " . ENANO_SQLFUNC_LOWERCASE . "(username) = '" . $db->escape(strtolower($userdata['username'])) . "';");
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    32
    if ( !$q )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    33
      $db->die_json();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    34
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    35
    if ( $db->numrows() < 1 )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    36
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    37
      // Username not found - let the main login function handle it
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    38
      $db->free_result();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    39
      return null;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    40
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    41
    list($user_id, $flags) = $db->fetchrow_num();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    42
    $flags = intval($flags);
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    43
    // At the point the username is validated.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    44
    $do_validate_user = false;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    45
    $do_validate_pass = $flags & $pass_flag;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    46
    if ( empty($userdata['yubikey_otp']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    47
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    48
      // no OTP was provided
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    49
      // make sure the user has allowed logging in with no OTP
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    50
      if ( !($flags & YK_SEC_ALLOW_NO_OTP) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    51
      {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    52
        // We also might have no Yubikeys enrolled.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    53
        $q = $db->sql_query('SELECT 1 FROM ' . table_prefix . "yubikey WHERE user_id = $user_id;");
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    54
        if ( !$q )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    55
          $db->die_json();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    56
        
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    57
        if ( $db->numrows() > 0 )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    58
        {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    59
          // Yep at least one key is enrolled.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    60
          // I don't think these should be logged because they'll usually just be innocent mistakes.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    61
          $db->free_result();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    62
          return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    63
              'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    64
              'error' => 'yubiauth_err_must_have_otp'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    65
            );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    66
        }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    67
        // Nope, no keys enrolled, user hasn't enabled Yubikey support
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    68
        $db->free_result();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    69
      }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    70
      // we're ok, use normal password auth
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    71
      return null;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    72
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    73
    else
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    74
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    75
      // user did enter an OTP
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    76
      $do_validate_otp = true;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    77
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    78
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    79
  else if ( !empty($userdata['yubikey_otp']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    80
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    81
    // we have an OTP, but no username to work with
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    82
    $yubi_uid = substr($userdata['yubikey_otp'], 0, 12);
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    83
    if ( !preg_match('/^[cbdefghijklnrtuv]{12}$/', $yubi_uid ) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    84
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    85
      return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    86
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    87
          'error' => 'yubiauth_err_invalid_otp'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    88
        );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    89
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    90
    $q = $db->sql_query('SELECT u.user_id, u.username, u.user_yubikey_flags FROM ' . table_prefix . "users AS u\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    91
                      . "  LEFT JOIN " . table_prefix . "yubikey AS y\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    92
                      . "    ON ( y.user_id = u.user_id )\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    93
                      . "  WHERE y.yubi_uid = '$yubi_uid'\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    94
                      . "  GROUP BY u.user_yubikey_flags;");
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    95
    if ( !$q )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    96
      $db->_die();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    97
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    98
    if ( $db->numrows() < 1 )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
    99
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   100
      if ( !$do_validate_pass )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   101
        $session->sql('INSERT INTO ' . table_prefix . "logs(log_type,action,time_id,date_string,author,edit_summary,page_text) VALUES\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   102
                   . '  (\'security\', \'' . $auth_log_prefix . 'auth_bad\', '.time().', \''.enano_date('d M Y h:i a').'\', \'(Yubikey)\', '
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   103
                      . '\''.$db->escape($_SERVER['REMOTE_ADDR']).'\', ' . intval($level) . ')');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   104
      
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   105
      return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   106
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   107
          'error' => 'yubiauth_err_key_not_authorized'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   108
        );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   109
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   110
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   111
    list($user_id, $username, $flags) = $db->fetchrow_num();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   112
    $do_validate_otp = true;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   113
    $do_validate_user = $flags & $user_flag;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   114
    $do_validate_pass = $flags & $pass_flag;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   115
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   116
  else
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   117
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   118
    // Nothing - no username or OTP. This request can't be used; throw it out.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   119
    return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   120
        'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   121
        'error' => 'yubiauth_err_nothing_provided'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   122
      );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   123
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   124
  if ( $do_validate_otp )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   125
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   126
    // We need to validate the OTP.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   127
    $otp_check = yubikey_validate_otp($userdata['yubikey_otp']);
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   128
    if ( !$otp_check['success'] )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   129
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   130
      if ( !$do_validate_pass )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   131
        $session->sql('INSERT INTO ' . table_prefix . "logs(log_type,action,time_id,date_string,author,edit_summary,page_text) VALUES\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   132
                   . '  (\'security\', \'' . $auth_log_prefix . 'auth_bad\', '.time().', \''.enano_date('d M Y h:i a').'\', \'(Yubikey)\', '
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   133
                      . '\''.$db->escape($_SERVER['REMOTE_ADDR']).'\', ' . intval($level) . ')');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   134
      return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   135
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   136
          'error' => 'yubiauth_err_' . $otp_check['error']
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   137
        );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   138
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   139
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   140
  if ( $do_validate_user )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   141
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   142
    if ( empty($username) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   143
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   144
      return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   145
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   146
          'error' => 'yubiauth_err_must_have_username'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   147
        );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   148
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   149
    if ( strtolower($username) !== strtolower($userdata['username']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   150
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   151
      // Username incorrect
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   152
      if ( !$do_validate_pass )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   153
        $session->sql('INSERT INTO ' . table_prefix . "logs(log_type,action,time_id,date_string,author,edit_summary,page_text) VALUES\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   154
                   . '  (\'security\', \'' . $auth_log_prefix . 'auth_bad\', '.time().', \''.enano_date('d M Y h:i a').'\', \'(Yubikey)\', '
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   155
                      . '\''.$db->escape($_SERVER['REMOTE_ADDR']).'\', ' . intval($level) . ')');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   156
      return array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   157
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   158
          'error' => 'invalid_credentials'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   159
        );
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   160
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   161
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   162
  // Do we need to have the password validated?
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   163
  if ( $do_validate_pass )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   164
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   165
    // Yes; return and let the login API continue
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   166
    return null;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   167
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   168
  else
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   169
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   170
    // No password required; validated, issue session key
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   171
    $session->sql('INSERT INTO ' . table_prefix . "logs(log_type,action,time_id,date_string,author,edit_summary,page_text) VALUES\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   172
                   . '  (\'security\', \'' . $auth_log_prefix . 'auth_good\', '.time().', \''.enano_date('d M Y h:i a').'\', \'' . $db->escape($userdata['username']) . '\', '
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   173
                      . '\''.$db->escape($_SERVER['REMOTE_ADDR']).'\', ' . intval($level) . ')');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   174
        
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   175
    $q = $db->sql_query('SELECT password FROM ' . table_prefix . "users WHERE user_id = $user_id;");
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   176
    if ( !$q )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   177
      $db->_die();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   178
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   179
    list($password) = $db->fetchrow_num();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   180
    $db->free_result();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   181
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   182
    $session->register_session($user_id, $userdata['username'], $password, $level, $remember);
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   183
    return true;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   184
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   185
}
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   186
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   187
function yubikey_add_special_pages()
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   188
{
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   189
  global $db, $session, $paths, $template, $plugins; // Common objects
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   190
  global $lang;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   191
  
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   192
  $paths->add_page(array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   193
      'name' => $lang->get('yubiauth_specialpage_yubikey'),
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   194
      'urlname' => 'Yubikey',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   195
      'namespace' => 'Special',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   196
      'visible' => 0, 'protected' => 0, 'comments_on' => 0, 'special' => 0
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   197
    ));
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   198
}
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   199
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   200
function page_Special_Yubikey()
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   201
{
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   202
  global $db, $session, $paths, $template, $plugins; // Common objects
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   203
  
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   204
  header('Content-type: text/javascript');
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   205
  /*
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   206
  if ( isset($_GET['validate_otp']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   207
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   208
    echo enano_json_encode(yubikey_validate_otp($_GET['validate_otp']));
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   209
    return true;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   210
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   211
  */
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   212
  if ( isset($_GET['get_flags']) || isset($_POST['get_flags']) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   213
  {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   214
    $yubi_uid = substr($_REQUEST['get_flags'], 0, 12);
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   215
    if ( !preg_match('/^[cbdefghijklnrtuv]{12}$/', $yubi_uid) )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   216
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   217
      return print enano_json_encode(array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   218
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   219
          'error' => 'invalid_otp'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   220
        ));
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   221
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   222
    $q = $db->sql_query('SELECT u.user_yubikey_flags FROM ' . table_prefix . "users AS u\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   223
                      . "  LEFT JOIN " . table_prefix . "yubikey AS y\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   224
                      . "    ON ( y.user_id = u.user_id )\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   225
                      . "  WHERE y.yubi_uid = '$yubi_uid'\n"
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   226
                      . "  GROUP BY u.user_yubikey_flags;");
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   227
    if ( !$q )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   228
      $db->_die();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   229
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   230
    if ( $db->numrows() < 1 )
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   231
    {
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   232
      return print enano_json_encode(array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   233
          'mode' => 'error',
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   234
          'error' => 'key_not_authorized'
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   235
        ));
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   236
    }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   237
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   238
    list($flags) = $db->fetchrow_num();
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   239
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   240
    echo enano_json_encode(array(
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   241
        // We strip YK_SEC_ALLOW_NO_OTP here for security reasons.
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   242
        'flags' => intval($flags & ~YK_SEC_ALLOW_NO_OTP)
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   243
      ));
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   244
    
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   245
    return true;
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   246
  }
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   247
}
9d2c4f04a0d0 First commit! Hoping everything works.
Dan
parents:
diff changeset
   248