<?php
/**
  * @class 基类 认证
  * @author soul
  */
class baseAction
{
	//认证与初始化
	public function __construct()
	{
		//LibFc::ReturnJson(false, '当前访问人数过多，请稍后访问');
		//请求的API
		$apiFun = mvc::$URL_CLASS.'/'.mvc::$URL_METHOD;
		$now = time();
		if($apiFun != 'base/buildToken')
		{
			//数据的语言版本
			mvc::$cfg['dLang'] = empty($_REQUEST['lang']) || $_REQUEST['lang'] != 'en' ? 'cn': 'en';
			if(isset($_POST['data']))
			{
				$dataArr = json_decode($_POST['data'], true);
				if(is_array($dataArr))
				{	
					unset($_POST['data']);
					foreach($dataArr as $K=>$V)
					{
						$_POST[$K] = $V;
					}
				}
			}
			if(!empty($_POST['lang'])) mvc::$cfg['dLang'] = $_POST['lang'];

			//命令行模式  index.php rabbit[类名] receive[方法名] act=TJ_API_PJL[参数1] a=12121[参数2]
			if(!empty($argv) && count($argv) > 2)
			{
				$_SERVER['PATH_INFO'] = $argv[1].'/'. $argv[2];
				for($i = 3; $i < count($argv); $i++)
				{
					$_SERVER['QUERY_STRING'] .= '&'.$argv[$i];
				}
				$_SERVER['QUERY_STRING'] = trim($_SERVER['QUERY_STRING'], '&');
				parse_str($_SERVER['QUERY_STRING'], $_GET);
			}

			$headers = getallheaders();
			$authtoken = '';
			if(!empty($headers['Authorization'])) $authtoken = $headers['Authorization'];
			else if(!empty($headers['authorization'])) $authtoken = $headers['authorization'];
			//通过秘钥生成的token认证 //
			if(!empty($authtoken))
			{
				//Bearer 74451a8bebf12c16fa478e3b552d9d68
				$token = str_replace('Bearer ', '', $authtoken);
				$MainBase = new MainBase();
				$where = sprintf(" and aut_token='%s' and aut_etime>%d and au_status=1 and au_btime<%d and au_etime>%d", LibFc::Escape($token), $now, $now, $now);
				$res = $MainBase->get('api_user_token join api_user on au_appkey = aut_appkey', ['au_uid', 'au_act', 'au_comname', 'au_cfg'], $where, true);
				if(empty($res['data'])) LibFc::ReturnJson(false, 'token无效', 'token');
				$tokenInfo = $res['data'];

				$res = $MainBase->get('api_user_act JOIN api_act ON aa_id = aua_aa_id', ['aa_id'], sprintf(" and aua_uid=%d and aa_act='%s'", $tokenInfo['au_uid'], LibFc::Escape($apiFun)));
				if(empty($res['data'])) LibFc::ReturnJson(false, '无权限访问此接口'.$apiFun);

				mvc::$cfg['RQTOKEN'] = json_decode($tokenInfo['au_cfg'], true);
				mvc::$cfg['RQTOKEN']['token'] = $token;
				mvc::$cfg['RQTOKEN']['uid'] = $tokenInfo['au_uid'];
				mvc::$cfg['RQTOKEN']['comname'] = $tokenInfo['au_comname'];
			}
			else
			{
				$token = $headers['token']? $headers['token']: $_REQUEST['token'];
				if(empty($token) || empty(mvc::$cfg['api_tokens'][$token]))
					LibFc::ReturnJson(false, 'token不存在', 'token');

				$au_cfg = mvc::$cfg['api_tokens'][$token];
				if($au_cfg['status'] == 'N')
					LibFc::ReturnJson(false, 'token已被禁用', 'token');
				
				if($now >= strtotime($au_cfg['time'][0]) && $now <= strtotime($au_cfg['time'][1]))
				{
					if($au_cfg['apis'] !== 'ALL' && !in_array($apiFun, $au_cfg['apis']))
						LibFc::ReturnJson(false, '无权限访问此接口'.$apiFun);
				}
				else
				{
					LibFc::ReturnJson(false, 'YPAPI token已过服务期，请重新申请', 'token');
				}
				mvc::$cfg['RQTOKEN'] = $au_cfg;
				mvc::$cfg['RQTOKEN']['token'] = $token;
				mvc::$cfg['RQTOKEN']['comname'] = $au_cfg['user'];
				if(empty(mvc::$cfg['RQTOKEN']['uid'])) mvc::$cfg['RQTOKEN']['uid'] = 0;
			}
			unset($_GET['token']);
			unset($_POST['token']);
			unset($_REQUEST['token']);
		}
		//使用人 特殊权限处理
		mvc::$cfg['BYUID'] = $_REQUEST['byuid']? (int) $_REQUEST['byuid']: 0;
	}

	public function test()
	{
		LibFc::ReturnJson(true, 'test ok');
	}

	/**
	 * @method 获取API接口的token 有效期2小时
	 * @http  get  authorization
	 * @param appkey        string [必填] 
	 * @param appsecret     string [必填] 
	 *		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
			curl_setopt($ch, CURLOPT_USERPWD, 'appkey:appsecret');
	 * @author soul 2022/8/15
	 * @return {"status":true,"data":{"token":"10c91d65f1e31940e29cc10d6b9e622d"},"code":0,"runtime":134}
	 */
	public function buildToken()
	{
		if(empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_USER']))
			LibFc::ReturnJson(false, 'appkey 不存在', 'appkey');

		$appkey = $_SERVER['PHP_AUTH_USER'];
		$appsecret = $_SERVER['PHP_AUTH_PW'];
		$MainBase = new MainBase();
		$now = time();
		$where = sprintf(" and au_status=1 and au_appkey='%s' and au_btime<%d and au_etime>%d", LibFc::Escape($appkey), $now, $now);
		$res = $MainBase->get('api_user', ['au_appkey', 'au_appsecret'], $where, true);
		if(empty($res['data'])) 
			LibFc::ReturnJson(false, 'appkey 不存在', 'appkey');
		$info = $res['data'];
		if($info['au_appsecret'] !== $appsecret)
			LibFc::ReturnJson(false, 'appsecret不正确', 'appsecret');
		$addArr = [
			'aut_appkey'=>$info['au_appkey'],
			'aut_atime'=>$now,
			'aut_etime'=>$now+7200,
		];
		$token = md5('YPAPI'.$info['au_appkey'].'@'.$info['au_appsecret'].'@'.$addArr['aut_etime']);
		$addArr['aut_token'] = $token;
		$MainBase->add('api_user_token', $addArr);
		$arr = ['token'=>$token];
		LibFc::ReturnJson(true, $arr);
	}
}