@@ -3,6 +3,7 @@ package handles
33import (
44 "fmt"
55 stdpath "path"
6+ "regexp"
67 "strings"
78 "time"
89
@@ -416,6 +417,19 @@ type UpdateSharingReq struct {
416417 CreatorName string `json:"creator"`
417418 Accessed int `json:"accessed"`
418419 ID string `json:"id"`
420+ NewID string `json:"new_id"`
421+ }
422+
423+ var validSharingID = regexp .MustCompile (`^[\w\p{Han}\-]+$` )
424+
425+ func validateSharingID (id string ) error {
426+ if len ([]rune (id )) > 64 {
427+ return errors .New ("share id must be at most 64 characters" )
428+ }
429+ if ! validSharingID .MatchString (id ) {
430+ return errors .New ("share id can only contain letters, numbers, underscores, hyphens, and CJK characters" )
431+ }
432+ return nil
419433}
420434
421435func UpdateSharing (c * gin.Context ) {
@@ -471,6 +485,20 @@ func UpdateSharing(c *gin.Context) {
471485 s .Readme = req .Readme
472486 s .Remark = req .Remark
473487 s .Creator = user
488+ if req .NewID != "" && req .NewID != req .ID {
489+ if ! reqUser .CanCustomizeShareID () {
490+ common .ErrorStrResp (c , "permission denied" , 403 )
491+ return
492+ }
493+ if err = validateSharingID (req .NewID ); err != nil {
494+ common .ErrorResp (c , err , 400 )
495+ return
496+ }
497+ if err = op .UpdateSharingId (s , req .NewID ); err != nil {
498+ common .ErrorResp (c , err , 500 )
499+ return
500+ }
501+ }
474502 if err = op .UpdateSharing (s ); err != nil {
475503 common .ErrorResp (c , err , 500 )
476504 } else {
@@ -493,6 +521,12 @@ func CreateSharing(c *gin.Context) {
493521 common .ErrorStrResp (c , "must add at least 1 object" , 400 )
494522 return
495523 }
524+ if req .ID != "" {
525+ if err = validateSharingID (req .ID ); err != nil {
526+ common .ErrorResp (c , err , 400 )
527+ return
528+ }
529+ }
496530 var user * model.User
497531 reqUser := c .Request .Context ().Value (conf .UserKey ).(* model.User )
498532 if reqUser .IsAdmin () && req .CreatorName != "" {
@@ -503,7 +537,7 @@ func CreateSharing(c *gin.Context) {
503537 }
504538 } else {
505539 user = reqUser
506- if ! user .CanShare () || (! user .IsAdmin () && req .ID != "" ) {
540+ if ! user .CanShare () || (! user .CanCustomizeShareID () && req .ID != "" ) {
507541 common .ErrorStrResp (c , "permission denied" , 403 )
508542 return
509543 }
0 commit comments