<?php
    //localhost/prestacaocontasrafa/index.php?chave=1
    //$better_token = md5(uniqid(rand(), true));


    $better_token ='cpl'.md5(uniqid(rand(), true));
    session_name($better_token);
    session_start();

    // previne o cache nas página
    header("Expires: Mon, 21 Out 1999 00:00:00 GMT");
    header("Cacho-control: no-cache");
    header("Pragma: no-cache");

    include("funcoes.php");

    //se não passar a chave pega a base de produção... para testes deve-se passar a chave
    //$chave = (isset($_GET['chave'])) ? $_GET['chave'] : '23299477000115';
    //$chave = (isset($_GET['chave'])) ? $_GET['chave'] : '82939232000174';

    // o dominio tem gov.br vai consultar o dominio
    $dominiogov=null;
    $chave=null;
    if (strrpos($_SERVER['HTTP_HOST'], ".gov.br")!=false) {
        $dominiogov = $_SERVER['HTTP_HOST'];
    } else {
        $chave = (isset($_GET['chave'])) ? $_GET['chave'] : null;
    }


    if ($chave != null || $dominiogov != null ) {
        //Valida usuario se existe e carrega o o banco de dados.
        try {
            @$conexao=conexaobasecliente();
            if (mysqli_connect_errno($conexao)) {
                echo "A conexão falhou, erro reportado: " . mysqli_connect_error();
                exit;
            } else {
                $sqlclientes = "select id, razao_social, cnpj, banco, senha, usuario, cabecalho1, cabecalho2, cabecalho3,
                   endereco, bairro, cep, telefone, estado, site, cidade, uf, host, email_tramitacao, email_porta,
                   email_senha, email_servidor, email_nome, email_autenticacao, tempo_sessao, tentativas_acesso, chancela, celebracao, adiantamento, diaria,
                   host_assinatura, entidade_assinatura, excluir_despesa_prestacao, mascara_cpf, adiantamento_assinatura, diaria_assinatura, validade_assinatura,
                   parceria, portal_monitoramente, avaliar_despesa_prestacao, numeracao_transferencia, adiantamento_administrador, diaria_administrador, 
                   api_textos, api_pessoas, alterar_despesa_rejeitada, gov_subdominio, gov_clientId, gov_clientSecret, gov_redirectUri, gov_redirectUriLogout, gov_producao,
                   gerar_assinatura_govbr, assinatura_icp, assinatura_govbr, assinatura_govbr_clientID, assinatura_govbr_secret, ocultar_plano_chamamento, portal_prestacao_enviado
                   from gerr_cliente where bloqueado = 'N' and ". ($dominiogov==null?" cnpj = '".$chave."'":" gov_subdominio = '".$dominiogov."'");


                if ($result = mysqli_query($conexao, $sqlclientes)) {
                    if(mysqli_num_rows($result)>0) {
                        while ($row = mysqli_fetch_assoc($result)) {
                            $chave = $row["cnpj"];
                            //echo ($row["razao_social"])." - ".$row["cnpj"];
                            $_SESSION['idcliente'] = $row["id"];
                            $_SESSION['cnpjcliente'] = $row["cnpj"];
                            $_SESSION['razaosocialcliente'] = $row["razao_social"];
                            $_SESSION['banco'] = $row["banco"];
                            $_SESSION['bancousuario'] = $row["usuario"];
                            $_SESSION['bancosenha'] = $row["senha"];
                            $_SESSION['host'] = $row["host"];
                            $_SESSION['chave'] = $chave;
                            $_SESSION['cabecalho1'] = $row["cabecalho1"];
                            $_SESSION['cabecalho2'] = $row["cabecalho2"];
                            $_SESSION['cabecalho3'] = $row["cabecalho3"];
                            $_SESSION['enderecocliente'] = $row["endereco"];
                            $_SESSION['bairrocliente'] = $row["bairro"];
                            $_SESSION['cepcliente'] = $row["cep"];
                            $_SESSION['cidadecliente'] = $row["cidade"];
                            $_SESSION['ufcliente'] = $row["uf"];
                            $_SESSION['estadocliente'] = $row["estado"];
                            $_SESSION['telefonecliente'] = $row["telefone"];
                            $_SESSION['sitecliente'] = $row["site"];
                            $_SESSION["usuarioid"] = 0;
                            $_SESSION["usuariotipo"] = 'Cidadão';
                            $_SESSION["email_tramitacao"] = $row["email_tramitacao"];
                            $_SESSION["email_porta"] = $row["email_porta"];
                            $_SESSION["email_senha"] = $row["email_senha"];
                            $_SESSION["email_usuario"] = $row["email_servidor"];
                            $_SESSION["email_nome"] = $row["email_nome"];
                            $_SESSION["email_autenticacao"] = $row["email_autenticacao"];
                            $_SESSION["tempo_sessao"] = $row["tempo_sessao"];
                            $_SESSION["tentativas_acesso"] = $row["tentativas_acesso"];
                            $_SESSION["chancela"] = $row["chancela"];
                            $_SESSION["celebracao"] = $row["celebracao"];
                            $_SESSION["adiantamento"] = $row["adiantamento"];
                            $_SESSION["diaria"] = $row["diaria"];
                            $_SESSION["host_assinatura"] = $row["host_assinatura"];
                            $_SESSION["entidade_assinatura"] = $row["entidade_assinatura"];
                            $_SESSION["excluir_despesa_prestacao"] = $row["excluir_despesa_prestacao"];
                            $_SESSION["mascara_cpf"] = $row["mascara_cpf"];
                            $_SESSION["adiantamento_assinatura"] = $row["adiantamento_assinatura"];
                            $_SESSION["diaria_assinatura"] = $row["diaria_assinatura"];
                            $_SESSION["validade_assinatura"] = $row["validade_assinatura"];
                            $_SESSION["portal_monitoramente"] = $row["portal_monitoramente"];
                            $_SESSION["configuracao"] = ($row["parceria"]==''?'cpl':$row["parceria"]) ;
                            $_SESSION["avaliar_despesa_prestacao"] = $row["avaliar_despesa_prestacao"];
                            $_SESSION["numeracao_transferencia"] = $row["numeracao_transferencia"];
                            $_SESSION["adiantamento_administrador"] = ($row["adiantamento"]=='S' ? $row["adiantamento_administrador"] : 'N');
                            $_SESSION["diaria_administrador"] = ($row["diaria"]=='S' ? $row["diaria_administrador"] : 'N');
                            $_SESSION["diaria_calculo"] = ($row["cnpj"]=='83102293000145' /*|| $row["cnpj"]=='99999999999999'*/ ? 'N' : 'S'); //Camboriu
                            $_SESSION["api_pessoas"] = $row["api_pessoas"];
                            $_SESSION["api_textos"] = $row["api_textos"];
                            $_SESSION["alterar_despesa_rejeitada"] = $row["alterar_despesa_rejeitada"];
                            $_SESSION['cpfgovbr']='';
                            $_SESSION['gov_dominio']=$dominiogov;
                            $_SESSION['gov_subdominio']=$row['gov_subdominio'];
                            $_SESSION['gov_clientId']=$row['gov_clientId'];
                            $_SESSION['gov_clientSecret']=$row['gov_clientSecret'];
                            $_SESSION['gov_redirectUri']=$row['gov_redirectUri'];
                            $_SESSION['gov_redirectUriLogout']=$row['gov_redirectUriLogout'];
                            $_SESSION['gov_producao']=$row['gov_producao'];
                            $_SESSION['gerar_assinatura_govbr']=$row['gerar_assinatura_govbr'];
                            $_SESSION['assinatura_icp']=$row['assinatura_icp'];
                            $_SESSION['assinatura_govbr']=$row['assinatura_govbr'];
                            $_SESSION['assinatura_govbr_clientID']=$row['assinatura_govbr_clientID'];
                            $_SESSION['assinatura_govbr_secret']=$row['assinatura_govbr_secret'];
                            $_SESSION['tipo_assinatura']=($row['assinatura_govbr']=='S' || $row['assinatura_icp']=='S'?'Digital':($row['host_assinatura']!=''?'Eletronica':'') );
                            $_SESSION['tipo_conta_govbr']='';
                            $_SESSION['ocultar_plano_chamamento']=$row['ocultar_plano_chamamento'];
                            $_SESSION['portal_prestacao_enviado']=$row['portal_prestacao_enviado'];

                        }
                        /* free result set */
                        mysqli_free_result($result);
                        //carrega pagina
                        //include("principal.php");


                        if (isset($_GET['code'])){
                            $code = (isset($_GET['code'])) ? $_GET['code'] : null;


                            if ($_SESSION['gov_producao']=='N'){
                                define('URL_PROVIDER', 'https://sso.staging.acesso.gov.br');
                                define('URL_SERVICOS', 'https://api.staging.acesso.gov.br');
                            } else {
                                define('URL_PROVIDER', 'https://sso.acesso.gov.br');
                                define('URL_SERVICOS', 'https://api.acesso.gov.br');
                            }
                            define('URL_CATALOGO_SELOS', 'https://confiabilidades.staging.acesso.gov.br');
                            define('REDIRECT_URI', $_SESSION['gov_redirectUri']); // redirectURI informada na chamada do serviço do authorize.
                            define('CLIENT_ID', $_SESSION['gov_clientId']); // clientId informado na chamada do serviço do authorize.
                            define('SECRET', $_SESSION['gov_clientSecret']); // secret de conhecimento apenas do backend da aplicação.
                            define('CODE_CHALLENGE', 'TMaYenZ-DEyv1lRW4c6WqnokiVPKn_8bYNT9r97SfhE');
                            define('CODE_VERIFIER', 'Zj9LJPSeNaZzvGP890D8Sojk4H50QS3ZcEyClaIHULrMNm4YYSSvTEuloSbrzQKH');
                            define('CODE_CHALLENGE_METHOD', 'S256');
                            //define('NIVEIS', 'openid+email+profile+govbr_confiabilidades+sign');
                            define('CONFIABILIDADES', '<coloque-aqui-as-confiabilidades-repeitando-sintaxe-virgula-barra-parenteses-segundo-roteiro>');

                            function getAuthorizationDados($url, $method, $headers = [], $data = null){
                                $ch = curl_init($url);
                                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                if ($data) {
                                    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                                }
                                $response = curl_exec($ch);
                                curl_close($ch);
                                return $response;
                            }
                            // Gerar um código desafio aleatório
                            //$code_verifier = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');
                            $data = [
                                'grant_type' => 'authorization_code',
                                'code' => $code,
                                'redirect_uri' => REDIRECT_URI,
                                'code_verifier' => CODE_VERIFIER,
                                'sub'=>''
                            ];
                            $headers = [
                                "Authorization: Basic " . base64_encode(CLIENT_ID . ":" . SECRET),
                                "Accept: application/json"
                            ];
                            $response = getAuthorizationDados(URL_PROVIDER . "/token", "POST", $headers, $data);
                            $tokens = json_decode($response, true);
                            //echo "JSON retornado:\n";
                            //echo json_encode($tokens, JSON_PRETTY_PRINT) . "\n";

                            //get para buscar os dados;
                            function getdados($url){
                                $url = $url . "/jwk";
                                $ch = curl_init();
                                curl_setopt($ch, CURLOPT_URL, $url);
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
                                $response = curl_exec($ch);
                                $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                                if ($http_status != 200) {
                                    throw new RuntimeException("Falhou : HTTP error code : " . $http_status);
                                }
                                curl_close($ch);
                                $keys = json_decode($response, true)['keys'];
                                $key = $keys[0];
                                return $response;
                            }

                            $token =   $tokens['access_token'];
                            try {
                                $publicKey = getdados(URL_PROVIDER);
                            } catch (Exception $e) {
                                echo "Erro: " . $e->getMessage() . "\n";
                            }


                            function verifyJwtToken($token, $CLIENT_ID, $URL_PROVIDER, $publicKey) {
                                //Decodificar o token JWT
                                $tokenParts = explode('.', $token);
                                //print_r($tokenParts);
                                $header = base64_decode($tokenParts[0]);
                                $payload = base64_decode($tokenParts[1]);
                                $signature = base64_decode($tokenParts[2]);
                                //echo ' - payload : ';
                                return json_decode($payload, true);
                                //echo $payload;

                                // Verificar a assinatura
                                /*$verified = openssl_verify($tokenParts[0] . '.' . $tokenParts[1], $signature, $publicKey, OPENSSL_ALGO_SHA256);

                                if ($verified !== 1) {
                                    // Token inválido
                                    return null;
                                }

                                // Decodificar o payload do token
                                $claims = json_decode($payload, true);
                                var_dump($claims);

                                // Verificar os claims do token
                                /*$currentTimestamp = time();
                                if (!isset($claims['exp']) || $claims['exp'] < $currentTimestamp) {
                                    // Token expirado
                                    return null;
                                }
                                if ($claims['aud'] !== $CLIENT_ID) {
                                    // Audiência inválida
                                    return null;
                                }
                                if ($claims['iss'] !== $URL_PROVIDER . '/') {
                                    // Procedência inválida
                                    return null;
                                }
                                */
                            }
                            $claims = verifyJwtToken($token, CLIENT_ID, URL_PROVIDER, $publicKey);
                            if ($claims !== null) {
                                // Token válido, $claims contém os claims do token

                                /*if ($claims['sub']=='039.279.189-70' || $claims['sub']=='03927918970'){
                                    echo $code; exit;
                                }*/
                                $_SESSION['codex'] = $code;
                                //if ($claims['sub']=='039.279.189-70' || $claims['sub']=='03927918970') {
                                    //exemplo de busca de niveis
                                    $cpflogin = preg_replace('/\D/', '', $claims['sub']);
                                    $url =  URL_SERVICOS."/confiabilidades/v3/contas/".$cpflogin."/niveis?response-type=ids";
                                    $options = array(
                                        'http' => array(
                                            'header'  => "Authorization: Bearer $token\r\n" .
                                                "Accept: application/json\r\n",
                                            'method'  => 'GET'
                                        )
                                    );
                                    $context  = stream_context_create($options);
                                    $result = file_get_contents($url, false, $context);
                                    if ($result === false) {
                                        $error = error_get_last();
                                        print_r($error);
                                        exit;
                                    }
                                    //percore o selo e qual o nivel é
                                    $nivel = 1;
                                    $dados = json_decode($result, true);
                                    foreach ($dados as $selo){
                                        //print_r($selo);
                                        if ($selo['id']==2 || $selo['id']==3)
                                            $nivel = 2;
                                    }
                                    if ($nivel==1){
                                        $_SESSION['tipo_conta_govbr']='Bronze';
                                    } else {
                                        $_SESSION['tipo_conta_govbr']='Prata';
                                    }
                                    /*if ($claims['sub']=='039.279.189-70' || $claims['sub']=='03927918970'){
                                        $_SESSION['tipo_conta_govbr']='Bronze';
                                    }*/
                                        //var_dump($result); echo $_SESSION['tipo_conta_govbr']; exit;
                                //}

                                $_SESSION['cpfgovbr']=$claims['sub'];
                                $link='https://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'?chave='.$chave.'&m=doLogin';
                                $link=str_replace('index.php','principal.php',$link);
                                redirect_post($link,['name'=>$better_token]);
                            } else {
                                // Token inválido
                                echo "Token inválido";
                            }
                        }

                        if ($_SERVER['HTTP_HOST'] != 'localhost') {
                            if ($_SESSION['gov_subdominio']!='' && $_SESSION['gov_producao']=='S'){
                                $link = strtolower('https://'.$_SESSION['gov_subdominio'].$_SERVER['SCRIPT_NAME'].'?chave='.$chave);
                            } else
                                $link = strtolower('https://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'?chave='.$chave);
                        } else {
                            $link = strtolower('http://localhost'.$_SERVER['SCRIPT_NAME'].'?chave='.$chave);
                        }

                        $link=str_replace('index.php','principal.php',$link);

                        //$parametros = $_SERVER['QUERY_STRING'];
                        //$link = $link.$parametros;



                        if (isset($_GET['m'])) {
                            if (getvalor('m')=='portal'){
                                $_SESSION["usuariotipo"] = 'Portal';
                                if ($_SERVER['HTTP_HOST'] != 'localhost') {
                                    $link = strtolower('https://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'?');
                                } else {
                                    $link = strtolower('http://localhost'.$_SERVER['SCRIPT_NAME'].'?');
                                }
                                $link=str_replace('index.php','principal.php',$link);
                                $parametros = $_SERVER['QUERY_STRING'];
                                $link = $link.$parametros;
                                redirect_post($link,['name'=>$better_token]);
                            } else {
                                redirect_post($link,['name'=>$better_token]);
                            }
                        } else {
                            redirect_post($link,['name'=>$better_token]);
                            //header("Location: principal.php?name=$better_token&chave=$chave");
                        }
                    } else {
                        if ($dominiogov == null) {
                            header("Location: site");
                        } else {
                            echo ('Parâmetro inválido.');
                        }
                    }
                } else {
                    if ($dominiogov == null) {
                        header("Location: site");
                    } else {
                        echo ('Parâmetro inválido.');
                    }

                }
            }
            @mysqli_close($conexao);
        } catch (Exception $e) {
            echo 'Erro ao conectar com os dados do servidor.';
        }
    } else {
        //$link = strtolower('http://'.$_SERVER['SERVER_NAME'].'/site/index.php');
        //echo $link;
        //redirect_post($link);
        //echo $_SERVER['HTTP_HOST'];
        if ($dominiogov == null) {
            header("Location: site");
        } else {
            echo ('Parâmetro inválido.');
        }
    }

