Commit Graph

21038 Commits

Author SHA1 Message Date
Jian Qiu
1dc0e3b5ec fix: module not found return 404 (#25560)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
v4.0.4-20260904.0 v4.0.4-20260905.0
2026-09-04 19:55:06 +08:00
Jian Qiu
df217c1be2 fix: verify test revisit (#25564)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-04 19:40:01 +08:00
屈轩
adf05b2988 fix(region): esxi v2v prefer storage (#25556) 2026-09-04 17:33:39 +08:00
Jian Qiu
3c35e76604 fix(webconsole): authenticate sftp endpoints and check session owner (#25551)
The sftp list/download/upload endpoints were not protected by
authentication, only by the UUID4 session id. Anyone who learned the
session id (it appears in URLs and logs) could list, download and
upload files of the VM over the victim's active SSH/SFTP channel.

Wrap all three endpoints with auth.Authenticate and record the owner
of each sftp session at registration, so only the user who opened the
session can use it.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 13:45:50 +08:00
Jian Qiu
790d1437a8 fix(webconsole): validate ssh target ip against accessible resources (#25548)
The ssh console endpoint accepted a raw ip address in the URL path
and dialed it directly with user provided credentials, so any
authenticated user could use the webconsole service as an internal
SSH proxy, port scanner and credential brute-forcer.

Resolve the ip against hosts (access_ip) and servers (ip_addr)
visible to the user's session and require it to match one of them,
rejecting all other addresses.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 10:06:42 +08:00
Jian Qiu
5d5c052a9b fix(s3gateway): enforce signature freshness and single key decoding (#25536)
- Reject signed requests older or newer than 15 minutes (x-amz-date
  for v4, Date for v2), so intercepted valid requests can no longer
  be replayed indefinitely
- Decode the object key exactly once: r.URL.Path is already decoded
  by net/http and is the form the signature covers, decoding again
  let a signature for one key be replayed against another
  (e.g. %252e%252e%252f resolving to ../)
- Add unit tests for both behaviors

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:19:21 +08:00
Jian Qiu
3047bbdcda fix(webconsole): fetch kubeconfig with user session for k8s shell (#25539)
The k8s shell/log endpoints fetched the target cluster kubeconfig
with the admin session, bypassing RBAC and owner scope checks, so any
authenticated user could exec into pods and read logs of any
registered cluster.

Fetch the kubeconfig with the user's own session instead, so policy
checks and owner filtering apply, and command records are attributed
to the real user.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:18:17 +08:00
Jian Qiu
2321b65ee1 fix(webconsole): generate session key with crypto/rand (#25542)
The AES key encrypting all console session tokens was derived from
rand.Float32 with only about 24 bits of entropy, so it could be
recovered by brute force from a single known (session id, token)
pair and then be used to forge access tokens of arbitrary sessions.

Generate the key from 32 crypto/rand bytes instead (about 192 bits
of effective entropy). Sessions live in process memory only, so a
per-process random key is sufficient.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:17:22 +08:00
Jian Qiu
70391d0158 fix(webconsole): isolate RDP console sessions with unique ids (#25545)
RemoteRDPConsoleInfo.GetId() always returned an empty string, so all
RDP sessions were stored under the same key in the session manager:
any valid RDP access token resolved to whatever RDP session was stored
last, letting a user take over another user's console session
(host/port/username/password).

Give every RDP session a random UUID id and validate in
SSessionManager.Get that the presented access token is exactly the
one issued for the session, so sessions can not be reached by any
other token.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-04 09:16:43 +08:00
wanyaoqi
af794715fd fix(region): use host type hypervisor rather than kvm (#25533) 2026-09-03 23:54:21 +08:00
Jian Qiu
4f1706d285 fix(appsrv): do not honor CORS credentials for wildcard origins (#25517)
With cors_hosts unset (the default), the CORS middleware allowed all
origins and echoed the request origin together with
Access-Control-Allow-Credentials, so any website could make
authenticated cross-origin requests against the API with the user's
cookies.

Credentials are now only honored for explicitly listed origins:
with an empty or wildcard origin allowlist the middleware responds
with Access-Control-Allow-Origin: * and no credentials header.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:52:58 +08:00
Jian Qiu
d8facf9ffd fix: convert sql.ErrNoRows to 404 not found (#25524)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-03 23:50:55 +08:00
Jian Qiu
8cab0232c4 fix(notify): harden verification code generation and verification (#25528)
- Generate verification codes with crypto/rand instead of the
  predictable time-seeded math/rand
- Count failed verification attempts and invalidate the code after
  verify_max_attempts (default 5) failures, closing the unlimited
  online brute force of the 6-digit code at the login endpoint
- Delete the verification record after a successful check so codes
  are single use and can not be replayed within the validity window
- Add unit tests for code generation

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:48:40 +08:00
Jian Qiu
c053206af9 fix(hostimage): harden nbd export against command injection (#25531)
The nbd export endpoints interpolated the request disk_id into
shell commands (sh -c with the joined qemu-nbd command line, and
ps|grep for the process check), so a crafted disk_id could execute
arbitrary commands as root on the host image service.

- Require the disk_id to be a plain UUID in both export and close
  endpoints
- Run qemu-nbd with argv instead of sh -c
- Check the export process via its pid file and kill -0 instead of
  shell pipelines
- Add unit tests for the validation and the process check

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 23:47:31 +08:00
Zexi Li
a79c399c2f feat(llm): support cancel and resume for instant model import (#25520)
Allow deleting models to abort in-flight downloads, persist import input for resume-import after killed status, and clean up import cache on delete.
2026-09-03 20:14:35 +08:00
Jian Qiu
add8d8381f fix: mask tokens and passwords in logs (#25514)
Full session tokens were written to logs in policy.go, mcclient auth,
oidc handler and the webconsole session manager; guest root passwords
were logged by the linux fsdriver and the nbdkit mount command; MCP
tool arguments and full JSON-RPC bodies (which may contain
server-reset-password passwords) were logged by the llm agent.

Truncate tokens in log messages, drop or mask password values and
log only the tool/method name for MCP calls.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 19:27:34 +08:00
Jian Qiu
2b0d3d4362 fix(mcp-server): do not expose server-monitor as an MCP tool (#25512)
server-monitor sends arbitrary QMP/HMP commands (pmemsave, migrate,
etc.) to a running guest, which exceeds the semantics of monitoring.
As an MCP tool it could be triggered without human awareness through
LLM prompt injection or the tool-request endpoint.

Remove the mcp-desc registration tag from ServerMonitorOptions so
climcgen no longer registers the tool, drop its mention from the MCP
instructions, and add a regression test asserting it is not exposed.
The climc command and the permission-gated region API are unchanged.

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 19:21:31 +08:00
屈轩
413f014f9c fix(region): vmware vm nic sync (#25509) 2026-09-03 18:27:32 +08:00
Jian Qiu
32477e1620 fix(hostman): harden deployer command execution against shell injection (#25499)
- Quote the heredoc delimiter when writing deploy params to the
  deployer guest, so deploy content, passwords and other
  user-supplied values are written literally and shell expansions
  ($(...), backticks, $VAR) inside them are not evaluated by the
  remote shell
- Escape JSON passed via --deploy-params as a single POSIX shell
  word, preventing single quotes in user data from breaking out of
  the argument
- Add unit tests covering injection payloads

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 10:55:43 +08:00
Jian Qiu
4c3c641c97 fix(webconsole): harden climc shell command execution against injection (#25497)
- Run ssh via exec.Command argv instead of "bash -c" string
  interpolation, so user-supplied fields can no longer escape into
  local shell commands on the webconsole server
- Quote every interpolated value (env, command, args) as a POSIX
  shell word, so they stay literal data on the remote shell
- Validate username charset and limit target_ip to climc pod or container
- Add unit tests covering injection payloads

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 10:52:10 +08:00
Jian Qiu
919d2b9d56 fix: apigateway returns cors_hosts to browser (#25492)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-03 00:50:01 +08:00
Jian Qiu
4e798c8b95 fix: update rpm build scripts for openeuler (#25473)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-09-02 17:50:20 +08:00
Zexi Li
071e4fcb2d Automated cherry pick of #25479: Feat/aiproxy model context window (#25480)
* feat(aiproxy): expose catalog context window on AI models

Populate known 1M+ context windows in catalog seed data and return
context_window in AI model list/detail API responses.

* feat(aiproxy): add instance test-connectivity and set-models actions

Add provider instance test-connectivity using stored ai_key secrets,
and set-models to import selected catalog models while skipping
existing model_key rows. Register corresponding climc perform commands.
2026-09-02 17:43:42 +08:00
wanyaoqi
4126bd8494 fix(region): disable startrun snapshotsCleanup (#25448) 2026-09-02 15:59:16 +08:00
Zexi Li
90364a81df fix(cloudcommon): fix err shadowing in GetPropertyDistinctField (#25471) 2026-09-02 15:58:11 +08:00
屈轩
3bcd053ad5 fix(region): optimized cachedimage list (#25467) 2026-09-02 11:40:32 +08:00
屈轩
5ea244bc5c fix(region): support filter cloudprovider by regions (#25462) 2026-09-01 16:05:55 +08:00
屈轩
b3905f139e fix(region): vendor update (#25459) 2026-09-01 13:41:41 +08:00
屈轩
8b2994a380 fix(apigateway): update mcp api addr (#25455) 2026-09-01 13:41:14 +08:00
屈轩
637c5b15a2 fix(region): optimized cachedimage list (#25452) 2026-09-01 09:18:12 +08:00
Zexi Li
69f9ff2a61 feat(llm): add llm_sku clone API and climc support (#25444) v4.0.4-20260828.0 v4.0.4-20260831.0 v4.0.4-20260831.1 2026-08-27 19:01:15 +08:00
wanyaoqi
8abb4057f1 fix(region,host): optimize snapshot delete (#25441)
use rebase/commit merge backing chain instead of convert.
v4.0.4-20260827.0
2026-08-27 16:22:54 +08:00
wanyaoqi
8f13c93e28 fix(region): batch detach isolated devices (#25434) 2026-08-27 13:48:53 +08:00
wanyaoqi
a61a824884 fix(region): set default stop time 300s (#25431) 2026-08-26 15:15:33 +08:00
Jian Qiu
cc2cd72a2f fix: allow empty host networks (#25427)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-26 14:39:06 +08:00
屈轩
fa594fe753 fix(region): not real delete glance cachedimage (#25425) v4.0.4-20260826.0 2026-08-25 14:59:03 +08:00
wanyaoqi
24a245fd4f fix(host-deployer): no noeed clean failed mountpoints (#25421) 2026-08-25 11:35:02 +08:00
Jian Qiu
dbb6c4a17b fix: allow create-disk without disk args (#25414)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
2026-08-24 15:48:00 +08:00
屈轩
139df655b7 fix(region): v2v migrate uefi check (#25418) 2026-08-24 15:40:51 +08:00
屈轩
04c6ed26bf fix(glance): avoid receive notify when glance restart (#25411) 2026-08-24 15:05:14 +08:00
wanyaoqi
8bff91b52d fix(host-health,region): host health detect network available add check peers and default gw (#25384) v4.0.4-20260824.0 2026-08-24 14:34:20 +08:00
屈轩
2898cdb20a fix(region): skip hostlocal wire when detect vmware net (#25406) 2026-08-24 14:19:39 +08:00
屈轩
c8ddc8665f fix(region): show more error info for vmware net detect (#25402) 2026-08-24 10:21:33 +08:00
Zexi Li
9f318bbff6 feat(llm): merge SKU envs into container and validate prefer_hosts updates (#25388)
Allow local_path SKUs to update prefer_hosts on edit, and overlay SKU envs onto the primary container with same-key override.
2026-08-21 14:27:42 +08:00
Jian Qiu
8081f677c7 fix: unhandled errors (#25379)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
v4.0.4-20260820.0
2026-08-20 17:30:49 +08:00
Zexi Li
a2d0a0a799 fix(host): skip unmanage interface when bridge slave has no address (#25381)
Only call tryUnmanageInterface when the slave interface has IPv4 or IPv6
addresses configured, avoiding unnecessary NetworkManager unmanage on
address-less interfaces during bridge setup.
2026-08-20 17:27:10 +08:00
屈轩
d109f5bf35 fix(region): skip sync cloudpods kvm secgroup (#25378) 2026-08-20 10:45:13 +08:00
wanyaoqi
8aed63bd0d Automated cherry pick of #25365: fix(region,host): guest stop add timeout options,and check is_force (#25368)
* fix(host): check qga guest-get-osinfo error

* fix(region,host): guest stop add timeout options and is_force check
2026-08-20 10:15:27 +08:00
屈轩
c241fc1210 fix(region): support cloudpods ipset (#25374) 2026-08-19 18:56:38 +08:00
Zexi Li
388bba8e85 fix(scheduler): report HAMI hostFree before min-memory filter (#25370)
Shortage messages now show remaining GPU memory from matched devices
before min-memory filtering, so users see actual free capacity instead of 0.
2026-08-19 16:40:13 +08:00