@omnizap-system/omnizap 2.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clusterfuzzlite/Dockerfile +10 -0
- package/.env.example +907 -0
- package/.github/codeql/codeql-config.yml +10 -0
- package/.github/dependabot.yml +35 -0
- package/.github/workflows/ci.yml +73 -0
- package/.github/workflows/codeql.yml +106 -0
- package/.github/workflows/db-migration-check.yml +98 -0
- package/.github/workflows/dependency-review.yml +22 -0
- package/.github/workflows/deploy.yml +95 -0
- package/.github/workflows/release.yml +106 -0
- package/.github/workflows/security-attest-provenance.yml +51 -0
- package/.github/workflows/security-gitleaks.yml +34 -0
- package/.github/workflows/security-runner-hardening.yml +31 -0
- package/.github/workflows/security-scorecard.yml +44 -0
- package/.github/workflows/security-zap-baseline.yml +44 -0
- package/.github/workflows/security-zap-full-scan.yml +43 -0
- package/.github/workflows/security-zizmor.yml +36 -0
- package/.github/workflows/wiki-sync.yml +44 -0
- package/.gitleaks.toml +15 -0
- package/.prettierrc +34 -0
- package/CODE_OF_CONDUCT.md +114 -0
- package/LICENSE +56 -0
- package/README.md +110 -0
- package/SECURITY.md +110 -0
- package/app/config/index.js +4 -0
- package/app/configParts/adminIdentity.js +92 -0
- package/app/configParts/baileysConfig.js +1818 -0
- package/app/configParts/groupUtils.js +692 -0
- package/app/configParts/loggerConfig.js +394 -0
- package/app/configParts/messagePersistenceService.js +305 -0
- package/app/connection/baileysCompatibility.test.js +40 -0
- package/app/connection/baileysDbAuthState.js +344 -0
- package/app/connection/socketController.js +2243 -0
- package/app/controllers/messageController.js +7 -0
- package/app/controllers/messagePipeline/commandMiddleware.js +146 -0
- package/app/controllers/messagePipeline/conversationMiddleware.js +183 -0
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +522 -0
- package/app/controllers/messagePipeline/postProcessingMiddleware.js +41 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +166 -0
- package/app/controllers/messageProcessingPipeline.js +699 -0
- package/app/modules/adminModule/AGENT.md +4056 -0
- package/app/modules/adminModule/adminAiHelpService.js +56 -0
- package/app/modules/adminModule/adminConfigRuntime.js +177 -0
- package/app/modules/adminModule/commandConfig.json +7122 -0
- package/app/modules/adminModule/groupCommandHandlers.js +1823 -0
- package/app/modules/adminModule/groupCommandHandlers.test.js +350 -0
- package/app/modules/adminModule/groupEventHandlers.js +399 -0
- package/app/modules/aiModule/AGENT.md +547 -0
- package/app/modules/aiModule/aiAiHelpService.js +14 -0
- package/app/modules/aiModule/aiConfigRuntime.js +135 -0
- package/app/modules/aiModule/catCommand.js +967 -0
- package/app/modules/aiModule/commandConfig.json +981 -0
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
- package/app/modules/gameModule/AGENT.md +196 -0
- package/app/modules/gameModule/commandConfig.json +366 -0
- package/app/modules/gameModule/diceCommand.js +42 -0
- package/app/modules/gameModule/gameAiHelpService.js +14 -0
- package/app/modules/gameModule/gameConfigRuntime.js +68 -0
- package/app/modules/menuModule/AGENT.md +205 -0
- package/app/modules/menuModule/commandConfig.json +366 -0
- package/app/modules/menuModule/common.js +316 -0
- package/app/modules/menuModule/menuAiHelpService.js +14 -0
- package/app/modules/menuModule/menuConfigRuntime.js +68 -0
- package/app/modules/menuModule/menus.js +66 -0
- package/app/modules/playModule/AGENT.md +321 -0
- package/app/modules/playModule/commandConfig.json +584 -0
- package/app/modules/playModule/playAiHelpService.js +14 -0
- package/app/modules/playModule/playCommand.js +1417 -0
- package/app/modules/playModule/playConfigRuntime.js +68 -0
- package/app/modules/quoteModule/AGENT.md +199 -0
- package/app/modules/quoteModule/commandConfig.json +366 -0
- package/app/modules/quoteModule/quoteAiHelpService.js +14 -0
- package/app/modules/quoteModule/quoteCommand.js +842 -0
- package/app/modules/quoteModule/quoteConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/AGENT.md +229 -0
- package/app/modules/rpgPokemonModule/commandConfig.json +386 -0
- package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +795 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.js +2110 -0
- package/app/modules/rpgPokemonModule/rpgBattleService.test.js +770 -0
- package/app/modules/rpgPokemonModule/rpgEvolutionUtils.js +22 -0
- package/app/modules/rpgPokemonModule/rpgPokemonAiHelpService.js +14 -0
- package/app/modules/rpgPokemonModule/rpgPokemonCommand.js +174 -0
- package/app/modules/rpgPokemonModule/rpgPokemonConfigRuntime.js +68 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +192 -0
- package/app/modules/rpgPokemonModule/rpgPokemonDomain.test.js +93 -0
- package/app/modules/rpgPokemonModule/rpgPokemonEvolution.test.js +46 -0
- package/app/modules/rpgPokemonModule/rpgPokemonMessages.js +746 -0
- package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1847 -0
- package/app/modules/rpgPokemonModule/rpgPokemonService.js +6839 -0
- package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +354 -0
- package/app/modules/statsModule/AGENT.md +320 -0
- package/app/modules/statsModule/commandConfig.json +540 -0
- package/app/modules/statsModule/globalRankingCommand.js +64 -0
- package/app/modules/statsModule/rankingCommand.js +41 -0
- package/app/modules/statsModule/rankingCommon.js +1305 -0
- package/app/modules/statsModule/statsAiHelpService.js +14 -0
- package/app/modules/statsModule/statsConfigRuntime.js +68 -0
- package/app/modules/stickerModule/AGENT.md +692 -0
- package/app/modules/stickerModule/addStickerMetadata.js +239 -0
- package/app/modules/stickerModule/commandConfig.json +1216 -0
- package/app/modules/stickerModule/convertToWebp.js +367 -0
- package/app/modules/stickerModule/stickerAiHelpService.js +14 -0
- package/app/modules/stickerModule/stickerCommand.js +446 -0
- package/app/modules/stickerModule/stickerConfigRuntime.js +68 -0
- package/app/modules/stickerModule/stickerConvertCommand.js +159 -0
- package/app/modules/stickerModule/stickerTextCommand.js +653 -0
- package/app/modules/stickerPackModule/AGENT.md +215 -0
- package/app/modules/stickerPackModule/autoPackCollectorRuntime.js +20 -0
- package/app/modules/stickerPackModule/autoPackCollectorService.js +357 -0
- package/app/modules/stickerPackModule/commandConfig.json +387 -0
- package/app/modules/stickerPackModule/domainEventOutboxRepository.js +227 -0
- package/app/modules/stickerPackModule/domainEvents.js +52 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.js +429 -0
- package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +75 -0
- package/app/modules/stickerPackModule/semanticThemeClusterService.js +544 -0
- package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetRepository.js +400 -0
- package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +175 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +3702 -0
- package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +559 -0
- package/app/modules/stickerPackModule/stickerClassificationService.js +557 -0
- package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +249 -0
- package/app/modules/stickerPackModule/stickerDomainEventBus.js +65 -0
- package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +208 -0
- package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +99 -0
- package/app/modules/stickerPackModule/stickerObjectStorageService.js +285 -0
- package/app/modules/stickerPackModule/stickerPackAiHelpService.js +14 -0
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +1148 -0
- package/app/modules/stickerPackModule/stickerPackConfigRuntime.js +68 -0
- package/app/modules/stickerPackModule/stickerPackEngagementRepository.js +152 -0
- package/app/modules/stickerPackModule/stickerPackErrors.js +30 -0
- package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +101 -0
- package/app/modules/stickerPackModule/stickerPackItemRepository.js +432 -0
- package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +313 -0
- package/app/modules/stickerPackModule/stickerPackMessageService.js +268 -0
- package/app/modules/stickerPackModule/stickerPackRepository.js +450 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +179 -0
- package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +271 -0
- package/app/modules/stickerPackModule/stickerPackService.js +733 -0
- package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +32 -0
- package/app/modules/stickerPackModule/stickerPackUtils.js +107 -0
- package/app/modules/stickerPackModule/stickerStorageService.js +559 -0
- package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +242 -0
- package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +242 -0
- package/app/modules/systemMetricsModule/AGENT.md +193 -0
- package/app/modules/systemMetricsModule/commandConfig.json +344 -0
- package/app/modules/systemMetricsModule/pingCommand.js +399 -0
- package/app/modules/systemMetricsModule/systemMetricsAiHelpService.js +14 -0
- package/app/modules/systemMetricsModule/systemMetricsConfigRuntime.js +68 -0
- package/app/modules/tiktokModule/AGENT.md +196 -0
- package/app/modules/tiktokModule/commandConfig.json +366 -0
- package/app/modules/tiktokModule/tiktokAiHelpService.js +14 -0
- package/app/modules/tiktokModule/tiktokCommand.js +716 -0
- package/app/modules/tiktokModule/tiktokConfigRuntime.js +68 -0
- package/app/modules/userModule/AGENT.md +200 -0
- package/app/modules/userModule/commandConfig.json +386 -0
- package/app/modules/userModule/userAiHelpService.js +14 -0
- package/app/modules/userModule/userCommand.js +1155 -0
- package/app/modules/userModule/userConfigRuntime.js +68 -0
- package/app/modules/waifuPicsModule/AGENT.md +431 -0
- package/app/modules/waifuPicsModule/commandConfig.json +780 -0
- package/app/modules/waifuPicsModule/waifuPicsAiHelpService.js +14 -0
- package/app/modules/waifuPicsModule/waifuPicsCommand.js +586 -0
- package/app/modules/waifuPicsModule/waifuPicsConfigRuntime.js +68 -0
- package/app/observability/metrics.js +766 -0
- package/app/services/ai/aiHelpResponseCacheRepository.js +280 -0
- package/app/services/ai/aiLearningRepository.js +400 -0
- package/app/services/ai/commandConfigEnrichmentRepository.js +769 -0
- package/app/services/ai/commandConfigEnrichmentService.js +452 -0
- package/app/services/ai/commandConfigValidationService.js +443 -0
- package/app/services/ai/commandToolBuilderService.js +192 -0
- package/app/services/ai/conversationRouterService.js +516 -0
- package/app/services/ai/geminiService.js +115 -0
- package/app/services/ai/geminiService.test.js +87 -0
- package/app/services/ai/globalModuleAiHelpService.js +1412 -0
- package/app/services/ai/globalToolCallingService.js +203 -0
- package/app/services/ai/messageCommandExecutionService.js +391 -0
- package/app/services/ai/moduleAiHelpCoreService.js +1099 -0
- package/app/services/ai/moduleAiHelpWrapperFactory.js +65 -0
- package/app/services/ai/moduleCommandConfigRuntimeService.js +113 -0
- package/app/services/ai/moduleToolExecutorService.js +464 -0
- package/app/services/ai/moduleToolRegistryService.js +178 -0
- package/app/services/ai/toolCandidateSelectorService.js +781 -0
- package/app/services/auth/googleWebLinkService.js +80 -0
- package/app/services/auth/whatsappLoginLinkService.js +230 -0
- package/app/services/external/pokeApiService.js +398 -0
- package/app/services/group/groupMetadataService.js +311 -0
- package/app/services/infra/dbWriteQueue.js +874 -0
- package/app/services/infra/featureFlagService.js +131 -0
- package/app/services/infra/queueUtils.js +55 -0
- package/app/services/messaging/captchaService.js +491 -0
- package/app/services/messaging/messagePersistenceService.js +1 -0
- package/app/services/messaging/newsBroadcastService.js +347 -0
- package/app/services/sticker/stickerFocusService.js +347 -0
- package/app/services/sticker/stickerFocusService.test.js +43 -0
- package/app/store/aiPromptStore.js +38 -0
- package/app/store/conversationSessionStore.js +131 -0
- package/app/store/groupConfigStore.js +58 -0
- package/app/store/premiumUserStore.js +54 -0
- package/app/utils/antiLink/antiLinkModule.js +700 -0
- package/app/utils/http/getImageBufferModule.js +18 -0
- package/app/utils/json/jsonSanitizer.js +113 -0
- package/app/utils/json/jsonSanitizer.test.js +40 -0
- package/app/utils/systemMetrics/systemMetricsModule.js +88 -0
- package/app/workers/aiLearningWorker.js +605 -0
- package/app/workers/commandConfigEnrichmentWorker.js +242 -0
- package/database/index.js +2075 -0
- package/database/init.js +151 -0
- package/database/migrations/.gitkeep +0 -0
- package/database/migrations/20260307_d0_hardening_down.sql +64 -0
- package/database/migrations/20260307_d0_hardening_up.sql +79 -0
- package/database/migrations/20260307_d1_terms_acceptance_down.sql +11 -0
- package/database/migrations/20260307_d1_terms_acceptance_up.sql +37 -0
- package/database/migrations/20260307_d2_auth_hardening_down.sql +75 -0
- package/database/migrations/20260307_d2_auth_hardening_up.sql +100 -0
- package/database/migrations/20260314_d7_canonical_sender_down.sql +53 -0
- package/database/migrations/20260314_d7_canonical_sender_up.sql +114 -0
- package/database/migrations/20260406_d30_security_analytics_down.sql +95 -0
- package/database/migrations/20260406_d30_security_analytics_up.sql +292 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_down.sql +2 -0
- package/database/migrations/20260407_d31_web_google_session_token_hardening_up.sql +17 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_down.sql +1 -0
- package/database/migrations/20260408_d32_ai_help_response_cache_up.sql +22 -0
- package/database/migrations/20260409_d33_ai_learning_tables_down.sql +4 -0
- package/database/migrations/20260409_d33_ai_learning_tables_up.sql +52 -0
- package/database/migrations/20260410_d34_command_config_enrichment_down.sql +3 -0
- package/database/migrations/20260410_d34_command_config_enrichment_up.sql +48 -0
- package/database/schema.sql +1186 -0
- package/docker-compose.yml +104 -0
- package/docs/audits/stickerCatalogController-out-of-scope.md +103 -0
- package/docs/audits/stickerCatalogController-symbols.md +58 -0
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +35 -0
- package/docs/compliance/dpa-b2b-standard-2026-03-07.md +80 -0
- package/docs/compliance/monthly-compliance-checklist-2026-03-07.md +88 -0
- package/docs/compliance/notice-and-takedown-policy-2026-03-07.md +34 -0
- package/docs/compliance/privacy-policy-2026-03-07.md +75 -0
- package/docs/compliance/subprocessors-inventory-2026-03-07.md +16 -0
- package/docs/database/production-db-evolution-runbook-2026q1.md +365 -0
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +86 -0
- package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +77 -0
- package/docs/security/network-hardening-runbook-2026-03-07.md +137 -0
- package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +238 -0
- package/docs/seo/satellite-page-template.md +116 -0
- package/docs/seo/satellite-pages-phase1.json +364 -0
- package/docs/wiki/Home.md +120 -0
- package/docs/wiki/pair-extraordinaire-2026-03-08.md +3 -0
- package/docs/wiki/recent-changes-2026-03-08.md +47 -0
- package/ecosystem.prod.config.cjs +135 -0
- package/eslint.config.js +89 -0
- package/index.js +488 -0
- package/ml/clip_classifier/Dockerfile +18 -0
- package/ml/clip_classifier/README.md +118 -0
- package/ml/clip_classifier/adaptive_scoring.py +40 -0
- package/ml/clip_classifier/classifier.py +654 -0
- package/ml/clip_classifier/embedding_store.py +481 -0
- package/ml/clip_classifier/env_loader.py +15 -0
- package/ml/clip_classifier/llm_label_expander.py +144 -0
- package/ml/clip_classifier/main.py +213 -0
- package/ml/clip_classifier/requirements.txt +10 -0
- package/ml/clip_classifier/similarity_engine.py +74 -0
- package/new-logo.png +0 -0
- package/observability/alert-rules.yml +60 -0
- package/observability/grafana/dashboards/omnizap-mysql.json +136 -0
- package/observability/grafana/dashboards/omnizap-overview.json +170 -0
- package/observability/grafana/provisioning/dashboards/dashboards.yml +11 -0
- package/observability/grafana/provisioning/datasources/datasources.yml +15 -0
- package/observability/loki-config.yml +38 -0
- package/observability/mysql-setup.sql +46 -0
- package/observability/prometheus.yml +35 -0
- package/observability/promtail-config.yml +84 -0
- package/observability/sticker-catalog-slo.md +83 -0
- package/observability/sticker-scale-hardening-rollout.md +128 -0
- package/package.json +144 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/css/commands-react.input.css +71 -0
- package/public/assets/css/create-pack-react.input.css +31 -0
- package/public/assets/css/home-react.input.css +106 -0
- package/public/assets/css/login-react.input.css +58 -0
- package/public/assets/css/stickers-react.input.css +18 -0
- package/public/assets/css/terms-react.input.css +115 -0
- package/public/assets/css/user-react.input.css +57 -0
- package/public/assets/images/brand-icon-192.png +0 -0
- package/public/assets/images/brand-logo-128.webp +0 -0
- package/public/assets/images/hero-banner-1280.jpg +0 -0
- package/public/comandos/commands-catalog.json +4517 -0
- package/public/css/api-docs.css +161 -0
- package/public/css/stickers-admin.css +1288 -0
- package/public/css/styles.css +679 -0
- package/public/css/systemadm/admin.css +474 -0
- package/public/css/systemadm/base.css +73 -0
- package/public/css/systemadm/components.css +662 -0
- package/public/css/systemadm/layout.css +229 -0
- package/public/css/systemadm/tokens.css +56 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/js/apps/apiDocsApp.js +235 -0
- package/public/js/apps/commandsReactApp.js +528 -0
- package/public/js/apps/createPackApp.js +1646 -0
- package/public/js/apps/homeReactApp.js +942 -0
- package/public/js/apps/loginReactApp.js +496 -0
- package/public/js/apps/stickersAdminApp.js +1753 -0
- package/public/js/apps/stickersApp.js +3797 -0
- package/public/js/apps/termsReactApp.js +528 -0
- package/public/js/apps/userApp.js +2540 -0
- package/public/js/apps/userProfile/actions.js +66 -0
- package/public/js/apps/userReactApp.js +547 -0
- package/public/js/catalog.js +950 -0
- package/public/pages/api-docs.html +40 -0
- package/public/pages/aup.html +158 -0
- package/public/pages/comandos.html +41 -0
- package/public/pages/dpa.html +227 -0
- package/public/pages/home.html +45 -0
- package/public/pages/licenca.html +182 -0
- package/public/pages/login.html +40 -0
- package/public/pages/notice-and-takedown.html +234 -0
- package/public/pages/politica-de-privacidade.html +251 -0
- package/public/pages/seo-bot-whatsapp-para-grupo.html +350 -0
- package/public/pages/seo-bot-whatsapp-sem-programar.html +350 -0
- package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +350 -0
- package/public/pages/seo-como-criar-comandos-whatsapp.html +350 -0
- package/public/pages/seo-como-evitar-spam-no-whatsapp.html +350 -0
- package/public/pages/seo-como-moderar-grupo-whatsapp.html +350 -0
- package/public/pages/seo-como-organizar-comunidade-whatsapp.html +350 -0
- package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +350 -0
- package/public/pages/stickers-admin.html +31 -0
- package/public/pages/stickers-create.html +41 -0
- package/public/pages/stickers.html +45 -0
- package/public/pages/suboperadores.html +237 -0
- package/public/pages/termos-de-uso-texto-integral.html +241 -0
- package/public/pages/termos-de-uso.html +41 -0
- package/public/pages/user-password-reset.html +32 -0
- package/public/pages/user-systemadm.html +508 -0
- package/public/pages/user.html +39 -0
- package/public/robots.txt +9 -0
- package/public/site.webmanifest +24 -0
- package/public/sitemap.xml +98 -0
- package/schemas/command-config.schema.json +582 -0
- package/scripts/baileys-compat-smoke.mjs +12 -0
- package/scripts/cache-bust.mjs +142 -0
- package/scripts/deploy.sh +916 -0
- package/scripts/email-broadcast-terms-update.mjs +170 -0
- package/scripts/enrich-command-discovery-fields.mjs +286 -0
- package/scripts/generate-command-config-schema.mjs +273 -0
- package/scripts/generate-commands-catalog.mjs +308 -0
- package/scripts/generate-module-agents.mjs +631 -0
- package/scripts/generate-seo-satellite-pages.mjs +400 -0
- package/scripts/github-deploy-notify.mjs +174 -0
- package/scripts/github-release-notify.mjs +219 -0
- package/scripts/release.sh +599 -0
- package/scripts/run-codeql-local.sh +116 -0
- package/scripts/run-prettier-all.mjs +25 -0
- package/scripts/security-smoketest.mjs +581 -0
- package/scripts/sticker-catalog-loadtest.mjs +210 -0
- package/scripts/sticker-worker-task.mjs +119 -0
- package/scripts/sync-readme-snapshot.mjs +133 -0
- package/scripts/validate-command-config-schema.mjs +130 -0
- package/scripts/validate-command-configs.mjs +15 -0
- package/scripts/wiki-sync.sh +191 -0
- package/server/auth/googleWebAuth/googleWebAuthRuntime.js +62 -0
- package/server/auth/googleWebAuth/googleWebAuthService.js +807 -0
- package/server/auth/jwt/webJwtService.js +147 -0
- package/server/auth/stickerCatalogAuthContext.js +165 -0
- package/server/auth/termsAcceptance/termsAcceptanceHandler.js +189 -0
- package/server/auth/userPassword/index.js +14 -0
- package/server/auth/userPassword/userPasswordAuthService.js +422 -0
- package/server/auth/userPassword/userPasswordCrypto.js +199 -0
- package/server/auth/userPassword/userPasswordCrypto.test.js +76 -0
- package/server/auth/userPassword/userPasswordRecoveryService.js +728 -0
- package/server/auth/validation/authSchemas.js +236 -0
- package/server/auth/webAccount/webAccountHandlers.js +1434 -0
- package/server/controllers/admin/adminBanService.js +138 -0
- package/server/controllers/admin/adminPanelHandlers.js +2083 -0
- package/server/controllers/admin/stickerCatalogAdminContext.js +17 -0
- package/server/controllers/admin/systemAdminController.js +201 -0
- package/server/controllers/email/emailAutomationController.js +239 -0
- package/server/controllers/metricsController.js +21 -0
- package/server/controllers/seo/stickerCatalogSeoContext.js +514 -0
- package/server/controllers/sticker/nonCatalogHandlers.js +303 -0
- package/server/controllers/sticker/stickerCatalogController.js +4700 -0
- package/server/controllers/system/contactController.js +115 -0
- package/server/controllers/system/githubController.js +137 -0
- package/server/controllers/system/stickerCatalogSystemContext.js +758 -0
- package/server/controllers/system/storageController.js +154 -0
- package/server/controllers/system/systemController.js +135 -0
- package/server/controllers/system/systemMetricsController.js +156 -0
- package/server/controllers/system/visitController.js +90 -0
- package/server/controllers/userController.js +145 -0
- package/server/email/emailAutomationRuntime.js +225 -0
- package/server/email/emailAutomationService.js +125 -0
- package/server/email/emailOutboxRepository.js +282 -0
- package/server/email/emailTemplateService.js +480 -0
- package/server/email/emailTransportService.js +156 -0
- package/server/http/clientIp.js +95 -0
- package/server/http/httpRequestUtils.js +262 -0
- package/server/http/httpRequestUtils.test.js +80 -0
- package/server/http/httpServer.js +180 -0
- package/server/http/requestContext.js +20 -0
- package/server/http/siteRoutingUtils.js +87 -0
- package/server/index.js +1 -0
- package/server/middleware/cachePolicy.js +26 -0
- package/server/middleware/cachePolicyHelpers.js +1 -0
- package/server/middleware/endpointRateLimit.js +181 -0
- package/server/middleware/rateLimit.js +70 -0
- package/server/middleware/requireAdminAuth.js +48 -0
- package/server/middleware/securityHeaders.js +97 -0
- package/server/routes/admin/systemAdminRouter.js +64 -0
- package/server/routes/email/emailAutomationRouter.js +46 -0
- package/server/routes/health/healthRouter.js +41 -0
- package/server/routes/indexRouter.js +234 -0
- package/server/routes/metrics/metricsRouter.js +58 -0
- package/server/routes/static/staticPageRouter.js +134 -0
- package/server/routes/sticker/catalogHandlers/catalogAdminHttp.js +105 -0
- package/server/routes/sticker/catalogHandlers/catalogAuthHttp.js +77 -0
- package/server/routes/sticker/catalogHandlers/catalogPublicHttp.js +120 -0
- package/server/routes/sticker/catalogHandlers/catalogUploadHttp.js +83 -0
- package/server/routes/sticker/catalogRouter.js +77 -0
- package/server/routes/sticker/stickerApiRouter.js +84 -0
- package/server/routes/sticker/stickerDataRouter.js +145 -0
- package/server/routes/sticker/stickerSiteRouter.js +43 -0
- package/server/routes/user/userApiPaths.js +66 -0
- package/server/routes/user/userRouter.js +65 -0
- package/server/utils/safePath.js +26 -0
- package/utils/logger/loggerModule.js +35 -0
- package/vite.config.mjs +38 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# Runbook de Evolucao de Banco em Producao (2026 Q1-Q2)
|
|
2
|
+
|
|
3
|
+
Escopo: hardening e evolucao gradual de schema MySQL/InnoDB com foco em rollout online, validacao objetiva e rollback logico por fase.
|
|
4
|
+
|
|
5
|
+
## Objetivo
|
|
6
|
+
|
|
7
|
+
Definir o processo para aplicar, validar e (quando necessario) reverter as migracoes do ciclo `d0` ate `d34`, minimizando risco de indisponibilidade e regressao de desempenho.
|
|
8
|
+
|
|
9
|
+
## Arquivos alvo (ordem recomendada)
|
|
10
|
+
|
|
11
|
+
- `database/migrations/20260307_d0_hardening_up.sql`
|
|
12
|
+
- `database/migrations/20260307_d0_hardening_down.sql`
|
|
13
|
+
- `database/migrations/20260307_d1_terms_acceptance_up.sql`
|
|
14
|
+
- `database/migrations/20260307_d1_terms_acceptance_down.sql`
|
|
15
|
+
- `database/migrations/20260307_d2_auth_hardening_up.sql`
|
|
16
|
+
- `database/migrations/20260307_d2_auth_hardening_down.sql`
|
|
17
|
+
- `database/migrations/20260314_d7_canonical_sender_up.sql`
|
|
18
|
+
- `database/migrations/20260314_d7_canonical_sender_down.sql`
|
|
19
|
+
- `database/migrations/20260406_d30_security_analytics_up.sql`
|
|
20
|
+
- `database/migrations/20260406_d30_security_analytics_down.sql`
|
|
21
|
+
- `database/migrations/20260407_d31_web_google_session_token_hardening_up.sql`
|
|
22
|
+
- `database/migrations/20260407_d31_web_google_session_token_hardening_down.sql`
|
|
23
|
+
- `database/migrations/20260408_d32_ai_help_response_cache_up.sql`
|
|
24
|
+
- `database/migrations/20260408_d32_ai_help_response_cache_down.sql`
|
|
25
|
+
- `database/migrations/20260409_d33_ai_learning_tables_up.sql`
|
|
26
|
+
- `database/migrations/20260409_d33_ai_learning_tables_down.sql`
|
|
27
|
+
- `database/migrations/20260410_d34_command_config_enrichment_up.sql`
|
|
28
|
+
- `database/migrations/20260410_d34_command_config_enrichment_down.sql`
|
|
29
|
+
|
|
30
|
+
## 1) Pre-requisitos
|
|
31
|
+
|
|
32
|
+
1. Confirmar versao e engine:
|
|
33
|
+
|
|
34
|
+
```sql
|
|
35
|
+
SELECT VERSION() AS mysql_version;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Recomendado: MySQL `8.0.16+`.
|
|
39
|
+
|
|
40
|
+
2. Confirmar politica de scheduler:
|
|
41
|
+
|
|
42
|
+
```sql
|
|
43
|
+
SHOW VARIABLES LIKE 'event_scheduler';
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
3. Garantir backup e recuperacao:
|
|
47
|
+
|
|
48
|
+
- backup logico do schema alvo;
|
|
49
|
+
- cadeia PITR (binlog + snapshots);
|
|
50
|
+
- restore testado em homologacao.
|
|
51
|
+
|
|
52
|
+
4. Postura operacional:
|
|
53
|
+
|
|
54
|
+
- aplicar em janela de menor pressao de escrita;
|
|
55
|
+
- manter aplicacao online quando possivel;
|
|
56
|
+
- monitorar p95/p99 e lock waits durante e apos cada fase.
|
|
57
|
+
|
|
58
|
+
## 2) Comando padrao de execucao
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/<arquivo>.sql
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 3) Fases de rollout
|
|
65
|
+
|
|
66
|
+
### Fase D0 - Hardening nao disruptivo
|
|
67
|
+
|
|
68
|
+
Aplicar:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d0_hardening_up.sql
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Validar:
|
|
75
|
+
|
|
76
|
+
```sql
|
|
77
|
+
SELECT migration_key, phase, status, updated_at
|
|
78
|
+
FROM schema_change_log
|
|
79
|
+
WHERE migration_key = '20260307_d0_hardening';
|
|
80
|
+
|
|
81
|
+
SHOW INDEX FROM messages;
|
|
82
|
+
SHOW INDEX FROM domain_event_outbox;
|
|
83
|
+
SHOW INDEX FROM email_outbox;
|
|
84
|
+
SHOW INDEX FROM sticker_worker_task_queue;
|
|
85
|
+
SHOW INDEX FROM sticker_asset_reprocess_queue;
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Rollback:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d0_hardening_down.sql
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Fase D1 - Aceite de termos versionado
|
|
95
|
+
|
|
96
|
+
Aplicar:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d1_terms_acceptance_up.sql
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Validar:
|
|
103
|
+
|
|
104
|
+
```sql
|
|
105
|
+
SELECT migration_key, phase, status, updated_at
|
|
106
|
+
FROM schema_change_log
|
|
107
|
+
WHERE migration_key = '20260307_d1_terms_acceptance';
|
|
108
|
+
|
|
109
|
+
SHOW TABLES LIKE 'web_terms_acceptance_event';
|
|
110
|
+
SHOW INDEX FROM web_terms_acceptance_event;
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Rollback:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d1_terms_acceptance_down.sql
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Fase D2 - Auth hardening
|
|
120
|
+
|
|
121
|
+
Aplicar:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d2_auth_hardening_up.sql
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Validar:
|
|
128
|
+
|
|
129
|
+
```sql
|
|
130
|
+
SELECT migration_key, phase, status, updated_at
|
|
131
|
+
FROM schema_change_log
|
|
132
|
+
WHERE migration_key = '20260307_d2_auth_hardening';
|
|
133
|
+
|
|
134
|
+
SHOW TABLES LIKE 'web_user_password_login_throttle';
|
|
135
|
+
SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'email_hash';
|
|
136
|
+
SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'requested_ip_hash';
|
|
137
|
+
SHOW COLUMNS FROM web_user_password_recovery_code LIKE 'requested_user_agent_hash';
|
|
138
|
+
SHOW INDEX FROM web_user_password_recovery_code;
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Rollback:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260307_d2_auth_hardening_down.sql
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Fase D+7 - Canonical sender
|
|
148
|
+
|
|
149
|
+
Aplicar:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_up.sql
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Validar:
|
|
156
|
+
|
|
157
|
+
```sql
|
|
158
|
+
SELECT migration_key, phase, status, updated_at
|
|
159
|
+
FROM schema_change_log
|
|
160
|
+
WHERE migration_key = '20260314_d7_canonical_sender';
|
|
161
|
+
|
|
162
|
+
SHOW COLUMNS FROM messages LIKE 'canonical_sender_id';
|
|
163
|
+
SHOW INDEX FROM messages;
|
|
164
|
+
|
|
165
|
+
SELECT COUNT(*) AS null_canonical_sender
|
|
166
|
+
FROM messages
|
|
167
|
+
WHERE canonical_sender_id IS NULL;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Rollback:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260314_d7_canonical_sender_down.sql
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Fase D+30 - Security analytics e retencao
|
|
177
|
+
|
|
178
|
+
Aplicar:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_up.sql
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Validar:
|
|
185
|
+
|
|
186
|
+
```sql
|
|
187
|
+
SELECT migration_key, phase, status, updated_at
|
|
188
|
+
FROM schema_change_log
|
|
189
|
+
WHERE migration_key = '20260406_d30_security_analytics';
|
|
190
|
+
|
|
191
|
+
SHOW COLUMNS FROM web_google_session LIKE 'session_token_hash';
|
|
192
|
+
SHOW INDEX FROM web_google_session;
|
|
193
|
+
|
|
194
|
+
SELECT COUNT(*) AS null_session_hash
|
|
195
|
+
FROM web_google_session
|
|
196
|
+
WHERE session_token_hash IS NULL;
|
|
197
|
+
|
|
198
|
+
SHOW EVENTS
|
|
199
|
+
WHERE Db = DATABASE()
|
|
200
|
+
AND Name IN (
|
|
201
|
+
'ev_rollup_message_activity_daily',
|
|
202
|
+
'ev_purge_baileys_event_journal',
|
|
203
|
+
'ev_purge_message_analysis_event',
|
|
204
|
+
'ev_purge_web_visit_event',
|
|
205
|
+
'ev_purge_sticker_pack_interaction_event'
|
|
206
|
+
);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Rollback:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260406_d30_security_analytics_down.sql
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Fase D+31 - Hardening de token de sessao web
|
|
216
|
+
|
|
217
|
+
Aplicar:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260407_d31_web_google_session_token_hardening_up.sql
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Validar:
|
|
224
|
+
|
|
225
|
+
```sql
|
|
226
|
+
SHOW COLUMNS FROM web_google_session LIKE 'session_token_hash';
|
|
227
|
+
|
|
228
|
+
SELECT COUNT(*) AS inconsistent_rows
|
|
229
|
+
FROM web_google_session
|
|
230
|
+
WHERE session_token_hash IS NULL
|
|
231
|
+
OR session_token <> LOWER(SUBSTRING(HEX(session_token_hash), 1, 36));
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Rollback:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260407_d31_web_google_session_token_hardening_down.sql
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Fase D+32 - Cache de respostas de AI Help
|
|
241
|
+
|
|
242
|
+
Aplicar:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260408_d32_ai_help_response_cache_up.sql
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Validar:
|
|
249
|
+
|
|
250
|
+
```sql
|
|
251
|
+
SHOW TABLES LIKE 'ai_help_response_cache';
|
|
252
|
+
SHOW INDEX FROM ai_help_response_cache;
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Rollback:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260408_d32_ai_help_response_cache_down.sql
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Fase D+33 - Tabelas de aprendizado de IA
|
|
262
|
+
|
|
263
|
+
Aplicar:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260409_d33_ai_learning_tables_up.sql
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Validar:
|
|
270
|
+
|
|
271
|
+
```sql
|
|
272
|
+
SHOW TABLES LIKE 'ai_learning_events';
|
|
273
|
+
SHOW TABLES LIKE 'ai_learned_patterns';
|
|
274
|
+
SHOW TABLES LIKE 'ai_learned_keywords';
|
|
275
|
+
SHOW TABLES LIKE 'ai_question_embeddings';
|
|
276
|
+
|
|
277
|
+
SHOW INDEX FROM ai_learning_events;
|
|
278
|
+
SHOW INDEX FROM ai_learned_patterns;
|
|
279
|
+
SHOW INDEX FROM ai_learned_keywords;
|
|
280
|
+
SHOW INDEX FROM ai_question_embeddings;
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Rollback:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260409_d33_ai_learning_tables_down.sql
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Fase D+34 - Enriquecimento de command config
|
|
290
|
+
|
|
291
|
+
Aplicar:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260410_d34_command_config_enrichment_up.sql
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Validar:
|
|
298
|
+
|
|
299
|
+
```sql
|
|
300
|
+
SHOW TABLES LIKE 'ai_command_config_enrichment_cursor';
|
|
301
|
+
SHOW TABLES LIKE 'ai_command_config_enrichment_suggestion';
|
|
302
|
+
SHOW TABLES LIKE 'ai_command_config_enrichment_state';
|
|
303
|
+
|
|
304
|
+
SHOW INDEX FROM ai_command_config_enrichment_suggestion;
|
|
305
|
+
SHOW INDEX FROM ai_command_config_enrichment_state;
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Rollback:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
mysql -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" < database/migrations/20260410_d34_command_config_enrichment_down.sql
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
## 4) Checklist de monitoramento (todas as fases)
|
|
315
|
+
|
|
316
|
+
Monitorar por 30-60 minutos apos cada fase:
|
|
317
|
+
|
|
318
|
+
- `Threads_running`, lock waits InnoDB, latencia p95/p99;
|
|
319
|
+
- profundidade de filas (`domain_event_outbox`, `email_outbox`, `sticker_worker_task_queue`);
|
|
320
|
+
- falhas em workers e jobs/event scheduler.
|
|
321
|
+
|
|
322
|
+
Consultas rapidas:
|
|
323
|
+
|
|
324
|
+
```sql
|
|
325
|
+
SELECT status, COUNT(*) FROM domain_event_outbox GROUP BY status;
|
|
326
|
+
SELECT status, COUNT(*) FROM email_outbox GROUP BY status;
|
|
327
|
+
SELECT status, COUNT(*) FROM sticker_worker_task_queue GROUP BY status;
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## 5) Criterio de avance (go/no-go)
|
|
331
|
+
|
|
332
|
+
Avancar somente se:
|
|
333
|
+
|
|
334
|
+
- migracao atual estiver `applied` (quando registrada em `schema_change_log`);
|
|
335
|
+
- validacoes estruturais e de indice estiverem consistentes;
|
|
336
|
+
- sem degradacao sustentada de erro/latencia.
|
|
337
|
+
|
|
338
|
+
Suspender se houver:
|
|
339
|
+
|
|
340
|
+
- lock waits persistentes;
|
|
341
|
+
- crescimento anomalo de filas sem drenagem;
|
|
342
|
+
- erro de aplicacao relacionado a novas colunas/tabelas.
|
|
343
|
+
|
|
344
|
+
## 6) Politica de roll-forward
|
|
345
|
+
|
|
346
|
+
Quando rollback nao for necessario e dados estiverem integros:
|
|
347
|
+
|
|
348
|
+
1. manter a fase aplicada;
|
|
349
|
+
2. ajustar query/indice no codigo;
|
|
350
|
+
3. repetir validacoes;
|
|
351
|
+
4. registrar observacoes em `schema_change_log.notes`.
|
|
352
|
+
|
|
353
|
+
## 7) Notas de seguranca operacional
|
|
354
|
+
|
|
355
|
+
- DDL no MySQL faz auto-commit. `down` e rollback logico, nao undo transacional.
|
|
356
|
+
- Nao usar `db:init` para migracao em producao.
|
|
357
|
+
- Migracoes aplicadas em producao devem permanecer imutaveis.
|
|
358
|
+
|
|
359
|
+
## 8) Referencias
|
|
360
|
+
|
|
361
|
+
- MySQL 8.0 DDL: https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html
|
|
362
|
+
- MySQL CHECK constraints: https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
|
|
363
|
+
- MySQL Event Scheduler: https://dev.mysql.com/doc/refman/8.0/en/event-scheduler.html
|
|
364
|
+
- InnoDB locking: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
|
|
365
|
+
- Referencia interna: `database/` e `docs/database/`
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Runbook DSAR/LGPD (Direitos do Titular)
|
|
2
|
+
|
|
3
|
+
Data: 2026-03-07
|
|
4
|
+
|
|
5
|
+
## 1) Objetivo
|
|
6
|
+
|
|
7
|
+
Padronizar resposta para direitos do titular: acesso, correção, exclusão, oposição e portabilidade.
|
|
8
|
+
|
|
9
|
+
## 2) Canais de entrada
|
|
10
|
+
|
|
11
|
+
- WhatsApp oficial: https://wa.me/559591122954
|
|
12
|
+
- Canal interno de compliance (registro em ticket obrigatório)
|
|
13
|
+
|
|
14
|
+
## 3) Papéis e responsáveis
|
|
15
|
+
|
|
16
|
+
- DPO/Privacidade (owner do caso): valida base legal e resposta final.
|
|
17
|
+
- Engenharia: localiza dados, executa exportação/correção/exclusão.
|
|
18
|
+
- Segurança: valida risco e cadeia de evidência.
|
|
19
|
+
- Suporte: confirma identidade e comunica status ao titular.
|
|
20
|
+
|
|
21
|
+
## 4) Prazos operacionais
|
|
22
|
+
|
|
23
|
+
| Tipo de solicitação | Prazo alvo interno |
|
|
24
|
+
| ------------------------------------------ | -------------------- |
|
|
25
|
+
| Confirmação de recebimento | até 2 dias corridos |
|
|
26
|
+
| Acesso/confirmação de tratamento | até 7 dias corridos |
|
|
27
|
+
| Correção | até 7 dias corridos |
|
|
28
|
+
| Exclusão/anonimização (quando cabível) | até 15 dias corridos |
|
|
29
|
+
| Oposição/revisão | até 10 dias corridos |
|
|
30
|
+
| Portabilidade (quando tecnicamente viável) | até 15 dias corridos |
|
|
31
|
+
|
|
32
|
+
Observação: prevalecem prazos legais aplicáveis quando menores.
|
|
33
|
+
Para pedidos enquadrados no art. 19 da LGPD, observar resposta simplificada imediata quando possível e declaração clara/completa em até 15 dias.
|
|
34
|
+
|
|
35
|
+
## 5) Fluxo operacional
|
|
36
|
+
|
|
37
|
+
1. Registrar ticket com ID único e timestamp UTC.
|
|
38
|
+
2. Confirmar identidade mínima do solicitante.
|
|
39
|
+
3. Classificar direito solicitado e base jurídica.
|
|
40
|
+
4. Mapear sistemas/tabelas afetadas.
|
|
41
|
+
5. Executar ação técnica (consulta, ajuste, exclusão, exportação).
|
|
42
|
+
6. Revisão jurídica/privacidade.
|
|
43
|
+
7. Responder titular com protocolo e resumo da ação.
|
|
44
|
+
8. Encerrar com evidências anexas e métricas de SLA.
|
|
45
|
+
|
|
46
|
+
## 6) Matriz por direito
|
|
47
|
+
|
|
48
|
+
### 6.1 Acesso
|
|
49
|
+
|
|
50
|
+
- Entregar resumo dos dados tratados e finalidades.
|
|
51
|
+
- Incluir categorias, origem e compartilhamentos principais.
|
|
52
|
+
|
|
53
|
+
### 6.2 Correção
|
|
54
|
+
|
|
55
|
+
- Corrigir dado incompleto/inexato/desatualizado.
|
|
56
|
+
- Registrar antes/depois e fundamento da alteração.
|
|
57
|
+
|
|
58
|
+
### 6.3 Exclusão
|
|
59
|
+
|
|
60
|
+
- Eliminar ou anonimizar quando não houver base legal de retenção.
|
|
61
|
+
- Se houver retenção obrigatória, informar bloqueio e justificativa.
|
|
62
|
+
|
|
63
|
+
### 6.4 Oposição
|
|
64
|
+
|
|
65
|
+
- Avaliar legitimidade do pedido conforme base legal aplicável.
|
|
66
|
+
- Suspender tratamento contestado quando juridicamente cabível.
|
|
67
|
+
|
|
68
|
+
### 6.5 Portabilidade
|
|
69
|
+
|
|
70
|
+
- Fornecer formato estruturado e interoperável quando tecnicamente viável.
|
|
71
|
+
- Excluir segredos comerciais e dados de terceiros não transferíveis.
|
|
72
|
+
|
|
73
|
+
## 7) Evidências obrigatórias
|
|
74
|
+
|
|
75
|
+
- ID do ticket, timestamps e responsáveis por etapa.
|
|
76
|
+
- Comprovante de identidade validado.
|
|
77
|
+
- Consulta técnica executada e resultado.
|
|
78
|
+
- Mensagem de resposta final ao titular.
|
|
79
|
+
|
|
80
|
+
## 8) Escalonamento
|
|
81
|
+
|
|
82
|
+
Escalonar para jurídico + segurança quando houver:
|
|
83
|
+
|
|
84
|
+
- risco de incidente de segurança;
|
|
85
|
+
- pedido envolvendo alto volume de titulares;
|
|
86
|
+
- conflito entre pedido e obrigação legal de retenção.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Runbook de Resposta a Incidentes (LGPD/ANPD)
|
|
2
|
+
|
|
3
|
+
Data: 2026-03-07
|
|
4
|
+
Escopo: segurança, privacidade e continuidade operacional do OmniZap System.
|
|
5
|
+
|
|
6
|
+
## 1) Objetivo
|
|
7
|
+
|
|
8
|
+
Estabelecer fluxo formal para:
|
|
9
|
+
|
|
10
|
+
- detecção, contenção e erradicação de incidentes;
|
|
11
|
+
- preservação de evidências técnicas e cadeia de custódia;
|
|
12
|
+
- decisão sobre comunicação à ANPD e aos titulares, quando aplicável;
|
|
13
|
+
- registro de lições aprendidas e prevenção de recorrência.
|
|
14
|
+
|
|
15
|
+
## 2) Classificação inicial de severidade
|
|
16
|
+
|
|
17
|
+
| Severidade | Critério resumido |
|
|
18
|
+
| ---------- | ----------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
+
| Crítica | Exfiltração confirmada de dados/mensagens, indisponibilidade relevante, comprometimento de credenciais administrativas. |
|
|
20
|
+
| Alta | Acesso não autorizado com potencial de dano relevante, impacto regulatório provável. |
|
|
21
|
+
| Média | Falha explorável com restrições relevantes, sem evidência de exfiltração. |
|
|
22
|
+
| Baixa | Evento de baixo impacto, sem risco material imediato. |
|
|
23
|
+
|
|
24
|
+
## 3) Papéis e responsabilidades
|
|
25
|
+
|
|
26
|
+
- Líder de incidente: coordena resposta e decisões de prioridade.
|
|
27
|
+
- Segurança (SecOps): contenção técnica, coleta de IOC, análise de causa raiz.
|
|
28
|
+
- Produto/Engenharia: correção, rollback, validação e monitoramento pós-correção.
|
|
29
|
+
- Privacidade/Jurídico: análise LGPD, avaliação de risco ao titular, decisão de notificação.
|
|
30
|
+
- Comunicação: preparação de mensagens para clientes, titulares e partes interessadas.
|
|
31
|
+
|
|
32
|
+
## 4) Fluxo operacional (tempo de referência)
|
|
33
|
+
|
|
34
|
+
1. T+0 até T+30 min: abrir incidente, classificar severidade e acionar responsáveis.
|
|
35
|
+
2. T+30 min até T+2 h: isolar vetores, revogar tokens/sessões, aplicar bloqueios emergenciais.
|
|
36
|
+
3. T+2 h até T+6 h: identificar escopo afetado, coletar evidências e registrar timeline.
|
|
37
|
+
4. T+6 h até T+24 h: executar correções/migações e validar estabilidade.
|
|
38
|
+
5. T+24 h em diante: concluir RCA, ações preventivas e relatório final.
|
|
39
|
+
|
|
40
|
+
## 5) Gatilhos de comunicação à ANPD e titulares
|
|
41
|
+
|
|
42
|
+
Acionar avaliação formal de notificação quando houver, por indício mínimo:
|
|
43
|
+
|
|
44
|
+
- acesso não autorizado a dados pessoais com risco ou dano relevante;
|
|
45
|
+
- exposição de conteúdo integral de mensagens, credenciais ou dados sensíveis;
|
|
46
|
+
- comprometimento em larga escala de contas, grupos ou histórico de comunicação;
|
|
47
|
+
- indisponibilidade relevante com potencial de prejuízo material a titulares/clientes.
|
|
48
|
+
|
|
49
|
+
Critério jurídico: observar a LGPD (Lei nº 13.709/2018, art. 48) e regulamentações vigentes da ANPD.
|
|
50
|
+
Quando aplicável ao controlador, observar o prazo regulatório de 3 (três) dias úteis para comunicação, sem prejuízo de obrigações setoriais específicas.
|
|
51
|
+
|
|
52
|
+
## 6) Evidências mínimas obrigatórias
|
|
53
|
+
|
|
54
|
+
- linha do tempo do incidente (UTC e horário local);
|
|
55
|
+
- ativos afetados (serviços, banco, endpoints, credenciais);
|
|
56
|
+
- amostras de logs, hashes e identificadores técnicos;
|
|
57
|
+
- decisão técnica e jurídica de notificação (com justificativa);
|
|
58
|
+
- ações de contenção, correção e verificação pós-incidente.
|
|
59
|
+
- conteúdo mínimo da comunicação regulatória (natureza do incidente, categorias/dados afetados, titulares envolvidos, medidas técnicas/administrativas, riscos, motivo de eventual atraso e medidas de mitigação).
|
|
60
|
+
|
|
61
|
+
## 7) Comunicação e rastreabilidade
|
|
62
|
+
|
|
63
|
+
- toda comunicação deve possuir ID de incidente;
|
|
64
|
+
- manter repositório interno com documentos e decisões;
|
|
65
|
+
- preservar logs de acesso a mensagens, quando aplicável, para auditoria.
|
|
66
|
+
|
|
67
|
+
## 8) Pós-incidente (obrigatório)
|
|
68
|
+
|
|
69
|
+
1. Executar reunião de lições aprendidas em até 5 dias úteis.
|
|
70
|
+
2. Converter causas-raiz em ações com responsável e prazo.
|
|
71
|
+
3. Atualizar runbooks, controles preventivos e checklist de compliance mensal.
|
|
72
|
+
|
|
73
|
+
## 9) Referências oficiais
|
|
74
|
+
|
|
75
|
+
- LGPD (Lei nº 13.709/2018): https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm
|
|
76
|
+
- ANPD (portal institucional): https://www.gov.br/anpd/pt-br
|
|
77
|
+
- ANPD (comunicado de incidente de segurança - CIS): https://www.gov.br/anpd/pt-br/canais_atendimento/agente-de-tratamento/comunicado-de-incidente-de-seguranca-cis
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Runbook de Hardening de Rede (Produção)
|
|
2
|
+
|
|
3
|
+
Data: 2026-03-07
|
|
4
|
+
Escopo: reduzir superfície externa detectada em scan (`22`, `3001`, `8007`) e mitigar risco de DoS por conexões lentas.
|
|
5
|
+
|
|
6
|
+
## 1) Objetivo operacional
|
|
7
|
+
|
|
8
|
+
- manter externamente acessíveis apenas `22/tcp` (restrito por IP), `80/tcp` e `443/tcp`;
|
|
9
|
+
- impedir exposição pública direta de serviços internos (`3001`, `8007`);
|
|
10
|
+
- endurecer Nginx e SSH;
|
|
11
|
+
- validar remediação por `nmap` externo.
|
|
12
|
+
|
|
13
|
+
## 2) Fechar portas públicas desnecessárias
|
|
14
|
+
|
|
15
|
+
No host de produção:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
sudo ufw default deny incoming
|
|
19
|
+
sudo ufw default allow outgoing
|
|
20
|
+
sudo ufw allow 80/tcp
|
|
21
|
+
sudo ufw allow 443/tcp
|
|
22
|
+
sudo ufw allow from <IP_ADMIN>/32 to any port 22 proto tcp
|
|
23
|
+
sudo ufw deny 3001/tcp
|
|
24
|
+
sudo ufw deny 8007/tcp
|
|
25
|
+
sudo ufw --force enable
|
|
26
|
+
sudo ufw status verbose
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 3) Bind local para serviços internos
|
|
30
|
+
|
|
31
|
+
### Node (OmniZap)
|
|
32
|
+
|
|
33
|
+
- usar `METRICS_HOST=127.0.0.1` no ambiente de produção;
|
|
34
|
+
- confirmar que o processo não escuta em `0.0.0.0` nas portas internas.
|
|
35
|
+
|
|
36
|
+
### Uvicorn (porta 8007)
|
|
37
|
+
|
|
38
|
+
Se houver serviço FastAPI/Uvicorn no host, ajustar para loopback:
|
|
39
|
+
|
|
40
|
+
```ini
|
|
41
|
+
ExecStart=/usr/bin/uvicorn app:app --host 127.0.0.1 --port 8007
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Após ajuste:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
sudo systemctl daemon-reload
|
|
48
|
+
sudo systemctl restart <servico-uvicorn>
|
|
49
|
+
sudo systemctl status <servico-uvicorn> --no-pager
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 4) Hardening do Nginx (mitigar slow HTTP / slowloris)
|
|
53
|
+
|
|
54
|
+
Criar `/etc/nginx/conf.d/omnizap-hardening.conf`:
|
|
55
|
+
|
|
56
|
+
```nginx
|
|
57
|
+
server_tokens off;
|
|
58
|
+
client_header_timeout 10s;
|
|
59
|
+
client_body_timeout 10s;
|
|
60
|
+
send_timeout 10s;
|
|
61
|
+
keepalive_timeout 15s;
|
|
62
|
+
reset_timedout_connection on;
|
|
63
|
+
|
|
64
|
+
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
|
|
65
|
+
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=20r/s;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
No `server` de produção, aplicar:
|
|
69
|
+
|
|
70
|
+
```nginx
|
|
71
|
+
limit_conn conn_per_ip 40;
|
|
72
|
+
limit_req zone=req_per_ip burst=60 nodelay;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Validar e recarregar:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
sudo nginx -t
|
|
79
|
+
sudo systemctl reload nginx
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 5) Hardening de SSH
|
|
83
|
+
|
|
84
|
+
Criar `/etc/ssh/sshd_config.d/omnizap-hardening.conf`:
|
|
85
|
+
|
|
86
|
+
```sshconfig
|
|
87
|
+
PermitRootLogin no
|
|
88
|
+
PasswordAuthentication no
|
|
89
|
+
KbdInteractiveAuthentication no
|
|
90
|
+
MaxAuthTries 3
|
|
91
|
+
LoginGraceTime 20
|
|
92
|
+
AllowTcpForwarding no
|
|
93
|
+
X11Forwarding no
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Validar e reiniciar:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
sudo sshd -t
|
|
100
|
+
sudo systemctl restart ssh
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 6) Atualizações de segurança do sistema
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
sudo apt update
|
|
107
|
+
sudo apt full-upgrade -y
|
|
108
|
+
sudo apt autoremove -y
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Observação: resultados do `nmap --script vuln` são majoritariamente heurísticos por versão/CPE. A confirmação final deve seguir boletins do fornecedor (Ubuntu/Nginx/OpenSSH) e versão de pacote instalada.
|
|
112
|
+
|
|
113
|
+
## 7) Checklist de validação final
|
|
114
|
+
|
|
115
|
+
No host:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
sudo ss -lntp | egrep ':22|:80|:443|:3001|:8007'
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
De máquina externa:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
nmap -p 22,80,443,3001,8007 -sV omnizap.shop
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Resultado esperado:
|
|
128
|
+
|
|
129
|
+
- `22`, `80`, `443` abertos;
|
|
130
|
+
- `3001` e `8007` filtrados/fechados externamente.
|
|
131
|
+
|
|
132
|
+
## Referências
|
|
133
|
+
|
|
134
|
+
- Nginx admin guide: https://nginx.org/en/docs/
|
|
135
|
+
- OpenSSH hardening guidelines: https://www.openssh.com/manual.html
|
|
136
|
+
- Ubuntu security notices: https://ubuntu.com/security/notices
|
|
137
|
+
- UFW docs: https://manpages.ubuntu.com/manpages/jammy/en/man8/ufw.8.html
|