PageRenderTime 57ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/goircd.go

https://bitbucket.org/murarth/goircd
Go | 2343 lines | 1809 code | 477 blank | 57 comment | 490 complexity | 54f532d4401f8fa59e34b6271f16b443 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "crypto/tls"
  6. "errors"
  7. "fmt"
  8. "io"
  9. "net"
  10. "os"
  11. "os/signal"
  12. "path"
  13. "runtime"
  14. "sort"
  15. "strings"
  16. "syscall"
  17. "time"
  18. )
  19. type ServerMessage struct {
  20. Node *ServerNode
  21. Tokens Tokens
  22. Line string
  23. Error error
  24. }
  25. type UserMessage struct {
  26. User *User
  27. Tokens Tokens
  28. Error error
  29. }
  30. type AdminData struct {
  31. AdminName string
  32. AdminNick string
  33. AdminEmail string
  34. }
  35. // Return name, relative to base unless name is absolute
  36. func RelDir(name, base string) string {
  37. if path.IsAbs(name) {
  38. return name
  39. }
  40. return path.Join(base, name)
  41. }
  42. func (adm *AdminData) Configure(config *Block) error {
  43. name, err := config.GetString("Name")
  44. if err != nil {
  45. return err
  46. }
  47. nick, err := config.GetString("Nick")
  48. if err != nil {
  49. return err
  50. }
  51. email, err := config.GetString("Email")
  52. if err != nil {
  53. return err
  54. }
  55. adm.AdminName = name
  56. adm.AdminNick = nick
  57. adm.AdminEmail = email
  58. return nil
  59. }
  60. type Limits struct {
  61. MaxNick int
  62. MaxIdent int
  63. MaxRealName int
  64. MaxVHost int
  65. MaxAway int
  66. MaxPartReason int
  67. MaxQuitReason int
  68. MaxChannelName int
  69. MaxChannelList int
  70. MaxTopic int
  71. MaxKickReason int
  72. MaxChannels int
  73. MaxOperChannels int
  74. MaxTargets int
  75. MaxModes int
  76. MaxXLine int
  77. MaxWho int
  78. }
  79. func (lim *Limits) Configure(config *Block) {
  80. lim.MaxNick = config.GetIntDefault(31, "Nickname")
  81. lim.MaxIdent = config.GetIntDefault(11, "Ident")
  82. lim.MaxRealName = config.GetIntDefault(128, "RealName")
  83. lim.MaxVHost = config.GetIntDefault(64, "VHost")
  84. lim.MaxAway = config.GetIntDefault(200, "Away")
  85. lim.MaxPartReason = config.GetIntDefault(200, "PartReason")
  86. lim.MaxQuitReason = config.GetIntDefault(255, "QuitReason")
  87. lim.MaxChannelName = config.GetIntDefault(32, "ChannelName")
  88. lim.MaxChannelList = config.GetIntDefault(60, "ChannelLists")
  89. lim.MaxTopic = config.GetIntDefault(307, "Topic")
  90. lim.MaxKickReason = config.GetIntDefault(255, "KickReason")
  91. lim.MaxChannels = config.GetIntDefault(10, "MaxChannels")
  92. lim.MaxOperChannels = config.GetIntDefault(20, "MaxOperChannels")
  93. lim.MaxTargets = config.GetIntDefault(20, "MaxTargets")
  94. lim.MaxModes = config.GetIntDefault(20, "MaxModes")
  95. lim.MaxXLine = config.GetIntDefault(50, "XLineLimit")
  96. lim.MaxWho = config.GetIntDefault(4096, "MaxWho")
  97. }
  98. type Options struct {
  99. DefaultModes string
  100. HostInTopic bool
  101. PartPrefix string
  102. PartSuffix string
  103. QuitPrefix string
  104. QuitSuffix string
  105. DefaultQuit string
  106. IPv4Mask net.IPMask
  107. IPv6Mask net.IPMask
  108. }
  109. func MakeCIDR(n int, ipv6 bool) net.IPMask {
  110. var maskLen int
  111. if ipv6 {
  112. maskLen = net.IPv6len
  113. } else {
  114. maskLen = net.IPv4len
  115. }
  116. if n > maskLen*8 {
  117. n = maskLen * 8
  118. }
  119. res := make(net.IPMask, maskLen)
  120. i := 0
  121. for n > 0 {
  122. if n >= 8 {
  123. res[i] = 0xff
  124. } else {
  125. res[i] = byte(0xff << uint(8-n))
  126. break
  127. }
  128. i++
  129. n -= 8
  130. }
  131. if !ipv6 {
  132. return net.IPv4Mask(res[0], res[1], res[2], res[3])
  133. }
  134. return res
  135. }
  136. func (opt *Options) Configure(config *Block) {
  137. opt.DefaultModes = config.GetStringDefault("", "DefaultModes")
  138. opt.HostInTopic = config.GetBoolDefault(false, "HostInTopic")
  139. opt.PartPrefix = config.GetStringDefault("", "PartPrefix")
  140. opt.PartSuffix = config.GetStringDefault("", "PartSuffix")
  141. opt.QuitPrefix = config.GetStringDefault("Quit: ", "QuitPrefix")
  142. opt.QuitSuffix = config.GetStringDefault("", "QuitSuffix")
  143. opt.DefaultQuit = config.GetStringDefault("Client exited")
  144. ipv4range := config.GetIntDefault(32, "IPv4Range")
  145. ipv6range := config.GetIntDefault(128, "IPv6Range")
  146. opt.IPv4Mask = MakeCIDR(ipv4range, false)
  147. opt.IPv6Mask = MakeCIDR(ipv6range, true)
  148. }
  149. type Security struct {
  150. FlatMap bool
  151. HideULines bool
  152. DiePassword Password
  153. RestartPassword Password
  154. }
  155. func (sec *Security) Configure(config *Block) error {
  156. sec.FlatMap = config.GetBoolDefault(true, "FlatMap")
  157. sec.HideULines = config.GetBoolDefault(false, "HideULines")
  158. dieHash := config.GetStringDefault("", "DieHash")
  159. diePass, err := config.GetString("DiePassword")
  160. if err != nil {
  161. return err
  162. }
  163. diePw, err := LoadPassword(dieHash, diePass)
  164. if err != nil {
  165. return err
  166. }
  167. resHash := config.GetStringDefault("", "RestartHash")
  168. resPass, err := config.GetString("RestartPassword")
  169. if err != nil {
  170. return err
  171. }
  172. resPw, err := LoadPassword(resHash, resPass)
  173. if err != nil {
  174. return err
  175. }
  176. sec.DiePassword = diePw
  177. sec.RestartPassword = resPw
  178. return nil
  179. }
  180. type Listener struct {
  181. net.Listener
  182. Bind *Bind
  183. }
  184. type Server struct {
  185. channels map[string]*Channel
  186. UserNicks map[string]*User
  187. LocalUsers map[UID]*User
  188. MaxLocalUsers int
  189. MaxGlobalUsers int
  190. UnregisteredCount int
  191. nextUserId UID
  192. Id SID
  193. ServerName string
  194. NetworkName string
  195. Description string
  196. AdminData
  197. Limits
  198. Options
  199. Security
  200. Logger
  201. StartTime time.Time
  202. MOTD []string
  203. Rules []string
  204. FakeUser *User
  205. ServerTree
  206. Operators map[*User]bool
  207. LocalClones map[string]int
  208. GlobalClones map[string]int
  209. XLines map[byte]map[string]*XLine
  210. OperTypes map[string]*OperType
  211. OperBlocks map[string]*Oper
  212. Connect []*Connect
  213. Links map[string]*Link
  214. ULines map[string]*ULine
  215. config *Config
  216. BaseDir string
  217. ConfigDir string
  218. ConfigFile string
  219. listeners map[string]*Listener
  220. userMessages chan *UserMessage
  221. serverMessages chan *ServerMessage
  222. pendingClients chan *User
  223. pendingConnects chan *Link
  224. pendingServers chan *ServerNode
  225. killswitch chan int
  226. doRestart bool
  227. routines chan int
  228. routineCount int
  229. channelModes string
  230. channelModesTypes string
  231. prefixModes string
  232. statusMsg string
  233. extBans string
  234. userModes string
  235. ISupport []string
  236. }
  237. func NewServer(baseDir, configFile string) *Server {
  238. serv := new(Server)
  239. serv.channels = make(map[string]*Channel)
  240. serv.UserNicks = make(map[string]*User)
  241. serv.LocalUsers = make(map[UID]*User)
  242. serv.StartTime = time.Now()
  243. serv.listeners = make(map[string]*Listener)
  244. serv.userMessages = make(chan *UserMessage, 10240)
  245. serv.serverMessages = make(chan *ServerMessage, 10240)
  246. serv.pendingClients = make(chan *User, 64)
  247. serv.pendingConnects = make(chan *Link, 64)
  248. serv.pendingServers = make(chan *ServerNode, 16)
  249. serv.killswitch = make(chan int, 1)
  250. serv.routines = make(chan int, 4096)
  251. serv.MOTD = make([]string, 0)
  252. serv.Rules = make([]string, 0)
  253. serv.Operators = make(map[*User]bool)
  254. serv.LocalClones = make(map[string]int)
  255. serv.GlobalClones = make(map[string]int)
  256. serv.XLines = make(map[byte]map[string]*XLine)
  257. serv.nextUserId = 1
  258. serv.Logger.Init()
  259. if !path.IsAbs(configFile) {
  260. configFile = path.Join(baseDir, configFile)
  261. }
  262. serv.BaseDir = baseDir
  263. configDir, _ := path.Split(configFile)
  264. serv.ConfigDir = configDir
  265. serv.ConfigFile = configFile
  266. serv.config = NewConfig()
  267. serv.Configure()
  268. serv.ServerTree.Init(serv)
  269. serv.FakeUser = NewServerUser(serv.Root)
  270. serv.ModeStrings()
  271. serv.BuildISupport()
  272. return serv
  273. }
  274. func (self *Server) AddOperator(user *User) {
  275. self.Operators[user] = true
  276. }
  277. func (self *Server) RemoveOperator(user *User) {
  278. delete(self.Operators, user)
  279. // Remove Oper only modes
  280. var i byte = 'A'
  281. for {
  282. p := ""
  283. if m := GetUserMode(i); m != nil && m.CanSet() == ModeOpers {
  284. if user.HasMode(i) {
  285. user.RemoveMode(i)
  286. m.HandlePre(self, user, false, &p)
  287. m.HandlePost(self, user, false, p)
  288. }
  289. }
  290. if i == 'Z' {
  291. i = 'a'
  292. } else if i == 'z' {
  293. break
  294. } else {
  295. i++
  296. }
  297. }
  298. }
  299. func (self *Server) AddXLine(typ byte, x *XLine) {
  300. xlines, ok := self.XLines[typ]
  301. if !ok {
  302. xlines = make(map[string]*XLine)
  303. self.XLines[typ] = xlines
  304. }
  305. mask := IRCToLower(x.Mask())
  306. xlines[mask] = x
  307. self.EnforceXLine(x)
  308. }
  309. func (self *Server) EnforceXLine(xline *XLine) {
  310. for _, u := range self.LocalUsers {
  311. if xline.MatchesUser(u) {
  312. xline.Apply(self, u)
  313. }
  314. }
  315. }
  316. // TestXLineExpire tests whether the given XLine is out of date and, if so,
  317. // expires it, returning whether the XLine was expired.
  318. func (self *Server) TestXLineExpire(x *XLine) bool {
  319. now := time.Now()
  320. if x.Duration != 0 && x.Creation.Add(x.Duration).Before(now) {
  321. self.RemoveXLine(x.Type, x.Mask())
  322. self.ServerNotice('x',
  323. "Removing expired %c-Line %s (set by %s %d ago)",
  324. x.Type, x.Mask(), x.Setter, now.Sub(x.Creation))
  325. return true
  326. }
  327. return false
  328. }
  329. func (self *Server) MatchesAnyXLine(user *User) *XLine {
  330. for _, xlines := range self.XLines {
  331. for _, x := range xlines {
  332. if !self.TestXLineExpire(x) && x.MatchesUser(user) {
  333. return x
  334. }
  335. }
  336. }
  337. return nil
  338. }
  339. func (self *Server) MatchesXLine(typ byte, user *User) *XLine {
  340. xlines := self.XLines[typ]
  341. for _, x := range xlines {
  342. if !self.TestXLineExpire(x) && x.MatchesUser(user) {
  343. return x
  344. }
  345. }
  346. return nil
  347. }
  348. // Returns the percentage of current users affected by an XLine
  349. func (self *Server) XLineMatch(x *XLine) float32 {
  350. if numUsers := len(self.Users); numUsers != 0 {
  351. matches := 0
  352. for _, u := range self.Users {
  353. if x.MatchesUser(u) {
  354. matches++
  355. }
  356. }
  357. return float32(matches) * 100.0 / float32(len(self.Users))
  358. }
  359. return 0
  360. }
  361. func (self *Server) HasXLine(typ byte, mask string) bool {
  362. xlines, ok := self.XLines[typ]
  363. mask = IRCToLower(mask)
  364. if ok {
  365. _, ok := xlines[mask]
  366. return ok
  367. }
  368. return false
  369. }
  370. func (self *Server) RemoveXLine(typ byte, mask string) bool {
  371. if xlines, ok := self.XLines[typ]; ok {
  372. mask = IRCToLower(mask)
  373. if _, ok := xlines[mask]; ok {
  374. delete(xlines, mask)
  375. return true
  376. }
  377. }
  378. return false
  379. }
  380. func (self *Server) HasULine(name string) bool {
  381. _, ok := self.ULines[name]
  382. return ok
  383. }
  384. func (self *Server) CheckUser(user *User) bool {
  385. return self.LocalUsers[user.Id] == user
  386. }
  387. func (self *Server) FindConnect(user *LocalUser) *Connect {
  388. for _, conn := range self.Connect {
  389. if conn.Matches(user) {
  390. return conn
  391. }
  392. }
  393. return nil
  394. }
  395. func (self *Server) RoutineCount() int {
  396. pollLoop:
  397. for {
  398. select {
  399. case count := <-self.routines:
  400. self.routineCount += count
  401. default:
  402. break pollLoop
  403. }
  404. }
  405. return self.routineCount
  406. }
  407. func (self *Server) RoutineStart() {
  408. self.routines <- 1
  409. }
  410. func (self *Server) RoutineExit() {
  411. self.routines <- -1
  412. }
  413. // Send a message to a User
  414. func (self *Server) SendLine(user *User, format string, args ...interface{}) {
  415. if local := user.Local(); local != nil {
  416. line := fmt.Sprintf(format, args...)
  417. if err := local.QueueOutgoing(line); err != nil {
  418. self.KillUser(user, "%s", err)
  419. }
  420. } else if user.IsRemote() {
  421. self.SendNode(user.Server, ":%s PUSH %s :%s",
  422. self.Id, user.Id, fmt.Sprintf(format, args...))
  423. }
  424. }
  425. // Send a message to a User, sourced by another User
  426. func (self *Server) Send(source *User, target *User, format string, args ...interface{}) {
  427. var src string
  428. if source == nil {
  429. src = target.Server.Name
  430. } else {
  431. src = source.FullHost()
  432. }
  433. self.SendLine(target, ":%s %s", src, fmt.Sprintf(format, args...))
  434. }
  435. // Send a message to a User with the server as source
  436. func (self *Server) SendServer(user *User, format string, args ...interface{}) {
  437. self.Send(nil, user, format, args...)
  438. }
  439. // Send a message to all local Users
  440. func (self *Server) SendAll(source *User, format string, args ...interface{}) {
  441. for _, user := range self.LocalUsers {
  442. self.Send(source, user, format, args...)
  443. }
  444. }
  445. func (self *Server) SendChannel(source *User, ch *Channel, targets TargetUsers,
  446. format string, args ...interface{}) {
  447. var send RemoteSend
  448. if source == nil {
  449. source = self.FakeUser
  450. }
  451. for u := range ch.Users {
  452. if targets.TargetUser(u) {
  453. if u.IsLocal() {
  454. self.Send(source, u, format, args...)
  455. } else {
  456. send.AddUser(u)
  457. }
  458. }
  459. }
  460. send.Send(self, ":%s %s", source.Id, fmt.Sprintf(format, args...))
  461. }
  462. func (self *Server) SendNumeric(user *User, num uint, format string, args ...interface{}) {
  463. self.SendServer(user, "%03d %s :%s", num, user.Nick,
  464. fmt.Sprintf(format, args...))
  465. }
  466. func (self *Server) GlobalNotice(mode byte, format string, args ...interface{}) {
  467. self.ServerNotice(mode, format, args...)
  468. self.Broadcast(":%s SNOTE %c :%s",
  469. self.Id, byte(IRCRuneToUpper(rune(mode))), fmt.Sprintf(format, args...))
  470. }
  471. func (self *Server) ServerNotice(mode byte, format string, args ...interface{}) {
  472. modeLower := byte(IRCRuneToLower(rune(mode)))
  473. if name, ok := snoNames[modeLower]; ok {
  474. for u := range self.Operators {
  475. if u.ServerNotices.HasMode(mode) {
  476. self.SendServer(u, "NOTICE %s :*** %s: %s",
  477. u.Nick, name, fmt.Sprintf(format, args...))
  478. }
  479. }
  480. }
  481. }
  482. func (self *Server) SendError(user *User, err ClientError) {
  483. self.SendServer(user, "%03d %s %s", err.Numeric(), user.Nick, err.Message())
  484. }
  485. func (self *Server) SendBanList(user *User, ch *Channel) {
  486. for _, ban := range ch.Bans {
  487. self.SendServer(user, "367 %s %s %s %s %d", user.Nick, ch.Name,
  488. ban.Mask, ban.SetBy, ban.Creation)
  489. }
  490. self.SendServer(user, "368 %s %s :End of channel ban list",
  491. user.Nick, ch.Name)
  492. }
  493. func (self *Server) SendExceptionList(user *User, ch *Channel) {
  494. for _, exc := range ch.Exceptions {
  495. self.SendServer(user, "348 %s %s %s %s %d", user.Nick, ch.Name,
  496. exc.Mask, exc.SetBy, exc.Creation)
  497. }
  498. self.SendServer(user, "349 %s %s :End of channel exception list",
  499. user.Nick, ch.Name)
  500. }
  501. func (self *Server) SendInvexList(user *User, ch *Channel) {
  502. for _, invex := range ch.Invexes {
  503. self.SendServer(user, "346 %s %s %s %s %d", user.Nick, ch.Name,
  504. invex.Mask, invex.SetBy, invex.Creation)
  505. }
  506. self.SendServer(user, "347 %s %s :End of channel invite exception list",
  507. user.Nick, ch.Name)
  508. }
  509. func (self *Server) SendLusers(user *User) {
  510. invisible := 0
  511. for _, u := range self.UserNicks {
  512. if u.HasMode('i') {
  513. invisible++
  514. }
  515. }
  516. self.SendNumeric(user, 251, "There are %d users and %d invisible on %d servers",
  517. len(self.UserNicks)-invisible, invisible, len(self.Servers))
  518. opers := len(self.Operators)
  519. if opers != 0 {
  520. self.Send(nil, user, "252 %s %d :operator(s) online", user.Nick, opers)
  521. }
  522. if self.UnregisteredCount != 0 {
  523. self.Send(nil, user, "253 %s %d :unknown connection(s)",
  524. user.Nick, self.UnregisteredCount)
  525. }
  526. numLocalUsers := len(self.LocalUsers)
  527. numUsers := len(self.UserNicks)
  528. numChannels := len(self.channels)
  529. if numChannels != 0 {
  530. self.Send(nil, user, "254 %s %d :channel(s) formed",
  531. user.Nick, numChannels)
  532. }
  533. self.SendNumeric(user, 255, "I have %d clients and %d servers",
  534. numUsers, len(self.Root.Nodes))
  535. self.SendNumeric(user, 265, "Current Local Users: %d Max: %d",
  536. numLocalUsers, self.MaxLocalUsers)
  537. self.SendNumeric(user, 266, "Current Global Users: %d Max: %d",
  538. numUsers, self.MaxGlobalUsers)
  539. }
  540. func (self *Server) SendDisplayedHost(user *User) {
  541. self.SendServer(user, "396 %s %s :is now your displayed host",
  542. user.Nick, user.GetHost())
  543. }
  544. func (self *Server) SendMOTD(user *User) {
  545. self.SendNumeric(user, 375, "%s message of the day", self.ServerName)
  546. for _, line := range self.MOTD {
  547. self.SendNumeric(user, 372, "%s", line)
  548. }
  549. self.SendNumeric(user, 376, "End of message of the day")
  550. }
  551. func (self *Server) SendRules(user *User) {
  552. for _, line := range self.Rules {
  553. self.SendNumeric(user, 308, "%s", line)
  554. }
  555. self.SendNumeric(user, 309, "End of /RULES")
  556. }
  557. func (self *Server) SendModes(user *User, ch *Channel) {
  558. self.SendServer(user, "324 %s %s %s",
  559. user.Nick, ch.Name, ch.ModeString(!(ch.HasUser(user) || user.IsOper())))
  560. self.SendServer(user, "329 %s %s %d", user.Nick, ch.Name, ch.Creation)
  561. }
  562. func (self *Server) SendNames(user *User, ch *Channel) {
  563. var users []*User
  564. if ch.HasUser(user) {
  565. users = make([]*User, 0, len(ch.Users))
  566. for u := range ch.Users {
  567. users = append(users, u)
  568. }
  569. } else {
  570. users = make([]*User, 0, len(ch.Users))
  571. for u := range ch.Users {
  572. if user.CanSee(u) {
  573. users = append(users, u)
  574. }
  575. }
  576. }
  577. if len(users) != 0 {
  578. names := make([]string, 0, len(users))
  579. namesLoop:
  580. for _, u := range users {
  581. name := ch.FormatNick(u)
  582. for _, handler := range NamesItem {
  583. res := handler.(NamesItemHandler).NamesItem(self, user, ch, u, &name)
  584. if res == Deny {
  585. continue namesLoop
  586. }
  587. }
  588. names = append(names, name)
  589. }
  590. visChar := '='
  591. if ch.HasMode('p') {
  592. visChar = '*'
  593. } else if ch.HasMode('s') {
  594. visChar = '@'
  595. }
  596. sp := Spool(names, 200, 1)
  597. for sp.More() {
  598. self.SendServer(user, "353 %s %c %s :%s",
  599. user.Nick, visChar, ch.Name, strings.Join(sp.Next(), " "))
  600. }
  601. }
  602. self.SendServer(user, "366 %s %s :End of /NAMES list", user.Nick, ch.Name)
  603. }
  604. func (self *Server) SendTopic(user *User, ch *Channel) {
  605. if ch.Topic == "" {
  606. self.SendServer(user, "331 %s %s :No topic is set", user.Nick, ch.Name)
  607. } else {
  608. self.SendServer(user, "332 %s %s :%s", user.Nick, ch.Name, ch.Topic)
  609. self.SendServer(user, "333 %s %s %s %d", user.Nick,
  610. ch.Name, ch.TopicSetter, ch.TopicCreation)
  611. }
  612. }
  613. func (self *Server) SendUserInvites(user *User) {
  614. if local := user.Local(); local != nil {
  615. for ch := range local.Invites {
  616. self.SendNumeric(user, 346, "%s", ch.Name)
  617. }
  618. self.SendNumeric(user, 347, "End of /INVITE list")
  619. }
  620. }
  621. func (self *Server) BuildISupport() {
  622. support := make([]string, 0, 40)
  623. support = append(support,
  624. fmt.Sprint("AWAYLEN=", self.MaxAway),
  625. "CASEMAPPING=rfc1459",
  626. "CHANMODES="+self.channelModesTypes,
  627. "CHANTYPES=#",
  628. "CHARSET=ascii",
  629. "ELIST=M",
  630. "EXCEPTS=e",
  631. "EXTBAN=,"+self.extBans,
  632. "FNC",
  633. "INVEX=I",
  634. fmt.Sprint("KICKLEN=", self.MaxKickReason),
  635. "MAP",
  636. fmt.Sprint("MAXBANS=", self.MaxChannelList),
  637. fmt.Sprint("MAXCHANNELS=", self.MaxChannels),
  638. fmt.Sprint("MAXPARA=", self.MaxTargets),
  639. fmt.Sprint("MAXTARGETS=", self.MaxTargets),
  640. fmt.Sprint("MODES=", self.MaxTargets),
  641. "NETWORK="+self.NetworkName,
  642. fmt.Sprint("NICKLEN=", self.MaxNick),
  643. "PREFIX="+self.prefixModes,
  644. "STATUSMSG="+self.statusMsg,
  645. fmt.Sprint("TOPICLEN=", self.MaxTopic),
  646. "USERIP",
  647. "VBANLIST",
  648. "WALLCHOPS",
  649. "WALLVOICES")
  650. add005 := func(s string) { support = append(support, s) }
  651. for _, handler := range Numeric005 {
  652. handler.(Numeric005Handler).Numeric005(self, add005)
  653. }
  654. self.ISupport = support
  655. }
  656. func (self *Server) SendVersion(user *User, extra bool) {
  657. if extra {
  658. self.SendNumeric(user, 351, "%s %s", VERSION, self.ServerName)
  659. }
  660. spool := Spool(self.ISupport, 200, 1)
  661. for spool.More() {
  662. self.SendServer(user, "005 %s %s :are supported by this server",
  663. user.Nick, strings.Join(spool.Next(), " "))
  664. }
  665. }
  666. func (self *Server) SendWallops(user *User, message string) {
  667. for _, u := range self.UserNicks {
  668. if u.IsLocal() && u.HasMode('w') {
  669. self.Send(user, u, "WALLOPS :%s", message)
  670. }
  671. }
  672. self.Propagate(user.Server, ":%s WALLOPS :%s", user.Id, message)
  673. }
  674. func (self *Server) MaskIP(ip net.IP) string {
  675. if ip.To4() == nil {
  676. return ip.Mask(self.IPv6Mask).String()
  677. }
  678. return ip.Mask(self.IPv4Mask).String()
  679. }
  680. func (self *Server) NextUserId() UID {
  681. var id UID
  682. for {
  683. id = self.Id.NewUID(self.nextUserId)
  684. self.nextUserId++
  685. if self.nextUserId > MaxUID {
  686. self.nextUserId = 0
  687. }
  688. if _, ok := self.LocalUsers[id]; !ok {
  689. break
  690. }
  691. }
  692. return id
  693. }
  694. func (self *Server) AddClone(user *User) {
  695. mask := self.MaskIP(user.IP)
  696. fmt.Println("Add clone", mask, user.Nick)
  697. self.GlobalClones[mask] += 1
  698. if local := user.Local(); local != nil {
  699. self.LocalClones[mask] += 1
  700. class := local.Connect
  701. if self.LocalClones[mask] > class.MaxLocal {
  702. self.KillUser(user, "No more connections allowed locally from this host")
  703. } else if self.GlobalClones[mask] > class.MaxGlobal {
  704. self.KillUser(user, "No more connections allowed globally from this host")
  705. }
  706. }
  707. }
  708. func (self *Server) RemoveClone(user *User) {
  709. mask := self.MaskIP(user.IP)
  710. fmt.Println("Remove clone", mask, user.Nick)
  711. self.GlobalClones[mask] -= 1
  712. if self.GlobalClones[mask] == 0 {
  713. delete(self.GlobalClones, mask)
  714. }
  715. if user.IsLocal() {
  716. self.LocalClones[mask] -= 1
  717. if self.LocalClones[mask] == 0 {
  718. delete(self.LocalClones, mask)
  719. }
  720. }
  721. }
  722. func (self *Server) AcceptClient(user *User) {
  723. self.UnregisteredCount++
  724. local := user.LocalUser
  725. local.Id = self.NextUserId()
  726. user.Nick = local.Id.String()
  727. if class := self.FindConnect(local); class != nil {
  728. local.Connect = class
  729. local.UseFakeLag = class.FakeLag
  730. local.FakeLag.Threshold = class.Threshold
  731. self.AddClone(user)
  732. } else {
  733. self.KillUser(user, "Access denied by configuration")
  734. }
  735. self.LocalUsers[user.Id] = user
  736. if numUsers := len(self.LocalUsers); numUsers > self.MaxLocalUsers {
  737. self.MaxLocalUsers = numUsers
  738. }
  739. if x := self.MatchesAnyXLine(user); x != nil {
  740. x.Apply(self, user)
  741. }
  742. /* TODO: This isn't working. Don't know why.
  743. if usingTls {
  744. tlsConn := c.(*tls.Conn)
  745. state := tlsConn.ConnectionState()
  746. if len(state.PeerCertificates) != 0 {
  747. sig := state.PeerCertificates[0].Signature
  748. fmt.Println("Got signature:", hex.EncodeToString(sig))
  749. }
  750. }
  751. */
  752. self.RoutineStart()
  753. go self.ClientLoop(user)
  754. }
  755. func (self *Server) AcceptServer(node *ServerNode) {
  756. self.UnknownServers[node] = true
  757. self.RoutineStart()
  758. go self.ServerLoop(node)
  759. }
  760. func (self *Server) ConnectServer(link *Link) {
  761. self.pendingConnects <- link
  762. }
  763. func (self *Server) ClientDNS(user *User) {
  764. self.SendServer(user, "NOTICE Auth :*** Looking up your hostname...")
  765. names, err := net.LookupAddr(user.IPString)
  766. if err != nil {
  767. self.SetHost(user, "")
  768. } else {
  769. name := names[0]
  770. if name[len(name)-1] == '.' {
  771. name = name[:len(name)-1]
  772. }
  773. self.SetHost(user, name)
  774. }
  775. self.RoutineExit()
  776. }
  777. var (
  778. PingTimeout = errors.New("Ping timeout")
  779. RegistrationTimeout = errors.New("Registration timeout")
  780. )
  781. func (self *Server) ClientLoop(user *User) {
  782. self.Log(Debug, "Goroutine spawned: Client loop for %s", user.Id)
  783. defer func() {
  784. self.Log(Debug, "Goroutine exit: Client loop for %s", user.Id)
  785. self.RoutineExit()
  786. }()
  787. now := time.Now().UnixNano()
  788. // Time of next PING, followed by a KILL
  789. nextPing := now + 10 * 1000000000
  790. // Whether the User will be killed on nextPing; if false, send a PING
  791. pingTimeout := true
  792. local := user.LocalUser
  793. // The User may have been killed by an XLine.
  794. // In which case, we're only running this loop to deliver the kill message
  795. // and there is no need to run DNS lookup or read the client's messages.
  796. if !local.Killed {
  797. // TODO: DNS cache
  798. self.RoutineStart()
  799. go self.ClientDNS(user)
  800. self.RoutineStart()
  801. go self.userRead(local)
  802. }
  803. self.RoutineStart()
  804. go self.userWrite(local)
  805. if local.Connect != nil {
  806. nextPing = now + local.Connect.RegistrationTimeout*1000000000
  807. }
  808. for {
  809. select {
  810. case msg := <-local.messages:
  811. switch msg {
  812. case Killed:
  813. return
  814. case Registered:
  815. nextPing = now + local.Connect.PingFreq*1000000000
  816. pingTimeout = false
  817. }
  818. case line := <-local.Incoming:
  819. if line != "" {
  820. tok := Tokenize(line, true, self.MaxTargets)
  821. if len(tok) == 0 {
  822. panic("Zero length tokens after parsing: " + line)
  823. }
  824. self.RecvMessage(user, tok)
  825. if local.IsRegistered() {
  826. pingTimeout = false
  827. nextPing = now + local.Connect.PingFreq*1000000000
  828. }
  829. }
  830. case err := <-local.Errors:
  831. self.ReportError(user, err)
  832. case <-time.After(time.Duration(nextPing - now)):
  833. if pingTimeout {
  834. if local.IsRegistered() {
  835. self.ReportError(user, PingTimeout)
  836. } else {
  837. self.ReportError(user, RegistrationTimeout)
  838. }
  839. } else {
  840. self.SendLine(user, "PING :%s", self.ServerName)
  841. nextPing += local.Connect.PingFreq * 1000000000
  842. pingTimeout = true
  843. }
  844. }
  845. now = time.Now().UnixNano()
  846. }
  847. }
  848. var ExcessFlood = errors.New("Excess flood")
  849. func (self *Server) userRead(user *LocalUser) {
  850. defer self.RoutineExit()
  851. bufSize := user.Connect.RecvQ
  852. buf := make([]byte, bufSize)
  853. off := 0
  854. for {
  855. select {
  856. case newSize := <-user.ChangeRecvQ:
  857. if newSize != bufSize {
  858. if len(buf) <= newSize {
  859. user.Errors <- RecvQExceeded
  860. return
  861. }
  862. newBuf := make([]byte, newSize)
  863. copy(newBuf, buf[:off])
  864. buf = newBuf
  865. bufSize = newSize
  866. }
  867. default:
  868. }
  869. n, err := user.Connection.Read(buf[off:])
  870. off += n
  871. if err != nil {
  872. user.Errors <- err
  873. break
  874. }
  875. if off == bufSize {
  876. user.Errors <- RecvQExceeded
  877. return
  878. }
  879. for {
  880. end := bytes.IndexByte(buf[:off], '\n')
  881. if end == -1 {
  882. break
  883. }
  884. next := end + 1
  885. if end > 510 { // 512, minus CR-LF
  886. end = 510
  887. }
  888. j := 0
  889. for i := 0; i < end; i++ {
  890. c := buf[i]
  891. // Replace NUL bytes with spaces
  892. if c == 0 {
  893. buf[j] = ' '
  894. // Remove carriage returns
  895. } else if c == '\r' {
  896. continue
  897. }
  898. if i != j {
  899. buf[j] = c
  900. }
  901. j++
  902. }
  903. end = j
  904. line := string(buf[:end])
  905. copy(buf, buf[next:])
  906. off -= next
  907. user.FakeLag.AddLag(1)
  908. lag := <-user.FakeLag.Output
  909. if !user.UseFakeLag && lag > user.FakeLag.Threshold {
  910. user.Errors <- ExcessFlood
  911. return
  912. }
  913. user.Incoming <- line
  914. }
  915. }
  916. }
  917. func (self *Server) userWrite(user *LocalUser) {
  918. defer self.RoutineExit()
  919. var bufSize int
  920. if user.Connect == nil {
  921. bufSize = 512
  922. } else {
  923. bufSize = user.Connect.SendQ
  924. }
  925. buf := make([]byte, bufSize)
  926. off := 0
  927. writeTimeout := time.Duration(0.25e9)
  928. for {
  929. var newSize int
  930. var line string
  931. if off == 0 {
  932. // If the SendQ is empty, wait indefinitely on channels
  933. select {
  934. case newSize = <-user.ChangeSendQ:
  935. goto handleChange
  936. case line = <-user.Outgoing:
  937. goto handleLine
  938. }
  939. } else {
  940. deadline := time.Now()
  941. deadline.Add(writeTimeout)
  942. user.Connection.SetWriteDeadline(deadline)
  943. // Otherwise, only poll the channels.
  944. // Then, continue attempting to flush the queue.
  945. n, err := user.Connection.Write(buf[:off])
  946. if n != 0 {
  947. copy(buf, buf[n:off])
  948. off -= n
  949. }
  950. if err != nil {
  951. if nErr, ok := err.(net.Error); ok {
  952. if nErr.Timeout() {
  953. continue
  954. }
  955. }
  956. user.Errors <- err
  957. return
  958. }
  959. select {
  960. case newSize = <-user.ChangeSendQ:
  961. goto handleChange
  962. case line = <-user.Outgoing:
  963. goto handleLine
  964. default:
  965. }
  966. }
  967. continue
  968. handleChange:
  969. if newSize != bufSize {
  970. if len(buf) < newSize {
  971. user.Errors <- SendQExceeded
  972. return
  973. }
  974. newBuf := make([]byte, newSize)
  975. copy(newBuf, buf[:off])
  976. buf = newBuf
  977. bufSize = newSize
  978. }
  979. continue
  980. handleLine:
  981. if line == "" {
  982. user.Errors <- io.EOF
  983. user.Connection.Close()
  984. return
  985. }
  986. if len(line) > 510 {
  987. line = line[:510]
  988. }
  989. line += "\r\n"
  990. copy(buf[off:], []byte(line))
  991. off += len(line)
  992. if off >= bufSize {
  993. user.Errors <- SendQExceeded
  994. return
  995. }
  996. }
  997. }
  998. func (self *Server) ReportError(user *User, error error) {
  999. if opErr, ok := error.(*net.OpError); ok {
  1000. error = opErr.Err
  1001. }
  1002. self.userMessages <- &UserMessage{User: user, Error: error}
  1003. }
  1004. func (self *Server) RecvMessage(user *User, tokens Tokens) {
  1005. self.userMessages <- &UserMessage{User: user, Tokens: tokens}
  1006. }
  1007. // Create a crypto/tls.Config object from loaded configuration
  1008. // Return an error if any necessary directives are missing or invalid
  1009. func (self *Server) TlsConfig() (config *tls.Config, err error) {
  1010. block := self.config.GetBlock("TLS")
  1011. if block == nil {
  1012. return nil, errors.New("Missing TLS block")
  1013. }
  1014. certFile, err := block.GetString("CertFile")
  1015. if err != nil {
  1016. return nil, err
  1017. }
  1018. keyFile, err := block.GetString("KeyFile")
  1019. if err != nil {
  1020. return nil, err
  1021. }
  1022. if !path.IsAbs(certFile) {
  1023. certFile = path.Join(self.BaseDir, certFile)
  1024. }
  1025. if !path.IsAbs(keyFile) {
  1026. keyFile = path.Join(self.BaseDir, keyFile)
  1027. }
  1028. cert, err := tls.LoadX509KeyPair(certFile, keyFile)
  1029. if err != nil {
  1030. return nil, err
  1031. }
  1032. cfg := new(tls.Config)
  1033. cfg.Certificates = []tls.Certificate{cert}
  1034. cfg.ServerName = self.ServerName
  1035. //cfg.AuthenticateClient = true
  1036. return cfg, nil
  1037. }
  1038. func (self *Server) StartListener(bind *Bind, port int) error {
  1039. var l net.Listener
  1040. var err error
  1041. addr := bind.Address(port)
  1042. if _, ok := self.listeners[addr]; ok {
  1043. return errors.New("Already listening on address " + addr)
  1044. }
  1045. if bind.TLS {
  1046. if tlsCfg, e := self.TlsConfig(); e != nil {
  1047. err = e
  1048. } else {
  1049. l, err = tls.Listen("tcp", addr, tlsCfg)
  1050. }
  1051. } else {
  1052. l, err = net.Listen("tcp", addr)
  1053. }
  1054. if err != nil {
  1055. return err
  1056. }
  1057. if bind.Type == BindClients {
  1058. self.RoutineStart()
  1059. go self.ClientListener(l)
  1060. } else {
  1061. self.RoutineStart()
  1062. go self.ServerListener(l)
  1063. }
  1064. self.listeners[addr] = &Listener{l, bind}
  1065. return nil
  1066. }
  1067. func (self *Server) Go() int {
  1068. for _, handler := range Ready {
  1069. handler.(ReadyHandler).Ready(self)
  1070. }
  1071. sigIncoming := make(chan os.Signal, 5)
  1072. signal.Notify(sigIncoming, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
  1073. for {
  1074. select {
  1075. case cl := <-self.pendingClients:
  1076. self.AcceptClient(cl)
  1077. case link := <-self.pendingConnects:
  1078. if _, ok := self.ServerNames[link.Name]; !ok {
  1079. node := self.NewOutgoingServer(link)
  1080. self.AcceptServer(node)
  1081. }
  1082. case node := <-self.pendingServers:
  1083. self.AcceptServer(node)
  1084. case count := <-self.routines:
  1085. self.routineCount += count
  1086. case msg := <-self.userMessages:
  1087. self.HandleMessage(msg.User, msg.Tokens, msg.Error)
  1088. case msg := <-self.serverMessages:
  1089. self.HandleServerMessage(msg.Node, msg.Tokens, msg.Line, msg.Error)
  1090. case sig := <-sigIncoming:
  1091. if unixSig, ok := sig.(syscall.Signal); ok {
  1092. switch unixSig {
  1093. case syscall.SIGHUP:
  1094. self.ServerNotice('a', "Received SIGHUP, rehashing...")
  1095. self.Rehash()
  1096. case syscall.SIGINT, syscall.SIGTERM:
  1097. self.Shutdown(int(unixSig) | 0x80)
  1098. }
  1099. }
  1100. case ret := <-self.killswitch:
  1101. self.doShutdown()
  1102. return ret
  1103. }
  1104. }
  1105. return 0
  1106. }
  1107. func (self *Server) HandleMessage(user *User, tokens Tokens, uErr error) {
  1108. // The User may have been killed after more messages were queued
  1109. if !self.CheckUser(user) {
  1110. return
  1111. }
  1112. if uErr != nil {
  1113. if uErr == io.EOF {
  1114. self.KillUser(user, self.DefaultQuit)
  1115. } else {
  1116. self.KillUser(user, uErr.Error())
  1117. }
  1118. return
  1119. }
  1120. command := IRCToUpper(tokens[0])
  1121. tokens[0] = command
  1122. var err ClientError
  1123. for _, handler := range UserPreCommand {
  1124. res, e := handler.(UserPreCommandHandler).UserPreCommand(
  1125. self, user, tokens)
  1126. if res == Allow {
  1127. break
  1128. } else if res == Deny {
  1129. err = e
  1130. goto commandError
  1131. }
  1132. }
  1133. if cmd := GetCommand(command); cmd != nil {
  1134. err = cmd.Execute(self, user, tokens[1:])
  1135. } else {
  1136. err = UnknownCommand.Set(command)
  1137. }
  1138. commandError:
  1139. if err != nil {
  1140. self.SendError(user, err)
  1141. }
  1142. }
  1143. // Signal a shutdown
  1144. func (self *Server) Shutdown(code int) {
  1145. select {
  1146. case self.killswitch <- code:
  1147. default:
  1148. }
  1149. }
  1150. func (self *Server) Restart() {
  1151. self.doRestart = true
  1152. select {
  1153. case self.killswitch <- 0:
  1154. default:
  1155. }
  1156. }
  1157. // Internal method which performs the shutdown,
  1158. // should only be called from Server.Go
  1159. func (self *Server) doShutdown() {
  1160. self.ServerNotice('a', "Server is going down")
  1161. self.Log(Info, "Server is going down")
  1162. for _, handler := range Shutdown {
  1163. handler.(ShutdownHandler).Shutdown(self)
  1164. }
  1165. // Close all listeners
  1166. for _, listener := range self.listeners {
  1167. listener.Close()
  1168. }
  1169. // Split all linked servers
  1170. self.SplitAllNodes("Server shutdown")
  1171. // Kill all clients
  1172. self.KillAllClients("Server shutdown")
  1173. // Wait for user routines to terminate, but not too long
  1174. var wait int64 = 5 * 1000000000
  1175. var interval int64 = 250000000
  1176. allEnded := false
  1177. for wait > 0 {
  1178. if self.RoutineCount() == 0 {
  1179. allEnded = true
  1180. break
  1181. }
  1182. <-time.After(time.Duration(interval))
  1183. wait -= interval
  1184. }
  1185. if !allEnded {
  1186. self.Log(Info, "Goroutines not terminating timely, exiting regardless")
  1187. }
  1188. // Close all pending connections
  1189. closeLoop:
  1190. for {
  1191. select {
  1192. case user := <-self.pendingClients:
  1193. self.KillUser(user, "Server shutdown")
  1194. case node := <-self.pendingServers:
  1195. self.SplitNode(node, "Server shutdown")
  1196. default:
  1197. break closeLoop
  1198. }
  1199. }
  1200. if self.doRestart {
  1201. if err := syscall.Exec(os.Args[0], os.Args, os.Environ()); err != nil {
  1202. self.Fatal("Failed to exec process: %s", err)
  1203. }
  1204. }
  1205. }
  1206. func (self *Server) ConfigureServer(config *Config) error {
  1207. serv := config.GetBlock("Server")
  1208. if serv == nil {
  1209. return errors.New("Missing required Server block")
  1210. }
  1211. var err error
  1212. name, err := serv.GetString("Name")
  1213. if err != nil {
  1214. return err
  1215. }
  1216. idStr := serv.GetStringDefault("", "ServerId")
  1217. network, err := serv.GetString("Network")
  1218. if err != nil {
  1219. return err
  1220. }
  1221. if strings.IndexRune(network, ' ') != -1 {
  1222. return errors.New(fmt.Sprintf(
  1223. "Server Network cannot contain space (0x20) at %s",
  1224. serv.GetValue("Network").Pos()))
  1225. }
  1226. desc, err := serv.GetString("Description")
  1227. if err != nil {
  1228. return err
  1229. }
  1230. var id SID
  1231. if idStr == "" {
  1232. id = GenerateSID(name, desc)
  1233. } else {
  1234. id = ParseSID(idStr)
  1235. }
  1236. if id == 0 || id > MaxSID {
  1237. return errors.New(fmt.Sprintf("Invalid Id %s at %s",
  1238. idStr, serv.GetValue("ServerId").Pos()))
  1239. }
  1240. self.Id = id
  1241. self.ServerName = name
  1242. self.NetworkName = network
  1243. self.Description = desc
  1244. return nil
  1245. }
  1246. func LoadLines(name string) ([]string, error) {
  1247. file, err := os.Open(name)
  1248. if err != nil {
  1249. return nil, err
  1250. }
  1251. buf := bufio.NewReader(file)
  1252. res := make([]string, 0)
  1253. var line string
  1254. for {
  1255. bytes, isPrefix, err := buf.ReadLine()
  1256. if err == io.EOF {
  1257. break
  1258. } else if err != nil {
  1259. return nil, err
  1260. }
  1261. line += string(bytes)
  1262. if !isPrefix {
  1263. res = append(res, line)
  1264. line = ""
  1265. }
  1266. }
  1267. return res, nil
  1268. }
  1269. func (self *Server) ConfigureMembers(config *Config) error {
  1270. if maxProcs := config.GetIntDefault(0, "System", "MaxProcessors"); maxProcs > 0 {
  1271. runtime.GOMAXPROCS(maxProcs)
  1272. }
  1273. if admin := config.GetBlock("Admin"); admin == nil {
  1274. return errors.New("Missing required Admin block")
  1275. } else if err := self.AdminData.Configure(admin); err != nil {
  1276. return err
  1277. }
  1278. if lim := config.GetBlock("Limits"); lim == nil {
  1279. self.Limits.Configure(new(Block))
  1280. } else {
  1281. self.Limits.Configure(lim)
  1282. }
  1283. if opt := config.GetBlock("Options"); opt == nil {
  1284. self.Options.Configure(new(Block))
  1285. } else {
  1286. self.Options.Configure(opt)
  1287. }
  1288. if sec := config.GetBlock("Security"); sec == nil {
  1289. return errors.New("Missing Security configuration block")
  1290. } else {
  1291. if err := self.Security.Configure(sec); err != nil {
  1292. return err
  1293. }
  1294. }
  1295. operTypes, opers, err := LoadOperBlocks(config)
  1296. if err != nil {
  1297. return err
  1298. }
  1299. self.OperTypes = operTypes
  1300. self.OperBlocks = opers
  1301. connect, err := LoadConnectBlocks(config)
  1302. if err != nil {
  1303. return err
  1304. }
  1305. self.Connect = connect
  1306. binds, err := LoadBinds(config)
  1307. if err != nil {
  1308. return err
  1309. }
  1310. links, err := LoadLinks(config)
  1311. if err != nil {
  1312. return err
  1313. }
  1314. self.Links = links
  1315. self.ULines, err = LoadULines(config)
  1316. motdName := config.GetStringDefault("", "Files", "MOTD")
  1317. if motdName == "" {
  1318. self.MOTD = make([]string, 0)
  1319. } else {
  1320. motd, err := LoadLines(RelDir(motdName, self.ConfigDir))
  1321. if err != nil {
  1322. return err
  1323. }
  1324. self.MOTD = motd
  1325. }
  1326. rulesName := config.GetStringDefault("", "Files", "Rules")
  1327. if rulesName == "" {
  1328. self.Rules = make([]string, 0)
  1329. } else {
  1330. rules, err := LoadLines(RelDir(rulesName, self.ConfigDir))
  1331. if err != nil {
  1332. return err
  1333. }
  1334. self.Rules = rules
  1335. }
  1336. if log := config.GetBlock("Log"); log == nil {
  1337. self.Logger.Configure(new(Block), self.BaseDir)
  1338. } else {
  1339. self.Logger.Configure(log, self.BaseDir)
  1340. }
  1341. for _, bind := range binds {
  1342. for _, port := range bind.Ports {
  1343. addr := bind.Address(port)
  1344. doBind := true
  1345. if l, ok := self.listeners[addr]; ok {
  1346. if bind.Equal(l.Bind) {
  1347. doBind = false
  1348. } else {
  1349. l.Close()
  1350. }
  1351. }
  1352. if doBind {
  1353. if err := self.StartListener(bind, port); err != nil {
  1354. self.Log(Error, "Failed to open listener: %s", err)
  1355. }
  1356. }
  1357. }
  1358. }
  1359. if len(self.listeners) == 0 {
  1360. self.Fatal("No ports successfully opened, exiting")
  1361. }
  1362. return nil
  1363. }
  1364. func (self *Server) Configure() {
  1365. var err error
  1366. config := self.config
  1367. if err = config.Parse(self.ConfigFile); err != nil {
  1368. self.Log(Error, "Failed to parse configuration file: %s", err)
  1369. os.Exit(2)
  1370. }
  1371. if err = self.ConfigureServer(config); err != nil {
  1372. goto confError
  1373. }
  1374. if err = self.ConfigureMembers(config); err != nil {
  1375. goto confError
  1376. }
  1377. for _, handler := range Configure {
  1378. if err = handler.(ConfigureHandler).Configure(config); err != nil {
  1379. goto confError
  1380. }
  1381. }
  1382. return
  1383. confError:
  1384. self.Log(Error, "Failed to configure: %s", err)
  1385. os.Exit(3)
  1386. }
  1387. func (self *Server) Rehash() {
  1388. self.Log(Info, "Rehashing server")
  1389. config := NewConfig()
  1390. if err := config.Parse(self.ConfigFile); err != nil {
  1391. self.Log(Error, "Failed rehash: %s", err)
  1392. self.ServerNotice('a', "Failed to rehash %s on %s: %s",
  1393. path.Base(self.ConfigFile), self.ServerName, err)
  1394. } else {
  1395. var err error
  1396. if err := self.ConfigureMembers(config); err != nil {
  1397. goto rehashError
  1398. }
  1399. for _, handler := range Configure {
  1400. if err := handler.(ConfigureHandler).Configure(config); err != nil {
  1401. // We can't revert it now, so just report the error and carry on
  1402. self.Log(Error, "Failed event rehash %s: %s", handler, err)
  1403. self.ServerNotice('a', "Error while rehashing %s on %s: %s",
  1404. path.Base(self.ConfigFile), self.ServerName, err)
  1405. }
  1406. }
  1407. self.config = config
  1408. self.Log(Info, "Completed rehash")
  1409. self.ServerNotice('a', "Successfully rehashed %s", self.ServerName)
  1410. return
  1411. rehashError:
  1412. self.Log(Error, "Failed rehash: %s", err)
  1413. self.ServerNotice('a', "Error while rehashing %s on %s: %s",
  1414. path.Base(self.ConfigFile), self.ServerName, err)
  1415. self.ServerNotice('a', "Rehash failed")
  1416. }
  1417. }
  1418. func (self *Server) AddChannel(ch *Channel) {
  1419. self.channels[IRCToLower(ch.Name)] = ch
  1420. }
  1421. func (self *Server) GetChannel(name string) *Channel {
  1422. return self.channels[IRCToLower(name)]
  1423. }
  1424. func (self *Server) GetOper(name string) *Oper {
  1425. return self.OperBlocks[name]
  1426. }
  1427. func (self *Server) GetUser(nick string) *User {
  1428. return self.UserNicks[IRCToLower(nick)]
  1429. }
  1430. // GetUptime returns server uptime duration
  1431. func (self *Server) GetUptime() time.Duration {
  1432. return time.Now().Sub(self.StartTime)
  1433. }
  1434. func (self *Server) GetXLines(typ byte) []*XLine {
  1435. xlines := self.XLines[typ]
  1436. if xlines != nil {
  1437. res := make([]*XLine, 0, len(xlines))
  1438. for _, x := range xlines {
  1439. res = append(res, x)
  1440. }
  1441. return res
  1442. }
  1443. return nil
  1444. }
  1445. func (self *Server) KickUser(user *User, ch *Channel, format string, args ...interface{}) {
  1446. reason := fmt.Sprintf(format, args...)
  1447. self.SendChannel(nil, ch, TargetAll, "KICK %s %s :%s", ch.Name, user.Nick, reason)
  1448. ch.RemoveUser(user)
  1449. for _, handler := range UserKick {
  1450. handler.(UserKickHandler).UserKick(self, self.FakeUser, ch, user, reason)
  1451. }
  1452. ch.RemoveUser(user)
  1453. if len(ch.Users) == 0 {
  1454. self.DestroyChannel(ch)
  1455. }
  1456. }
  1457. func (self *Server) SetMode(ch *Channel, set bool, mode byte, param string) {
  1458. if hdlr := GetChannelMode(mode); hdlr != nil {
  1459. if hdlr.Type() == ModeBoolean && set == ch.HasMode(mode) {
  1460. return
  1461. }
  1462. // We ignore the result, but still want its possible side effects
  1463. hdlr.HandlePre(self, self.FakeUser, ch, set, &param)
  1464. hdlr.HandlePost(self, self.FakeUser, ch, set, param)
  1465. switch hdlr.Type() {
  1466. case ModeString, ModeStringSet:
  1467. if set {
  1468. ch.SetModeParameter(mode, param)
  1469. } else {
  1470. ch.RemoveModeParameter(mode)
  1471. }
  1472. case ModeBoolean:
  1473. if set {
  1474. ch.SetMode(mode)
  1475. } else {
  1476. ch.RemoveMode(mode)
  1477. }
  1478. case ModePrefix:
  1479. pfx := hdlr.(PrefixModeHandler)
  1480. u := self.GetUser(param)
  1481. if u != nil && ch.HasUser(u) {
  1482. param = u.Nick
  1483. if set {
  1484. ch.AddPrefix(u, pfx.Level())
  1485. } else {
  1486. ch.RemovePrefix(u, pfx.Level())
  1487. }
  1488. } else {
  1489. return
  1490. }
  1491. }
  1492. emit := NewEmitModes()
  1493. emit.Add(set, mode, param)
  1494. self.SendChannel(nil, ch, TargetAll, "MODE %s %s", ch.Name, emit)
  1495. }
  1496. }
  1497. func (self *Server) SetUMode(user *User, set bool, mode byte, param string) {
  1498. if hdlr := GetUserMode(mode); hdlr != nil {
  1499. if hdlr.Type() == ModeBoolean && set == user.HasMode(mode) {
  1500. return
  1501. }
  1502. // We ignore the result, but still want its possible side effects
  1503. hdlr.HandlePre(self, user, set, &param)
  1504. hdlr.HandlePost(self, user, set, param)
  1505. if hdlr.Type() < ModeMany {
  1506. if set {
  1507. user.SetMode(mode)
  1508. } else {
  1509. user.RemoveMode(mode)
  1510. }
  1511. }
  1512. emit := NewEmitModes()
  1513. emit.Add(set, mode, param)
  1514. self.SendServer(user, "MODE %s %s", user.Nick, emit)
  1515. }
  1516. }
  1517. func (self *Server) SetHost(user *User, host string) {
  1518. local := user.LocalUser
  1519. user.Host = host
  1520. // Check host-based XLines
  1521. if host != "" {
  1522. if x := self.MatchesAnyXLine(user); x != nil {
  1523. x.Apply(self, user)
  1524. if local.Killed {
  1525. return
  1526. }
  1527. }
  1528. }
  1529. if class := self.FindConnect(local); class != nil {
  1530. local.Connect = class
  1531. local.ChangeRecvQ <- class.RecvQ
  1532. local.ChangeSendQ <- class.SendQ
  1533. } else {
  1534. self.KillUser(user, "Access denied by configuration")
  1535. return
  1536. }
  1537. if local.registration & REG_HOST == 0 {
  1538. local.registration |= REG_HOST
  1539. if local.registration == REG_READY {
  1540. self.Register(user)
  1541. }
  1542. }
  1543. }
  1544. func (self *Server) SetVirtualHost(user *User, host string) {
  1545. user.VirtualHost = host
  1546. if user.IsLocal() {
  1547. self.SendDisplayedHost(user)
  1548. }
  1549. }
  1550. func (self *Server) SetNick(user *User, nick string) {
  1551. if user.Nick != nick {
  1552. nickLow := IRCToLower(nick)
  1553. oldNickLow := IRCToLower(user.Nick)
  1554. if nickLow != oldNickLow {
  1555. if self.UserNicks[oldNickLow] == user {
  1556. delete(self.UserNicks, oldNickLow)
  1557. }
  1558. self.UserNicks[nickLow] = user
  1559. }
  1560. if local := user.Local(); local != nil {
  1561. if local.IsRegistered() {
  1562. self.Send(user, user, "NICK %s", nick)
  1563. for _, u := range user.GetLocalNeighbors() {
  1564. self.Send(user, u, "NICK %s", nick)
  1565. }
  1566. user.Nick = nick
  1567. } else {
  1568. user.Nick = nick
  1569. local.registration |= REG_NICK
  1570. if local.registration == REG_READY {
  1571. self.Register(user)
  1572. }
  1573. }
  1574. } else {
  1575. user.Nick = nick
  1576. }
  1577. }
  1578. }
  1579. func (self *Server) SetIdent(user *User, ident string) {
  1580. user.Ident = TruncUTF8(ident, self.MaxIdent)
  1581. if local := user.Local(); local != nil {
  1582. local.registration |= REG_IDENT
  1583. if local.registration == REG_READY {
  1584. self.Register(user)
  1585. }
  1586. }
  1587. }
  1588. func (self *Server) SetRealName(user *User, name string) {
  1589. user.RealName = TruncUTF8(name, self.MaxRealName)
  1590. }
  1591. func (self *Server) SetTopic(user *User, ch *Channel, when int64, topic string) {
  1592. setter := user.Nick
  1593. if self.HostInTopic {
  1594. setter = user.FullHost()
  1595. }
  1596. topic = TruncUTF8(topic, self.MaxTopic)
  1597. ch.SetTopic(topic, setter, when)
  1598. self.SendChannel(user, ch, TargetLocal, "TOPIC %s :%s", ch.Name, topic)
  1599. }
  1600. func (self *Server) ModeStrings() {
  1601. self.extBans = ""
  1602. self.userModes = ""
  1603. self.channelModes = ""
  1604. var cmodeTypes [4]string
  1605. var i byte = 'A'
  1606. for {
  1607. off := ModeOffset(i)
  1608. char := string(i)
  1609. if mode := chanModes[off]; mode != nil {
  1610. self.channelModes += char
  1611. switch mode.Type() {
  1612. case ModeList:
  1613. cmodeTypes[0] += char
  1614. case ModeString:
  1615. cmodeTypes[1] += char
  1616. case ModeStringSet:
  1617. cmodeTypes[2] += char
  1618. case ModeBoolean:
  1619. cmodeTypes[3] += char
  1620. }
  1621. }
  1622. if mode := userModes[off]; mode != nil {
  1623. self.userModes += char
  1624. }
  1625. if extBans[off] {
  1626. self.extBans += char
  1627. }
  1628. if i == 'Z' {
  1629. i = 'a'
  1630. } else if i == 'z' {
  1631. break
  1632. } else {
  1633. i++
  1634. }
  1635. }
  1636. self.prefixModes, self.statusMsg = PrefixModes()
  1637. self.channelModesTypes += strings.Join(cmodeTypes[:], ",")
  1638. }
  1639. type SortedPrefixes []PrefixModeHandler
  1640. func (s SortedPrefixes) Len() int { return len(s) }
  1641. func (s SortedPrefixes) Less(i, j int) bool {
  1642. // Sort highest first
  1643. return s[i].Level() > s[j].Level()
  1644. }
  1645. func (s SortedPrefixes) Swap(i, j int) {
  1646. s[i], s[j] = s[j], s[i]
  1647. }
  1648. func PrefixModes() (prefix string, statusMsg string) {
  1649. prefixes := make(SortedPrefixes, 0, len(prefixesByChar))
  1650. for _, pfx := range prefixesByChar {
  1651. prefixes = append(prefixes, pfx)
  1652. }
  1653. sort.Sort(prefixes)
  1654. numPrefixes := len(prefixes)
  1655. modesStr := make([]byte, 0, numPrefixes)
  1656. charsStr := make([]byte, 0, numPrefixes)
  1657. for _, pfx := range prefixes {
  1658. modesStr = append(modesStr, pfx.Mode())
  1659. charsStr = append(charsStr, pfx.Prefix())
  1660. }
  1661. return fmt.Sprintf("(%s)%s", modesStr, charsStr), string(charsStr)
  1662. }
  1663. func (self *Server) Register(user *User) {
  1664. local := user.LocalUser
  1665. self.UnregisteredCount--
  1666. local.registration |= REG_DONE
  1667. // Check ident-based XLines
  1668. if x := self.MatchesAnyXLine(user); x != nil {
  1669. x.Apply(self, user)
  1670. if local.Killed {
  1671. return
  1672. }
  1673. }
  1674. local.Registered()
  1675. local.IdleTime = time.Now()
  1676. self.Users[user.Id] = user
  1677. if numUsers := len(self.Users); numUsers > self.MaxGlobalUsers {
  1678. self.MaxGlobalUsers = numUsers
  1679. }
  1680. if user.Host == user.IPString {
  1681. self.SendServer(user, "NOTICE Auth :*** Could not resolve " +
  1682. "your hostname; using your IP address (%s) instead.", user.Host)
  1683. } else {
  1684. self.SendServer(user, "NOTICE Auth :*** Found your hostname (%s)", user.Host)
  1685. }
  1686. self.SendServer(user, "NOTICE Auth :Welcome to \002%s\002", self.NetworkName)
  1687. self.SendNumeric(user, 1, "Welcome to the %s IRC Network %s",
  1688. self.NetworkName, user.FullHost())
  1689. self.SendNumeric(user, 2, "Your host is %s, running version %s",
  1690. self.ServerName, VERSION)
  1691. self.SendNumeric(user, 3, "This server was created %s", COMPILE_TIME)
  1692. self.SendNumeric(user, 4, "%s %s %s %s", self.ServerName, VERSION,
  1693. self.userModes, self.channelModes)
  1694. self.SendVersion(user, false)
  1695. self.SendMOTD(user)
  1696. self.SendLusers(user)
  1697. for _, handler := range UserPreBroadcast {
  1698. handler.(UserPreBroadcastHandler).UserPreBroadcast(self, user)
  1699. }
  1700. self.BroadcastUser(user)
  1701. for _, handler := range UserPostRegister {
  1702. handler.(UserPostRegisterHandler).UserPostRegister(self, user)
  1703. }
  1704. self.GlobalNotice('c', "Client connecting on port %d: %s [%s] (%s)",
  1705. local.GetServerPort(), user.FullRealHost(), user.IPString, user.RealName)
  1706. }
  1707. func (self *Server) UserInvited(user, invitee *User, ch *Channel) {
  1708. self.Send(user, invitee, "INVITE %s :%s", invitee.Nick, ch.Name)
  1709. self.SendNumeric(user, 341, "%s %s", invitee.Nick, ch.Name)
  1710. }
  1711. func (self *Server) UserUninvited(user, uninvitee *User, ch *Channel) {
  1712. self.Send(nil, user, "%s 494 %s %s :Was uninvited",
  1713. user.Nick, uninvitee.Nick, ch.Name)
  1714. self.SendNumeric(uninvitee, 493, "You were uninvited from %s by %s",
  1715. ch.Name, user.Nick)
  1716. self.SendChannel(nil, ch, TargetAll, "NOTICE %s :*** %s uninvited %s",
  1717. ch.Name, user.Nick, uninvitee.Nick)
  1718. }
  1719. func (self *Server) UserJoined(user *User, ch *Channel, targets TargetUsers) {
  1720. self.SendChannel(user, ch, targets, "JOIN %s", ch.Name)
  1721. if user.IsLocal() {
  1722. if ch.Topic != "" {
  1723. self.SendTopic(user, ch)
  1724. }
  1725. self.SendNames(user, ch)
  1726. }
  1727. }
  1728. func (self *Server) UserParted(user *User, ch *Channel, reason string) {
  1729. except := make(ExceptUsers)
  1730. for _, handler := range UserPart {
  1731. handler.(UserPartHandler).UserPart(self, user, ch, &reason, except)
  1732. }
  1733. reason = TruncUTF8(reason, self.MaxPartReason)
  1734. target := &TargetAnd{TargetLocal, except}
  1735. if reason == "" {
  1736. if user.IsLocal() {
  1737. reason = self.PartPrefix + reason + self.PartSuffix
  1738. }
  1739. self.SendChannel(user, ch, target, "PART %s", ch.Name)
  1740. } else {
  1741. self.SendChannel(user, ch, target, "PART %s :%s", ch.Name, reason)
  1742. }
  1743. self.Propagate(user.Server, ":%s PART %s :%s", user.Id, ch.Name, reason)
  1744. ch.RemoveUser(user)
  1745. if len(ch.Users) == 0 {
  1746. self.DestroyChannel(ch)
  1747. }
  1748. }
  1749. func (self *Server) UserQuit(user *User, reason string) {
  1750. reason = TruncUTF8(reason, self.MaxQuitReason)
  1751. if reason == "" {
  1752. self.KillUser(user, "%s", self.DefaultQuit)
  1753. } else {
  1754. self.KillUser(user, "%s%s%s", self.QuitPrefix, reason, self.QuitSuffix)
  1755. }
  1756. }
  1757. // KillAllClients will terminate every local client, issuing to each User
  1758. // a notification only of their own disconnection and leaving the server in a
  1759. // somewhat unclean state. All client connections will be closed, but their
  1760. // User structures and all related User and Channel data will be left in an
  1761. // undefined state.
  1762. //
  1763. // Generally only useful in performing a complete shutdown of the server.
  1764. func (self *Server) KillAllClients(reason string) {
  1765. for _, user := range self.LocalUsers {
  1766. local := user.LocalUser
  1767. local.Killed = true
  1768. local.Kill(fmt.Sprintf("ERROR :Closing link: (%s@%s) [%s]",
  1769. user.Ident, user.GetRealHost(), reason))
  1770. }
  1771. }
  1772. func (self *Server) KillUser(user *User, format string, args ...interface{}) {
  1773. isRegistered := true
  1774. reason := fmt.Sprintf(format, args...)
  1775. if local := user.Local(); local != nil {
  1776. local.Kill(fmt.Sprintf("ERROR :Closing link: (%s@%s) [%s]",
  1777. user.Ident, user.GetRealHost(), reason))
  1778. local.Killed = true
  1779. if !local.IsRegistered() {
  1780. isRegistered = false
  1781. self.UnregisteredCount--
  1782. } else {
  1783. self.GlobalNotice('q', "Client exiting: %s [%s] (%s)",
  1784. user.FullRealHost(), user.IPString, reason)
  1785. }
  1786. }
  1787. if isRegistered {
  1788. except := make(ExceptUsers)
  1789. for _, handler := range UserQuit {
  1790. handler.(UserQuitHandler).UserQuit(self, user, &reason, except)
  1791. }
  1792. for _, u := range user.GetNeighbors() {
  1793. if except.TargetUser(u) {
  1794. if u.IsLocal() {
  1795. self.Send(user, u, "QUIT :%s", reason)
  1796. }
  1797. }
  1798. }
  1799. self.Propagate(user.Server, ":%s QUIT :%s", user.Id, reason)
  1800. for ch := range user.Channels {
  1801. ch.RemoveUser(user)
  1802. if len(ch.Users) == 0 {
  1803. self.DestroyChannel(ch)
  1804. }
  1805. }
  1806. }
  1807. delete(self.UserNicks, IRCToLower(user.Nick))
  1808. delete(self.Users, user.Id)
  1809. delete(user.Server.Users, user.Id)
  1810. self.RemoveClone(user)
  1811. if user.IsLocal() && user.HasMode('o') {
  1812. delete(self.Operators, user)
  1813. }
  1814. }
  1815. func (self *Server) DestroyChannel(ch *Channel) {
  1816. if len(ch.Users) != 0 {
  1817. panic("Attempt to destroy non-empty Channel " + ch.Name)
  1818. }
  1819. for u := range ch.Invitees {
  1820. delete(u.Invites, ch)
  1821. }
  1822. delete(self.channels, IRCToLower(ch.Name))
  1823. }
  1824. func (self *Server) ClientListener(lst net.Listener) {
  1825. self.Log(Debug, "Goroutine spawned: Client listener for %s", lst.Addr())
  1826. defer func() {
  1827. self.Log(Debug, "Goroutine exit: Client listener for %s", lst.Addr())
  1828. self.RoutineExit()
  1829. }()
  1830. for {
  1831. conn, err := lst.Accept()
  1832. if err == nil {
  1833. user := NewLocalUser(self.Root, conn)
  1834. self.pendingClients <- user
  1835. } else {
  1836. if ne, ok := err.(net.Error); ok && ne.Temporary() {
  1837. <-time.After(10 * time.Second)
  1838. } else {
  1839. self.Log(Error, "Client listener encountered error: %s", err)
  1840. return
  1841. }
  1842. }
  1843. }
  1844. }
  1845. func (s

Large files files are truncated, but you can click here to view the full file