Merge branch 'main' of https://github.com/appwrite/appwrite into feat-add-version-header

This commit is contained in:
loks0n 2024-05-08 10:05:23 +01:00
commit 824309e4e6
18 changed files with 183 additions and 97 deletions

View file

@ -0,0 +1,19 @@
name: Check dependencies
# Adapted from https://google.github.io/osv-scanner/github-action/#scan-on-pull-request
on:
pull_request:
branches: [main, 1.*.x]
merge_group:
branches: [main, 1.*.x]
permissions:
# Require writing security events to upload SARIF file to security tab
security-events: write
# Only need to read contents
contents: read
jobs:
scan-pr:
uses: "google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@v1.7.1"

23
.github/workflows/stale.yml vendored Normal file
View file

@ -0,0 +1,23 @@
name: Mark stale issues
on:
schedule:
- cron: "0 0 * * *" # Midnight Runtime
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: "This issue has been labeled as a 'question', indicating that it requires additional information from the requestor. It has been inactive for 7 days. If no further activity occurs, this issue will be closed in 14 days."
stale-issue-label: "stale"
days-before-stale: 7
days-before-close: 14
remove-stale-when-updated: true
close-issue-message: "This issue has been closed due to inactivity. If you still require assistance, please provide the requested information."
close-issue-reason: "not_planned"
operations-per-run: 100
only-labels: "question"

View file

