Files
openhuman/src-tauri/src/alphahuman/gateway/client.rs
T
c2ff8b693b feat/openclaw (#128)
* feat: add initial project structure and documentation

- Introduced the GNU General Public License (GPL) v3 in LICENSE file.
- Added MCP configuration in .claude/mcp.json for server integration.
- Created architecture documentation in docs/ARCHITECTURE.md outlining the platform's design and components.
- Defined MVP specifications in docs/MVP.md for the Telegram-based Agent Assistant.
- Established API reference for team management in docs/teams-api-reference.md.
- Set up basic HTML structure in public/index.html and added logo image in public/logo.png.

* feat: add initial project documentation and HTML structure

- Introduced CODE_OF_CONDUCT.md to establish community guidelines and standards for behavior.
- Created CONTRIBUTING.md to outline contribution process, development setup, and project conventions.
- Added SECURITY.md to define the security policy, supported versions, and reporting procedures for vulnerabilities.
- Established basic HTML structure in index.html for the application interface.

* chore: remove hello-python skill files

- Deleted skill.json and skill.py files for the Hello Python example runtime skill, as they are no longer needed in the project.

* feat: port tinyhuman agent runtime from ZeroClaw into Tauri backend

Port daemon supervisor, health registry, security (policy, secrets, audit,
pairing), agent traits, and config modules from ZeroClaw (MIT) into a new
tinyhuman/ module under src-tauri/src/. The daemon auto-starts on desktop
and shuts down gracefully on app exit via CancellationToken.

- health: global HealthRegistry with component tracking and JSON snapshots
- security/policy: SecurityPolicy with command validation, risk levels, rate limiting
- security/secrets: ChaCha20-Poly1305 SecretStore with legacy XOR migration
- security/audit: AuditLogger with JSON-line events and log rotation
- security/pairing: PairingGuard with brute-force protection and SHA-256 hashing
- security/traits: Sandbox trait + NoopSandbox
- config: minimal DaemonConfig with autonomy, reliability, secrets, audit sub-configs
- daemon: supervisor with health state writer emitting Tauri events
- agent/traits: Provider, Tool, Memory, Observer, RuntimeAdapter traits + Noop impls
- commands/tinyhuman: Tauri commands for health, security policy, encrypt/decrypt
- 185 inline unit tests across all modules
- README updated with custom inference/tunneling/memory positioning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: update README to reflect AlphaHuman Mk1 branding and enhanced description

- Changed project title to "AlphaHuman Mk1" for clarity.
- Revised project description to emphasize user-friendly AI capabilities and the use of the Neocortex Mk1 model.
- Removed outdated sections on custom inference, tunneling, and memory, streamlining the content for better readability.

* update readme

* Port zeroclaw runtime into tinyhuman

* Replace CLI mentions with UI language

* Split gateway module into smaller units

* Split channels and config schema modules

* Fix tinyhuman build, tests, and tunnel integration

* feat(tinyhuman): add missing modules and ui-friendly services

* refactor: rename tinyhuman to alphahuman

* chore: remove bottom text from Welcome component

* feat(settings): add tauri command console

* feat(daemon): enhance daemon mode handling and integrate rustls with ring feature

* feat(settings): implement comprehensive configuration management in TauriCommandsPanel

* refactor(TauriCommandsPanel): streamline error handling and enhance async function usage

* feat(settings): add skill management functionality to TauriCommandsPanel

* style(TauriCommandsPanel): update input styles for improved readability and user experience

* feat(settings): add Skills and Agent Chat panels with navigation and integration management

* feat(settings): implement browser access management in SkillsPanel and enhance AgentChatPanel with local storage functionality

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 13:03:15 +04:00

66 lines
1.8 KiB
Rust

//! Client IP parsing and rate-limit key derivation.
use axum::http::HeaderMap;
use std::net::{IpAddr, SocketAddr};
/// Parse a client IP from a header value, tolerating quotes and socket formats.
pub fn parse_client_ip(value: &str) -> Option<IpAddr> {
let value = value.trim().trim_matches('"').trim();
if value.is_empty() {
return None;
}
if let Ok(ip) = value.parse::<IpAddr>() {
return Some(ip);
}
if let Ok(addr) = value.parse::<SocketAddr>() {
return Some(addr.ip());
}
let value = value.trim_matches(['[', ']']);
value.parse::<IpAddr>().ok()
}
/// Extract the first valid client IP from forwarding headers.
pub fn forwarded_client_ip(headers: &HeaderMap) -> Option<IpAddr> {
if let Some(xff) = headers.get("X-Forwarded-For").and_then(|v| v.to_str().ok()) {
for candidate in xff.split(',') {
if let Some(ip) = parse_client_ip(candidate) {
return Some(ip);
}
}
}
headers
.get("X-Real-IP")
.and_then(|v| v.to_str().ok())
.and_then(parse_client_ip)
}
/// Resolve a stable client key for rate limiting.
pub fn client_key_from_request(
connect_info: Option<SocketAddr>,
headers: &HeaderMap,
trust_forwarded_headers: bool,
) -> String {
if trust_forwarded_headers {
if let Some(forwarded) = forwarded_client_ip(headers) {
return forwarded.to_string();
}
}
connect_info
.map(|addr| addr.ip().to_string())
.unwrap_or_else(|| "unknown".to_string())
}
/// Normalize configured key counts, ensuring a non-zero default.
pub fn normalize_max_keys(configured: usize, fallback: usize) -> usize {
if configured == 0 {
fallback.max(1)
} else {
configured
}
}