Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions controllers/corp_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,11 +201,15 @@ func (ctl *CorporationSigningController) GetAll() {
}

// @Title GetPage
// @Description get all the corporations by page
// @Description get all the corporations by page with search support
// @Tags CorpSigning
// @Accept json
// @Param link_id path string true "link id"
// @Success 200 {object} models.CorporationSigningSummary
// @Param link_id path string true "link id"
// @Param page query int false "page number" default(1)
// @Param page_size query int false "page size" default(10)
// @Param admin_added query bool false "filter by admin added" default(false)
// @Param search query string false "search query (email or corp name)"
// @Success 200 {object} models.CorporationSigningPageSummary
// @Failure 400 missing_url_path_parameter: missing url path parameter
// @Failure 401 missing_token: token is missing
// @Failure 402 unknown_token: token is unknown
Expand All @@ -229,12 +233,15 @@ func (ctl *CorporationSigningController) GetPage() {
return
}
adminAdded, sizeErr := ctl.GetBool("admin_added", false)
searchQuery := ctl.GetString("search") // 新增搜索参数

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

为了保持代码库语言一致性并提高可维护性,建议将此处的中文注释修改为英文。

Suggested change
searchQuery := ctl.GetString("search") // 新增搜索参数
searchQuery := ctl.GetString("search") // new search parameter