@ -11,6 +11,7 @@
</p> </p>
<!-- [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) --> <!-- [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) -->
[![We're Hiring](https://img.shields.io/static/v1?label=We're&message=Hiring&color=blue&style=flat-square)](https://appwrite.io/company/careers) [![We're Hiring](https://img.shields.io/static/v1?label=We're&message=Hiring&color=blue&style=flat-square)](https://appwrite.io/company/careers)
[![Hacktoberfest](https://img.shields.io/static/v1?label=hacktoberfest&message=friendly&color=191120&style=flat-square)](https://hacktoberfest.appwrite.io) [![Hacktoberfest](https://img.shields.io/static/v1?label=hacktoberfest&message=friendly&color=191120&style=flat-square)](https://hacktoberfest.appwrite.io)
[![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord?r=Github) [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord?r=Github)
@ -25,7 +26,7 @@
[**Appwrite 云公开测试版!立即注册!**](https://cloud.appwrite.io) [**Appwrite 云公开测试版!立即注册!**](https://cloud.appwrite.io)
Appwrite是一个基于Docker的端到端开发者平台其容器化的微服务库可应用于网页端移动端以及后端。Appwrite 通过视觉化界面简化了从零开始编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。 Appwrite 是一个基于 Docker 的端到端开发者平台其容器化的微服务库可应用于网页端移动端以及后端。Appwrite 通过视觉化界面简化了从零开始编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。
Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存,图像处理,云函数计算,[等多种服务](https://appwrite.io/docs). Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存,图像处理,云函数计算,[等多种服务](https://appwrite.io/docs).
@ -93,7 +94,6 @@ docker run -it --rm `
运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。 运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。
需要自定义容器构架,请查看我们的 Docker [环境变量](https://appwrite.io/docs/environment-variables) 文档。您还可以参考我们的 [docker-compose.yml](https://appwrite.io/install/compose) 和 [.env](https://appwrite.io/install/env) 文件手动设置环境。 需要自定义容器构架,请查看我们的 Docker [环境变量](https://appwrite.io/docs/environment-variables) 文档。您还可以参考我们的 [docker-compose.yml](https://appwrite.io/install/compose) 和 [.env](https://appwrite.io/install/env) 文件手动设置环境。
### 从旧版本升级 ### 从旧版本升级
@ -104,71 +104,73 @@ docker run -it --rm `
开始使用 Appwrite 只需要在控制台创建一个新项目,选择开发平台,然后抓取我们的开发套件。您可以从以下的教程中找到你喜欢的平台开始使用 Appwrite。 开始使用 Appwrite 只需要在控制台创建一个新项目,选择开发平台,然后抓取我们的开发套件。您可以从以下的教程中找到你喜欢的平台开始使用 Appwrite。
| 类别 | 技术 | | 类别 | 技术 |
|---------------------|------| | ------------------ | --------------------------------------------------------------------------- |
| **Web 应用** | [Web 快速开始](/docs/quick-starts/web) | | **Web 应用** | [Web 快速开始](https://appwrite.io/docs/quick-starts/web) |
| | [Next.js 快速开始](/docs/quick-starts/nextjs) | | | [Next.js 快速开始](https://appwrite.io/docs/quick-starts/nextjs) |
| | [React 快速开始](/docs/quick-starts/react) | | | [React 快速开始](https://appwrite.io/docs/quick-starts/react) |
| | [Vue.js 快速开始](/docs/quick-starts/vue) | | | [Vue.js 快速开始](https://appwrite.io/docs/quick-starts/vue) |
| | [Nuxt 快速开始](/docs/quick-starts/nuxt) | | | [Nuxt 快速开始](https://appwrite.io/docs/quick-starts/nuxt) |
| | [SvelteKit 快速开始](/docs/quick-starts/sveltekit) | | | [SvelteKit 快速开始](https://appwrite.io/docs/quick-starts/sveltekit) |
| | [Refine 快速开始](/docs/quick-starts/refine) | | | [Refine 快速开始](https://appwrite.io/docs/quick-starts/refine) |
| | [Angular 快速开始](/docs/quick-starts/angular) | | | [Angular 快速开始](https://appwrite.io/docs/quick-starts/angular) |
| **苹果于安卓应用** | [React Native 快速开始](/docs/quick-starts/react-native) | | **苹果于安卓应用** | [React Native 快速开始](https://appwrite.io/docs/quick-starts/react-native) |
| | [Flutter 快速开始](/docs/quick-starts/flutter) | | | [Flutter 快速开始](https://appwrite.io/docs/quick-starts/flutter) |
| | [Apple 快速开始](/docs/quick-starts/apple) | | | [Apple 快速开始](https://appwrite.io/docs/quick-starts/apple) |
| | [Android 快速开始](/docs/quick-starts/android) | | | [Android 快速开始](https://appwrite.io/docs/quick-starts/android) |
| **服务器** | [Node.js 快速开始](/docs/quick-starts/node) | | **服务器** | [Node.js 快速开始](https://appwrite.io/docs/quick-starts/node) |
| | [Python 快速开始](/docs/quick-starts/python) | | | [Python 快速开始](https://appwrite.io/docs/quick-starts/python) |
| | [.NET 快速开始](/docs/quick-starts/dotnet) | | | [.NET 快速开始](https://appwrite.io/docs/quick-starts/dotnet) |
| | [Dart 快速开始](/docs/quick-starts/dart) | | | [Dart 快速开始](https://appwrite.io/docs/quick-starts/dart) |
| | [Ruby 快速开始](/docs/quick-starts/ruby) | | | [Ruby 快速开始](https://appwrite.io/docs/quick-starts/ruby) |
| | [Deno 快速开始](/docs/quick-starts/deno) | | | [Deno 快速开始](https://appwrite.io/docs/quick-starts/deno) |
| | [PHP 快速开始](/docs/quick-starts/php) | | | [PHP 快速开始](https://appwrite.io/docs/quick-starts/php) |
| | [Kotlin 快速开始](/docs/quick-starts/kotlin) | | | [Kotlin 快速开始](https://appwrite.io/docs/quick-starts/kotlin) |
| | [Swift 快速开始](/docs/quick-starts/swift) | | | [Swift 快速开始](https://appwrite.io/docs/quick-starts/swift) |
### 软件服务 ### 软件服务
* [**帐户**](https://appwrite.io/docs/references/cloud/client-web/account) -管理当前用户的帐户和登录方式。跟踪和管理用户 Session登录设备登录方法和查看相关记录。 - [**帐户**](https://appwrite.io/docs/references/cloud/client-web/account) -管理当前用户的帐户和登录方式。跟踪和管理用户 Session登录设备登录方法和查看相关记录。
* [**用户**](https://appwrite.io/docs/server/users) - 在以管理员模式登录时管理和列出所有用户。 - [**用户**](https://appwrite.io/docs/server/users) - 在以管理员模式登录时管理和列出所有用户。
* [**团队**](https://appwrite.io/docs/references/cloud/client-web/teams) - 管理用户分组。邀请成员,管理团队中的用户权限和用户角色。 - [**团队**](https://appwrite.io/docs/references/cloud/client-web/teams) - 管理用户分组。邀请成员,管理团队中的用户权限和用户角色。
* [**数据库**](https://appwrite.io/docs/references/cloud/client-web/databases) - 管理数据库文档和文档集。用检索界面来对文档和文档集进行读取,创建,更新,和删除。 - [**数据库**](https://appwrite.io/docs/references/cloud/client-web/databases) - 管理数据库文档和文档集。用检索界面来对文档和文档集进行读取,创建,更新,和删除。
* [**贮存**](https://appwrite.io/docs/references/cloud/client-web/storage) - 管理文件的阅读、创建、删除和预览。设置文件的预览来满足程序的个性化需求。所有文件都由 ClamAV 扫描并安全存储和加密。 - [**贮存**](https://appwrite.io/docs/references/cloud/client-web/storage) - 管理文件的阅读、创建、删除和预览。设置文件的预览来满足程序的个性化需求。所有文件都由 ClamAV 扫描并安全存储和加密。
* [**云函数**](https://appwrite.io/docs/server/functions) - 在安全隔离的环境中运行自定义代码。这些代码可以被事件CRON或者手动操作触发。 - [**云函数**](https://appwrite.io/docs/server/functions) - 在安全隔离的环境中运行自定义代码。这些代码可以被事件CRON或者手动操作触发。
* [**消息传递**](https://appwrite.io/docs/references/cloud/client-web/messaging) - 使用 Appwrite 消息传递功能通过推送通知、电子邮件和短信与用户进行通信。 - [**消息传递**](https://appwrite.io/docs/references/cloud/client-web/messaging) - 使用 Appwrite 消息传递功能通过推送通知、电子邮件和短信与用户进行通信。
* [**语言适配**](https://appwrite.io/docs/references/cloud/client-web/locale) - 根据用户所在的的国家和地区做出合适的语言适配。 - [**语言适配**](https://appwrite.io/docs/references/cloud/client-web/locale) - 根据用户所在的的国家和地区做出合适的语言适配。
* [**头像**](https://appwrite.io/docs/references/cloud/client-web/avatars) -管理用户头像、国家旗帜、浏览器图标、信用卡符号,和生成二维码。 - [**头像**](https://appwrite.io/docs/references/cloud/client-web/avatars) -管理用户头像、国家旗帜、浏览器图标、信用卡符号,和生成二维码。
如需完整的 API 界面文档,请访问 [https://appwrite.io/docs](https://appwrite.io/docs)。如需更多教程、新闻和公告,请订阅我们的 [博客](https://medium.com/appwrite-io) 和 加入我们的[Discord 社区](https://discord.gg/GSeTUeA)。 如需完整的 API 界面文档,请访问 [https://appwrite.io/docs](https://appwrite.io/docs)。如需更多教程、新闻和公告,请订阅我们的 [博客](https://medium.com/appwrite-io) 和 加入我们的[Discord 社区](https://discord.gg/GSeTUeA)。
### 开发套件 ### 开发套件
以下是当前支持的平台和语言列表。如果您想帮助我们为您选择的平台添加支持,您可以访问我们的 [SDK 生成器](https://github.com/appwrite/sdk-generator) 项目并查看我们的 [贡献指南](https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md)。 以下是当前支持的平台和语言列表。如果您想帮助我们为您选择的平台添加支持,您可以访问我们的 [SDK 生成器](https://github.com/appwrite/sdk-generator) 项目并查看我们的 [贡献指南](https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md)。
#### 客户端 #### 客户端
* ✅ &nbsp; [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
* ✅ &nbsp; [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护) - ✅ &nbsp; [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
* ✅ &nbsp; [Apple](https://github.com/appwrite/sdk-for-apple) (由 Appwrite 团队维护) - ✅ &nbsp; [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护)
* ✅ &nbsp; [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护) - ✅ &nbsp; [Apple](https://github.com/appwrite/sdk-for-apple) (由 Appwrite 团队维护)
* ✅ &nbsp; [React Native](https://github.com/appwrite/sdk-for-react-native) - **公测** (由 Appwrite 团队维护) - ✅ &nbsp; [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护)
- ✅ &nbsp; [React Native](https://github.com/appwrite/sdk-for-react-native) - **公测** (由 Appwrite 团队维护)
#### 服务器 #### 服务器
* ✅ &nbsp; [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
* ✅ &nbsp; [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护) - ✅ &nbsp; [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
* ✅ &nbsp; [Dart](https://github.com/appwrite/sdk-for-dart) (由 Appwrite 团队维护) - ✅ &nbsp; [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护)
* ✅ &nbsp; [Deno](https://github.com/appwrite/sdk-for-deno) (由 Appwrite 团队维护) - ✅ &nbsp; [Dart](https://github.com/appwrite/sdk-for-dart) (由 Appwrite 团队维护)
* ✅ &nbsp; [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护) - ✅ &nbsp; [Deno](https://github.com/appwrite/sdk-for-deno) (由 Appwrite 团队维护)
* ✅ &nbsp; [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护) - ✅ &nbsp; [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护)
* ✅ &nbsp; [Kotlin](https://github.com/appwrite/sdk-for-kotlin) (由 Appwrite 团队维护) - ✅ &nbsp; [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护)
* ✅ &nbsp; [Swift](https://github.com/appwrite/sdk-for-swift) (由 Appwrite 团队维护) - ✅ &nbsp; [Kotlin](https://github.com/appwrite/sdk-for-kotlin) (由 Appwrite 团队维护)
* ✅ &nbsp; [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护) - ✅ &nbsp; [Swift](https://github.com/appwrite/sdk-for-swift) (由 Appwrite 团队维护)
- ✅ &nbsp; [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护)
#### 开发者社区 #### 开发者社区
* ✅ &nbsp; [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
* ✅ &nbsp; [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
找不到需要的的 SDK - 欢迎通过发起PR来帮助我们完善Appwrite的软件生态环境 [SDK 生成器](https://github.com/appwrite/sdk-generator)! - ✅ &nbsp; [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
- ✅ &nbsp; [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
找不到需要的的 SDK - 欢迎通过发起 PR 来帮助我们完善 Appwrite 的软件生态环境 [SDK 生成器](https://github.com/appwrite/sdk-generator)!
## 软件架构 ## 软件架构
@ -180,13 +182,13 @@ Appwrite API 界面层利用后台缓存和任务委派来提供极速的响应
## 贡献代码 ## 贡献代码
为了确保正确审查,所有代码贡献 - 包括来自具有直接提交更改权限的贡献者 - 都必须提交PR请求并在合并分支之前得到核心开发人员的批准。 为了确保正确审查,所有代码贡献 - 包括来自具有直接提交更改权限的贡献者 - 都必须提交 PR 请求并在合并分支之前得到核心开发人员的批准。
我们欢迎所有人提交PR如果您愿意提供帮助可以在 [贡献指南](CONTRIBUTING.md) 中了解有关如何为项目做出贡献的更多信息。 我们欢迎所有人提交 PR如果您愿意提供帮助可以在 [贡献指南](CONTRIBUTING.md) 中了解有关如何为项目做出贡献的更多信息。
## 安全 ## 安全
为了保护您的隐私请避免在GitHub 上发布安全问题。发送问题至 security@appwrite.io我们将为您做更细致的解答。 为了保护您的隐私,请避免在 GitHub 上发布安全问题。发送问题至 security@appwrite.io我们将为您做更细致的解答。
## 订阅我们 ## 订阅我们

View file

@ -10,7 +10,6 @@
<br /> <br />
</p> </p>
<!-- [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) --> <!-- [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) -->
[![We're Hiring](https://img.shields.io/static/v1?label=We're&message=Hiring&color=blue&style=flat-square)](https://appwrite.io/company/careers) [![We're Hiring](https://img.shields.io/static/v1?label=We're&message=Hiring&color=blue&style=flat-square)](https://appwrite.io/company/careers)
@ -142,29 +141,29 @@ Choose from one of the providers below:
Getting started with Appwrite is as easy as creating a new project, choosing your platform, and integrating its SDK into your code. You can easily get started with your platform of choice by reading one of our Getting Started tutorials. Getting started with Appwrite is as easy as creating a new project, choosing your platform, and integrating its SDK into your code. You can easily get started with your platform of choice by reading one of our Getting Started tutorials.
| Platform | Technology | | Platform | Technology |
|--------------------|------------| | --------------------- | ---------------------------------------------------------------------------------- |
| **Web app** | [Quick start for Web](/docs/quick-starts/web) | | **Web app** | [Quick start for Web](https://appwrite.io/docs/quick-starts/web) |
| | [Quick start for Next.js](/docs/quick-starts/nextjs) | | | [Quick start for Next.js](https://appwrite.io/docs/quick-starts/nextjs) |
| | [Quick start for React](/docs/quick-starts/react) | | | [Quick start for React](https://appwrite.io/docs/quick-starts/react) |
| | [Quick start for Vue.js](/docs/quick-starts/vue) | | | [Quick start for Vue.js](https://appwrite.io/docs/quick-starts/vue) |
| | [Quick start for Nuxt](/docs/quick-starts/nuxt) | | | [Quick start for Nuxt](https://appwrite.io/docs/quick-starts/nuxt) |
| | [Quick start for SvelteKit](/docs/quick-starts/sveltekit) | | | [Quick start for SvelteKit](https://appwrite.io/docs/quick-starts/sveltekit) |
| | [Quick start for Refine](/docs/quick-starts/refine) | | | [Quick start for Refine](https://appwrite.io/docs/quick-starts/refine) |
| | [Quick start for Angular](/docs/quick-starts/angular) | | | [Quick start for Angular](https://appwrite.io/docs/quick-starts/angular) |
| **Mobile and Native** | [Quick start for React Native](/docs/quick-starts/react-native) | | **Mobile and Native** | [Quick start for React Native](https://appwrite.io/docs/quick-starts/react-native) |
| | [Quick start for Flutter](/docs/quick-starts/flutter) | | | [Quick start for Flutter](https://appwrite.io/docs/quick-starts/flutter) |
| | [Quick start for Apple](/docs/quick-starts/apple) | | | [Quick start for Apple](https://appwrite.io/docs/quick-starts/apple) |
| | [Quick start for Android](/docs/quick-starts/android) | | | [Quick start for Android](https://appwrite.io/docs/quick-starts/android) |
| **Server** | [Quick start for Node.js](/docs/quick-starts/node) | | **Server** | [Quick start for Node.js](https://appwrite.io/docs/quick-starts/node) |
| | [Quick start for Python](/docs/quick-starts/python) | | | [Quick start for Python](https://appwrite.io/docs/quick-starts/python) |
| | [Quick start for .NET](/docs/quick-starts/dotnet) | | | [Quick start for .NET](https://appwrite.io/docs/quick-starts/dotnet) |
| | [Quick start for Dart](/docs/quick-starts/dart) | | | [Quick start for Dart](https://appwrite.io/docs/quick-starts/dart) |
| | [Quick start for Ruby](/docs/quick-starts/ruby) | | | [Quick start for Ruby](https://appwrite.io/docs/quick-starts/ruby) |
| | [Quick start for Deno](/docs/quick-starts/deno) | | | [Quick start for Deno](https://appwrite.io/docs/quick-starts/deno) |
| | [Quick start for PHP](/docs/quick-starts/php) | | | [Quick start for PHP](https://appwrite.io/docs/quick-starts/php) |
| | [Quick start for Kotlin](/docs/quick-starts/kotlin) | | | [Quick start for Kotlin](https://appwrite.io/docs/quick-starts/kotlin) |
| | [Quick start for Swift](/docs/quick-starts/swift) | | | [Quick start for Swift](https://appwrite.io/docs/quick-starts/swift) |
### Products ### Products

View file

@ -4,7 +4,7 @@ return [
'amex' => ['name' => 'American Express', 'path' => __DIR__ . '/credit-cards/amex.png'], 'amex' => ['name' => 'American Express', 'path' => __DIR__ . '/credit-cards/amex.png'],
'argencard' => ['name' => 'Argencard', 'path' => __DIR__ . '/credit-cards/argencard.png'], 'argencard' => ['name' => 'Argencard', 'path' => __DIR__ . '/credit-cards/argencard.png'],
'cabal' => ['name' => 'Cabal', 'path' => __DIR__ . '/credit-cards/cabal.png'], 'cabal' => ['name' => 'Cabal', 'path' => __DIR__ . '/credit-cards/cabal.png'],
'censosud' => ['name' => 'Consosud', 'path' => __DIR__ . '/credit-cards/consosud.png'], 'cencosud' => ['name' => 'Cencosud', 'path' => __DIR__ . '/credit-cards/cencosud.png'],
'diners' => ['name' => 'Diners Club', 'path' => __DIR__ . '/credit-cards/diners.png'], 'diners' => ['name' => 'Diners Club', 'path' => __DIR__ . '/credit-cards/diners.png'],
'discover' => ['name' => 'Discover', 'path' => __DIR__ . '/credit-cards/discover.png'], 'discover' => ['name' => 'Discover', 'path' => __DIR__ . '/credit-cards/discover.png'],
'elo' => ['name' => 'Elo', 'path' => __DIR__ . '/credit-cards/elo.png'], 'elo' => ['name' => 'Elo', 'path' => __DIR__ . '/credit-cards/elo.png'],

View file

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -11,7 +11,7 @@ return [
/** General Errors */ /** General Errors */
Exception::GENERAL_UNKNOWN => [ Exception::GENERAL_UNKNOWN => [
'name' => Exception::GENERAL_UNKNOWN, 'name' => Exception::GENERAL_UNKNOWN,
'description' => 'An unknown error has occured. Please check the logs for more information.', 'description' => 'An unknown error has occurred. Please check the logs for more information.',
'code' => 500, 'code' => 500,
], ],
Exception::GENERAL_MOCK => [ Exception::GENERAL_MOCK => [
@ -284,7 +284,7 @@ return [
], ],
Exception::USER_CHALLENGE_REQUIRED => [ Exception::USER_CHALLENGE_REQUIRED => [
'name' => Exception::USER_CHALLENGE_REQUIRED, 'name' => Exception::USER_CHALLENGE_REQUIRED,
'description' => 'A recently succeessful challenge is required to complete this action. A challenge is considered recent for 5 minutes.', 'description' => 'A recently successful challenge is required to complete this action. A challenge is considered recent for 5 minutes.',
'code' => 401, 'code' => 401,
], ],
Exception::USER_OAUTH2_BAD_REQUEST => [ Exception::USER_OAUTH2_BAD_REQUEST => [
@ -489,7 +489,7 @@ return [
], ],
Exception::REPOSITORY_NOT_FOUND => [ Exception::REPOSITORY_NOT_FOUND => [
'name' => Exception::REPOSITORY_NOT_FOUND, 'name' => Exception::REPOSITORY_NOT_FOUND,
'description' => 'Repository with the requested ID could not be found. Check to see if the ID is correct, or create the respository.', 'description' => 'Repository with the requested ID could not be found. Check to see if the ID is correct, or create the repository.',
'code' => 404, 'code' => 404,
], ],
Exception::PROVIDER_CONTRIBUTION_CONFLICT => [ Exception::PROVIDER_CONTRIBUTION_CONFLICT => [
@ -499,7 +499,7 @@ return [
], ],
Exception::GENERAL_PROVIDER_FAILURE => [ Exception::GENERAL_PROVIDER_FAILURE => [
'name' => Exception::GENERAL_PROVIDER_FAILURE, 'name' => Exception::GENERAL_PROVIDER_FAILURE,
'description' => 'VCS (Version Control System) provider failed to proccess the request. We believe this is an error with the VCS provider. Try again, or contact support for more information.', 'description' => 'VCS (Version Control System) provider failed to process the request. We believe this is an error with the VCS provider. Try again, or contact support for more information.',
'code' => 400, 'code' => 400,
], ],

View file

@ -1,5 +1,13 @@
<?php <?php
/**
* ISO 3166 standard country codes
* https://www.iso.org/iso-3166-country-codes.html
*
* Source:
* https://www.iso.org/obp/ui/#search/code/
*/
return [ return [
'AF', 'AF',
'AO', 'AO',

View file

@ -123,7 +123,8 @@ $createSession = function (string $userId, string $secret, Request $request, Res
Authorization::skip(fn () => $dbForProject->deleteDocument('tokens', $verifiedToken->getId())); Authorization::skip(fn () => $dbForProject->deleteDocument('tokens', $verifiedToken->getId()));
$dbForProject->purgeCachedDocument('users', $user->getId()); $dbForProject->purgeCachedDocument('users', $user->getId());
if ($verifiedToken->getAttribute('type') === Auth::TOKEN_TYPE_MAGIC_URL) { // Magic URL + Email OTP
if ($verifiedToken->getAttribute('type') === Auth::TOKEN_TYPE_MAGIC_URL || $verifiedToken->getAttribute('type') === Auth::TOKEN_TYPE_EMAIL) {
$user->setAttribute('emailVerification', true); $user->setAttribute('emailVerification', true);
} }

View file

@ -1282,7 +1282,7 @@ App::get('/v1/functions/:functionId/deployments')
} }
// Set resource queries // Set resource queries
$queries[] = Query::equal('resourceId', [$function->getId()]); $queries[] = Query::equal('resourceInternalId', [$function->getInternalId()]);
$queries[] = Query::equal('resourceType', ['functions']); $queries[] = Query::equal('resourceType', ['functions']);
/** /**

View file

@ -49,6 +49,12 @@ App::post('/v1/proxy/rules')
if ($domain === $mainDomain) { if ($domain === $mainDomain) {
throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'You cannot assign your main domain to specific resource. Please use subdomain or a different domain.'); throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'You cannot assign your main domain to specific resource. Please use subdomain or a different domain.');
} }
$functionsDomain = System::getEnv('_APP_DOMAIN_FUNCTIONS', '');
if (str_ends_with($domain, $functionsDomain)) {
throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'You cannot assign your functions domain or it\'s subdomain to specific resource. Please use different domain.');
}
if ($domain === 'localhost' || $domain === APP_HOSTNAME_INTERNAL) { if ($domain === 'localhost' || $domain === APP_HOSTNAME_INTERNAL) {
throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'This domain name is not allowed. Please pick another one.'); throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'This domain name is not allowed. Please pick another one.');
} }

View file

@ -697,7 +697,7 @@ App::shutdown()
if ($project->getId() !== 'console') { if ($project->getId() !== 'console') {
if ($mode !== APP_MODE_ADMIN) { if (!Auth::isPrivilegedUser(Authorization::getRoles())) {
$fileSize = 0; $fileSize = 0;
$file = $request->getFiles('file'); $file = $request->getFiles('file');
if (!empty($file)) { if (!empty($file)) {

View file

@ -837,7 +837,7 @@ $register->set('pools', function () {
/** /**
* Get Resource * Get Resource
* *
* Creation could be reused accross connection types like database, cache, queue, etc. * Creation could be reused across connection types like database, cache, queue, etc.
* *
* Resource assignment to an adapter will happen below. * Resource assignment to an adapter will happen below.
*/ */
@ -847,7 +847,7 @@ $register->set('pools', function () {
$resource = function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) { $resource = function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) {
return new PDOProxy(function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) { return new PDOProxy(function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) {
return new PDO("mysql:host={$dsnHost};port={$dsnPort};dbname={$dsnDatabase};charset=utf8mb4", $dsnUser, $dsnPass, array( return new PDO("mysql:host={$dsnHost};port={$dsnPort};dbname={$dsnDatabase};charset=utf8mb4", $dsnUser, $dsnPass, array(
// No need to set PDO::ATTR_ERRMODE it is overwitten in PDOProxy // No need to set PDO::ATTR_ERRMODE it is overwritten in PDOProxy
PDO::ATTR_TIMEOUT => 3, // Seconds PDO::ATTR_TIMEOUT => 3, // Seconds
PDO::ATTR_PERSISTENT => true, PDO::ATTR_PERSISTENT => true,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

View file

@ -103,7 +103,7 @@ class CalcTierStats extends Action
return; return;
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());
@ -129,7 +129,7 @@ class CalcTierStats extends Action
$data = $this->getData($project, $dbForConsole, $dbForProject); $data = $this->getData($project, $dbForConsole, $dbForProject);
$csv->insertOne($data); $csv->insertOne($data);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());

View file

@ -50,7 +50,7 @@ class CreateInfMetric extends Action
$dbForProject = call_user_func($getProjectDB, $project); $dbForProject = call_user_func($getProjectDB, $project);
$this->getUsageData($dbForProject, $project); $this->getUsageData($dbForProject, $project);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());
@ -72,7 +72,7 @@ class CreateInfMetric extends Action
$dbForProject = call_user_func($getProjectDB, $project); $dbForProject = call_user_func($getProjectDB, $project);
$this->getUsageData($dbForProject, $project); $this->getUsageData($dbForProject, $project);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());

View file

@ -42,7 +42,7 @@ class PatchRecreateRepositoriesDocuments extends Action
$dbForProject = call_user_func($getProjectDB, $project); $dbForProject = call_user_func($getProjectDB, $project);
$this->recreateRepositories($dbForConsole, $dbForProject, $project); $this->recreateRepositories($dbForConsole, $dbForProject, $project);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());
@ -64,7 +64,7 @@ class PatchRecreateRepositoriesDocuments extends Action
$dbForProject = call_user_func($getProjectDB, $project); $dbForProject = call_user_func($getProjectDB, $project);
$this->recreateRepositories($dbForConsole, $dbForProject, $project); $this->recreateRepositories($dbForConsole, $dbForProject, $project);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Console::error("Unexpected error occured with Project ID {$projectId}"); Console::error("Unexpected error occurred with Project ID {$projectId}");
Console::error('[Error] Type: ' . get_class($th)); Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage()); Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile()); Console::error('[Error] File: ' . $th->getFile());

View file

@ -202,6 +202,8 @@ trait AccountBase
$this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals(200, $response['headers']['status-code']);
$this->assertEquals($userId, $response['body']['$id']); $this->assertEquals($userId, $response['body']['$id']);
$this->assertEquals($userId, $response['body']['$id']);
$this->assertTrue($response['body']['emailVerification']);
$response = $this->client->call(Client::METHOD_POST, '/account/sessions/token', array_merge([ $response = $this->client->call(Client::METHOD_POST, '/account/sessions/token', array_merge([
'origin' => 'http://localhost', 'origin' => 'http://localhost',

View file

@ -2,17 +2,43 @@
namespace Tests\E2E\Services\Projects; namespace Tests\E2E\Services\Projects;
use Tests\E2E\Client;
use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\ProjectCustom;
use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\Scope;
use Tests\E2E\Scopes\SideServer; use Tests\E2E\Scopes\SideServer;
use Utopia\System\System;
class ProjectsCustomServerTest extends Scope class ProjectsCustomServerTest extends Scope
{ {
use ProjectCustom; use ProjectCustom;
use SideServer; use SideServer;
public function testMock() // Domains
public function testCreateProjectRule()
{ {
$this->assertEquals(true, true); $headers = array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-mode' => 'admin',
'cookie' => 'a_session_console=' . $this->getRoot()['session'],
]);
$response = $this->client->call(Client::METHOD_POST, '/proxy/rules', $headers, [
'resourceType' => 'api',
'domain' => 'api.appwrite.test',
]);
$this->assertEquals(201, $response['headers']['status-code']);
// prevent functions domain
$functionsDomain = System::getEnv('_APP_DOMAIN_FUNCTIONS', '');
$response = $this->client->call(Client::METHOD_POST, '/proxy/rules', $headers, [
'resourceType' => 'api',
'domain' => $functionsDomain,
]);
$this->assertEquals(400, $response['headers']['status-code']);
} }
} }