getSessionData(); if( defined('G5_SOCIAL_LOGIN_START_PARAM') && G5_SOCIAL_LOGIN_START_PARAM === 'hauth.start' && G5_SOCIAL_LOGIN_DONE_PARAM === 'hauth.done' ){ return $g5['hybrid_auth']->authenticate($provider); } $base_url = G5_SOCIAL_LOGIN_BASE_URL; $hauth_time = time(); $connect_data = array( 'login_start' => $base_url . ( strpos($base_url, '?') ? '&' : '?' ) . G5_SOCIAL_LOGIN_START_PARAM.'='.$provider.'&hauth.time='.$hauth_time, 'login_done' => $base_url . ( strpos($base_url, '?') ? '&' : '?' ) . G5_SOCIAL_LOGIN_DONE_PARAM.'='.$provider, ); return $g5['hybrid_auth']->authenticate($provider, $connect_data); } function social_before_join_check($url=''){ global $g5, $config; if( $provider_name = social_get_request_provider() ){ //재가입 방지 if( $user_profile = social_session_exists_check() ){ $sql = sprintf("select * from {$g5['social_profile_table']} where provider = '%s' and identifier = '%s' ", $provider_name, $user_profile->identifier); $is_exist = false; $row = sql_fetch($sql); if( isset($row['provider']) && $row['provider'] ){ $is_exist = true; $time = time() - (86400 * (int) G5_SOCIAL_DELETE_DAY); if( empty($row['mb_id']) && ( 0 == G5_SOCIAL_DELETE_DAY || strtotime($row['mp_latest_day']) < $time) ){ $sql = "delete from {$g5['social_profile_table']} where mp_no =".$row['mp_no']; sql_query($sql); $is_exist = false; } } if( $is_exist ){ $msg = sprintf("해당 %s ID 로 연결 또는 가입된 내역이 있기 때문에 다시 가입할수 없습니다. 회원이시면 로그인 후 정보 수정에서 계정 연결을 해 주세요.", social_get_provider_service_name($provider_name) ); $url = $url ? $url : G5_URL; alert($msg, $url); return false; } } return true; } return false; } function social_get_data($by='provider', $provider, $user_profile){ global $g5; // 소셜 가입이 되어 있는지 체크 if( $by == 'provider' ){ $sql = sprintf("select * from {$g5['social_profile_table']} where provider = '%s' and identifier = '%s' order by mb_id desc ", $provider, $user_profile->identifier); $row = sql_fetch($sql); if( !empty($row['mb_id']) ){ return $row; //mb_id 가 있는 경우에만 데이터를 리턴합니다. } return false; } else if ( $by == 'member' ){ // 아이디 또는 이메일이나 별명으로 이미 가입되어 있는지 체크 $email = ($user_profile->emailVerified) ? $user_profile->emailVerified : $user_profile->email; $sid = preg_match("/[^0-9a-z_]+/i", "", $user_profile->sid); $nick = social_relace_nick($user_profile->displayName); if( !$nick ){ $tmp = explode("@", $email); $nick = $tmp[0]; } $sql = "select mb_nick, mb_email from {$g5['member_table']} where mb_nick = '".$nick."' "; if( !empty($email) ){ $sql .= sprintf(" or mb_email = '%s' ", $email); } $result = sql_query($sql); $exists = array(); while($row=sql_fetch_array($result)){ if($row['mb_nick'] && $row['mb_nick'] == $nick){ $exists['mb_nick'] = $nick; } if($row['mb_email'] && $row['mb_email'] == $email){ $exists['mb_email'] = $email; } } return $exists; } return null; } function social_user_profile_replace( $mb_id, $provider, $profile ){ global $g5; if( !$mb_id ) return; // $profile 에 성별, 나이, 생일 등의 정보가 포함되어 있습니다. //받아온 정보를 암호화 하여 $object_sha = sha1( serialize( $profile ) ); $provider = strtolower($provider); $sql = sprintf("SELECT mp_no, mb_id from {$g5['social_profile_table']} where provider= '%s' and identifier = '%s' ", $provider, $profile->identifier); $result = sql_query($sql); for($i=0;$row=sql_fetch_array($result);$i++){ //혹시 맞지 않는 데이터가 있으면 삭제합니다. if( $row['mb_id'] != $mb_id ){ sql_query(sprintf("DELETE FROM {$g5['social_profile_table']} where mp_no=%d", $row['mp_no'])); } } $sql = sprintf("SELECT mp_no, object_sha, mp_register_day from {$g5['social_profile_table']} where mb_id= '%s' and provider= '%s' and identifier = '%s' ", $mb_id, $provider, $profile->identifier); $row = sql_fetch($sql); $table_data = array( "mp_no" => ! empty($row) ? $row['mp_no'] : 'NULL', 'mb_id' => "'". $mb_id. "'", 'provider' => "'". $provider . "'", 'object_sha' => "'". $object_sha . "'", 'mp_register_day' => ! empty($row) ? "'".$row['mp_register_day']."'" : "'". G5_TIME_YMDHIS . "'", 'mp_latest_day' => "'". G5_TIME_YMDHIS . "'", ); $fields = array( 'identifier', 'profileurl', 'photourl', 'displayname', 'description', ); foreach( (array) $profile as $key => $value ){ $key = strtolower($key); if( in_array( $key, $fields ) ) { $value = (string) $value; $table_data[ $key ] = "'". sql_real_escape_string($value). "'"; } } $fields = '`' . implode( '`, `', array_keys( $table_data ) ) . '`'; $values = implode( ", ", array_values( $table_data ) ); $sql = "REPLACE INTO {$g5['social_profile_table']} ($fields) VALUES ($values) "; sql_query($sql); return sql_insert_id(); } function social_build_provider_config($provider){ $setting = array( 'base_url' => https_url(G5_PLUGIN_DIR.'/'.G5_SOCIAL_LOGIN_DIR).'/', 'providers' => array( $provider => array( 'enabled' => true, 'keys' => array( 'id' => null, 'key' => null, 'secret' => null ) ) ), ); if( function_exists('social_extends_get_keys') ){ $setting['providers'][$provider] = social_extends_get_keys($provider); } if(defined('G5_SOCIAL_IS_DEBUG') && G5_SOCIAL_IS_DEBUG){ $setting['debug_mode'] = true; $setting['debug_file'] = G5_DATA_PATH.'/tmp/social_'.md5($_SERVER['SERVER_SOFTWARE'].$_SERVER['SERVER_ADDR']).'_'.date('ymd').'.log'; } return $setting; } function social_extends_get_keys($provider){ global $config; static $r = array(); if ( empty($r) ) { // Naver $r['Naver'] = array( "enabled" => option_array_checked('naver', $config['cf_social_servicelist']) ? true : false, "redirect_uri" => get_social_callbackurl('naver'), "keys" => array( "id" => $config['cf_naver_clientid'], "secret" => $config['cf_naver_secret'], ), ); // Kakao $r['Kakao'] = array( "enabled" => option_array_checked('kakao', $config['cf_social_servicelist']) ? true : false, "keys" => array("id" => $config['cf_kakao_rest_key'], "secret" => $config['cf_kakao_client_secret'] ? $config['cf_kakao_client_secret'] : $config['cf_kakao_rest_key'] ), "redirect_uri" => get_social_callbackurl('kakao') ); // Facebook $r['Facebook'] = array( "enabled" => option_array_checked('facebook', $config['cf_social_servicelist']) ? true : false, "keys" => array("id" => $config['cf_facebook_appid'], "secret" => $config['cf_facebook_secret']), "display" => "popup", "redirect_uri" => get_social_callbackurl('facebook'), "scope" => 'email', // optional "trustForwarded" => false ); // Google $r['Google'] = array( "enabled" => option_array_checked('google', $config['cf_social_servicelist']) ? true : false, "keys" => array("id" => $config['cf_google_clientid'], "secret" => $config['cf_google_secret']), "redirect_uri" => get_social_callbackurl('google'), "scope" => "https://www.googleapis.com/auth/userinfo.profile "."https://www.googleapis.com/auth/userinfo.email", /* "scope" => "https://www.googleapis.com/auth/plus.login ". // optional "https://www.googleapis.com/auth/plus.me ". // optional "https://www.googleapis.com/auth/plus.profile.emails.read", // optional */ //"access_type" => "offline", // optional //"approval_prompt" => "force", // optional ); // Twitter $r['Twitter'] = array( "enabled" => option_array_checked('twitter', $config['cf_social_servicelist']) ? true : false, "keys" => array("key" => $config['cf_twitter_key'], "secret" => $config['cf_twitter_secret']), "redirect_uri" => get_social_callbackurl('twitter'), "trustForwarded" => false ); // Payco $r['Payco'] = array( "enabled" => option_array_checked('payco', $config['cf_social_servicelist']) ? true : false, "keys" => array("id" => $config['cf_payco_clientid'], "secret" => $config['cf_payco_secret']), "redirect_uri" => get_social_callbackurl('payco'), "trustForwarded" => false ); } return isset($r[$provider]) ? $r[$provider] : array(); } function social_escape_request($request){ return clean_xss_tags( strip_tags($request) ); } function social_get_request_provider(){ $provider_name = isset($_REQUEST['provider']) ? ucfirst(social_escape_request($_REQUEST['provider'])) : ''; return $provider_name; } function social_login_session_clear($mycf=0){ $_SESSION["HA::STORE"] = array(); // used by hybridauth library. to clear as soon as the auth process ends. $_SESSION["HA::CONFIG"] = array(); // used by hybridauth library. to clear as soon as the auth process ends. set_session('sl_userprofile', ''); set_session('social_login_redirect', ''); if(!$mycf){ set_session('ss_social_provider', ''); } } function social_session_exists_check(){ $provider_name = social_get_request_provider(); if(!$provider_name){ return false; } if( $provider_name && isset($_SESSION['HA::STORE']['hauth_session.'.strtolower($provider_name).'.is_logged_in']) && !empty($_SESSION['sl_userprofile'][$provider_name]) ){ return json_decode($_SESSION['sl_userprofile'][$provider_name]); } return false; } function social_relace_nick($nick=''){ if( empty($nick) ) return ''; return preg_replace("/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "", $nick); } function social_get_error_msg($type){ ob_start(); switch( $type ){ case 0 : echo "지정되지 않은 오류입니다."; break; case 1 : echo "설정 오류입니다."; break; case 2 : echo "해당 provider 설정 오류입니다."; break; case 3 : echo "알수 없거나 비활성화 된 provider 입니다."; break; case 4 : echo "해당 서비스에 접근할수 있는 권한이 없습니다."; break; case 5 : echo "인증이 실패되었습니다.. " . "사용자가 인증을 취소했거나, 공급자가 연결을 거부했습니다."; break; case 6 : echo "사용자 프로필 요청이 실패했습니다.사용자가 해당 서비스에 연결되어 있지 않을 경우도 있습니다. " . "이 경우 다시 인증 요청을 해야 합니다."; break; case 7 : echo "사용자가 해당 서비스에 연결되어 있지 않습니다."; break; case 8 : echo "해당 서비스가 기능을 지원하지 않습니다."; break; } $get_error = ob_get_clean(); return $get_error; } if( !function_exists('replaceQueryParams') ){ function replaceQueryParams($url, $params) { $query = parse_url($url, PHP_URL_QUERY); parse_str($query, $oldParams); if (empty($oldParams)) { return rtrim($url, '?') . '?' . http_build_query($params); } $params = array_merge($oldParams, $params); return preg_replace('#\?.*#', '?' . http_build_query($params), $url); } } function social_loading_provider_page( $provider ){ social_login_session_clear(1); define('G5_SOCIAL_IS_LOADING', TRUE ); $login_action_url = G5_URL; $img_url = G5_SOCIAL_LOGIN_URL.'/img/'; include_once(G5_SOCIAL_LOGIN_PATH.'/includes/loading.php'); } function social_check_login_before($p_service=''){ global $is_member, $member; $action = isset( $_REQUEST['action'] ) ? social_escape_request($_REQUEST['action']) : ''; $provider_name = $p_service ? $p_service : social_get_request_provider(); $url = isset($_REQUEST['url']) ? $_REQUEST['url'] : G5_URL; $mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : 'login'; $use_popup = G5_SOCIAL_USE_POPUP ? 1 : 2; $ss_social_provider = get_session('ss_social_provider'); if( $provider_name ){ if( ! isset( $_REQUEST["redirect_to_idp"] ) ) { return social_loading_provider_page( $provider_name ); } try { $adapter = social_login_get_provider_adapter( $provider_name ); // then grab the user profile $user_profile = $adapter->getUserProfile(); if( ! (isset($_SESSION['sl_userprofile']) && is_array($_SESSION['sl_userprofile'])) ){ $_SESSION['sl_userprofile'] = array(); } if( ! $is_member ){ $_SESSION['sl_userprofile'][$provider_name] = json_encode( $user_profile ); } } catch( Exception $e ) { $get_error = social_get_error_msg( $e->getCode() ); if( isset($adapter) && is_object( $adapter ) ){ $adapter->logout(); } include_once(G5_SOCIAL_LOGIN_PATH.'/error.php'); exit; } $register_url = G5_BBS_URL.'/register_form.php?provider='.$provider_name; $register_action_url = G5_BBS_URL.'/register_form_update.php'; $login_action_url = G5_HTTPS_BBS_URL."/login_check.php"; $mylink = (isset($_REQUEST['mylink']) && !empty($_REQUEST['mylink'])) ? 1 : 0; //소셜로 이미 가입 했다면 로그인 처리 합니다. if( $user_provider = social_get_data('provider', $provider_name, $user_profile) ){ if( $is_member ){ $msg = "이미 로그인 하셨거나 잘못된 요청입니다."; if( $mylink ){ $msg = "이미 연결된 아이디가 있거나, 잘못된 요청입니다."; } if( $use_popup == 1 || ! $use_popup ){ //팝업이면 alert_close( $msg ); } else { alert( $msg ); } if( is_object( $adapter ) ){ //연결한것은 인증 받은 즉시 로그아웃한다. social_logout_with_adapter($adapter); } exit; } //데이터가 틀리면 데이터를 갱신 후 로그인 처리 합니다. $mb_id = $user_provider['mb_id']; //이미 소셜로 가입된 데이터가 있다면 password를 필요하지 않으니, 패스워드를 무작위 생성하여 넘깁니다. $mb_password = sha1( str_shuffle( "0123456789abcdefghijklmnoABCDEFGHIJ" ) ); echo social_return_from_provider_page( $provider_name, $login_action_url, $mb_id, $mb_password, $url, $use_popup ); exit; //소셜 데이터와 회원데이터가 일치 하는 경우 계정와 연결할지, 새로 계정을 만들지 선택합니다. } else { if( $is_member && !empty($user_profile) ){ //회원이면 if( $mylink ){ social_user_profile_replace($member['mb_id'], $provider_name, $user_profile); if( is_object( $adapter ) ){ //연결한것은 인증 받은 즉시 로그아웃한다. social_logout_with_adapter($adapter); } // 세션에 소셜정보가 없으면 연결된 소셜서비스를 저장합니다. if( ! get_session('ss_social_provider') ){ set_session('ss_social_provider', $provider_name); } if( $use_popup == 1 || ! $use_popup ){ //팝업이면 ?> $provider_name); $url = replaceQueryParams($url, $params); goto_url($url); } else { goto_url(G5_URL); } } exit; } goto_url(G5_URL); } if( !( property_exists($user_profile, 'sid') && !empty($user_profile->sid) ) ){ $msg = '소셜 데이터 오류'; if( $use_popup == 1 || ! $use_popup ){ //팝업이면 alert_close($msg); } else { alert($msg); } } /* * 회원이 아닌 경우에만 아래 실행 */ $register_url = G5_SOCIAL_LOGIN_URL.'/register_member.php?provider='.$provider_name; if( $url ){ $register_url .= '&url='.urlencode($url); } if( $use_popup == 1 || ! $use_popup ){ //팝업이면 ?> displayName); $member['mb_sex'] = $user_profile->gender; $member['mb_email'] = ($user_profile->emailVerified) ? $user_profile->emailVerified : $user_profile->email; } return $member; } function social_profile_img_resize($path, $file_url, $width, $height){ // getimagesize 경우 php.ini 에서 allow_url_fopen 이 활성화 되어 있어야 원격이미지를 읽어올수 있습니다. list($w, $h, $ext) = @getimagesize($file_url); if( $w && $h && $ext ){ $ratio = max($width/$w, $height/$h); $h = ceil($height / $ratio); $x = ($w - $width / $ratio) / 2; $w = ceil($width / $ratio); $tmp = imagecreatetruecolor($width, $height); if($ext == 1){ $image = imagecreatefromgif($file_url); } else if($ext == 3) { $image = imagecreatefrompng($file_url); } else { $image = imagecreatefromjpeg($file_url); } imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h); switch ($ext) { case '2': imagejpeg($tmp, $path, 100); break; case '3': imagepng($tmp, $path, 0); break; case '1': imagegif($tmp, $path); break; } chmod($path, G5_FILE_PERMISSION); /* cleanup memory */ imagedestroy($image); imagedestroy($tmp); } } function social_is_login_check(){ //소셜 로그인이 맞는지 체크합니다. if( social_session_exists_check() ){ return true; } return false; } function social_logout_with_adapter($adapter=null){ if( is_object( $adapter ) ){ $adapter->logout(); } social_login_session_clear(1); } function social_member_provider_manage(){ global $member; return social_login_link_account($member['mb_id'], false, 'mb_form'); } function social_member_comfirm_redirect(){ global $is_member; if( !$is_member ){ return; } $provider_name = get_session('ss_social_provider'); if( social_get_provider_service_name($provider_name) ){ try { $adapter = social_login_get_provider_adapter( $provider_name ); // then grab the user profile $user_profile = $adapter->getUserProfile(); } catch( Exception $e ) { $get_error = social_get_error_msg( $e->getCode() ); if( is_object( $adapter ) ){ social_logout_with_adapter($adapter); } alert('SNS 사용자 인증에 실패하였습니다.', G5_URL); } if( $user_provider = social_get_data('provider', $provider_name, $user_profile) ){ social_login_session_clear(1); $url = G5_BBS_URL.'/register_form.php'; $social_token = social_nonce_create($provider_name); set_session('social_link_token', $social_token); $params = array('provider'=>$provider_name); $url = replaceQueryParams($url, $params); goto_url($url); } set_session('ss_social_provider', ''); alert('잘못된 요청입니다.', G5_URL); } } function social_is_edit_page($url=''){ global $is_member; if( !$is_member ) return false; if($url){ $p = @parse_url($url); $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); if ( isset($p['host']) && ($p['host'] === $host) && preg_match('/register_form\.php$/i', $url) ){ return true; } } return false; } function social_is_login_password_check($mb_id){ global $g5; $action = isset($_POST['action']) ? $_POST['action'] : ''; $provider_name = social_get_request_provider(); if(!$mb_id || $action === 'link'){ //아이디가 없거나, 계정 연결이면 if($action === 'link'){ //계정연결이면 같은 서비스명이 있는 경우 $sql = sprintf("select count(*) as num from {$g5['social_profile_table']} where provider = '%s' and mb_id = '%s' ", $provider_name, $mb_id); $row = sql_fetch($sql); if( $row['num'] ){ alert("해당 계정에 이미 $provider_name ID 가 연결되어 있습니다. 연결을 해제 후 다시 시도해 주세요."); } } return false; } //소셜 로그인이 맞는지 체크합니다. if( $user_profile = social_session_exists_check() ){ // db에 이미 쇼셜 계정이 존재하는 경우에는 if( $user_provider = social_get_data('provider', $provider_name, $user_profile) ){ if($user_provider['mb_id'] == $mb_id) return true; } } return false; } //소셜 로그인 후 계정 업데이트 function social_login_success_after($mb, $link='', $mode='', $tmp_create_info=array()){ global $g5, $config; $provider = social_get_request_provider(); if( isset($mb['mb_id']) && !empty($mb['mb_id']) && $provider && $user_profile = social_session_exists_check() ){ $mb_id = $mb['mb_id']; //로그인에 성공 했으면 기존 데이터와 비교하여 틀린 값이 없으면 업데이트 합니다. social_user_profile_replace($mb_id, $provider, $user_profile); //소셜로그인의 provider 이름( naver, kakao, facebook 기타 등등 ) 서비스 이름을 세션에 입력합니다. set_session('ss_social_provider', $provider); //소셜로그인 최초 받아온 세션에 저장된 값을 삭제합니다. if( isset($_SESSION['sl_userprofile']) && isset($_SESSION['sl_userprofile'][$provider]) ){ unset($_SESSION['sl_userprofile'][$provider]); } if($mode=='register'){ //회원가입 했다면 return; } } return $link; } function social_login_link_account($mb_id, $is_buffer=false, $is_type=''){ global $g5, $is_admin, $is_guest, $member, $config; if( !$mb_id ) return; $sql = "select * from {$g5['social_profile_table']} where mb_id = '".$mb_id."' "; $result = sql_query($sql); $my_social_accounts = array(); for($i=0;$row=sql_fetch_array($result);$i++){ $my_social_accounts[] = $row; } if( $is_type === 'get_data' ){ return $my_social_accounts; } ob_start(); if( $is_type === 'mb_form' ) { global $urlencode; static $social_pop_once; $my_provides = array(); foreach( $my_social_accounts as $account ){ $my_provides[] = strtolower($account['provider']); } $self_url = G5_BBS_URL."/login.php"; //새창을 사용한다면 if( G5_SOCIAL_USE_POPUP ) $self_url = G5_SOCIAL_LOGIN_URL.'/popup.php'; include(get_social_skin_path().'/social_u_register_form.skin.php'); } $html = ob_get_clean(); if($is_buffer){ return $html; } else { echo $html; } } function social_get_provider_service_name($provider='', $all=''){ $services = array( 'naver' => '네이버', 'kakao' => '카카오', 'daum' => '다음', 'facebook' => '페이스북', 'google' => '구글', 'twitter' => '트위터', 'payco' => '페이코', ); if( $all ){ return $services; } $provider = $provider ? strtolower($provider) : ''; return ($provider && isset($services[$provider])) ? $services[$provider] : ''; } function social_provider_logout($provider='', $session_delete=1){ $provider = $provider ? $provider : get_session('ss_social_provider'); if( $provider ){ try { if( ! class_exists( 'Hybrid_Auth', false ) ) { include_once G5_SOCIAL_LOGIN_PATH . "/Hybrid/Auth.php"; } Hybrid_Auth::logoutAllProviders(); /* if( $adapter = social_login_get_provider_adapter( $provider ) ){ $adapter->logout(); } */ if( $session_delete ) set_session('ss_social_provider', ''); } catch( Exception $e ){ if( is_object( $adapter ) ){ social_logout_with_adapter($adapter); } } } } //회원 연결을 해제하거나 회원 탈퇴시 function social_member_link_delete($mb_id, $mp_no=''){ global $g5; if(!$mb_id) return; $mp_no = (int) $mp_no; if( G5_SOCIAL_DELETE_DAY > 0 ){ //mb_id가 없는 소셜 데이터 중에 해당 기간이 넘어간 db 데이터를 삭제합니다. $time = date("Y-m-d H:i:s", time() - (86400 * (int) G5_SOCIAL_DELETE_DAY)); $sql = "delete from {$g5['social_profile_table']} where mb_id = '' and mp_latest_day < '$time' "; sql_query($sql); $sql = "update {$g5['social_profile_table']} set mb_id='', object_sha='', profileurl='', photourl='', displayname='', mp_latest_day = '".G5_TIME_YMDHIS."' where mb_id= '".$mb_id."'"; } else { $sql = "delete from {$g5['social_profile_table']} where mb_id= '".$mb_id."'"; //바로 삭제합니다. } if($mp_no){ $sql .= " and mp_no=$mp_no"; } sql_query($sql, false); } function social_service_check($provider){ global $config; if( $config['cf_social_servicelist'] && option_array_checked($provider, $config['cf_social_servicelist']) ) { return true; } return false; } function exist_mb_id_recursive($mb_id){ static $count = 0; $mb_id_add = ($count > 0) ? $mb_id.(string)$count : $mb_id; if( ! exist_mb_id($mb_id_add) ){ return $mb_id_add; } $count++; return exist_mb_id_recursive($mb_id); } function exist_mb_nick_recursive($mb_nick){ static $count = 0; $mb_nick_add = ($count > 0) ? $mb_nick.(string)$count : $mb_nick; if( ! exist_mb_nick($mb_nick_add, '') ){ return $mb_nick_add; } $count++; return exist_mb_nick_recursive($mb_nick); } function social_get_nonce($key=''){ if( $key == 'd' ){ //nonce_duration return 7200; } else if ($key == 'n' ){ //nonce_name return '_nonce'; } else { if( empty($key) ) $key = social_get_request_provider(); $setting = social_build_provider_config($key); try{ return isset($setting['providers'][$key]['secret']) ? sha1($setting['providers'][$key]['secret']) : ''; } catch(Exception $e) { return ''; } } return ''; } function social_nonce_create_query_string( $action = '' , $user = '', $provider = '' ){ if($nonce_key=social_get_nonce('n')){ return $nonce_key."=".social_nonce_create( $action , $user, $provider ); } return ''; } function social_nonce_create( $action = '' , $user='' , $provider = '' ){ return substr( social_nonce_generate_hash( $action , $user, $provider ), -12, 10); } function social_nonce_is_valid( $nonce , $action = '' , $user='' , $provider = '' ){ // Nonce generated 0-12 hours ago if ( substr(social_nonce_generate_hash( $action , $user, $provider ), -12, 10) == $nonce ){ return true; } return false; } function social_nonce_generate_hash( $action='' , $user='', $provider = '' ){ $i = ceil( time() / ( social_get_nonce('d') / 2 ) ); return md5( $i . $action . $user . social_get_nonce($provider) ); }