소스 검색

fix: set the existing channels unregistered

tags/v1.0.0-rc1
Shivaram Lingamneni 5 년 전
부모
커밋
e4c9351254
4개의 변경된 파일23개의 추가작업 그리고 19개의 파일을 삭제
  1. 11
    1
      irc/accounts.go
  2. 4
    1
      irc/channel.go
  3. 0
    11
      irc/channelreg.go
  4. 8
    6
      irc/chanserv.go

+ 11
- 1
irc/accounts.go 파일 보기

@@ -842,8 +842,18 @@ func (am *AccountManager) Unregister(account string) error {
842 842
 	var clients []*Client
843 843
 
844 844
 	var registeredChannels []string
845
+	// on our way out, unregister all the account's channels and delete them from the db
845 846
 	defer func() {
846
-		am.server.channelRegistry.deleteByAccount(casefoldedAccount, registeredChannels)
847
+		for _, channelName := range registeredChannels {
848
+			info := am.server.channelRegistry.LoadChannel(channelName)
849
+			if info != nil && info.Founder == casefoldedAccount {
850
+				am.server.channelRegistry.Delete(channelName, *info)
851
+			}
852
+			channel := am.server.channels.Get(channelName)
853
+			if channel != nil {
854
+				channel.SetUnregistered(casefoldedAccount)
855
+			}
856
+		}
847 857
 	}()
848 858
 
849 859
 	var credText string

+ 4
- 1
irc/channel.go 파일 보기

@@ -165,10 +165,13 @@ func (channel *Channel) SetRegistered(founder string) error {
165 165
 }
166 166
 
167 167
 // SetUnregistered deletes the channel's registration information.
168
-func (channel *Channel) SetUnregistered() {
168
+func (channel *Channel) SetUnregistered(expectedFounder string) {
169 169
 	channel.stateMutex.Lock()
170 170
 	defer channel.stateMutex.Unlock()
171 171
 
172
+	if channel.registeredFounder != expectedFounder {
173
+		return
174
+	}
172 175
 	channel.registeredFounder = ""
173 176
 	var zeroTime time.Time
174 177
 	channel.registeredTime = zeroTime

+ 0
- 11
irc/channelreg.go 파일 보기

@@ -215,17 +215,6 @@ func (reg *ChannelRegistry) Delete(casefoldedName string, info RegisteredChannel
215 215
 	})
216 216
 }
217 217
 
218
-// deleteByAccount is a helper to delete all channel registrations corresponding to a user account.
219
-func (reg *ChannelRegistry) deleteByAccount(cfaccount string, cfchannels []string) {
220
-	for _, cfchannel := range cfchannels {
221
-		info := reg.LoadChannel(cfchannel)
222
-		if info == nil || info.Founder != cfaccount {
223
-			continue
224
-		}
225
-		reg.Delete(cfchannel, *info)
226
-	}
227
-}
228
-
229 218
 // Rename handles the persistence part of a channel rename: the channel is
230 219
 // persisted under its new name, and the old name is cleaned up if necessary.
231 220
 func (reg *ChannelRegistry) Rename(channel *Channel, casefoldedOldName string) {

+ 8
- 6
irc/chanserv.go 파일 보기

@@ -277,11 +277,13 @@ func csUnregisterHandler(server *Server, client *Client, command string, params
277 277
 		return
278 278
 	}
279 279
 
280
-	hasPrivs := client.HasRoleCapabs("chanreg")
281
-	if !hasPrivs {
282
-		founder := channel.Founder()
283
-		hasPrivs = founder != "" && founder == client.Account()
280
+	founder := channel.Founder()
281
+	if founder == "" {
282
+		csNotice(rb, client.t("That channel is not registered"))
283
+		return
284 284
 	}
285
+
286
+	hasPrivs := client.HasRoleCapabs("chanreg") || founder == client.Account()
285 287
 	if !hasPrivs {
286 288
 		csNotice(rb, client.t("Insufficient privileges"))
287 289
 		return
@@ -295,8 +297,8 @@ func csUnregisterHandler(server *Server, client *Client, command string, params
295 297
 		return
296 298
 	}
297 299
 
298
-	channel.SetUnregistered()
299
-	go server.channelRegistry.Delete(channelKey, info)
300
+	channel.SetUnregistered(founder)
301
+	server.channelRegistry.Delete(channelKey, info)
300 302
 	csNotice(rb, fmt.Sprintf(client.t("Channel %s is now unregistered"), channelKey))
301 303
 }
302 304
 

Loading…
취소
저장