-
Notifications
You must be signed in to change notification settings - Fork 4.4k
Fix: CNAME validation #9861
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: CNAME validation #9861
Conversation
WalkthroughThe update modifies the logic for determining the target CNAME domain in the API proxy controller. The target domain is now selected dynamically based on the rule's type and, for deployments, the deployment resource type. The DNS CNAME validator is only added when an appropriate target domain is determined and validated. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant ProxyController
participant EnvConfig
participant DNSValidator
Client->>ProxyController: Request with rule
ProxyController->>ProxyController: Check rule.type
alt type == 'api'
ProxyController->>EnvConfig: Get _APP_DOMAIN_TARGET_CNAME
else type == 'redirect'
ProxyController->>EnvConfig: Get _APP_DOMAIN_SITES
else type == 'deployment'
ProxyController->>ProxyController: Check deploymentResourceType
alt deploymentResourceType == 'function'
ProxyController->>EnvConfig: Get _APP_DOMAIN_FUNCTIONS
else deploymentResourceType == 'site'
ProxyController->>EnvConfig: Get _APP_DOMAIN_SITES
end
else
ProxyController->>ProxyController: Set targetCNAME = null
end
ProxyController->>DNSValidator: Add CNAME validator if targetCNAME is valid
ProxyController->>DNSValidator: Add A/AAAA validators (unchanged)
ProxyController-->>Client: Continue processing
Poem
Note ⚡️ AI Code Reviews for VS Code, Cursor, WindsurfCodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback. Note ⚡️ Faster reviews with cachingCodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 30th. To opt out, configure ✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
app/controllers/api/proxy.php (2)
217-243
: Improved domain validation logic based on rule typeThe implementation now correctly determines the target CNAME based on the rule type and deployment resource type, which makes the validation more accurate. Each rule type (api, redirect, deployment) now points to its appropriate target domain, enhancing the reliability of DNS validation.
Consider extracting this logic into a separate method like
getTargetCNAMEForRule($rule)
to improve readability and maintainability. This would make the code more modular and easier to test.- $targetCNAME = null; - switch ($rule->getAttribute('type', '')) { - case 'api': - // For example: fra.cloud.appwrite.io - $targetCNAME = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')); - break; - case 'redirect': - // For example: appwrite.network - $targetCNAME = new Domain(System::getEnv('_APP_DOMAIN_SITES', '')); - break; - case 'deployment': - switch ($rule->getAttribute('deploymentResourceType', '')) { - case 'function': - // For example: fra.appwrite.run - $targetCNAME = new Domain(System::getEnv('_APP_DOMAIN_FUNCTIONS', '')); - break; - case 'site': - // For example: appwrite.network - $targetCNAME = new Domain(System::getEnv('_APP_DOMAIN_SITES', '')); - break; - default: - break; - } - // no break - default: - break; - } + $targetCNAME = $this->getTargetCNAMEForRule($rule);Then add this method to the class:
private function getTargetCNAMEForRule(Document $rule): ?Domain { switch ($rule->getAttribute('type', '')) { case 'api': // For example: fra.cloud.appwrite.io return new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')); case 'redirect': // For example: appwrite.network return new Domain(System::getEnv('_APP_DOMAIN_SITES', '')); case 'deployment': switch ($rule->getAttribute('deploymentResourceType', '')) { case 'function': // For example: fra.appwrite.run return new Domain(System::getEnv('_APP_DOMAIN_FUNCTIONS', '')); case 'site': // For example: appwrite.network return new Domain(System::getEnv('_APP_DOMAIN_SITES', '')); default: return null; } // no break intentionally to fall through to default default: return null; } }
247-251
: Improved CNAME validator addition logicThe code now only adds a DNS validator for CNAME records when an appropriate target domain is determined and is valid. This prevents validation against inappropriate or invalid target domains.
Consider adding a log entry when a target CNAME is not available or not valid for debugging purposes:
if (!is_null($targetCNAME)) { if ($targetCNAME->isKnown() && !$targetCNAME->isTest()) { $validators[] = new DNS($targetCNAME->get(), DNS::RECORD_CNAME); + } else { + $log->debug('Target CNAME is known or is test domain, skipping CNAME validation'); } + } else { + $log->debug('No target CNAME determined for rule type: ' . $rule->getAttribute('type', '')); }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
app/controllers/api/proxy.php
(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
app/controllers/api/proxy.php (1)
src/Appwrite/Network/Validator/DNS.php (1)
DNS
(7-111)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: scan
Security Scan Results for PRDocker Image Scan Results
Source Code Scan Results🎉 No vulnerabilities found! |
✨ Benchmark results
⚡ Benchmark Comparison
|
What does this PR do?
(Provide a description of what this PR does and why it's needed.)
Test Plan
(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work. Screenshots may also be helpful.)
Related PRs and Issues
Checklist
Summary by CodeRabbit