main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/mkaminski/goaim/oscar"
  5. "io"
  6. "log"
  7. "net"
  8. "net/http"
  9. )
  10. const testFile string = "/Users/mike/dev/goaim/aim.db"
  11. func main() {
  12. sm := oscar.NewSessionManager()
  13. fm, err := oscar.NewFeedbagStore(testFile)
  14. if err != nil {
  15. log.Fatal(err)
  16. }
  17. go listenBOS(sm, fm)
  18. listener, err := net.Listen("tcp", ":5190")
  19. if err != nil {
  20. log.Fatal(err)
  21. }
  22. defer listener.Close()
  23. fmt.Println("Server is listening on port 5190")
  24. for {
  25. // Accept incoming connections
  26. conn, err := listener.Accept()
  27. if err != nil {
  28. log.Println(err)
  29. continue
  30. }
  31. // Handle connection in a separate goroutine
  32. go handleAuthConnection(sm, fm, conn)
  33. }
  34. }
  35. func webServer(ch chan string) {
  36. http.HandleFunc("/send-im", func(w http.ResponseWriter, r *http.Request) {
  37. body, _ := io.ReadAll(r.Body)
  38. ch <- string(body)
  39. })
  40. if err := http.ListenAndServe(":3333", nil); err != nil {
  41. panic(err.Error())
  42. }
  43. }
  44. func listenBOS(sm *oscar.SessionManager, fm *oscar.FeedbagStore) {
  45. // Listen on TCP port 5190
  46. listener, err := net.Listen("tcp", ":5191")
  47. if err != nil {
  48. log.Fatal(err)
  49. }
  50. ch := make(chan string, 1)
  51. go webServer(ch)
  52. defer listener.Close()
  53. fmt.Println("Server is listening on port 5191")
  54. for {
  55. // Accept incoming connections
  56. conn, err := listener.Accept()
  57. if err != nil {
  58. log.Println(err)
  59. continue
  60. }
  61. go handleBOSConnection(sm, fm, conn)
  62. }
  63. }
  64. func handleAuthConnection(sm *oscar.SessionManager, fm *oscar.FeedbagStore, conn net.Conn) {
  65. defer conn.Close()
  66. seq := uint32(100)
  67. _, err := oscar.SendAndReceiveSignonFrame(conn, &seq)
  68. if err != nil {
  69. log.Println(err)
  70. return
  71. }
  72. sess, err := sm.NewSession()
  73. if err != nil {
  74. log.Fatal(err.Error())
  75. }
  76. err = oscar.ReceiveAndSendAuthChallenge(sess, conn, conn, &seq)
  77. if err != nil {
  78. log.Println(err)
  79. return
  80. }
  81. err = oscar.ReceiveAndSendBUCPLoginRequest(sess, fm, conn, conn, &seq)
  82. if err != nil {
  83. log.Println(err)
  84. return
  85. }
  86. }
  87. func handleBOSConnection(sm *oscar.SessionManager, fm *oscar.FeedbagStore, conn net.Conn) {
  88. if err := oscar.ReadBos(sm, fm, conn); err != nil && err != io.EOF {
  89. if err != io.EOF {
  90. fmt.Printf("user disconnected with error: %s\n", err.Error())
  91. } else {
  92. fmt.Println("user disconnected")
  93. }
  94. }
  95. }