59 lines
11 KiB
Python
59 lines
11 KiB
Python
"""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))
|