karnel-termux 4.17.2 → 4.17.5

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.
@@ -1 +1 @@
1
- 680f9d3f783c6f2bf95e4499c3e230d2d25b7070
1
+ 2e76f74b21de6f9a01911b2c06b96ac09d12359d
@@ -83,6 +83,20 @@ _cline_install_global_impl() {
83
83
  return 1
84
84
  fi
85
85
 
86
+ local expected actual
87
+ expected=$(npm view "@cline/cli-linux-arm64@$version" dist.integrity 2>/dev/null)
88
+ if [[ -z "$expected" ]]; then
89
+ rm -f "$tarball"
90
+ log_error "Falha ao obter a integridade do binário do Cline no registry npm"
91
+ return 1
92
+ fi
93
+ actual=$(node -e 'const c=require("crypto");const h=c.createHash("sha512");h.update(require("fs").readFileSync(process.argv[1]));process.stdout.write("sha512-"+h.digest("base64"))' "$tarball" 2>/dev/null) || actual=""
94
+ if [[ "$actual" != "$expected" ]]; then
95
+ rm -f "$tarball"
96
+ log_error "Integridade do binário do Cline não confere (esperado $expected)"
97
+ return 1
98
+ fi
99
+
86
100
  mkdir -p "$CLINE_DATA_DIR"
87
101
  : >"$CLINE_DATA_DIR/$CLINE_MARKER"
88
102
  if ! tar -xzf "$tarball" -C "$CLINE_DATA_DIR" &>>"$LOG_FILE"; then
@@ -3,6 +3,7 @@
3
3
  import "@/utils/log"
4
4
  import "@/utils/version"
5
5
  import "@/utils/colors"
6
+ import "@/utils/install"
6
7
 
7
8
  LOG_FILE="$KARNEL_CACHE/install_ai.log"
8
9
  KILOCODE_DATA_DIR="${KARNEL_DATA:-${XDG_DATA_HOME:-$HOME/.local/share}/karnel-data}/kilocode"
@@ -120,13 +121,15 @@ _download_kilocode_binary_impl() {
120
121
  return 1
121
122
  fi
122
123
 
123
- local expected actual
124
- expected=$(github_release_asset_sha256 Kilo-Org/kilocode "$latest_version" "$tarball") || expected=""
125
- actual=$(sha256sum "$staging_dir/$tarball" 2>/dev/null | awk '{print $1}')
126
- if [[ ! "$expected" =~ ^[0-9a-f]{64}$ || "$actual" != "$expected" ]]; then
127
- rm -rf "$staging_dir"
128
- log_error "Kilo Code archive failed official SHA-256 validation"
129
- return 1
124
+ if declare -F github_release_asset_sha256 >/dev/null; then
125
+ local expected actual
126
+ expected=$(github_release_asset_sha256 Kilo-Org/kilocode "$latest_version" "$tarball") || expected=""
127
+ actual=$(sha256sum "$staging_dir/$tarball" 2>/dev/null | awk '{print $1}')
128
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ || "$actual" != "$expected" ]]; then
129
+ rm -rf "$staging_dir"
130
+ log_error "Kilo Code archive failed official SHA-256 validation"
131
+ return 1
132
+ fi
130
133
  fi
131
134
 
132
135
  if ! tar -zxf "$staging_dir/$tarball" -C "$staging_dir" &>>"$LOG_FILE"; then
@@ -485,9 +485,15 @@ _update_kimchi_proot_impl() {
485
485
 
486
486
  local download_url="https://github.com/getkimchi/kimchi/releases/download/$latest_version/kimchi_linux_arm64.tar.gz"
487
487
 
488
- _kimchi_proot_ubuntu /bin/bash -c "
488
+ local expected
489
+ expected=$(github_release_asset_sha256 getkimchi/kimchi "$latest_version" "kimchi_linux_arm64.tar.gz") || expected=""
490
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
491
+ log_warn "No published SHA-256 for Kimchi; skipping integrity verification"
492
+ fi
493
+ _kimchi_proot_ubuntu /bin/bash -c '
489
494
  mkdir -p /tmp/kimchi-install &&
490
- curl -fsSL '$download_url' -o /tmp/kimchi-install/kimchi.tar.gz &&
495
+ curl -fsSL "$1" -o /tmp/kimchi-install/kimchi.tar.gz &&
496
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/kimchi-install/kimchi.tar.gz | awk "{print \$1}")" = "$2" ]; } &&
491
497
  tar -zxf /tmp/kimchi-install/kimchi.tar.gz -C /tmp/kimchi-install &&
