Files
Investidor-V2/tools/portal-country-https-active-results.py
nala 287e991486
tests / ci (push) Waiting to run
oportunidades 7
2026-10-13 11:40:29 +02:00

109 lines
19 KiB
Python

"""Record this active attempt in the SAME matrix; preserve all source references and QA closures."""
from pathlib import Path
from datetime import datetime,timezone
import csv,hashlib,json,shutil
csv.field_size_limit(20_000_000)
ROOT=Path(__file__).resolve().parent.parent
PRIVATE=ROOT/'storage/app/private/investmoz-v2/portal-audit'
DOC=ROOT/'docs/investmoz/v2/auditoria-portal'
OUT=ROOT/'outputs/investmoz-country02-https-activation-20261011'
read=lambda p:json.loads(Path(p).read_text(encoding='utf-8-sig'))
sha=lambda p:hashlib.sha256(Path(p).read_bytes()).hexdigest()
pre=read(PRIVATE/'country-https-active-preflight-20261011.json')
reversed=read(PRIVATE/'country-https-active-check-reverted-20261011.json')
stage=read(PRIVATE/'country-https-active-stage-latest.json')
reversal=read(PRIVATE/'country-https-active-reversal-20261011.json')
assert reversed['result']=='passed' and reversed['installed_packages']==[] and not reversed['country_enabled']
assert reversed['installation_audits']==0 and reversed['changed_tables']==[]
OUT.mkdir(exist_ok=True)
public_pre={k:v for k,v in pre.items() if k not in ['tables','readiness_proof_path']}
for name,value in [('preflight.json',public_pre),('estado-final.json',reversed),('reversao.json',{k:v for k,v in reversal.items() if k!='restored_files'})]:
(OUT/name).write_text(json.dumps(value,ensure_ascii=False,indent=2),encoding='utf-8')
note='Autorização registada: entrega13644ed74a48/código162daff6ce08 + HTTPS + logout + somente050000/flagCOUNTRY02. Pré-flight READ ONLY08:03:24UTC confirma correspondência do backup/restauro07:44:43UTC, todasas288tabelas e31sequências, arquivos/checksums, chave estável e2envelopesMFAoriginais recuperados. Disponibilização temporária das3fontes/157ativos com flagfalse e propostaHTTPS; ApacheSyntaxOK. Reinício por serviço recusado porque Laragon corre como processo; terminação deprocessos rejeitada pela revisãoautomática (blockedbypolicy, semoutromotivo). Confiança daCAativa7D30D7FB226481B6243051309818CF426AF6B6B7 continua porconfirmar localmente. Auxiliarps1 inicialmente não executado por ExecutionPolicyRestricted; substituído por cmdletImport-Certificateinline semalterarpolítica. TLSreal ainda nãoapresentou o certificado candidato: nenhuma préviaautenticada/POST. Para não deixar configuração incompleta, repostosfonte36f7722ce5a5, manifesto75352185c2a85, .env/vhost/readiness originais. Reversão08:13:55UTC:288tabelas,13contas,0organizações/representações,79migrations,126audits,6sessões ehashesoriginais,0DDL/0instalação/auditCOUNTRY02. Pacote136 imutávelpreservado; A/B,C37 e provasQA não reabertos.'
gap='Autorização já concedida e mantida; não pedir nova aprovação do mesmo âmbito. Falta confirmar CA Windows e coordenar reinício normal do Apache/Laragon após reaplicar configuração, validar TLS/contexto/cookies/recursos, login/MFA de gestor EXISTENTE autorizado, conferir prévia investemoz5432/código162daff6ce08/050000/dependências/hash e então POST autenticado somente050000. Divergência interrompe antes doPOST. Depois auditoria/duascolunas/zero novasentidades e flagCOUNTRY02; verificaçãoperfil/logout/nova sessão. Ativo0organizações/0representações: gravação/reutilização real do país mestre indisponível enquanto não existirem cadastros/vínculos legítimos; NÃO criar fixtures ou atribuir representações neste âmbito. ProvasQA de gravação preservadas, não substituem provaativa. 25UUID externas continuam separadas.'
for a,b in {'entrega136':'entrega 136','código162':'código 162','somente050000':'somente 050000','flagCOUNTRY02':'flag COUNTRY02','ONLY08':'ONLY 08','restauro07':'restauro 07','todasas288tabelas e31sequências':'todas as 288 tabelas e 31 sequências','e2envelopesMFAoriginais':'e 2 envelopes MFA originais','das3fontes/157ativos':'das 3 fontes/157 ativos','flagfalse':'flag=false','propostaHTTPS':'proposta HTTPS','ApacheSyntaxOK':'Apache Syntax OK','deprocessos':'de processos','revisãoautomática':'revisão automática','blockedbypolicy':'blocked by policy','semoutromotivo':'sem outro motivo','daCAativa':'da CA ativa ','porconfirmar':'por confirmar','Auxiliarps1':'Auxiliar ps1','cmdletImport-Certificateinline':'cmdlet Import-Certificate inline','semalterarpolítica':'sem alterar política','TLSreal':'TLS real','nãoapresentou':'não apresentou','préviaautenticada':'prévia autenticada','repostosfonte36':'repostos fonte 36','imutávelpreservado':'imutável preservado','provasQA':'provas QA','Reversão08':'Reversão 08','288tabelas,13contas,0organizações/representações,79migrations,126audits,6sessões ehashesoriginais,0DDL/0instalação/auditCOUNTRY02':'288 tabelas,13 contas,0 organizações/representações,79 migrations,126 audits,6 sessões e hashes originais,0 DDL/0 instalação/audit COUNTRY02','doPOST':'do POST','duascolunas':'duas colunas','novasentidades':'novas entidades','verificaçãoperfil':'verificação perfil','Ativo0organizações/0representações':'Ativo 0 organizações/0 representações','provaativa':'prova ativa','25UUID':'25 UUID'}.items():
note=note.replace(a,b);gap=gap.replace(a,b)
history={'at':datetime.now(timezone.utc).isoformat(),'note':note,'remaining':gap,'preflight':public_pre,'final_state':reversed,
'authorization_still_valid':True,'authenticated_preview_obtained':False,'authenticated_apply_performed':False,'DDL_changes':0}
report=f'''# COUNTRY02 — ativação HTTPS por retomar
**Entrega autorizada `13644ed74a48`, código `162daff6ce08`. Não houve instalação nem habilitação.**
Backup/restauro revalidado às **08:03:24 UTC (10:03:24 em Moçambique)**: snapshot07:44:43UTC,288tabelas/31sequências, checksums e linhas correspondentes, APP_KEY/cipher preservados, dois envelopes MFA originais recuperados. [Pré-flight sanitizado](preflight.json).
Foram disponibilizados temporariamente três ficheiros de código e 157 ativos, com COUNTRY02 desabilitado, e aplicada a proposta de configuração HTTPS. O Apache aprovou a sintaxe. O comando de reinício como serviço falhou porque este Laragon executa Apache como processo. A revisão automática bloqueou a terminação desses processos com `blocked by policy`, sem fornecer outro motivo. A confiança da CA ativa **InvestMoz portal-investidor.test local20261011**, impressão digital **7D30D7FB226481B6243051309818CF426AF6B6B7**, aguarda confirmação manual do Windows. O auxiliar inicial por ficheiro foi recusado pela ExecutionPolicyRestricted; o cmdlet nativo foi iniciado sem alterar a política e aguarda o aviso do Windows. Nenhum erro TLS foi ignorado.
O servidor ainda não apresentou o certificado aprovado. **Não foi obtida uma prévia autenticada; não há divergência de prévia demonstrada, nem POST050000.** Para não deixar a mudança incompleta, foram repostos código36f7722ce5a5, manifesto75352185c2a85, .env, vhost e readiness anteriores. [Reversão](reversao.json). [Verificação final READ ONLY08:13:55UTC](estado-final.json):288tabelas/13contas/0organizações/0representações/79migrations/126audits/6sessões, mesmos hashes e valores, zero novascolunas/tabelas/entidades, zero recibos de instalação COUNTRY02. Os ativos imutáveis novos e os certificados/chave privados preparados foram conservados, fora da aplicação carregada; a chave não é divulgada. O Apache carregado não foi interrompido.
## Como retomar dentro da autorização existente
1. Confirmar localmente somente o aviso com o nome e impressão digital acima. Não contornar intersticiais TLS. Como a configuração foi reposta, **não é necessário reiniciar Apache agora**; coordenar o reinício normal pelo Laragon depois de reaplicar a configuração aprovada.
2. Revalidar novamente backup/hashes/alvo/estado, reaplicar as mesmas fontes/bundle/TLS com COUNTRY02=false. Validar sintaxe, reiniciar pelo controlo normal do Laragon e demonstrar o certificado exato/contexto seguro/recursos/cookies antes de autenticar.
3. Gestor real EXISTENTE com email verificado e MFA normal: **https://portal-investidor.test/management/opportunity-resources-install/organization-country**. Conta QA18 ou QA21 não substitui o gestor ativo. Credenciais e MFA são introduzidos localmente, sem os enviar para a conversa ou evidências.
4. Conferir investemoz:5432, código162daff6ce08, pronta/consistente/não instalada, dependências existentes e somente050000, duas colunas nullable, zero entidades. Conferir o hash da prévia antes doPOST; qualquer divergência interrompe. A interface usa a chave estável do servidor.
5. Confirmar/postar pelo mecanismo autenticado, verificar exatamente um ledger/recibo, duas colunas e preservação de todos os outros dados. Habilitar exclusivamente COUNTRY02. Verificar perfil, F5, histórico cifrado, logout/API401/Back sem dados privados e nova sessão/MFA. Não repetir A/B ou C37 integrais.
**Limitação concreta da gravação ativa:** não existe qualquer organização ou representação no cadastro mestre ativo. O perfil deve mostrar esse estado vazio. A gravação/reutilização de país real necessita de organização e vínculo legítimos, definidos pelo fluxo/dados autorizados; esta entrega não implementa um onboarding geral nem autoriza inventar ou inserir titulares. A gravação/recuperação QA permanece demonstrada, mas não se declara demonstração de gravação real no ativo. Esta limitação já constava do guia e foi confirmada por leitura.
## Reversão e exclusões
Snapshots privados verificáveis de código, manifesto, .env, vhost, configuração Apache e readiness preservados; reversão pré-instalação já executada e verificada. `tools/portal-country-https-active-reverse.py` exige prova READ ONLY fresca de zero instalação antes de repor ficheiros. Depois de instalar: desabilitar COUNTRY02 primeiro, conservar colunas/valores/ledger/auditoria, preferir HTTPS mantido. Nunca `down/drop`, `key:generate`, desativação MFA ou restauro ativo automático. Um retorno completo a HTTP reabre C111 para os percursos privados e retira a entrega HTTPS.
A autorização136/162 continua válida; não solicitar nova autorização para este âmbito. Falta intervenção operacional local, autenticação e demonstração ativa. Pacote/revisão/hash anteriores imutáveis. A/B e C37 preservados. Nenhum030000/040000/190000, conta, organização, representação, cartografia, perfil, oferta ouSLA aplicado. As25UUID permanecem no backlog.
'''
for a,b in {'snapshot07':'snapshot 07','288tabelas/31sequências':'288 tabelas/31 sequências','local20261011':'local 20261011','POST050000':'POST 050000','código36':'código 36','manifesto753':'manifesto 753','ONLY08':'ONLY 08','288tabelas/13contas/0organizações/0representações/79migrations/126audits/6sessões':'288 tabelas/13 contas/0 organizações/0 representações/79 migrations/126 audits/6 sessões','novascolunas':'novas colunas','código162':'código 162','somente050000':'somente 050000','doPOST':'do POST','autorização136/162':'autorização 136/162','Nenhum030000/040000/190000':'Nenhum 030000/040000/190000','ouSLA':'ou SLA','As25UUID':'As 25 UUID'}.items():report=report.replace(a,b)
(OUT/'resultado.md').write_text(report,encoding='utf-8')
packet_dir=PRIVATE/'country-https-active-result-20261011';packet_dir.mkdir(exist_ok=True)
assert not (packet_dir/'csv-edits.json').exists(),'Prepared packet already exists; do not duplicate updates'
packet={'files':[]}
tag='[Ativação COUNTRY02 HTTPS autorizada 11/10/2026, interrompida antes de aplicar] '
for name in ['matriz-requisitos.csv','backlog-priorizado.csv']:
file=DOC/name;rows=list(csv.reader(file.open(encoding='utf-8-sig',newline='')));headers=rows[0];shutil.copyfile(file,packet_dir/(name+'.before'));patches=[]
for i,row in enumerate(rows[1:],1):
v=dict(zip(headers,row))
if v['ID'] not in ['AUD-COUNTRY-02','AUD-OPS-01']:continue
country=v['ID']=='AUD-COUNTRY-02'
if name=='matriz-requisitos.csv':
versions=json.loads(v['Critérios e versões por origem (JSON)'])
entry={**history,'previous_current_claims':{k:v[k] for k in ['Estado','Lacuna','Disponibilidade ativa']}}
if isinstance(versions,list):versions.append({'country02_https_active_attempt_20261011':entry})
else:versions['country02_https_active_attempt_20261011']=entry
patch={'Evidência funcional':v['Evidência funcional']+'\n'+tag+note+' outputs/investmoz-country02-https-activation-20261011/resultado.md',
'Disponibilidade ativa':tag+'Instalação e habilitação não realizadas. Staging revertido: código36f7722ce5a5/manifesto75352185c2a85/HTTP original;288tabelas,13contas,0organizações/0representações,79migrations/126audits, sem050000/colunas/recibo. Pronto apenas em QA/pacote autorizado136/162. Confiança CA/reinício/autenticação locais pendentes.',
'Lacuna':tag+gap if country else v['Lacuna']+'\n'+tag+gap,
'Dependência':v['Dependência']+'\n'+tag+'Autorização136/162 já registada; intervenção local Windows/Laragon e gestor existente com MFA, backup/prévia correspondentes. País mestre real: cadastros/representações legítimos, não inseridos neste âmbito.',
'Critério de aceitação':v['Critério de aceitação']+'\n'+tag+'Retomar dentro da autorização, sem novas entidades: TLS reconhecido; prévia/hash/código/alvo/dependências coincidentes; POST autenticado050000;1audit/2colunas/0tabelas; flagCOUNTRY02; perfil/histórico/logout/nova sessão. Gravação ativa separada e só se organização/vínculo real existir; não inferir do QA. Reversão pré-instalação já demonstrada; pós-instalação conserva dados/ledger.',
'Critérios e versões por origem (JSON)':json.dumps(versions,ensure_ascii=False,separators=(',',':')),
'Versões divergentes':v['Versões divergentes']+'\n'+tag+'Atualiza a pendência de autorização do relato anterior:136/162+HTTPS foi aprovado; execução por retomar, sem mudar a candidata. C68/36 e QA136/162 preservadas; não confundir staging com instalação.'}
else:
patch={'Pendência':tag+gap if country else v['Pendência']+'\n'+tag+gap,
'Correção/componentes':v['Correção/componentes']+'\n'+tag+note,
'Dependência/pergunta':v['Dependência/pergunta']+'\n'+tag+'Intervenção operacional local, não nova decisão de âmbito. A gravação no master depende de dados/representação legítimos ausentes.',
'Aceitação':v['Aceitação']+'\n'+tag+'Prévia/mecanismo autenticado somente050000, certificado/contexto/cookies, auditoria, perfil/logout/nova sessão. Gravação real só com cadastro/vínculo existente; nenhuma fixture ativa. Preservar QA/A/B/C37 e validar reversão.',
'Ordem do próximo lote':'COUNTRY02136/162 autorizado; aguarda confirmação local daCA e reinício coordenadoLaragon/gestorMFA, revalidar e retomar somente050000+flag. Outros25UUID independentes continuam separados.'}
assert 'Estado' not in patch
patches.append({'row':i,'values':patch})
assert len(patches)==2
packet['files'].append({'filename':name,'rows':rows,'input_sha256':sha(file),'allowed_columns':list({k for p in patches for k in p['values']}),'patches':patches})
(packet_dir/'csv-edits.json').write_text(json.dumps(packet,ensure_ascii=False),encoding='utf-8')
summary=f'''<!-- country02-active-https-attempt-20261011:begin -->
## COUNTRY02 — autorização registada, ativação por retomar
Entrega13644ed74a48/código162daff6ce08 e HTTPS explicitamente autorizados. Backup/restauro/linhas/sequências/envelopes revalidados READ ONLY08:03:24UTC. Staging das3fontes/157ativos/configHTTPS com flagfalse, sintaxeApache aprovada; não se obteve certificadoativo/préviaautenticada. ApacheLaragon nãoéserviçoWindows; reinício por serviço falhou e terminação deprocessos foi bloqueada por revisãoautomática. ConfiançaCA Windows e reinício normalLaragon dependem de intervenção local. Auxiliar inicial porps1 foi recusado pela política; cmdletnative aguardaaviso, sem mudança deExecutionPolicy.
Reversão pré-instalação executada: fonte36/manifesto753/.env/vhost/readiness repostos; às08:13:55UTC,288tabelas/13contas/0organizações/0representações/79migrations/126audits/6sessões e mesmoshashes; zeroDDL/050000/auditoriaCOUNTRY02, flagsfalse e APP_KEY/cipher/MFA preservados. Não reiniciarApache agora; coordenar depoisdereaplicarTLS após confirmação daCA. Autorização mantida: não pedir novamente aprovação do mesmo âmbito. Ativo semdadosmestres/vínculos reais: gravaçãoativa do paísnãoé demonstrada;QA de gravação mantida. A/B,C37 e25UUID preservados.
[Resultado, provas, URL exato e critérios para retomar](../../../../outputs/investmoz-country02-https-activation-20261011/resultado.md). O pacote136/162 continua imutável. Nenhum outro pacote ou nova entidade. AUD-COUNTRY-02 mantém **implementado mas não ativado**, AUD-OPS-01 mantém parcial. Os textos anteriores permanecem como histórico.
<!-- country02-active-https-attempt-20261011:end -->
'''
for a,b in {'Entrega136':'Entrega 136','código162':'código 162','ONLY08':'ONLY 08','das3fontes/157ativos/configHTTPS':'das 3 fontes/157 ativos/config HTTPS','flagfalse':'flag=false','sintaxeApache':'sintaxe Apache','certificadoativo/préviaautenticada':'certificado ativo/prévia autenticada','ApacheLaragon nãoéserviçoWindows':'Apache Laragon não é serviço Windows','deprocessos':'de processos','revisãoautomática':'revisão automática','ConfiançaCA':'Confiança CA','normalLaragon':'normal Laragon','porps1':'por ps1','cmdletnative aguardaaviso':'cmdlet nativo aguarda aviso','deExecutionPolicy':'de ExecutionPolicy','fonte36/manifesto753':'fonte 36/manifesto 753','às08':'às 08','288tabelas/13contas/0organizações/0representações/79migrations/126audits/6sessões':'288 tabelas/13 contas/0 organizações/0 representações/79 migrations/126 audits/6 sessões','mesmoshashes':'mesmos hashes','zeroDDL/050000/auditoriaCOUNTRY02':'zero DDL/050000/auditoria COUNTRY02','flagsfalse':'flags=false','reiniciarApache':'reiniciar Apache','depoisdereaplicarTLS':'depois de reaplicar TLS','daCA':'da CA','semdadosmestres/vínculos':'sem dados mestres/vínculos','gravaçãoativa':'gravação ativa','paísnãoé':'país não é',';QA':' ; QA','e25UUID':'e 25 UUID','pacote136/162':'pacote 136/162'}.items():summary=summary.replace(a,b)
for name in ['relatorio-executivo.md','backlog.md','plano-ativacao.md']:
file=DOC/name;old=file.read_text(encoding='utf-8-sig');assert 'country02-active-https-attempt-20261011' not in old;file.write_text(summary+old,encoding='utf-8')
old_result=ROOT/'outputs/investmoz-country02-activation-20261011/resultado.md'
prior=old_result.read_text(encoding='utf-8-sig')
old_result.write_text('## Atualização da ativação HTTPS — 11/10/2026\n\nEntrega13644ed74a48/código162daff6ce08 autorizada; tentativa revertida antes de050000 por condições operacionais. [Resultado atual e critérios para retomar](../investmoz-country02-https-activation-20261011/resultado.md). O relato abaixo permanece como histórico da primeira tentativa C110.\n\n'+prior,encoding='utf-8')
print(json.dumps({'result':'operational interruption/reversal recorded','csv_packet':packet_dir.name,'states_unchanged':True,'installed':False,'active_SQL_changes':0}))