PrestaShop Bridge V1
v1.0.3Secure skill pack for operating a PrestaShop 9 Bridge through a stable, signed, asynchronous API contract.
MIT-0
Security Scan
OpenClaw
Suspicious
medium confidencePurpose & Capability
The SKILL.md, README, openapi.yaml, and schemas consistently describe a PrestaShop Bridge that legitimately requires secrets (OAuth client credentials, JWT keys, HMAC secret), Redis and MySQL access. However the registry-level 'Requirements' summary (top of the provided metadata) lists no required environment variables or config paths, which is inconsistent with _meta.json, docs, and the validator that all declare many required runtime variables. This mismatch between published metadata and the package contents is a red flag (either metadata was omitted or the package may be incomplete).
Instruction Scope
The SKILL.md instructions themselves are narrowly scoped to API usage, signing, and polling and explicitly forbid direct DB/filesystem access. That is coherent for a bridge contract. However the included validator script reads local files and expects a .env file and examples.http; the SKILL.md and docs instruct maintainers to run the validator and to verify exact HMAC examples. The validator also embeds a fixed SECRET used to compute example HMACs, which leaks an example signing secret inside the package and increases the chance someone will accidentally reuse it.
Install Mechanism
This is an instruction-only pack with no install spec and no external downloads — low installation risk. The only code files are small validators/eval scripts included for local verification.
Credentials
The package (in _meta.json and docs) declares many sensitive environment variables (OAUTH_CLIENT_SECRET, JWT_PRIVATE_KEY_PATH, HMAC_SECRET_CURRENT/PREVIOUS, DATABASE_URL, REDIS_DSN, etc.), which are proportionate to the stated bridge purpose. The problem is the registry-level requirements shown to the platform were empty; that inconsistency could cause a user to install without providing required secrets. Additionally, validators/validate_examples.py embeds a long hex SECRET constant — this is a hard-coded secret inside the repo (not a platform requirement) and could be mistaken for a runtime secret or misused; it's poor hygiene and may aid attackers if reused.
Persistence & Privilege
The skill does not request permanent platform presence (always:false) and does not request elevated platform privileges. It does not modify other skills. Autonomous invocation remains enabled (normal), but there is no combination of 'always' plus broad credentials here.
What to consider before installing
Do not install or use this pack until you confirm a few things: 1) The registry/manifest shown to the platform should list the same required environment variables declared inside _meta.json and docs—if the platform shows none, ask the publisher why. 2) Verify the package actually includes .env.bridge.example and examples.http referenced by the validator; those files appear to be missing from the provided manifest. 3) Inspect validators/validate_examples.py: it contains a hard-coded SECRET used to compute example HMACs — treat this as an example secret only and ensure you never deploy or reuse it in production. 4) Confirm the package origin and homepage/source (source is unknown here); prefer packages with a verifiable upstream repo or publisher. 5) If you plan to deploy, ensure secrets (oauth client secret, HMAC secrets, JWT private key, DATABASE_URL, REDIS_DSN) are provided through secure secret storage and not committed. 6) Ask the publisher to fix metadata inconsistencies (registry requirements, included example files) and to remove or clearly label any embedded test secrets before trusting automated agents with these credentials.Like a lobster shell, security has layers — review code before you run it.
apibridgehmaclatestoauth2openclawprestashopsymfony
License
MIT-0
Free to use, modify, and redistribute. No attribution required.
SKILL.md
PrestaShop Bridge V1
PrestaShop Bridge V1 is a secure operational contract for AI agents and Python handlers that need to interact with a PrestaShop 9 store through a stable interface. It standardizes OAuth2 authentication, HMAC request signing, rate limiting, asynchronous writes, idempotency, and durable job polling.
Operating model
- Reads are synchronous.
- Writes are asynchronous.
- Redis is used only for Messenger transport and temporary HTTP idempotency cache.
- MySQL is the source of truth for job status, business idempotency, and failed jobs.
- A
202 Acceptedresponse means only that a job was accepted for processing. It never means business success.
Capabilities
get_product
- method:
GET - endpoint:
/v1/products/{id} - sync:
true - scope:
bridge:read - params:
idinteger, required
- success:
200
get_order
- method:
GET - endpoint:
/v1/orders/{id} - sync:
true - scope:
bridge:read - params:
idinteger, required
- success:
200
get_job_status
- method:
GET - endpoint:
/v1/jobs/{jobId} - sync:
true - scope:
bridge:read - note: job status is read from MySQL, not from Redis
- success:
200
update_product
- method:
POST - endpoint:
/v1/jobs/products/update - sync:
false - scope:
bridge:write - idempotency:
X-Request-IDrequired - payload:
product_idupdates.price_htupdates.stock_deltaupdates.seooptions.skip_reindex
- success:
202
import_products
- method:
POST - endpoint:
/v1/jobs/products/import - sync:
false - scope:
bridge:write - idempotency: request id required and stable
batch_id - payload:
batch_iditemsoptions
- constraints:
- maximum
50items - maximum payload size
10MB
- maximum
- success:
202
update_order_status
- method:
POST - endpoint:
/v1/jobs/orders/status - sync:
false - scope:
bridge:write - idempotency:
X-Request-IDrequired - payload:
order_idnew_statusnotify_customertracking_number
- success:
202
Security
Required headers on protected routes
Authorization: Bearer {jwt_rs256_token}X-Request-ID: {uuid_v4}X-Timestamp: {unix_seconds}X-Signature: {hmac_sha256_hex}Content-Type: application/jsonAccept: application/json
Compression
- gzip recommended above
1024bytes - gzip required above
32768bytes
OAuth2
- flow:
client_credentials - token endpoint:
/oauth/token - JWT algorithm:
RS256 - TTL:
3600 - scopes:
bridge:readbridge:write
HMAC
String to sign:
METHOD + "\n" + URI + "\n" + TIMESTAMP + "\n" + REQUEST_ID + "\n" + BODY_SHA256
Exact example:
- method:
POST - uri:
/v1/jobs/products/update - timestamp:
1710950400 - request id:
f47ac10b-58cc-4372-a567-0e02b2c3d479 - body sha256:
37abd647733fbd18a3f11fb5a082fe59c62719d9fe833aec96b28ccea36b70ba - signature:
448e251d1c71078b07a10baf4094fd2686bcebef97761c4729a921f71798554c
Response handling
200 OK: synchronous read success or completed idempotent replay.202 Accepted: job accepted only. Always poll/v1/jobs/{jobId}.400 Bad Request: schema validation failed.401 Unauthorized: JWT missing, invalid, or expired.403 Forbidden: invalid HMAC, invalid timestamp window, or insufficient scope.409 Conflict: idempotency conflict or known failed replay.422 Unprocessable Entity: valid JSON but impossible business transition.429 Too Many Requests: wait forRetry-After.500 Internal Server Error: unexpected server failure.503 Service Unavailable: service degraded or Redis unavailable.
Absolute refusal rules
- Never report business success immediately after a
202. - Never modify TTC price directly. Only HT price may be changed.
- Never delete a product that has associated orders.
- Never access the database or filesystem directly.
- Never send payloads larger than
10MB. - Never perform heavy writes synchronously.
- Never reuse an
X-Request-IDfor a different business intention within 24 hours.
Pre-deployment checks
- Verify JWT issuance and validation with RS256 only.
- Verify the exact HMAC example in
examples.http. - Verify schema validation for all request bodies.
- Verify Redis-backed idempotency replay behavior.
- Verify MySQL-backed job polling after Redis restart.
- Verify idempotent handlers under at-least-once delivery.
Files
42 totalSelect a file
Select a file to preview.
Comments
Loading comments…
