You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@answer.apache.org by li...@apache.org on 2024/05/27 08:03:44 UTC
(incubator-answer) 01/02: feat: Support SMTP Encryption using TLS
This is an automated email from the ASF dual-hosted git repository.
linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit c1eb74bfb0910e5000d9b5979cc7844b82600594
Author: sy-records <52...@qq52o.cn>
AuthorDate: Mon May 20 15:14:24 2024 +0800
feat: Support SMTP Encryption using TLS
---
docs/docs.go | 92 +++++++++++++++++++++++++++-----------
docs/swagger.json | 92 +++++++++++++++++++++++++++-----------
docs/swagger.yaml | 83 ++++++++++++++++++----------------
i18n/en_US.yaml | 1 +
i18n/zh_CN.yaml | 1 +
internal/schema/siteinfo_schema.go | 4 +-
ui/src/pages/Admin/Smtp/index.tsx | 4 +-
7 files changed, 180 insertions(+), 97 deletions(-)
diff --git a/docs/docs.go b/docs/docs.go
index 3b8e51e3..d5f2e590 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -6208,9 +6208,9 @@ const docTemplate = `{
}
}
},
- "/answer/api/v1/user/register/captcha": {
- "get": {
- "description": "UserRegisterCaptcha",
+ "/answer/api/v1/user/register/email": {
+ "post": {
+ "description": "UserRegisterByEmail",
"consumes": [
"application/json"
],
@@ -6220,7 +6220,18 @@ const docTemplate = `{
"tags": [
"User"
],
- "summary": "UserRegisterCaptcha",
+ "summary": "UserRegisterByEmail",
+ "parameters": [
+ {
+ "description": "UserRegisterReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserRegisterReq"
+ }
+ }
+ ],
"responses": {
"200": {
"description": "OK",
@@ -6243,9 +6254,14 @@ const docTemplate = `{
}
}
},
- "/answer/api/v1/user/register/email": {
- "post": {
- "description": "UserRegisterByEmail",
+ "/answer/api/v1/user/staff": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user staff",
"consumes": [
"application/json"
],
@@ -6255,15 +6271,15 @@ const docTemplate = `{
"tags": [
"User"
],
- "summary": "UserRegisterByEmail",
+ "summary": "get user staff",
"parameters": [
{
- "description": "UserRegisterReq",
+ "description": "GetUserStaffReq",
"name": "data",
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/schema.UserRegisterReq"
+ "$ref": "#/definitions/schema.GetUserStaffReq"
}
}
],
@@ -6279,7 +6295,7 @@ const docTemplate = `{
"type": "object",
"properties": {
"data": {
- "$ref": "#/definitions/schema.UserLoginResp"
+ "$ref": "#/definitions/schema.GetUserStaffResp"
}
}
}
@@ -6927,7 +6943,6 @@ const docTemplate = `{
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"mention_username_list": {
@@ -7985,7 +8000,7 @@ const docTemplate = `{
"type": "object",
"properties": {
"encryption": {
- "description": "\"\" SSL",
+ "description": "\"\" SSL TLS",
"type": "string"
},
"from_email": {
@@ -8333,6 +8348,36 @@ const docTemplate = `{
}
}
},
+ "schema.GetUserStaffReq": {
+ "type": "object",
+ "properties": {
+ "page_size": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "username": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.GetUserStaffResp": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ }
+ }
+ },
"schema.GetVoteWithPageResp": {
"type": "object",
"properties": {
@@ -8869,7 +8914,6 @@ const docTemplate = `{
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"comment_id": {
@@ -9882,10 +9926,11 @@ const docTemplate = `{
"type": "object",
"properties": {
"encryption": {
- "description": "\"\" SSL",
+ "description": "\"\" SSL TLS",
"type": "string",
"enum": [
- "SSL"
+ "SSL",
+ "TLS"
]
},
"from_email": {
@@ -10117,12 +10162,10 @@ const docTemplate = `{
],
"properties": {
"captcha_code": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"captcha_id": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"e_mail": {
"type": "string",
@@ -10287,12 +10330,10 @@ const docTemplate = `{
],
"properties": {
"captcha_code": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"captcha_id": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"old_pass": {
"type": "string",
@@ -10440,15 +10481,12 @@ const docTemplate = `{
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"is_cancel": {
- "description": "is cancel",
"type": "boolean"
},
"object_id": {
- "description": "id",
"type": "string"
}
}
diff --git a/docs/swagger.json b/docs/swagger.json
index 00b06d9a..58cc5389 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -6177,9 +6177,9 @@
}
}
},
- "/answer/api/v1/user/register/captcha": {
- "get": {
- "description": "UserRegisterCaptcha",
+ "/answer/api/v1/user/register/email": {
+ "post": {
+ "description": "UserRegisterByEmail",
"consumes": [
"application/json"
],
@@ -6189,7 +6189,18 @@
"tags": [
"User"
],
- "summary": "UserRegisterCaptcha",
+ "summary": "UserRegisterByEmail",
+ "parameters": [
+ {
+ "description": "UserRegisterReq",
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/schema.UserRegisterReq"
+ }
+ }
+ ],
"responses": {
"200": {
"description": "OK",
@@ -6212,9 +6223,14 @@
}
}
},
- "/answer/api/v1/user/register/email": {
- "post": {
- "description": "UserRegisterByEmail",
+ "/answer/api/v1/user/staff": {
+ "get": {
+ "security": [
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "get user staff",
"consumes": [
"application/json"
],
@@ -6224,15 +6240,15 @@
"tags": [
"User"
],
- "summary": "UserRegisterByEmail",
+ "summary": "get user staff",
"parameters": [
{
- "description": "UserRegisterReq",
+ "description": "GetUserStaffReq",
"name": "data",
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/schema.UserRegisterReq"
+ "$ref": "#/definitions/schema.GetUserStaffReq"
}
}
],
@@ -6248,7 +6264,7 @@
"type": "object",
"properties": {
"data": {
- "$ref": "#/definitions/schema.UserLoginResp"
+ "$ref": "#/definitions/schema.GetUserStaffResp"
}
}
}
@@ -6896,7 +6912,6 @@
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"mention_username_list": {
@@ -7954,7 +7969,7 @@
"type": "object",
"properties": {
"encryption": {
- "description": "\"\" SSL",
+ "description": "\"\" SSL TLS",
"type": "string"
},
"from_email": {
@@ -8302,6 +8317,36 @@
}
}
},
+ "schema.GetUserStaffReq": {
+ "type": "object",
+ "properties": {
+ "page_size": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "username": {
+ "type": "string",
+ "maxLength": 500
+ }
+ }
+ },
+ "schema.GetUserStaffResp": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "description": "avatar",
+ "type": "string"
+ },
+ "display_name": {
+ "description": "display name",
+ "type": "string"
+ },
+ "username": {
+ "description": "username",
+ "type": "string"
+ }
+ }
+ },
"schema.GetVoteWithPageResp": {
"type": "object",
"properties": {
@@ -8838,7 +8883,6 @@
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"comment_id": {
@@ -9851,10 +9895,11 @@
"type": "object",
"properties": {
"encryption": {
- "description": "\"\" SSL",
+ "description": "\"\" SSL TLS",
"type": "string",
"enum": [
- "SSL"
+ "SSL",
+ "TLS"
]
},
"from_email": {
@@ -10086,12 +10131,10 @@
],
"properties": {
"captcha_code": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"captcha_id": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"e_mail": {
"type": "string",
@@ -10256,12 +10299,10 @@
],
"properties": {
"captcha_code": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"captcha_id": {
- "type": "string",
- "maxLength": 500
+ "type": "string"
},
"old_pass": {
"type": "string",
@@ -10409,15 +10450,12 @@
"type": "string"
},
"captcha_id": {
- "description": "captcha_id",
"type": "string"
},
"is_cancel": {
- "description": "is cancel",
"type": "boolean"
},
"object_id": {
- "description": "id",
"type": "string"
}
}
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 8c094f86..5b7a7de7 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -1,20 +1,3 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
definitions:
constant.NotificationChannelKey:
enum:
@@ -181,7 +164,6 @@ definitions:
captcha_code:
type: string
captcha_id:
- description: captcha_id
type: string
mention_username_list:
description: '@ user id list'
@@ -930,7 +912,7 @@ definitions:
schema.GetSMTPConfigResp:
properties:
encryption:
- description: '"" SSL'
+ description: '"" SSL TLS'
type: string
from_email:
type: string
@@ -1169,6 +1151,27 @@ definitions:
slug_name:
type: string
type: object
+ schema.GetUserStaffReq:
+ properties:
+ page_size:
+ minimum: 1
+ type: integer
+ username:
+ maxLength: 500
+ type: string
+ type: object
+ schema.GetUserStaffResp:
+ properties:
+ avatar:
+ description: avatar
+ type: string
+ display_name:
+ description: display name
+ type: string
+ username:
+ description: username
+ type: string
+ type: object
schema.GetVoteWithPageResp:
properties:
answer_id:
@@ -1541,7 +1544,6 @@ definitions:
captcha_code:
type: string
captcha_id:
- description: captcha_id
type: string
comment_id:
description: comment id
@@ -2234,9 +2236,10 @@ definitions:
schema.UpdateSMTPConfigReq:
properties:
encryption:
- description: '"" SSL'
+ description: '"" SSL TLS'
enum:
- SSL
+ - TLS
type: string
from_email:
maxLength: 256
@@ -2397,10 +2400,8 @@ definitions:
schema.UserChangeEmailSendCodeReq:
properties:
captcha_code:
- maxLength: 500
type: string
captcha_id:
- maxLength: 500
type: string
e_mail:
maxLength: 500
@@ -2521,10 +2522,8 @@ definitions:
schema.UserModifyPasswordReq:
properties:
captcha_code:
- maxLength: 500
type: string
captcha_id:
- maxLength: 500
type: string
old_pass:
maxLength: 32
@@ -2628,13 +2627,10 @@ definitions:
captcha_code:
type: string
captcha_id:
- description: captcha_id
type: string
is_cancel:
- description: is cancel
type: boolean
object_id:
- description: id
type: string
required:
- object_id
@@ -6390,11 +6386,18 @@ paths:
summary: get user ranking
tags:
- User
- /answer/api/v1/user/register/captcha:
- get:
+ /answer/api/v1/user/register/email:
+ post:
consumes:
- application/json
- description: UserRegisterCaptcha
+ description: UserRegisterByEmail
+ parameters:
+ - description: UserRegisterReq
+ in: body
+ name: data
+ required: true
+ schema:
+ $ref: '#/definitions/schema.UserRegisterReq'
produces:
- application/json
responses:
@@ -6407,21 +6410,21 @@ paths:
data:
$ref: '#/definitions/schema.UserLoginResp'
type: object
- summary: UserRegisterCaptcha
+ summary: UserRegisterByEmail
tags:
- User
- /answer/api/v1/user/register/email:
- post:
+ /answer/api/v1/user/staff:
+ get:
consumes:
- application/json
- description: UserRegisterByEmail
+ description: get user staff
parameters:
- - description: UserRegisterReq
+ - description: GetUserStaffReq
in: body
name: data
required: true
schema:
- $ref: '#/definitions/schema.UserRegisterReq'
+ $ref: '#/definitions/schema.GetUserStaffReq'
produces:
- application/json
responses:
@@ -6432,9 +6435,11 @@ paths:
- $ref: '#/definitions/handler.RespBody'
- properties:
data:
- $ref: '#/definitions/schema.UserLoginResp'
+ $ref: '#/definitions/schema.GetUserStaffResp'
type: object
- summary: UserRegisterByEmail
+ security:
+ - ApiKeyAuth: []
+ summary: get user staff
tags:
- User
/answer/api/v1/vote/down:
diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index 25f3ad04..850dc7d1 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -1667,6 +1667,7 @@ ui:
msg: Encryption cannot be empty.
text: For most servers SSL is the recommended option.
ssl: SSL
+ tls: TLS
none: None
smtp_port:
label: SMTP port
diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml
index 9abddc22..f92974ad 100644
--- a/i18n/zh_CN.yaml
+++ b/i18n/zh_CN.yaml
@@ -1620,6 +1620,7 @@ ui:
msg: 不能为空
text: 对于大多数服务器而言,SSL 是推荐开启的。
ssl: SSL
+ tls: TLS
none: 无加密
smtp_port:
label: SMTP 端口
diff --git a/internal/schema/siteinfo_schema.go b/internal/schema/siteinfo_schema.go
index ea19d046..abb9ea37 100644
--- a/internal/schema/siteinfo_schema.go
+++ b/internal/schema/siteinfo_schema.go
@@ -236,7 +236,7 @@ type UpdateSMTPConfigReq struct {
FromName string `validate:"omitempty,gt=0,lte=256" json:"from_name"`
SMTPHost string `validate:"omitempty,gt=0,lte=256" json:"smtp_host"`
SMTPPort int `validate:"omitempty,min=1,max=65535" json:"smtp_port"`
- Encryption string `validate:"omitempty,oneof=SSL" json:"encryption"` // "" SSL
+ Encryption string `validate:"omitempty,oneof=SSL TLS" json:"encryption"` // "" SSL TLS
SMTPUsername string `validate:"omitempty,gt=0,lte=256" json:"smtp_username"`
SMTPPassword string `validate:"omitempty,gt=0,lte=256" json:"smtp_password"`
SMTPAuthentication bool `validate:"omitempty" json:"smtp_authentication"`
@@ -260,7 +260,7 @@ type GetSMTPConfigResp struct {
FromName string `json:"from_name"`
SMTPHost string `json:"smtp_host"`
SMTPPort int `json:"smtp_port"`
- Encryption string `json:"encryption"` // "" SSL
+ Encryption string `json:"encryption"` // "" SSL TLS
SMTPUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password"`
SMTPAuthentication bool `json:"smtp_authentication"`
diff --git a/ui/src/pages/Admin/Smtp/index.tsx b/ui/src/pages/Admin/Smtp/index.tsx
index 40725c31..cde274e3 100644
--- a/ui/src/pages/Admin/Smtp/index.tsx
+++ b/ui/src/pages/Admin/Smtp/index.tsx
@@ -55,8 +55,8 @@ const Smtp: FC = () => {
type: 'string',
title: t('encryption.label'),
description: t('encryption.text'),
- enum: ['SSL', ''],
- enumNames: ['SSL', 'None'],
+ enum: ['TLS', 'SSL', ''],
+ enumNames: ['TLS', 'SSL', 'None'],
},
smtp_port: {
type: 'string',