Changeset 26605


Ignore:
Timestamp:
Jan 11, 2014, 1:27:14 AM (7 years ago)
Author:
mistic100
Message:

add Persona authentification

Location:
extensions/oAuth
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • extensions/oAuth/admin/template/providers.tpl

    r26558 r26605  
    128128      </ol>
    129129    {else}
    130       <p>{'No registration required for OpenID based providers'|translate}</p>
     130      <p style="text-align:left;">
     131      {if $p=='Flickr' or $p=='Steam' or $p=='Wordpress'}
     132        {'Based on OpenID.'|translate}</br>
     133      {/if}
     134      {'No registration required.'|translate}<br>
     135      <a href="{$provider.about_link}" target="_blank">{'About'|translate}</a>
     136      </p>
    131137    {/if}
    132138    </div>
  • extensions/oAuth/admin/template/style.css

    r26556 r26605  
    4848    margin:5px;
    4949  }
    50 .Wordpress, .OpenID, .Flickr, .Steam {
     50.Wordpress, .OpenID, .Flickr, .Steam, .Persona {
    5151  display:inline-block;
    5252}
  • extensions/oAuth/auth.php

    r26604 r26605  
    1010try {
    1111  // inputs
    12   if ( $provider == 'OpenID' and !isset($_GET['openid_identifier']) )
     12  if ($provider == 'OpenID' and !isset($_GET['openid_identifier']))
    1313  {
    1414    throw new Exception('Invalid OpenID!', 1003);
     
    2525  }
    2626 
    27   $hybridauth = new Hybrid_Auth($hybridauth_conf);
     27  if ($provider == 'Persona')
     28  {
     29    $response = persona_verify($_POST['assertion']);
     30   
     31    if ($response === false || $response['status'] != 'okay')
     32    {
     33      header('HTTP/1.1 503 Service Unavailable');
     34      exit;
     35    }
     36    else
     37    {
     38      $oauth_id = array($provider, $response['email']);
     39    }
     40  }
     41  else
     42  {
     43    $hybridauth = new Hybrid_Auth($hybridauth_conf);
     44   
     45    // connected
     46    if ($hybridauth->isConnectedWith($provider))
     47    {
     48      $adapter = $hybridauth->getAdapter($provider);
     49      $remote_user = $adapter->getUserProfile();
     50     
     51      $oauth_id = array($provider, $remote_user->identifier);
     52    }
     53  }
    2854 
    29   // connected
    30   if ($hybridauth->isConnectedWith($provider))
     55  if (!empty($oauth_id))
    3156  {
    32     $adapter = $hybridauth->getAdapter($provider);
    33     $remote_user = $adapter->getUserProfile();
    34    
    35     $oauth_id = $provider.'---'.$remote_user->identifier;
    36    
    3757    // check is already registered
    3858    $query = '
    39 SELECT id FROM '.USERS_TABLE.'
    40   WHERE oauth_id = "'.$oauth_id.'"
     59SELECT id FROM ' . USERS_TABLE . '
     60  WHERE oauth_id = "' . implode('---', $oauth_id) . '"
    4161;';
    4262    $result = pwg_query($query);
     
    4767      log_user($user_id, false);
    4868     
    49       $template->assign('REDIRECT_TO', 'default');
     69      $redirect_to = 'default';
    5070    }
    5171    // not registered : redirect to register page
     
    5474      if ($conf['allow_user_registration'])
    5575      {
    56         pwg_set_session_var('oauth_new_user', array($provider,$remote_user->identifier));
    57         $template->assign('REDIRECT_TO', 'register');
     76        pwg_set_session_var('oauth_new_user', $oauth_id);
     77        $redirect_to = 'register';
    5878      }
    5979      else
    6080      {
    6181        $_SESSION['page_errors'][] = l10n('Sorry, new registrations are blocked on this gallery.');
    62         $adapter->logout();
    63         $template->assign('REDIRECT_TO', 'identification');
     82        if (isset($adapter)) $adapter->logout();
     83        $redirect_to = 'identification';
    6484      }
     85    }
     86   
     87    if ($provider == 'Persona')
     88    {
     89      echo json_encode(compact('redirect_to'));
     90      header('HTTP/1.1 200 OK');
     91      exit;
     92    }
     93    else
     94    {
     95      $template->assign('REDIRECT_TO', $redirect_to);
    6596    }
    6697  }
     
    92123     5 : Authentication aborded
    93124     6 : User profile request failed
     125   404 : User not found
    94126 other errors :
     127   503 : Persona error
    95128  1002 : Invalid provider
    96129  1003 : Missing openid_identifier
    97130*/
    98 catch (Exception $e) {
    99   switch ($e->getCode()) {
     131catch (Exception $e)
     132{
     133  switch ($e->getCode())
     134  {
    100135    case 5:
    101136      $template->assign('ERROR', l10n('Authentication canceled')); break;
  • extensions/oAuth/include/functions.inc.php

    r26604 r26605  
    2525function oauth_assign_template_vars($u_redirect=null)
    2626{
    27   global $template, $conf, $hybridauth_conf;
     27  global $template, $conf, $hybridauth_conf, $user;
    2828 
    2929  $conf['oauth']['include_common_template'] = true;
     
    3131  if ($template->get_template_vars('OAUTH') == null)
    3232  {
     33    if (!empty($user['oauth_id']))
     34    {
     35      list($provider, $identifier) = explode('---', $user['oauth_id'], 2);
     36      if ($provider == 'Persona')
     37      {
     38        $persona_email = $identifier;
     39      }
     40    }
     41   
    3342    $template->assign('OAUTH', array(
    3443      'conf' => $conf['oauth'],
    3544      'u_login' => get_root_url() . OAUTH_PATH . 'auth.php?provider=',
    3645      'providers' => $hybridauth_conf['providers'],
     46      'persona_email' => @$persona_email,
    3747      ));
    3848    $template->assign(array(
     
    7080  }
    7181}
     82
     83// http://www.sitepoint.com/authenticate-users-with-mozilla-persona/
     84function persona_verify()
     85{
     86  $url = 'https://verifier.login.persona.org/verify';
     87
     88  $assert = filter_input(
     89    INPUT_POST,
     90    'assertion',
     91    FILTER_UNSAFE_RAW,
     92    FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH
     93    );
     94
     95  $scheme = 'http';
     96  if ( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443 )
     97  {
     98    $scheme = 'https';
     99  }
     100  $audience = sprintf(
     101    '%s://%s:%s',
     102    $scheme,
     103    $_SERVER['HTTP_HOST'],
     104    $_SERVER['SERVER_PORT']
     105    );
     106
     107  $params = 'assertion=' . urlencode($assert) . '&audience=' . urlencode($audience);
     108
     109  $options = array(
     110    CURLOPT_URL => $url,
     111    CURLOPT_RETURNTRANSFER => true,
     112    CURLOPT_POST => true,
     113    CURLOPT_POSTFIELDS => $params,
     114    CURLOPT_SSL_VERIFYPEER => true,
     115    CURLOPT_SSL_VERIFYHOST => 2,
     116    );
     117
     118  $ch = curl_init();
     119  curl_setopt_array($ch, $options);
     120  $result = curl_exec($ch);
     121  curl_close($ch);
     122 
     123  if ($result === false)
     124  {
     125    return false;
     126  }
     127  else
     128  {
     129    return json_decode($result, true);
     130  }
     131}
  • extensions/oAuth/include/providers_stats.inc.php

    r26555 r26605  
    5555    'provider_name'     => 'OpenID',
    5656    'new_app_link'      => null,
     57    'about_link'        => 'http://openid.net/get-an-openid/what-is-openid/',
    5758  ),
    5859  'Flickr' => array(
     
    6061    'provider_name'     => 'Flickr',
    6162    'new_app_link'      => null,
     63    'about_link'        => 'http://openid.net/get-an-openid/what-is-openid/',
    6264  ),
    6365  'Steam' => array(
     
    6567    'provider_name'     => 'Steam',
    6668    'new_app_link'      => null,
     69    'about_link'        => 'http://openid.net/get-an-openid/what-is-openid/',
    6770  ),
    6871  'Wordpress' => array(
     
    7073    'provider_name'     => 'Wordpress',
    7174    'new_app_link'      => null,
     75    'about_link'        => 'http://openid.net/get-an-openid/what-is-openid/',
    7276  ),
     77  'Persona' => array(
     78    'label'             => 'Persona',
     79    'provider_name'     => 'Persona',
     80    'new_app_link'      => null,
     81    'about_link'        => 'https://login.persona.org/about',
     82    ),
    7383);
  • extensions/oAuth/include/public_events.inc.php

    r26604 r26605  
    99  global $template, $conf, $hybridauth_conf;
    1010 
    11   if ($hybridauth_conf['enabled'] > 0)
     11  if ($hybridauth_conf['enabled'] == 0)
    1212  {
    1313    return;
     
    3737  {
    3838    list($oauth_id) = pwg_db_fetch_row($result);
    39     list($provider) = explode('---', $oauth_id);
     39    list($provider) = explode('---', $oauth_id, 2);
    4040    $_SESSION['page_errors'][] = l10n('You registered with a %s account, please sign in with the same account.', $provider);
    4141   
     
    6565    list($provider, $user_identifier) = pwg_get_session_var('oauth_new_user');
    6666   
    67     require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
    68    
    6967    try {
    70       $hybridauth = new Hybrid_Auth($hybridauth_conf);
    71       $adapter = $hybridauth->authenticate($provider);
    72       $remote_user = $adapter->getUserProfile();
    73      
    74       // security, check remote identifier
    75       if ($remote_user->identifier != $user_identifier)
     68      if ($provider == 'Persona')
    7669      {
    77         pwg_unset_session_var('oauth_new_user');
    78         throw new Exception('Hacking attempt!', 403);
     70        $template->assign('OAUTH_USER', array(
     71          'provider' => $provider,
     72          'username' => $user_identifier,
     73          'u_profile' => null,
     74          'avatar' => null,
     75          ));
     76       
     77        oauth_assign_template_vars();
     78        $template->append('OAUTH', array('persona_email'=>$user_identifier), true);
     79     
     80        $conf['oauth']['include_common_template'] = true;
    7981      }
    80    
    81       $template->assign('OAUTH_USER', array(
    82         'provider' => $provider,
    83         'username' => $remote_user->displayName,
    84         'u_profile' => $remote_user->profileURL,
    85         'avatar' => $remote_user->photoURL,
    86         ));
     82      else
     83      {
     84        require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
    8785       
     86        $hybridauth = new Hybrid_Auth($hybridauth_conf);
     87        $adapter = $hybridauth->authenticate($provider);
     88        $remote_user = $adapter->getUserProfile();
     89       
     90        // security, check remote identifier
     91        if ($remote_user->identifier != $user_identifier)
     92        {
     93          pwg_unset_session_var('oauth_new_user');
     94          throw new Exception('Hacking attempt!', 403);
     95        }
     96     
     97        $template->assign('OAUTH_USER', array(
     98          'provider' => $provider,
     99          'username' => $remote_user->displayName,
     100          'u_profile' => $remote_user->profileURL,
     101          'avatar' => $remote_user->photoURL,
     102          ));
     103      }
     104     
     105      $oauth_id = $provider.'---'.$user_identifier;
     106     
    88107      $page['infos'][] = l10n('Your registration is almost done, please complete the registration form.');
    89      
    90       $oauth_id = $provider.'---'.$remote_user->identifier;
    91108     
    92109      // form submited
     
    124141      {
    125142        // overwrite fields with remote datas
    126         $_POST['login'] = $remote_user->displayName;
    127         $_POST['mail_address'] = $remote_user->email;
     143        if ($provider == 'Persona')
     144        {
     145          $_POST['login'] = '';
     146          $_POST['mail_address'] = $user_identifier;
     147        }
     148        else
     149        {
     150          $_POST['login'] = $remote_user->displayName;
     151          $_POST['mail_address'] = $remote_user->email;
     152        }
    128153      }
    129154     
     
    133158      $template->set_prefilter('register', 'oauth_remove_password_fields_prefilter');
    134159    }
    135     catch (Exception $e) {
     160    catch (Exception $e)
     161    {
    136162      $page['errors'][] = l10n('An error occured, please contact the gallery owner. <i>Error code : %s</i>', $e->getCode());
    137163    }
     
    152178function oauth_begin_profile()
    153179{
    154   global $template, $user, $hybridauth_conf, $page;
    155  
    156   $oauth_id = get_oauth_id($user['id']);
    157  
    158   if (!isset($oauth_id))
    159   {
    160     return;
    161   }
    162  
    163   list($provider) = explode('---', $oauth_id);
    164  
    165   require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
     180  global $template, $user, $hybridauth_conf, $page, $user;
     181 
     182  if (empty($user['oauth_id']))
     183  {
     184    return;
     185  }
     186 
     187  list($provider, $user_identifier) = explode('---', $user['oauth_id'], 2);
    166188 
    167189  try {
    168     $hybridauth = new Hybrid_Auth($hybridauth_conf);
    169     $adapter = $hybridauth->getAdapter($provider);
    170     $remote_user = $adapter->getUserProfile();
    171    
    172     $template->assign('OAUTH_USER', array(
    173       'provider' => $provider,
    174       'username' => $remote_user->displayName,
    175       'u_profile' => $remote_user->profileURL,
    176       'avatar' => $remote_user->photoURL,
    177       ));
     190    if ($provider == 'Persona')
     191    {
     192      $template->assign('OAUTH_USER', array(
     193        'provider' => $provider,
     194        'username' => $user_identifier,
     195        'u_profile' => null,
     196        'avatar' => null,
     197        ));
     198    }
     199    else
     200    {
     201      require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
     202     
     203      $hybridauth = new Hybrid_Auth($hybridauth_conf);
     204      $adapter = $hybridauth->getAdapter($provider);
     205      $remote_user = $adapter->getUserProfile();
     206     
     207      $template->assign('OAUTH_USER', array(
     208        'provider' => $provider,
     209        'username' => $remote_user->displayName,
     210        'u_profile' => $remote_user->profileURL,
     211        'avatar' => $remote_user->photoURL,
     212        ));
     213    }
    178214   
    179215    $template->assign('OAUTH_PATH', OAUTH_PATH);
     
    181217    $template->set_prefilter('profile_content', 'oauth_remove_password_fields_prefilter');
    182218  }
    183   catch (Exception $e) {
     219  catch (Exception $e)
     220  {
    184221    $page['errors'][] = l10n('An error occured, please contact the gallery owner. <i>Error code : %s</i>', $e->getCode());
    185222  }
     
    201238  }
    202239
    203   list($provider) = explode('---', $oauth_id);
    204  
    205   require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
    206  
    207   try {
    208     $hybridauth = new Hybrid_Auth($hybridauth_conf);
    209     $adapter = $hybridauth->getAdapter($provider);
    210     $adapter->logout();
    211   }
    212   catch (Exception $e) {
    213     $_SESSION['page_errors'][] = l10n('An error occured, please contact the gallery owner. <i>Error code : %s</i>', $e->getCode());
     240  list($provider, $identifier) = explode('---', $oauth_id, 2);
     241 
     242 
     243  if ($provider != 'Persona')
     244  {
     245    require_once(OAUTH_PATH . 'include/hybridauth/Hybrid/Auth.php');
     246   
     247    try {
     248      $hybridauth = new Hybrid_Auth($hybridauth_conf);
     249      $adapter = $hybridauth->getAdapter($provider);
     250      $adapter->logout();
     251    }
     252    catch (Exception $e) {
     253      $_SESSION['page_errors'][] = l10n('An error occured, please contact the gallery owner. <i>Error code : %s</i>', $e->getCode());
     254    }
    214255  }
    215256}
     
    233274  }
    234275 
    235   oauth_assign_template_vars(get_gallery_home_url());
     276  $u_redirect = !empty($_GET['redirect']) ? urldecode($_GET['redirect']) : get_gallery_home_url();
     277  oauth_assign_template_vars($u_redirect);
    236278 
    237279  $template->set_prefilter('menubar', 'oauth_add_menubar_buttons_prefilter');
    238280}
    239281
    240 function oauth_include_template()
     282
     283/**
     284 * load common javascript
     285 */
     286function oauth_page_header()
    241287{
    242288  global $conf, $template;
    243  
     289
    244290  if (isset($conf['oauth']['include_common_template']))
    245291  {
  • extensions/oAuth/main.inc.php

    r26604 r26605  
    2020
    2121
     22global $hybridauth_conf, $conf;
     23
    2224// try to load hybridauth config
    23 global $hybridauth_conf;
    24 
    2525include_once(OAUTH_PATH . 'include/functions.inc.php');
    2626
     
    2929  load_hybridauth_conf();
    3030}
     31
     32// force getuserdata() to retrieve 'oauth_id' field
     33$conf['user_fields']['oauth_id'] = 'oauth_id';
    3134
    3235
     
    4346  add_event_handler('loc_begin_profile', 'oauth_begin_profile');
    4447 
    45   add_event_handler('loc_after_page_header', 'oauth_include_template');
     48  add_event_handler('loc_after_page_header', 'oauth_page_header');
    4649 
    4750  add_event_handler('try_log_user', 'oauth_try_log_user', EVENT_HANDLER_PRIORITY_NEUTRAL-30, 2);
     
    98101    // }
    99102  // }
     103 
     104  // pwg_unset_session_var('persona_logout');
    100105}
    101106
  • extensions/oAuth/template/identification_common.tpl

    r26604 r26605  
    33{combine_script id='jquery.colorbox' load='footer' require='jquery' path='themes/default/js/plugins/jquery.colorbox.min.js'}
    44{combine_css id='colorbox' path="themes/default/js/plugins/colorbox/style2/colorbox.css"}
     5
     6{if $OAUTH.providers.Persona.enabled}
     7  {combine_script id='persona' path='https://login.persona.org/include.js' load='footer'}
     8{/if}
    59
    610{html_style}
     
    3135
    3236// click on a button
    33 jQuery('a.oauth').click(function(e) {
     37jQuery('a.oauth:not(.persona)').click(function(e) {
    3438  e.preventDefault();
    3539 
     
    100104  jQuery.colorbox.close();
    101105});
     106
     107{if $OAUTH.providers.Persona.enabled}
     108jQuery('a.oauth.persona').click(function(e) {
     109  e.preventDefault();
     110  navigator.id.request();
     111});
     112
     113jQuery('a[href$="act=logout"]').click(function(e) {
     114  e.preventDefault();
     115  navigator.id.logout();
     116});
     117
     118navigator.id.watch({
     119  loggedInUser: {if not empty($OAUTH.persona_email)}'{$OAUTH.persona_email}'{else}null{/if},
     120 
     121  onlogin: function(assertion) {
     122    jQuery.ajax({
     123      type: 'POST',
     124      url: '{$OAUTH.u_login}Persona',
     125      dataType: 'json',
     126      data: { assertion: assertion },
     127      success: function(data) {
     128        oauth_redirect(data.redirect_to);
     129      },
     130      error: function() {
     131        alert('Unknown error');
     132      }
     133    });
     134  },
     135 
     136  onlogout: function() {
     137    window.location.href = '{$U_LOGOUT}';
     138  }
     139});
     140{/if}
    102141{/footer_script}
    103142
  • extensions/oAuth/template/oauth_sprites.css

    r23808 r26605  
    1717.oauth_16px.yahoo { background-position: -160px 0px; }
    1818.oauth_16px.steam { background-position: -176px 0px; }
     19.oauth_16px.persona { background-position: -192px 0px; }
    1920
    2021.oauth_26px {
     
    3637.oauth_26px.yahoo { background-position: -260px 0px; }
    3738.oauth_26px.steam { background-position: -286px 0px; }
     39.oauth_26px.persona { background-position: -312px 0px; }
    3840
    3941.oauth_38px {
     
    5557.oauth_38px.yahoo { background-position: -380px 0px; }
    5658.oauth_38px.steam { background-position: -418px 0px; }
     59.oauth_38px.persona { background-position: -456px 0px; }
Note: See TracChangeset for help on using the changeset viewer.