492
498
  rm -f /usr/local/bin/kimchi &&
493
499
  mv /tmp/kimchi-install/bin/kimchi /usr/local/bin/kimchi &&
@@ -495,7 +501,7 @@ _update_kimchi_proot_impl() {
495
501
  rm -rf /usr/local/share/kimchi &&
496
502
  mv /tmp/kimchi-install/share/kimchi /usr/local/share/kimchi &&
497
503
  rm -rf /tmp/kimchi-install
498
- " &>>"$LOG_FILE"
504
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"
499
505
 
500
506
  local kimchi_bin
501
507
  kimchi_bin="$(_kimchi_detect_ubuntu_root)/usr/local/bin/kimchi"
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  import "@/utils/log"
4
+ import "@/utils/install"
4
5
  import "@/utils/version"
5
6
 
6
7
  LOG_FILE="$KARNEL_CACHE/install_deploy.log"
@@ -110,6 +111,15 @@ _install_railway_manual_impl() {
110
111
  return 2
111
112
  fi
112
113
 
114
+ local expected
115
+ expected=$(github_release_asset_sha256 railwayapp/cli "$latest_version" "railway-${version}-aarch64-linux.tar.gz") || expected=""
116
+ if [[ "$expected" =~ ^[0-9a-f]{64}$ ]]; then
117
+ verify_sha256 "$RAILWAY_DATA_DIR/railway.tar.gz" "$expected" || {
118
+ rm -f "$RAILWAY_DATA_DIR/railway.tar.gz"
119
+ return 1
120
+ }
121
+ fi
122
+
113
123
  tar -zxf "$RAILWAY_DATA_DIR/railway.tar.gz" -C "$RAILWAY_DATA_DIR" 2>>"$LOG_FILE" || {
114
124
  rm -f "$RAILWAY_DATA_DIR/railway.tar.gz"
115
125
  return 1
@@ -73,7 +73,10 @@ update_code_server() {
73
73
  }
74
74
 
75
75
  _update_code_server_impl() {
76
- pkg upgrade -y code-server 2>/dev/null
76
+ if ! pkg upgrade -y code-server &>>"$LOG_FILE"; then
77
+ log_error "Falha ao atualizar code-server"
78
+ return 1
79
+ fi
77
80
  }
78
81
 
79
82
  reinstall_code_server() {
@@ -51,7 +51,10 @@ _update_neovim_impl() {
51
51
 
52
52
  _do_neovim_update() {
53
53
  mkdir -p "$(dirname "$LOG_FILE")"
54
- yes | pkg upgrade neovim -y &>>"$LOG_FILE"
54
+ if ! yes | pkg upgrade neovim -y &>>"$LOG_FILE"; then
55
+ log_error "Falha ao atualizar Neovim"
56
+ return 1
57
+ fi
55
58
  }
56
59
 
57
60
  update_neovim() {
@@ -141,6 +141,14 @@ _download_bun_binary_native_impl() {
141
141
  log_error "Failed to download Bun binary"
142
142
  return 1
143
143
  }
144
+ if declare -F github_release_asset_sha256 >/dev/null; then
145
+ expected=$(github_release_asset_sha256 "$BUN_REPO" "bun-v$version" "$zip_name") || expected=""
146
+ if [[ "$expected" =~ ^[0-9a-f]{64}$ ]]; then
147
+ verify_sha256 "$staging_dir/$zip_name" "$expected" || { rm -rf "$staging_dir"; return 1; }
148
+ else
149
+ log_warn "No published SHA-256 for Bun native; skipping integrity verification"
150
+ fi
151
+ fi
144
152
  if ! unzip -o "$staging_dir/$zip_name" -d "$staging_dir" &>>"$LOG_FILE"; then
145
153
  rm -rf "$staging_dir"
146
154
  log_error "Failed to extract Bun binary"
@@ -39,6 +39,17 @@ _install_deps_impl() {
39
39
  fi
40
40
  done
41
41
 
42
+ if [[ ! -f "$GLIBC_LIBDIR/ld-linux-aarch64.so.1" ]]; then
43
+ if ! yes | pkg install glibc-repo &>>"$LOG_FILE"; then
44
+ log_error "Failed to install glibc-repo"
45
+ return 1
46
+ fi
47
+ if ! yes | pkg install glibc &>>"$LOG_FILE"; then
48
+ log_error "Failed to install glibc (required by the glibc-linked Node.js)"
49
+ return 1
50
+ fi
51
+ fi
52
+
42
53
  return 0
43
54
  }
44
55
 
@@ -14,8 +14,12 @@ install_dnsrecon() {
14
14
  log_success "dnsrecon instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o dnsrecon via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_DNSRECON_REPO" "$_DNSRECON_COMMIT" "$_DNSRECON_DIR"; then
18
- pip install -r "$_DNSRECON_DIR/requirements.txt" 2>/dev/null
22
+ pip install -r "$_DNSRECON_DIR/requirements.txt" 2>>"$LOG_FILE" || return 1
19
23
  chmod +x "$_DNSRECON_DIR/dnsrecon.py"
20
24
  ln -sf "$_DNSRECON_DIR/dnsrecon.py" "$PREFIX/bin/dnsrecon"
21
25
  : > "$_DNSRECON_DIR/.karnel-wrapper"
@@ -41,7 +45,7 @@ update_dnsrecon() {
41
45
  { [ -f "$_DNSRECON_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_DNSRECON_DIR" "$_DNSRECON_REPO"; } || return 1
42
46
  install_pinned_git_repo "$_DNSRECON_REPO" "$_DNSRECON_COMMIT" "$_DNSRECON_DIR" || return 1
43
47
  : > "$_DNSRECON_DIR/.karnel-wrapper"
44
- pip install -r "$_DNSRECON_DIR/requirements.txt" 2>/dev/null
48
+ pip install -r "$_DNSRECON_DIR/requirements.txt" 2>>"$LOG_FILE" || return 1
45
49
  log_success "dnsrecon atualizado"
46
50
  return 0
47
51
  fi
@@ -14,6 +14,10 @@ install_enum4linux() {
14
14
  log_success "enum4linux instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o enum4linux via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_ENUM4LINUX_REPO" "$_ENUM4LINUX_COMMIT" "$_ENUM4LINUX_DIR"; then
18
22
  chmod +x "$_ENUM4LINUX_DIR/enum4linux.pl"
19
23
  ln -sf "$_ENUM4LINUX_DIR/enum4linux.pl" "$PREFIX/bin/enum4linux"
@@ -46,9 +46,9 @@ update_masscan() {
46
46
  _pinned_git_repo_owned "$_MASSCAN_DIR" "$_MASSCAN_REPO" ||
47
47
  { [ -f "$_MASSCAN_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_MASSCAN_DIR" "$_MASSCAN_REPO"; } || return 1
48
48
  install_pinned_git_repo "$_MASSCAN_REPO" "$_MASSCAN_COMMIT" "$_MASSCAN_DIR" || return 1
49
- make -C "$_MASSCAN_DIR" -j4 2>/dev/null
50
- install -m 755 "$_MASSCAN_DIR/bin/masscan" "$PREFIX/bin/masscan"
51
- sha256sum "$PREFIX/bin/masscan" > "$_MASSCAN_DIR/.karnel-wrapper"
49
+ make -C "$_MASSCAN_DIR" -j4 2>/dev/null || return 1
50
+ install -m 755 "$_MASSCAN_DIR/bin/masscan" "$PREFIX/bin/masscan" || return 1
51
+ sha256sum "$PREFIX/bin/masscan" > "$_MASSCAN_DIR/.karnel-wrapper" || return 1
52
52
  log_success "masscan atualizado"
53
53
  return 0
54
54
  fi
@@ -25,8 +25,8 @@ install_metasploit() {
25
25
  }
26
26
 
27
27
  cd "$METASPLOIT_DIR"
28
- gem install bundler 2>/dev/null
29
- bundle install --jobs 4 2>/dev/null
28
+ gem install bundler 2>>"$LOG_FILE" || return 1
29
+ bundle install --jobs 4 2>>"$LOG_FILE" || return 1
30
30
 
31
31
  for bin in msfconsole msfvenom msfrpc msfrpcd msfdb; do
32
32
  cat > "$PREFIX/bin/$bin" << BINEOF
@@ -58,7 +58,7 @@ update_metasploit() {
58
58
  _pinned_git_repo_owned "$METASPLOIT_DIR" "$METASPLOIT_REPO" ||
59
59
  { [ -f "$METASPLOIT_DIR/.karnel-installed" ] && _adopt_pinned_git_repo "$METASPLOIT_DIR" "$METASPLOIT_REPO"; } || return 1
60
60
  install_pinned_git_repo "$METASPLOIT_REPO" "$METASPLOIT_COMMIT" "$METASPLOIT_DIR" || return 1
61
- cd "$METASPLOIT_DIR" && bundle install --jobs 4 2>/dev/null
61
+ cd "$METASPLOIT_DIR" && bundle install --jobs 4 2>>"$LOG_FILE" || return 1
62
62
  for bin in msfconsole msfvenom msfrpc msfrpcd msfdb; do
63
63
  sha256sum "$PREFIX/bin/$bin" > "$METASPLOIT_DIR/.karnel-wrapper-$bin"
64
64
  done
@@ -14,6 +14,10 @@ install_nikto() {
14
14
  log_success "nikto instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o nikto via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_NIKTO_REPO" "$_NIKTO_COMMIT" "$_NIKTO_DIR"; then
18
22
  ln -sf "$_NIKTO_DIR/program/nikto.pl" "$PREFIX/bin/nikto"
19
23
  chmod +x "$PREFIX/bin/nikto"
@@ -14,6 +14,10 @@ install_sqlmap() {
14
14
  log_success "sqlmap instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o sqlmap via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_SQLMAP_REPO" "$_SQLMAP_COMMIT" "$_SQLMAP_DIR"; then
18
22
  ln -sf "$_SQLMAP_DIR/sqlmap.py" "$PREFIX/bin/sqlmap"
19
23
  chmod +x "$PREFIX/bin/sqlmap"
@@ -14,8 +14,12 @@ install_theharvester() {
14
14
  log_success "theharvester instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o theharvester via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_THEHARVESTER_REPO" "$_THEHARVESTER_COMMIT" "$_THEHARVESTER_DIR"; then
18
- pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>/dev/null
22
+ pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>>"$LOG_FILE" || return 1
19
23
  chmod +x "$_THEHARVESTER_DIR/theHarvester.py"
20
24
  ln -sf "$_THEHARVESTER_DIR/theHarvester.py" "$PREFIX/bin/theharvester"
21
25
  : > "$_THEHARVESTER_DIR/.karnel-wrapper"
@@ -41,7 +45,7 @@ update_theharvester() {
41
45
  { [ -f "$_THEHARVESTER_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_THEHARVESTER_DIR" "$_THEHARVESTER_REPO"; } || return 1
42
46
  install_pinned_git_repo "$_THEHARVESTER_REPO" "$_THEHARVESTER_COMMIT" "$_THEHARVESTER_DIR" || return 1
43
47
  : > "$_THEHARVESTER_DIR/.karnel-wrapper"
44
- pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>/dev/null
48
+ pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>>"$LOG_FILE" || return 1
45
49
  log_success "theharvester atualizado"
46
50
  return 0
47
51
  fi
@@ -14,6 +14,10 @@ install_whatweb() {
14
14
  log_success "whatweb instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o whatweb via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_WHATWEB_REPO" "$_WHATWEB_COMMIT" "$_WHATWEB_DIR"; then
18
22
  ln -sf "$_WHATWEB_DIR/whatweb" "$PREFIX/bin/whatweb"
19
23
  chmod +x "$PREFIX/bin/whatweb"
@@ -366,6 +366,11 @@ agent_apply_files() {
366
366
  d=$(agent_md_dir)
367
367
  fm="$d/actions_files_manifest.txt"
368
368
  ws="${AGENT_ACTIONS_WORKSPACE:-$PWD}"
369
+ ws="$(realpath -m "$ws" 2>/dev/null)" || ws=""
370
+ if [[ -z "$ws" || "$ws" == "/" ]]; then
371
+ log_error "Recusando aplicar arquivos com workspace '/' (permitiria escrita em qualquer lugar)"
372
+ return 1
373
+ fi
369
374
  AGENT_FILES_WRITTEN=0
370
375
  shown=0
371
376
  # paths attached as action="no-read" are write-protected for this task
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karnel-termux",
3
- "version": "4.17.2",
3
+ "version": "4.17.5",
4
4
  "description": "Modular Dev Environment for Termux — install languages, databases, AI agents, editors, and more with one command",
5
5
  "bin": {
6
6
  "karnel": "karnel/bin/karnel"