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

59 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Append criterion evidence to the existing matrix, preserving IDs, source rows and states."""
from pathlib import Path
from datetime import datetime,timezone
import csv,json,hashlib,collections
csv.field_size_limit(20000000)
R=Path(__file__).resolve().parent.parent;D=R/'docs/investmoz/v2/auditoria-portal';P=R/'storage/app/private/investmoz-v2/portal-audit'
read=lambda n:json.loads((P/n).read_text(encoding='utf-8'))
code=read('workflow-upgrade-code-20261011.json');qa=read('workflow-upgrade-backup-restoration-qa-20261011.json');target=read('workflow-upgrade-target-backup-20261011.json')
assert qa['result']==target['result']=='passed' and code['code_revision']==qa['code_revision']==target['candidate_code_revision']
for n in ['workflow-upgrade-fixed-install-chromium-20261011.json','workflow-upgrade-document-pipeline-chromium-20261011.json','workflow-upgrade-office-chromium-20261011.json','workflow-upgrade-final-ui-chromium-20261011.json']:
assert read(n)['result']=='passed'
tag='[Atualização do clone/ACL Super QA 11-10-2026] '
evidence='Clone real do alvo restaurado288→295tabelas:030000→040000 por HTTP autenticado/Chromium/MFA normal; prévia divergente409 sem DDL, repetição030000 com prévia renovada sem duplicação e040000 com mesmo recibo/chave; bootstrap distinto com2titulares sintéticos e terceiro aprovador. COUNTRY02/050000 e190000 ausente preservados. PDF/PNG: envio→fila→quarentena423→worker terminado após reservar→mesmo trabalho recuperado após210s→ClamD1.5.4/definições11out→3WebP com scans próprios→downloads/hash/preview. DOCX/XLSX próprios também scan real/hash/recuperação. Repetir processamento não cria novos ficheiros/versões/auditoria. Super sem âmbito ou elevação403, autoaprovação403, scope+elevação independente200 só no dossier; outro dossier403; revogação invalida sessão e novo login403. Expiração e Auditor acumulado recusados no teste afetado. Aviso/derivada390px e bundle servido pelo hash demonstrados.'
refs='workflow-upgrade-fixed-install-chromium-20261011.json; workflow-upgrade-document-pipeline-chromium-20261011.json; workflow-upgrade-worker-fault-20261011.json; workflow-upgrade-office-chromium-20261011.json; workflow-upgrade-final-ui-chromium-20261011.json; workflow-upgrade-backup-restoration-qa-20261011.json; workflow-upgrade-target-backup-20261011.json; workflow-upgrade-affected/policy-validity-20261011.xml. Provas anteriores das seis categorias/A-B/C37/coedição conservadas, não repetidas.'
implementation='PortalProfileAccess exige perfil operacional no âmbito e elevação de consulta independente/temporária para Superutilizador, inclusive recursos/Response/URLgenérico/preview; usa portal_security_approvals existente, sem novas tabelas de ACL. Superuser+Auditor não contorna a restrição. PortalSuperusers aceita view vinculado ao registo; UI esclarece. OpportunityImageProcessor reutiliza derivadas do mesmo original e pode reenfileirar scans pendentes, sem novos streams/versões.'
gap='Destino ainda não atualizado: ClamD3310 com assinaturas09out recusado(stale); worker supervisionado e GD/WebP/CLI/web documental no destino ainda por verificar;2titulares legítimos+terceiro gestorMFA+âmbitos Promotor/Validador/Publicador a designar. Restauração de oportunidade e partilha individual continuam desabilitadas/fora do pacote; variantes não ensaiadas,Response§27normativo integral,190000,cartografia/importações,legado,módulos/ofertas/SLA e leitores/dispositivos reais permanecem separados. Sem novas organizações ou representações.'
deps='030000 precede040000;020000 existente e050000 preservada;190000 NÃO é dependência DDL do workflow isolado. Backup real do destino renovado '+target['verified_at']+':288tabelas/31seq/799ficheiros/2MFA, restauro apenas55441. Pós-utilização QA '+qa['verified_at']+':295tabelas/31seq/188ficheiros/9MFA;285tabelas originais não transitórias preservadas. Revisão código '+code['code_revision'][:12]+'. A aprovação/serviços/readiness do destino continuam necessários; readyQA não significa ativo.'
active='Leitura exclusiva investemoz:5432:288tabelas,020000+050000,COUNTRY02ON,030000/040000 ausentes,demaisflagsOFF,13contas,0organizações/representações/geo_geometries. ClamDativo3310stale. Nenhuma alteração ativa de código,bundle,serviço,chave,flag,schema,dados ou privilégios.'
ids={'AUD-OP-02','AUD-OP-03','AUD-OPS-01','AUD-PROFILE-14','AUD-PROFILE-31','AUD-PROFILE-32','AUD-UI-01'}
packet={'proof_filename':'csv-authoring-proof.json','files':[]};folder=P/'workflow-upgrade-finalize-20261011';folder.mkdir(exist_ok=True)
for name in ['matriz-requisitos.csv','backlog-priorizado.csv']:
f=D/name;raw=f.read_bytes()
with f.open(encoding='utf-8-sig',newline='')as stream:rows=list(csv.reader(stream))
h=rows[0];patches=[]
for number,row in enumerate(rows[1:],1):
if row[h.index('ID')] not in ids:continue
def append(k,v):
old=row[h.index(k)];assert tag not in old
return old+'\n'+tag+v
if name=='matriz-requisitos.csv':
values={'Implementação encontrada':append('Implementação encontrada',implementation),'Disponibilidade ativa':active,'Evidência funcional':append('Evidência funcional',evidence+' '+refs),'Lacuna':append('Lacuna',gap),'Dependência':append('Dependência',deps),
'Interface':append('Interface','ChromiumHTTPS do clone, aviso de âmbito do Super/derivada390px e seletor de elevação identificados; hash do asset realmente carregado confere com bundle final. Dispositivos físicos e acessibilidade integral não encerrados.'),
'API':append('API','409divergência antes DDL, mesmas instalações sem repetição;423quarentena;200binários íntegros/scan;403sem scope/elevação,autoaprovação ou outro dossier;revogação nega URL anterior e novo login.'),
'Gravação':append('Gravação','Somenteclones55441:7tabelas previstas; zero linhas originais não transitórias alteradas; novas contas/roles/documentos estritamente sintéticos. Auditoria única030/040, histórico/MFA/cifra originais preservados.'),
'Recuperação':append('Recuperação','Worker real recupera o mesmo job após210s;PDF/PNG/DOCX/XLSX com hashes;3WebP recuperáveis;repetição não duplica. Restauro completo pós-utilização295tabelas e188ficheiros iguais.'),
'Resultado apresentado':append('Resultado apresentado',evidence),
'Versões divergentes':append('Versões divergentes','e871f8aadb59 preservada como referência; a leitura administrativa universal do Super é restringida nesta revisão. São17ficheiros de código;5alterados face àquela. Último delta após ensaio autenticado é somente rótulo de consulta no seletor; pedidos/autorização/DDL/transações iguais, reconferidos por prévia final e nova compilação. Não converter propostas em regras ativas.')}
else:values={'Pendência':append('Pendência',gap),'Correção/componentes':append('Correção/componentes',implementation+' '+evidence+' '+refs),'Dependência/pergunta':append('Dependência/pergunta',deps+' Designar: dois titulares; terceiro gestor independente comMFA; perfis funcionais e tipos/organizações legítimos. Restauração permanece proposta separada.'),'Ordem do próximo lote':append('Ordem do próximo lote','Conferir candidata única/delta; resolver serviços e designações no destino sob autorização própria; renovar prova do destino após alterações;030000→040000→bootstrap separado→habilitar apenas flags do workflow. Não aplicar190000/050000,importações ou publicações; não inventar organização para ensaio.')}
patches.append({'row':number,'values':values})
assert len(patches)==len(ids)
packet['files'].append({'filename':name,'input_sha256':hashlib.sha256(raw).hexdigest(),'rows':rows,'patches':patches,'allowed_columns':sorted({k for p in patches for k in p['values']}),'source_hash_updates':[]})
if name=='matriz-requisitos.csv':counts={'requirements':len(rows)-1,'rows':len(rows)-1,'source_occurrences':sum(int(r[h.index('Quantidade de linhas de origem')])for r in rows[1:]),'states':dict(collections.Counter(r[h.index('Estado')]for r in rows[1:])),'updated_IDs':sorted(ids),'new_IDs':0}
(folder/'csv-edits.json').write_text(json.dumps(packet,ensure_ascii=False),encoding='utf-8');(folder/'counts.json').write_text(json.dumps(counts,ensure_ascii=False,indent=2),encoding='utf-8')
cases=D/'casos-reproducao.md';t=cases.read_text(encoding='utf-8');assert '## C127 —' not in t
t+='''\n\n## C127 — Superutilizador administrativo com acesso operacional global a anexos
- **P0, apenas QA; fonte/cobertura:** a leitura do código anterior encontrou `canView` a devolver true para todo Superutilizador. Essa constatação é de código; não se apresenta como exploração observada no destino, que ainda não tem030000/040000. Contraria v1§345: elevação não substitui perfil operacional; administração não concede consulta universal.
- **Reprodução/esperado:** titular sintético15, sem âmbito, GET `/minhas-oportunidades/7/resources` e download próprio/genérico do PDF. Deve receber403; com papel funcional, ainda403 até outro titular aprovar elevação de consulta para7. Autoaprovação e acesso ao dossier8 devem continuar403.
- **Correção/evidência:** PortalProfileAccess/PortalSuperusers existentes: scope+elevação independente `view`, objeto e validade15min/MFA recente. Mesmo Super com Auditor não contorna a negação. Chromium:403→elevação aprovada200(hash)→outro dossier403; revogação invalida sessão, URL antigo e novo login403. Expiração/escopo/conflitos confirmados no teste afetado. `workflow-upgrade-document-pipeline-chromium-20261011.json`, `workflow-upgrade-policy-validity-20261011.xml`, UI/bundle final.
- **Limite:** não implementa ACL individual nem autoriza operação/administração universal. Provas de gestão de papéis não substituem decisão sobre titulares legítimos.
## C128 — repetição de processamento de imagem gerava novas derivadas
- **P1, achado de código corrigido emQA:** versão anterior gerava novosUUIDs/streams em cada execução com versão/etag atualizados, mesmo sem mudar o original. Não foi apresentado um ensaio HTTP «antes»; a causa está no laço incondicional de geração.
- **Reprodução/esperado:** após gerar e analisar uma imagem, recuperar etag/versão e voltar a preparar o mesmo original. Deve manter documentos, hashes, versão e decisões, sem duplicar.
- **Correção/prova:** reutilizar derivações coerentes com hash/larguras/bytes existentes; reenfileirar só scans pendentes. ImagemQA800×600: trêsWebP320/640/800, scans próprios reais; repetiçãoHTTP200 mantém IDs, versão, hashes/cifra e fila vazia. Teste afetado conserva contagem/documentos/versões/auditoria. `workflow-upgrade-document-pipeline-chromium-20261011.json` e teste de imagens em `workflow-upgrade-affected-20261011.xml`.
'''
cases.write_text(t,encoding='utf-8');print(json.dumps(counts,ensure_ascii=False))