소스 검색

validate amode recipients

tags/v2.5.0-rc1
Shivaram Lingamneni 3 년 전
부모
커밋
281821ed0e
1개의 변경된 파일9개의 추가작업 그리고 5개의 파일을 삭제
  1. 9
    5
      irc/import.go

+ 9
- 5
irc/import.go 파일 보기

@@ -53,17 +53,18 @@ type databaseImport struct {
53 53
 	Channels map[string]channelImport
54 54
 }
55 55
 
56
-func serializeAmodes(raw map[string]string) (result []byte, err error) {
56
+func serializeAmodes(raw map[string]string, validCfUsernames utils.StringSet) (result []byte, err error) {
57 57
 	processed := make(map[string]int, len(raw))
58 58
 	for accountName, mode := range raw {
59 59
 		if len(mode) != 1 {
60 60
 			return nil, fmt.Errorf("invalid mode %s for account %s", mode, accountName)
61 61
 		}
62 62
 		cfname, err := CasefoldName(accountName)
63
-		if err != nil {
64
-			return nil, fmt.Errorf("invalid amode recipient %s: %w", accountName, err)
63
+		if err != nil || !validCfUsernames.Has(cfname) {
64
+			log.Printf("skipping invalid amode recipient %s\n", accountName)
65
+		} else {
66
+			processed[cfname] = int(mode[0])
65 67
 		}
66
-		processed[cfname] = int(mode[0])
67 68
 	}
68 69
 	result, err = json.Marshal(processed)
69 70
 	return
@@ -78,6 +79,8 @@ func doImportDBGeneric(config *Config, dbImport databaseImport, credsType Creden
78 79
 	tx.Set(keySchemaVersion, strconv.Itoa(importDBSchemaVersion), nil)
79 80
 	tx.Set(keyCloakSecret, utils.GenerateSecretKey(), nil)
80 81
 
82
+	cfUsernames := make(utils.StringSet)
83
+
81 84
 	for username, userInfo := range dbImport.Users {
82 85
 		cfUsername, err := CasefoldName(username)
83 86
 		if err != nil {
@@ -118,6 +121,7 @@ func doImportDBGeneric(config *Config, dbImport databaseImport, credsType Creden
118 121
 		for _, certfp := range certfps {
119 122
 			tx.Set(fmt.Sprintf(keyCertToAccount, certfp), cfUsername, nil)
120 123
 		}
124
+		cfUsernames.Add(cfUsername)
121 125
 	}
122 126
 
123 127
 	for chname, chInfo := range dbImport.Channels {
@@ -149,7 +153,7 @@ func doImportDBGeneric(config *Config, dbImport databaseImport, credsType Creden
149 153
 			tx.Set(fmt.Sprintf(keyChannelTopicSetBy, cfchname), chInfo.TopicSetBy, nil)
150 154
 		}
151 155
 		if len(chInfo.Amode) != 0 {
152
-			m, err := serializeAmodes(chInfo.Amode)
156
+			m, err := serializeAmodes(chInfo.Amode, cfUsernames)
153 157
 			if err == nil {
154 158
 				tx.Set(fmt.Sprintf(keyChannelAccountToUMode, cfchname), string(m), nil)
155 159
 			} else {

Loading…
취소
저장