Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
  3. // released under the MIT license
  4. package irc
  5. import (
  6. "crypto/rand"
  7. "encoding/hex"
  8. "fmt"
  9. "strings"
  10. "github.com/goshuirc/irc-go/ircfmt"
  11. "github.com/oragono/oragono/irc/sno"
  12. )
  13. var (
  14. restrictedNicknames = map[string]bool{
  15. "=scene=": true, // used for rp commands
  16. "chanserv": true,
  17. "nickserv": true,
  18. "hostserv": true,
  19. }
  20. )
  21. // returns whether the change succeeded or failed
  22. func performNickChange(server *Server, client *Client, target *Client, newnick string, rb *ResponseBuffer) bool {
  23. nickname := strings.TrimSpace(newnick)
  24. cfnick, err := CasefoldName(nickname)
  25. if len(nickname) < 1 {
  26. rb.Add(nil, server.name, ERR_NONICKNAMEGIVEN, client.nick, client.t("No nickname given"))
  27. return false
  28. }
  29. if err != nil || len(nickname) > server.Limits().NickLen || restrictedNicknames[cfnick] {
  30. rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, client.nick, nickname, client.t("Erroneous nickname"))
  31. return false
  32. }
  33. if target.Nick() == nickname {
  34. return true
  35. }
  36. hadNick := target.HasNick()
  37. origNick := target.Nick()
  38. origNickMask := target.NickMaskString()
  39. err = client.server.clients.SetNick(target, nickname)
  40. if err == errNicknameInUse {
  41. rb.Add(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nickname, client.t("Nickname is already in use"))
  42. return false
  43. } else if err == errNicknameReserved {
  44. rb.Add(nil, server.name, ERR_NICKNAMEINUSE, client.nick, nickname, client.t("Nickname is reserved by a different account"))
  45. return false
  46. } else if err != nil {
  47. rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.nick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
  48. return false
  49. }
  50. client.nickTimer.Touch()
  51. client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s [%s]", origNickMask, nickname, cfnick))
  52. if hadNick {
  53. target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("$%s$r changed nickname to %s"), origNick, nickname))
  54. target.server.whoWas.Append(client)
  55. for friend := range target.Friends() {
  56. friend.Send(nil, origNickMask, "NICK", nickname)
  57. }
  58. }
  59. if target.Registered() {
  60. client.server.monitorManager.AlertAbout(target, true)
  61. }
  62. // else: Run() will attempt registration immediately after this
  63. return true
  64. }
  65. func (server *Server) RandomlyRename(client *Client) {
  66. prefix := server.AccountConfig().NickReservation.RenamePrefix
  67. if prefix == "" {
  68. prefix = "Guest-"
  69. }
  70. buf := make([]byte, 8)
  71. rand.Read(buf)
  72. nick := fmt.Sprintf("%s%s", prefix, hex.EncodeToString(buf))
  73. rb := NewResponseBuffer(client)
  74. performNickChange(server, client, client, nick, rb)
  75. rb.Send()
  76. // technically performNickChange can fail to change the nick,
  77. // but if they're still delinquent, the timer will get them later
  78. }