forked from devsam/core
139 lines
3.9 KiB
PHP
139 lines
3.9 KiB
PHP
<?php
|
|
namespace sammo;
|
|
use \kakao\Kakao_REST_API_Helper as Kakao_REST_API_Helper;
|
|
|
|
function checkUsernameDup($username){
|
|
if(!$username){
|
|
return '계정명을 입력해주세요';
|
|
}
|
|
|
|
$username = mb_strtolower($username, 'utf-8');
|
|
$length = strlen($username);
|
|
if($length < 4 || $length > 64){
|
|
return '적절하지 않은 길이입니다.';
|
|
}
|
|
|
|
$cnt = RootDB::db()->queryFirstField('SELECT count(no) FROM member WHERE `id` = %s LIMIT 1', $username);
|
|
if($cnt != 0){
|
|
return '이미 사용중인 계정명입니다';
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function checkNicknameDup($nickname){
|
|
if(!$nickname){
|
|
return '닉네임을 입력해주세요';
|
|
}
|
|
|
|
$length = mb_strwidth($nickname, 'utf-8');
|
|
if($length < 1 || $length > 18){
|
|
return '적절하지 않은 길이입니다.';
|
|
}
|
|
|
|
$cnt = RootDB::db()->queryFirstField('SELECT count(no) FROM member WHERE `name` = %s LIMIT 1', $nickname);
|
|
if($cnt != 0){
|
|
return '이미 사용중인 닉네임입니다';
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
function checkEmailDup($email){
|
|
if(!$email){
|
|
return '이메일을 입력해주세요';
|
|
}
|
|
|
|
$length = strlen($email);
|
|
if($length < 1 || $length > 64){
|
|
return '적절하지 않은 길이입니다.';
|
|
}
|
|
|
|
$globalSalt = RootDB::getGlobalSalt();
|
|
$isBanned = RootDB::db()->queryFirstField(
|
|
'SELECT count(no) FROM banned_member WHERE `hashed_email` = %s LIMIT 1',
|
|
hash('sha512', $globalSalt.$email.$globalSalt)
|
|
);
|
|
if($isBanned){
|
|
return '영구 차단된 이메일입니다.';
|
|
}
|
|
|
|
$userInfo = RootDB::db()->queryFirstField('SELECT `no`, `delete_after` FROM member WHERE `email` = %s LIMIT 1', $email);
|
|
if($userInfo){
|
|
$nowDate = TimeUtil::now();
|
|
if (!$userInfo['delete_after']) {
|
|
return '이미 사용중인 이메일입니다. 관리자에게 문의해주세요.';
|
|
}
|
|
|
|
if($userInfo['delete_after'] >= $nowDate){
|
|
return "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]";
|
|
}
|
|
|
|
//$userInfo['delete_after'] < $userInfo
|
|
RootDB::db()->delete('member', 'no=%i', $userInfo['no']);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function createOTPbyUserNO(int $userNo):bool{
|
|
$userInfo = RootDB::db()->queryFirstRow('SELECT oauth_info FROM member WHERE no=%i', $userNo);
|
|
if(!$userInfo){
|
|
return false;
|
|
}
|
|
|
|
$oauthInfo = Json::decode($userInfo['oauth_info']);
|
|
if(!$oauthInfo){
|
|
return false;
|
|
}
|
|
|
|
$accessToken = $oauthInfo['accessToken'];
|
|
$OTPValue = $oauthInfo['OTPValue']??null;
|
|
$OTPTrialUntil = $oauthInfo['OTPTrialUntil']??null;
|
|
|
|
$now = TimeUtil::now();
|
|
|
|
|
|
if($OTPTrialUntil && $OTPValue && $OTPTrialUntil > $now){
|
|
return true;
|
|
}
|
|
|
|
[$OTPValue, $OTPTrialUntil] = createOTP($accessToken);
|
|
|
|
if(!$OTPValue){
|
|
return false;
|
|
}
|
|
|
|
$oauthInfo['OTPValue'] = $OTPValue;
|
|
$oauthInfo['OTPTrialUntil'] = $OTPTrialUntil;
|
|
$oauthInfo['OTPTrialCount'] = 3;
|
|
|
|
RootDB::db()->update('member', [
|
|
'oauth_info'=>Json::encode($oauthInfo)
|
|
], 'no=%i', $userNo);
|
|
|
|
return true;
|
|
}
|
|
|
|
function createOTP(string $accessToken):?array{
|
|
$restAPI = new Kakao_REST_API_Helper($accessToken);
|
|
|
|
$OTPValue = Util::randRangeInt(1000, 9999);
|
|
$OTPTrialUntil = TimeUtil::DatetimeFromNowSecond(180);
|
|
|
|
$sendResult = $restAPI->talk_to_me_default([
|
|
"object_type"=> "text",
|
|
"text"=> "인증 코드는 $OTPValue 입니다. $OTPTrialUntil 이내에 입력해주세요.",
|
|
"link"=> [
|
|
"web_url"=> ServConfig::getServerBasepath(),
|
|
"mobile_web_url" => ServConfig::getServerBasepath()
|
|
],
|
|
"button_title"=> "로그인 페이지 열기"
|
|
]);
|
|
$sendResult['code'] = Util::array_get($sendResult['code'], 0);
|
|
if($sendResult['code'] < 0){
|
|
return null;
|
|
}
|
|
|
|
return [$OTPValue, $OTPTrialUntil];
|
|
}
|
|
|