diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
new file mode 100644
index 0000000000..80d880244c
--- /dev/null
+++ b/.github/workflows/nightly.yml
@@ -0,0 +1,47 @@
+name: Nightly Security Scan
+on:
+ schedule:
+ - cron: '0 0 * * *' # 12am UTC daily runtime
+ workflow_dispatch:
+
+jobs:
+ scan-image:
+ name: Scan Docker Image
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Build the Docker image
+ run: docker build . -t appwrite_image:latest
+ - name: Run Trivy vulnerability scanner on image
+ uses: aquasecurity/trivy-action@0.20.0
+ with:
+ image-ref: 'appwrite_image:latest'
+ format: 'sarif'
+ output: 'trivy-image-results.sarif'
+ ignore-unfixed: 'false'
+ severity: 'CRITICAL,HIGH'
+ - name: Upload Docker Image Scan Results
+ uses: github/codeql-action/upload-sarif@v2
+ with:
+ sarif_file: 'trivy-image-results.sarif'
+
+ scan-code:
+ name: Scan Code
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ - name: Run Trivy vulnerability scanner on filesystem
+ uses: aquasecurity/trivy-action@0.20.0
+ with:
+ scan-type: 'fs'
+ format: 'sarif'
+ output: 'trivy-fs-results.sarif'
+ severity: 'CRITICAL,HIGH'
+ - name: Upload Code Scan Results
+ uses: github/codeql-action/upload-sarif@v2
+ with:
+ sarif_file: 'trivy-fs-results.sarif'
diff --git a/.github/workflows/pr-scan.yml b/.github/workflows/pr-scan.yml
index af510ccc3b..eded58985d 100644
--- a/.github/workflows/pr-scan.yml
+++ b/.github/workflows/pr-scan.yml
@@ -1,17 +1,22 @@
name: PR Security Scan
-on:
- pull_request:
+on:
+ pull_request_target:
types: [opened, synchronize, reopened]
- workflow_dispatch:
+
jobs:
scan:
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
steps:
- - name: Check out code
+ - name: Check out code
uses: actions/checkout@v4
with:
+ ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
submodules: 'recursive'
+
- name: Build the Docker image
uses: docker/build-push-action@v5
with:
@@ -19,6 +24,7 @@ jobs:
push: false
load: true
tags: pr_image:${{ github.sha }}
+
- name: Run Trivy vulnerability scanner on image
uses: aquasecurity/trivy-action@0.20.0
with:
@@ -26,6 +32,7 @@ jobs:
format: 'json'
output: 'trivy-image-results.json'
severity: 'CRITICAL,HIGH'
+
- name: Run Trivy vulnerability scanner on source code
uses: aquasecurity/trivy-action@0.20.0
with:
@@ -34,10 +41,11 @@ jobs:
format: 'json'
output: 'trivy-fs-results.json'
severity: 'CRITICAL,HIGH'
- - name: Process and post Trivy scan results
+
+ - name: Process Trivy scan results
+ id: process-results
uses: actions/github-script@v7
with:
- github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const fs = require('fs');
let commentBody = '## Security Scan Results for PR\n\n';
@@ -79,9 +87,19 @@ jobs:
commentBody += 'Please contact the core team for assistance.';
}
- github.rest.issues.createComment({
- issue_number: context.issue.number,
- owner: context.repo.owner,
- repo: context.repo.repo,
- body: commentBody
- });
+ core.setOutput('comment-body', commentBody);
+ - name: Find Comment
+ uses: peter-evans/find-comment@v3
+ id: fc
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ comment-author: 'github-actions[bot]'
+ body-includes: Security Scan Results for PR
+
+ - name: Create or update comment
+ uses: peter-evans/create-or-update-comment@v3
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ body: ${{ steps.process-results.outputs.comment-body }}
+ edit-mode: replace
diff --git a/README.md b/README.md
index 738de5c67c..a9856a7310 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-> Our Appwrite Init event has concluded. You can check out all the new and upcoming features [on our Init website](https://appwrite.io/init) 🚀
+> Appwrite Init has concluded! You can check out all the latest announcements [on our Init website](https://appwrite.io/init) 🚀
@@ -134,6 +134,12 @@ Choose from one of the providers below:
Akamai Compute
+
+
+
+ AWS Marketplace
+
+ |
diff --git a/app/config/function-templates.php b/app/config/function-templates.php
index 4b58cc44be..db26ff2c19 100644
--- a/app/config/function-templates.php
+++ b/app/config/function-templates.php
@@ -82,7 +82,7 @@ return [
'providerOwner' => 'appwrite',
'providerVersion' => '0.2.*',
'variables' => [],
- 'scopes' => ["users.read"]
+ 'scopes' => ['users.read']
],
[
'icon' => 'icon-upstash',
@@ -125,7 +125,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-redis',
@@ -167,7 +168,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-neo4j',
@@ -217,7 +219,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-mongodb',
@@ -253,7 +256,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-neon',
@@ -320,7 +324,8 @@ return [
'required' => true,
'type' => 'text'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-open-ai',
@@ -380,7 +385,8 @@ return [
'required' => false,
'type' => 'number'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-discord',
@@ -442,7 +448,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-perspective-api',
@@ -476,7 +483,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-pangea',
@@ -523,7 +531,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-document',
@@ -543,7 +552,8 @@ return [
'providerRepositoryId' => 'templates',
'providerOwner' => 'appwrite',
'providerVersion' => '0.2.*',
- 'variables' => []
+ 'variables' => [],
+ 'scopes' => []
],
[
'icon' => 'icon-github',
@@ -586,7 +596,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-bookmark',
@@ -637,7 +648,7 @@ return [
'type' => 'url'
]
],
- 'scopes' => ["databases.read", "databases.write", "collections.write", "attributes.write", "documents.read", "documents.write"]
+ 'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
],
[
'icon' => 'icon-algolia',
@@ -718,7 +729,7 @@ return [
'type' => 'password'
],
],
- 'scopes' => ["databases.read", "collections.read", "documents.read"]
+ 'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-meilisearch',
@@ -811,7 +822,7 @@ return [
'type' => 'text'
],
],
- 'scopes' => ["databases.read", "collections.read", "documents.read"]
+ 'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-vonage',
@@ -896,7 +907,8 @@ return [
'required' => true,
'type' => 'phone'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-bell',
@@ -951,7 +963,8 @@ return [
'required' => true,
'type' => 'url'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-mail',
@@ -1033,7 +1046,8 @@ return [
'required' => false,
'type' => 'text'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-stripe',
@@ -1074,7 +1088,7 @@ return [
'type' => 'password'
]
],
- 'scopes' => ["users.read", "sessions.write", "users.write"]
+ 'scopes' => ['users.read', 'sessions.write', 'users.write']
],
[
'icon' => 'icon-stripe',
@@ -1131,7 +1145,7 @@ return [
'type' => 'text'
]
],
- 'scopes' => ["databases.read", "databases.write", "collections.write", "attributes.write", "documents.read", "documents.write"]
+ 'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
],
[
'icon' => 'icon-chat',
@@ -1164,7 +1178,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-translate',
@@ -1197,7 +1212,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-eye',
@@ -1255,7 +1271,7 @@ return [
'type' => 'password'
]
],
- 'scopes' => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
+ 'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-eye',
@@ -1313,7 +1329,7 @@ return [
'type' => 'password'
]
],
- "scopes" => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
+ 'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-text',
@@ -1371,7 +1387,7 @@ return [
'type' => 'password'
]
],
- "scopes" => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
+ 'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-chat',
@@ -1429,7 +1445,7 @@ return [
'type' => 'password'
]
],
- "scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
+ 'scopes' => ['buckets.read', 'buckets.write', 'files.read', 'files.write']
],
[
'icon' => 'icon-chip',
@@ -1463,7 +1479,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-chip',
@@ -1505,7 +1522,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["buckets.write", "files.read", "files.write"]
+ 'scopes' => ['buckets.write', 'files.read', 'files.write']
],
[
'icon' => 'icon-chip',
@@ -1579,7 +1596,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-document-search',
@@ -1642,7 +1660,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["databases.read", "collections.read", "documents.read"]
+ 'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-chip',
@@ -1705,7 +1723,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["databases.read", "collections.read", "documents.read"]
+ 'scopes' => ['databases.read', 'collections.read', 'documents.read']
],
[
'icon' => 'icon-chat',
@@ -1760,7 +1778,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
+ 'scopes' => ['buckets.read', 'buckets.write', 'files.read', 'files.write']
],
[
'icon' => 'icon-chip',
@@ -1801,7 +1819,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
+ 'scopes' => ['buckets.read', 'buckets.write', 'files.read', 'files.write']
],
[
'icon' => 'icon-chip',
@@ -1841,7 +1859,8 @@ return [
'required' => false,
'type' => 'number'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-music-note',
@@ -1883,7 +1902,7 @@ return [
'type' => 'password'
]
],
- "scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
+ 'scopes' => ['buckets.read', 'buckets.write', 'files.read', 'files.write']
],
[
'icon' => 'icon-chip',
@@ -1917,7 +1936,8 @@ return [
'required' => true,
'type' => 'password'
]
- ]
+ ],
+ 'scopes' => []
],
[
'icon' => 'icon-currency-dollar',
@@ -1972,7 +1992,7 @@ return [
'type' => 'text'
]
],
- "scopes" => ["users.read", "users.write"]
+ 'scopes' => ['users.read', 'users.write']
],
[
'icon' => 'icon-currency-dollar',
@@ -2043,6 +2063,6 @@ return [
'type' => 'text'
]
],
- "scopes" => ["users.read", "users.write"]
+ 'scopes' => ['users.read', 'users.write']
]
];
diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php
index 0cb88d31fa..6d87940ff7 100644
--- a/app/controllers/shared/api.php
+++ b/app/controllers/shared/api.php
@@ -602,10 +602,11 @@ App::shutdown()
/**
* Trigger functions.
*/
- $queueForFunctions
- ->from($queueForEvents)
- ->trigger();
-
+ if (!$queueForEvents->isPaused()) {
+ $queueForFunctions
+ ->from($queueForEvents)
+ ->trigger();
+ }
/**
* Trigger webhooks.
*/
diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml
index 0124dbad01..8f83fed544 100644
--- a/app/views/install/compose.phtml
+++ b/app/views/install/compose.phtml
@@ -679,6 +679,7 @@ $image = $this->getParam('image', '');
entrypoint: worker-usage-dump
<<: *x-logging
container_name: appwrite-worker-usage-dump
+ restart: unless-stopped
networks:
- appwrite
depends_on:
@@ -792,7 +793,7 @@ $image = $this->getParam('image', '');
<<: *x-logging
restart: unless-stopped
stop_signal: SIGINT
- image: openruntimes/executor:0.6.7
+ image: openruntimes/executor:0.6.11
networks:
- appwrite
- runtimes
diff --git a/docker-compose.yml b/docker-compose.yml
index 4d91f61a70..6ecb0ecff8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -874,7 +874,7 @@ services:
hostname: exc1
<<: *x-logging
stop_signal: SIGINT
- image: openruntimes/executor:0.6.7
+ image: openruntimes/executor:0.6.11
restart: unless-stopped
networks:
- appwrite
diff --git a/public/images/integrations/aws-logo.svg b/public/images/integrations/aws-logo.svg
new file mode 100644
index 0000000000..3ab41cde07
--- /dev/null
+++ b/public/images/integrations/aws-logo.svg
@@ -0,0 +1,38 @@
+
+
+