@omnizap-system/omnizap 2.6.1 → 2.6.2

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.
Files changed (156) hide show
  1. package/.env.example +54 -9
  2. package/.github/workflows/ci.yml +3 -3
  3. package/.github/workflows/security-runner-hardening.yml +1 -1
  4. package/.github/workflows/security-zap-full-scan.yml +1 -0
  5. package/app/config/index.js +2 -0
  6. package/app/configParts/adminIdentity.js +5 -5
  7. package/app/configParts/baileysConfig.js +226 -55
  8. package/app/configParts/groupUtils.js +5 -0
  9. package/app/configParts/messagePersistenceService.js +143 -3
  10. package/app/configParts/sessionConfig.js +157 -0
  11. package/app/connection/baileysCompatibility.test.js +1 -1
  12. package/app/connection/groupOwnerWriteStateResolver.js +109 -0
  13. package/app/connection/socketController.js +625 -124
  14. package/app/connection/socketController.multiSession.test.js +108 -0
  15. package/app/controllers/messageController.js +1 -1
  16. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  17. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  18. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  19. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
  20. package/app/controllers/messageProcessingPipeline.js +88 -9
  21. package/app/controllers/messageProcessingPipeline.test.js +200 -0
  22. package/app/modules/adminModule/AGENT.md +1 -1
  23. package/app/modules/adminModule/commandConfig.json +3318 -1347
  24. package/app/modules/adminModule/groupCommandHandlers.js +856 -14
  25. package/app/modules/adminModule/groupCommandHandlers.test.js +375 -9
  26. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  27. package/app/modules/aiModule/AGENT.md +47 -30
  28. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  29. package/app/modules/aiModule/catCommand.js +132 -25
  30. package/app/modules/aiModule/commandConfig.json +114 -28
  31. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  32. package/app/modules/gameModule/AGENT.md +1 -1
  33. package/app/modules/gameModule/commandConfig.json +29 -0
  34. package/app/modules/menuModule/AGENT.md +1 -1
  35. package/app/modules/menuModule/commandConfig.json +45 -10
  36. package/app/modules/menuModule/menuCatalogService.js +190 -0
  37. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  38. package/app/modules/menuModule/menuDynamicService.js +511 -0
  39. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  40. package/app/modules/menuModule/menus.js +36 -5
  41. package/app/modules/playModule/AGENT.md +10 -5
  42. package/app/modules/playModule/commandConfig.json +74 -16
  43. package/app/modules/playModule/playCommandConstants.js +13 -7
  44. package/app/modules/playModule/playCommandCore.js +4 -6
  45. package/app/modules/playModule/{playCommandYtDlpClient.js → playCommandMediaClient.js} +684 -332
  46. package/app/modules/playModule/playConfigRuntime.js +5 -6
  47. package/app/modules/playModule/playModuleCriticalFlows.test.js +44 -59
  48. package/app/modules/quoteModule/AGENT.md +1 -1
  49. package/app/modules/quoteModule/commandConfig.json +29 -0
  50. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  51. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  52. package/app/modules/statsModule/AGENT.md +1 -1
  53. package/app/modules/statsModule/commandConfig.json +58 -0
  54. package/app/modules/stickerModule/AGENT.md +1 -1
  55. package/app/modules/stickerModule/commandConfig.json +145 -0
  56. package/app/modules/stickerPackModule/AGENT.md +1 -1
  57. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  58. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  59. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +1 -1
  60. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +78 -57
  61. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  62. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  63. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  64. package/app/modules/tiktokModule/AGENT.md +1 -1
  65. package/app/modules/tiktokModule/commandConfig.json +29 -0
  66. package/app/modules/userModule/AGENT.md +1 -1
  67. package/app/modules/userModule/commandConfig.json +29 -0
  68. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  69. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  70. package/app/observability/metrics.js +136 -0
  71. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  72. package/app/services/ai/geminiService.js +131 -7
  73. package/app/services/ai/geminiService.test.js +59 -2
  74. package/app/services/ai/moduleAiHelpCoreService.js +33 -4
  75. package/app/services/group/groupMetadataService.js +24 -1
  76. package/app/services/infra/dbWriteQueue.js +51 -21
  77. package/app/services/messaging/newsBroadcastService.js +843 -27
  78. package/app/services/multiSession/assignmentBalancerService.js +457 -0
  79. package/app/services/multiSession/groupOwnershipRepository.js +381 -0
  80. package/app/services/multiSession/groupOwnershipService.js +890 -0
  81. package/app/services/multiSession/groupOwnershipService.test.js +309 -0
  82. package/app/services/multiSession/sessionRegistryService.js +293 -0
  83. package/app/store/aiPromptStore.js +36 -19
  84. package/app/store/groupConfigStore.js +41 -5
  85. package/app/store/premiumUserStore.js +21 -7
  86. package/app/utils/antiLink/antiLinkModule.js +352 -16
  87. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  88. package/database/index.js +6 -0
  89. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  90. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  91. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  92. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  93. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  94. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  95. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  96. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  97. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  98. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  99. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  100. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  101. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  102. package/database/schema.sql +102 -1
  103. package/docker-compose.yml +4 -1
  104. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  105. package/docs/compliance/privacy-policy-2026-03-07.md +2 -2
  106. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  107. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  108. package/docs/security/omnizap-static-security-headers.conf +25 -0
  109. package/ecosystem.prod.config.cjs +31 -11
  110. package/index.js +52 -18
  111. package/observability/alert-rules.yml +20 -0
  112. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  113. package/observability/mysql-setup.sql +4 -4
  114. package/observability/system-admin-observability.md +26 -0
  115. package/package.json +12 -5
  116. package/public/comandos/commands-catalog.json +2253 -78
  117. package/public/js/apps/commandsReactApp.js +267 -87
  118. package/public/js/apps/createPackApp.js +3 -3
  119. package/public/js/apps/stickersApp.js +255 -103
  120. package/public/js/apps/termsReactApp.js +57 -8
  121. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  122. package/public/js/apps/userReactApp.js +96 -47
  123. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  124. package/public/pages/politica-de-privacidade.html +1 -1
  125. package/public/pages/stickers.html +5 -5
  126. package/public/pages/termos-de-uso-texto-integral.html +1 -1
  127. package/public/pages/termos-de-uso.html +1 -1
  128. package/public/pages/user-password-reset.html +3 -4
  129. package/public/pages/user-systemadm.html +8 -462
  130. package/public/pages/user.html +1 -1
  131. package/scripts/clear-whatsapp-session.sh +123 -0
  132. package/scripts/core-ai-mode.mjs +163 -0
  133. package/scripts/deploy.sh +10 -0
  134. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  135. package/scripts/generate-commands-catalog.mjs +155 -0
  136. package/scripts/new-whatsapp-session.sh +317 -0
  137. package/scripts/security-web-surface-check.mjs +218 -0
  138. package/server/controllers/admin/adminPanelHandlers.js +253 -3
  139. package/server/controllers/admin/systemAdminController.js +267 -0
  140. package/server/controllers/sticker/stickerCatalogController.js +9 -23
  141. package/server/controllers/system/contactController.js +9 -17
  142. package/server/controllers/system/stickerCatalogSystemContext.js +27 -6
  143. package/server/controllers/system/systemController.js +254 -1
  144. package/server/controllers/userController.js +6 -0
  145. package/server/email/emailTemplateService.js +3 -2
  146. package/server/http/httpServer.js +8 -4
  147. package/server/middleware/securityHeaders.js +20 -1
  148. package/server/routes/admin/systemAdminRouter.js +6 -0
  149. package/server/routes/indexRouter.js +30 -6
  150. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  151. package/server/routes/static/staticPageRouter.js +27 -1
  152. package/server/utils/publicContact.js +31 -0
  153. package/utils/whatsapp/contactEnv.js +39 -0
  154. package/vite.config.mjs +2 -1
  155. package/app/modules/playModule/local/installYtDlp.js +0 -25
  156. package/app/modules/playModule/local/ytDlpInstaller.js +0 -28
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
+ ENV_FILE="${ENV_FILE:-$PROJECT_ROOT/.env}"
6
+ SESSION_ID_OVERRIDE=""
7
+ CLEAR_AUTH_FILES=0
8
+
9
+ log() {
10
+ printf '[clear-whatsapp-session] %s\n' "$*"
11
+ }
12
+
13
+ fail() {
14
+ printf '[clear-whatsapp-session] erro: %s\n' "$*" >&2
15
+ exit 1
16
+ }
17
+
18
+ require_cmd() {
19
+ if ! command -v "$1" >/dev/null 2>&1; then
20
+ fail "comando ausente: $1"
21
+ fi
22
+ }
23
+
24
+ resolve_db_name() {
25
+ local base_name="$1"
26
+ local node_env="${2:-development}"
27
+
28
+ if [[ "$base_name" == *_dev || "$base_name" == *_prod ]]; then
29
+ printf '%s' "$base_name"
30
+ return 0
31
+ fi
32
+
33
+ if [[ "$node_env" == "production" ]]; then
34
+ printf '%s_prod' "$base_name"
35
+ else
36
+ printf '%s_dev' "$base_name"
37
+ fi
38
+ }
39
+
40
+ usage() {
41
+ cat <<'EOF'
42
+ Uso:
43
+ bash scripts/clear-whatsapp-session.sh [opcoes]
44
+
45
+ Opcoes:
46
+ --session <id> Forca um session_id especifico (padrao: BAILEYS_AUTH_SESSION_ID ou "default")
47
+ --clear-auth-files Remove app/connection/auth/*.json tambem (evita rebootstrap da sessao antiga)
48
+ -h, --help Mostra esta ajuda
49
+ EOF
50
+ }
51
+
52
+ while [[ $# -gt 0 ]]; do
53
+ case "$1" in
54
+ --session)
55
+ [[ $# -ge 2 ]] || fail "faltou valor para --session"
56
+ SESSION_ID_OVERRIDE="$2"
57
+ shift 2
58
+ ;;
59
+ --clear-auth-files)
60
+ CLEAR_AUTH_FILES=1
61
+ shift
62
+ ;;
63
+ -h|--help)
64
+ usage
65
+ exit 0
66
+ ;;
67
+ *)
68
+ fail "opcao invalida: $1 (use --help)"
69
+ ;;
70
+ esac
71
+ done
72
+
73
+ require_cmd mysql
74
+ require_cmd base64
75
+
76
+ if [[ ! -f "$ENV_FILE" ]]; then
77
+ fail "arquivo .env nao encontrado em: $ENV_FILE"
78
+ fi
79
+
80
+ set -a
81
+ # shellcheck disable=SC1090
82
+ source "$ENV_FILE"
83
+ set +a
84
+
85
+ DB_HOST="${DB_HOST:-}"
86
+ DB_USER="${DB_USER:-}"
87
+ DB_PASSWORD="${DB_PASSWORD:-}"
88
+ DB_NAME="${DB_NAME:-}"
89
+ NODE_ENV_VALUE="${NODE_ENV:-development}"
90
+ SESSION_ID="${SESSION_ID_OVERRIDE:-${BAILEYS_AUTH_SESSION_ID:-default}}"
91
+
92
+ [[ -n "$DB_HOST" ]] || fail "DB_HOST nao definido no .env"
93
+ [[ -n "$DB_USER" ]] || fail "DB_USER nao definido no .env"
94
+ [[ -n "$DB_PASSWORD" ]] || fail "DB_PASSWORD nao definido no .env"
95
+ [[ -n "$DB_NAME" ]] || fail "DB_NAME nao definido no .env"
96
+ [[ -n "$SESSION_ID" ]] || SESSION_ID="default"
97
+
98
+ DB_REAL_NAME="$(resolve_db_name "$DB_NAME" "$NODE_ENV_VALUE")"
99
+ SESSION_ID_B64="$(printf '%s' "$SESSION_ID" | base64 -w0)"
100
+
101
+ log "Limpando sessao '$SESSION_ID' na tabela baileys_auth_state (database: $DB_REAL_NAME)..."
102
+
103
+ mysql -h "$DB_HOST" -u "$DB_USER" "-p$DB_PASSWORD" "$DB_REAL_NAME" <<SQL
104
+ SET @sid = CONVERT(FROM_BASE64('${SESSION_ID_B64}') USING utf8mb4);
105
+ DELETE FROM baileys_auth_state WHERE session_id = @sid;
106
+ SELECT ROW_COUNT() AS removed_rows, @sid AS session_id;
107
+ SQL
108
+
109
+ if [[ "$CLEAR_AUTH_FILES" == "1" ]]; then
110
+ AUTH_DIR="$PROJECT_ROOT/app/connection/auth"
111
+ if compgen -G "$AUTH_DIR/*.json" >/dev/null 2>&1; then
112
+ rm -f "$AUTH_DIR"/*.json
113
+ log "Arquivos legados removidos em: $AUTH_DIR/*.json"
114
+ else
115
+ log "Nenhum arquivo legado encontrado em: $AUTH_DIR"
116
+ fi
117
+ fi
118
+
119
+ if [[ "${BAILEYS_AUTH_BOOTSTRAP_FROM_FILES:-true}" == "true" && "$CLEAR_AUTH_FILES" != "1" ]]; then
120
+ log "Aviso: BAILEYS_AUTH_BOOTSTRAP_FROM_FILES=true. Considere usar --clear-auth-files para evitar restaurar sessao antiga."
121
+ fi
122
+
123
+ log "Concluido. Reinicie o bot para gerar novo QR Code."
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { spawnSync } from 'node:child_process';
6
+
7
+ const ENV_PATH = path.resolve(process.cwd(), '.env');
8
+ const MANAGED_BLOCK_START = '# >>> CORE_AI_MODE_MANAGED >>>';
9
+ const MANAGED_BLOCK_END = '# <<< CORE_AI_MODE_MANAGED <<<';
10
+
11
+ const CORE_AI_FLAGS = ['AI_LEARNING_WORKER_ENABLED', 'AI_HELP_CONTINUOUS_LEARNING_ENABLED', 'COMMAND_CONFIG_ENRICHMENT_WORKER_ENABLED', 'GLOBAL_HELP_ENABLE_WRAPPER_LLM_FALLBACK', 'MODULE_AI_HELP_ENABLE_LLM', 'ADMIN_AI_HELP_ENABLE_LLM', 'AI_AI_HELP_ENABLE_LLM', 'GAME_AI_HELP_ENABLE_LLM', 'MENU_AI_HELP_ENABLE_LLM', 'PLAY_AI_HELP_ENABLE_LLM', 'QUOTE_AI_HELP_ENABLE_LLM', 'RPG_POKEMON_AI_HELP_ENABLE_LLM', 'STATS_AI_HELP_ENABLE_LLM', 'STICKER_AI_HELP_ENABLE_LLM', 'STICKER_PACK_AI_HELP_ENABLE_LLM', 'SYSTEM_METRICS_AI_HELP_ENABLE_LLM', 'TIKTOK_AI_HELP_ENABLE_LLM', 'USER_AI_HELP_ENABLE_LLM', 'WAIFUPICS_AI_HELP_ENABLE_LLM'];
12
+
13
+ const parseArgs = (argv = []) => {
14
+ const args = [...argv];
15
+ let mode = 'status';
16
+ let restart = true;
17
+ let pm2Name = process.env.CORE_AI_PM2_NAME || 'omnizap-system-production';
18
+
19
+ if (args[0] && !args[0].startsWith('--')) {
20
+ mode = String(args.shift()).trim().toLowerCase();
21
+ }
22
+
23
+ for (const arg of args) {
24
+ if (arg === '--no-restart') {
25
+ restart = false;
26
+ continue;
27
+ }
28
+ if (arg.startsWith('--pm2-name=')) {
29
+ const value = String(arg.split('=').slice(1).join('=')).trim();
30
+ if (value) pm2Name = value;
31
+ }
32
+ }
33
+
34
+ return {
35
+ mode,
36
+ restart,
37
+ pm2Name,
38
+ };
39
+ };
40
+
41
+ const parseDotEnvEffectiveMap = (content) => {
42
+ const map = new Map();
43
+ const lines = String(content || '').split(/\r?\n/);
44
+ const keyRegex = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/;
45
+
46
+ for (const line of lines) {
47
+ const trimmed = line.trim();
48
+ if (!trimmed || trimmed.startsWith('#')) continue;
49
+ const match = line.match(keyRegex);
50
+ if (!match) continue;
51
+ map.set(match[1], String(match[2] || '').trim());
52
+ }
53
+
54
+ return map;
55
+ };
56
+
57
+ const removeManagedBlock = (content) => {
58
+ const lines = String(content || '').split(/\r?\n/);
59
+ const startIndex = lines.findIndex((line) => line.trim() === MANAGED_BLOCK_START);
60
+ if (startIndex < 0) return content;
61
+ const endIndex = lines.findIndex((line, index) => index > startIndex && line.trim() === MANAGED_BLOCK_END);
62
+ if (endIndex < 0) {
63
+ return `${lines.slice(0, startIndex).join('\n').trimEnd()}\n`;
64
+ }
65
+ const nextLines = [...lines.slice(0, startIndex), ...lines.slice(endIndex + 1)];
66
+ return `${nextLines.join('\n').trimEnd()}\n`;
67
+ };
68
+
69
+ const buildManagedBlock = (value) => {
70
+ const lines = [MANAGED_BLOCK_START, '# Gerenciado por scripts/core-ai-mode.mjs', ...CORE_AI_FLAGS.map((key) => `${key}=${value}`), MANAGED_BLOCK_END];
71
+ return `${lines.join('\n')}\n`;
72
+ };
73
+
74
+ const writeModeToEnv = async (modeValue) => {
75
+ const current = await fs.readFile(ENV_PATH, 'utf8');
76
+ const withoutManaged = removeManagedBlock(current);
77
+ const next = withoutManaged.trimEnd().length > 0 ? `${withoutManaged.trimEnd()}\n\n${buildManagedBlock(modeValue)}` : `${buildManagedBlock(modeValue)}`;
78
+ await fs.writeFile(ENV_PATH, next, 'utf8');
79
+ };
80
+
81
+ const computeStatus = async () => {
82
+ const content = await fs.readFile(ENV_PATH, 'utf8');
83
+ const map = parseDotEnvEffectiveMap(content);
84
+ const values = CORE_AI_FLAGS.map((key) => {
85
+ const raw = String(map.get(key) ?? '')
86
+ .trim()
87
+ .toLowerCase();
88
+ return {
89
+ key,
90
+ raw: raw || '(unset)',
91
+ bool: raw === 'true' || raw === '1' || raw === 'yes' || raw === 'on',
92
+ isSet: raw.length > 0,
93
+ };
94
+ });
95
+
96
+ const allFalse = values.every((item) => item.isSet && item.bool === false);
97
+ const allTrue = values.every((item) => item.isSet && item.bool === true);
98
+ const mode = allFalse ? 'deterministic_on' : allTrue ? 'ai_on' : 'custom';
99
+
100
+ return {
101
+ mode,
102
+ values,
103
+ };
104
+ };
105
+
106
+ const restartPm2Process = ({ pm2Name, modeValue }) => {
107
+ const envOverrides = Object.fromEntries(CORE_AI_FLAGS.map((key) => [key, modeValue]));
108
+ const result = spawnSync('pm2', ['restart', pm2Name, '--update-env'], {
109
+ env: {
110
+ ...process.env,
111
+ ...envOverrides,
112
+ },
113
+ encoding: 'utf8',
114
+ });
115
+
116
+ if (result.error) {
117
+ throw result.error;
118
+ }
119
+ if (result.status !== 0) {
120
+ throw new Error((result.stderr || result.stdout || `Falha ao reiniciar processo PM2: ${pm2Name}`).trim());
121
+ }
122
+ };
123
+
124
+ const printStatus = ({ mode, values }) => {
125
+ console.log(`core_ai_mode=${mode}`);
126
+ for (const item of values) {
127
+ console.log(`${item.key}=${item.raw}`);
128
+ }
129
+ };
130
+
131
+ const run = async () => {
132
+ const { mode, restart, pm2Name } = parseArgs(process.argv.slice(2));
133
+
134
+ if (!['on', 'off', 'status'].includes(mode)) {
135
+ console.error('Uso: npm run core:ai -- <on|off|status> [--no-restart] [--pm2-name=<processo>]');
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+
140
+ if (mode === 'status') {
141
+ const status = await computeStatus();
142
+ printStatus(status);
143
+ return;
144
+ }
145
+
146
+ const modeValue = mode === 'on' ? 'false' : 'true';
147
+ await writeModeToEnv(modeValue);
148
+
149
+ if (restart) {
150
+ restartPm2Process({ pm2Name, modeValue });
151
+ }
152
+
153
+ const status = await computeStatus();
154
+ console.log(`core_ai_mode_updated=${mode}`);
155
+ console.log(`pm2_restart=${restart ? 'executed' : 'skipped'}`);
156
+ console.log(`pm2_process=${pm2Name}`);
157
+ printStatus(status);
158
+ };
159
+
160
+ run().catch((error) => {
161
+ console.error(`Erro ao alternar modo do core AI: ${error?.message || error}`);
162
+ process.exitCode = 1;
163
+ });
package/scripts/deploy.sh CHANGED
@@ -11,6 +11,9 @@ RESTART_PM2="${DEPLOY_RESTART_PM2:-1}"
11
11
  PM2_APP_NAME="${DEPLOY_PM2_APP_NAME:-omnizap-production}"
12
12
  BUILD_ID="${DEPLOY_BUILD_ID:-$(date -u +%Y%m%d%H%M%S)}"
13
13
  VERIFY_URL="${DEPLOY_VERIFY_URL:-https://omnizap.shop/}"
14
+ WEB_SURFACE_VERIFY_ENABLED="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE:-1}"
15
+ WEB_SURFACE_VERIFY_BASE_URL="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE_BASE_URL:-$VERIFY_URL}"
16
+ WEB_SURFACE_VERIFY_REPORT_PATH="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE_REPORT_PATH:-$PROJECT_ROOT/temp/security-web-surface-report.json}"
14
17
  DRY_RUN="${DEPLOY_DRY_RUN:-0}"
15
18
  GITHUB_NOTIFY="${DEPLOY_GITHUB_NOTIFY:-1}"
16
19
  GITHUB_ENVIRONMENT="${DEPLOY_GITHUB_ENVIRONMENT:-production}"
@@ -920,4 +923,11 @@ if command -v curl >/dev/null 2>&1; then
920
923
  fi
921
924
  fi
922
925
 
926
+ if [ "$WEB_SURFACE_VERIFY_ENABLED" = "1" ]; then
927
+ log "Executando validacao web de seguranca em $WEB_SURFACE_VERIFY_BASE_URL"
928
+ SECURITY_WEB_SURFACE_BASE_URL="$WEB_SURFACE_VERIFY_BASE_URL" \
929
+ SECURITY_WEB_SURFACE_REPORT_PATH="$WEB_SURFACE_VERIFY_REPORT_PATH" \
930
+ node "$PROJECT_ROOT/scripts/security-web-surface-check.mjs"
931
+ fi
932
+
923
933
  log "Deploy concluído com sucesso."