pl, fr := ctl.tokenPayloadBasedOnCorpManager()
if fr != nil {
ctl.sendFailedResultAsResp(fr, action)
return
}
if r, merr := models.ListPageCorpSigning(pl.UserId, linkID, page, pageSize, adminAdded); merr != nil {

if r, merr := models.ListPageCorpSigning(pl.UserId, linkID, page, pageSize, adminAdded, searchQuery); merr != nil {
ctl.sendModelErrorAsResp(merr, action)
} else {
ctl.sendSuccessResp(action, r)
Expand Down
4 changes: 2 additions & 2 deletions models/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ func ListCorpSigning(userId, linkID string) ([]CorporationSigningSummary, IModel
return corpSigningAdapterInstance.List(userId, linkID)
}

func ListPageCorpSigning(userId, linkID string, page, pageSize int, adminAdded bool) (CorporationSigningPageSummary, IModelError) {
return corpSigningAdapterInstance.ListPage(userId, linkID, page, pageSize, adminAdded)
func ListPageCorpSigning(userId, linkID string, page, pageSize int, adminAdded bool, searchQuery string) (CorporationSigningPageSummary, IModelError) {
return corpSigningAdapterInstance.ListPage(userId, linkID, page, pageSize, adminAdded, searchQuery)
}

func GetCorpSigning(userId, csId string, email dp.EmailAddr) (string, CorporationSigning, IModelError) {
Expand Down
2 changes: 1 addition & 1 deletion models/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type corpSigningAdapter interface {
Remove(string, string) IModelError
Get(userId, csId string, email dp.EmailAddr) (string, CorporationSigning, IModelError)
List(userId, linkId string) ([]CorporationSigningSummary, IModelError)
ListPage(userId, linkId string, page, pageSize int, adminAdded bool) (CorporationSigningPageSummary, IModelError)
ListPage(userId, linkId string, page, pageSize int, adminAdded bool, searchQuery string) (CorporationSigningPageSummary, IModelError)
FindCorpSummary(linkId string, email string) (interface{}, IModelError)
FindDiffCLAFile(signingId string) (string, IModelError)
Agree(signingId string) IModelError
Expand Down
4 changes: 2 additions & 2 deletions signing/adapter/corp_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,15 +169,15 @@ func (adapter *corpSigningAdatper) List(userId, linkId string) (
return r, nil
}

func (adapter *corpSigningAdatper) ListPage(userId, linkId string, page, pageSize int, adminAdded bool) (
func (adapter *corpSigningAdatper) ListPage(userId, linkId string, page, pageSize int, adminAdded bool, searchQuery string) (
models.CorporationSigningPageSummary, models.IModelError,
) {
var pageData models.CorporationSigningPageSummary
pageData.Total = 0
if page <= 0 || pageSize <= 0 {
return pageData, toModelError(errors.New("invalid param"))
}
v, err := adapter.s.ListPage(userId, linkId, page, pageSize, adminAdded)
v, err := adapter.s.ListPage(userId, linkId, page, pageSize, adminAdded, searchQuery)
if err != nil {
return pageData, toModelError(err)
}
Expand Down
6 changes: 3 additions & 3 deletions signing/app/corp_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ type CorpSigningService interface {
Remove(userId, csId string) error
Get(userId, csId string, email dp.EmailAddr) (string, CorpSigningInfoDTO, error)
List(userId, linkId string) ([]CorpSigningDTO, error)
ListPage(userId, linkId string, page, pageSize int, adminAdded bool) (CorpSigningPageDTO, error)
ListPage(userId, linkId string, page, pageSize int, adminAdded bool, searchQuery string) (CorpSigningPageDTO, error)
FindCorpSummary(cmd *CmdToFindCorpSummary) ([]CorpSummaryDTO, error)
FindDiffCLAFile(signingId string) (string, error)
AgreeWithLatestCLA(signingId string) error
Expand Down Expand Up @@ -147,14 +147,14 @@ func (s *corpSigningService) List(userId, linkId string) ([]CorpSigningDTO, erro
return dtos, nil
}

func (s *corpSigningService) ListPage(userId, linkId string, page, pageSize int, adminAdded bool) (CorpSigningPageDTO, error) {
func (s *corpSigningService) ListPage(userId, linkId string, page, pageSize int, adminAdded bool, searchQuery string) (CorpSigningPageDTO, error) {
var pageData CorpSigningPageDTO
pageData.Total = 0
if _, err := checkIfCommunityManager(userId, linkId, s.linkRepo); err != nil {
return pageData, err
}

v, err := s.repo.FindPage(linkId, page, pageSize, adminAdded)
v, err := s.repo.FindPage(linkId, page, pageSize, adminAdded, searchQuery)
if err != nil || v.Total == 0 {
return pageData, err
}
Expand Down
2 changes: 1 addition & 1 deletion signing/domain/repository/corp_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type CorpSigning interface {
Find(string) (domain.CorpSigning, error)
Remove(*domain.CorpSigning) error
FindAll(linkId string) ([]CorpSigningSummary, error)
FindPage(linkId string, intPage, intPageSize int, adminAdded bool) (CorpSigningSummaryPage, error)
FindPage(linkId string, intPage, intPageSize int, adminAdded bool, searchQuery string) (CorpSigningSummaryPage, error)
FindAllWithPagination(linkId string, offset, limit int) ([]CorpSigningSummary, error)
CountByLinkId(linkId string) (int64, error)

Expand Down
20 changes: 19 additions & 1 deletion signing/infrastructure/repositoryimpl/corp_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,26 @@ func (impl *corpSigning) CountByLinkId(linkId string) (int64, error) {
return impl.dao.CountDocs(filter)
}

func (impl *corpSigning) FindPage(linkId string, intPage, intPageSize int, adminAdded bool) (repository.CorpSigningSummaryPage, error) {
// 邮箱验证辅助函数
func isEmail(query string) bool {
// 使用现有的邮箱验证逻辑
_, err := dp.NewEmailAddr(query)
Comment on lines +215 to +218

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

为了保持代码库语言一致性并提高可维护性,建议将此处的中文注释修改为英文。

Suggested change
// 邮箱验证辅助函数
func isEmail(query string) bool {
// 使用现有的邮箱验证逻辑
_, err := dp.NewEmailAddr(query)
// isEmail is a helper function to validate an email address.
func isEmail(query string) bool {
// use the existing email validation logic
_, err := dp.NewEmailAddr(query)

return err == nil
}

func (impl *corpSigning) FindPage(linkId string, intPage, intPageSize int, adminAdded bool, searchQuery string) (repository.CorpSigningSummaryPage, error) {
filter := linkIdFilter(linkId)
// 添加搜索过滤条件
if searchQuery != "" {
if isEmail(searchQuery) {
// 按邮箱搜索
filter[childField(fieldRep, fieldEmail)] = searchQuery
} else {
// 按企业名称搜索(模糊匹配)
filter[childField(fieldCorp, fieldName)] = bson.M{"$regex": searchQuery, "$options": "i"}
}
}
Comment on lines +225 to +233

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

此处的搜索逻辑存在几个问题:

  1. 安全漏洞 (高危):直接使用 searchQuery 作为正则表达式存在正则表达式拒绝服务(ReDoS)风险。恶意用户可以输入精心构造的正则表达式,导致服务器CPU占用过高。应使用 regexp.QuoteMeta() 对用户输入进行转义。

  2. 逻辑不完备:当前逻辑是“如果查询是邮箱格式,则按邮箱搜索,否则按企业名称搜索”。这会导致如果一个企业名称恰好是合法的邮箱格式(例如 email.com),则无法通过企业名称搜索到它。同时,如果用户输入部分邮箱地址,也无法进行搜索。更好的做法是同时在企业名称和邮箱两个字段中进行模糊搜索。

  3. 代码可维护性:代码中的注释是中文,为了方便团队中所有成员理解和维护,建议使用英文注释。

建议修改为使用 $or 操作符同时搜索企业名称和邮箱字段,并修复安全漏洞。请注意,此建议需要导入 regexp 包。

if searchQuery != "" {
		// To prevent ReDoS, escape the search query for use in regex.
		escapedQuery := regexp.QuoteMeta(searchQuery)
		regexFilter := bson.M{"\$regex": escapedQuery, "\$options": "i"}

		filter["\$or"] = bson.A{
			bson.M{childField(fieldCorp, fieldName): regexFilter},
			bson.M{childField(fieldRep, fieldEmail): regexFilter},
		}
	}


if adminAdded {
filter["admin.id"] = bson.M{"$ne": ""}
} else {
Expand Down
Loading