/
auth.go
110 lines (91 loc) · 2.57 KB
/
auth.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package packet
import (
"bytes"
"loginserver/rsa"
"share/log"
"share/models/account"
"share/models/message"
"share/network"
"share/rpc"
"time"
)
// PublicKey Packet
func PublicKey(session *network.Session, reader *network.Reader) {
var rsa = g_ServerSettings.RSA
var key = rsa.PublicKey
var packet = network.NewWriter(PUBLIC_KEY)
packet.WriteByte(0x01)
packet.WriteUint16(len(key))
packet.WriteBytes(key[:])
session.Send(packet)
}
// AuthAccount Packet
func AuthAccount(session *network.Session, reader *network.Reader) {
if session.Data.Verified != true {
log.Errorf("Session version is not verified! Src: %s", session.GetEndPnt())
session.Close()
return
}
// skip 2 bytes
reader.ReadUint16()
// read and decrypt RSA block
var loginData = reader.ReadBytes(rsa.RSA_LOGIN_LENGTH)
var data, err = g_ServerSettings.RSA.Decrypt(loginData[:])
if err != nil {
log.Errorf("%s; Src: %s", err.Error(), session.GetEndPnt())
session.Close()
return
}
// extract name and pass
var name = string(bytes.Trim(data[:32], "\x00"))
var pass = string(bytes.Trim(data[32:], "\x00"))
var r = account.AuthResponse{Status: account.None}
err = g_RPCHandler.Call(rpc.AuthCheck, account.AuthRequest{name, pass}, &r)
// if server is down...
if err != nil {
r.Status = account.OutOfService
}
var packet = network.NewWriter(AUTHACCOUNT)
packet.WriteByte(r.Status)
packet.WriteInt32(r.Id)
packet.WriteInt16(0x00)
packet.WriteByte(len(r.CharList)) // server count
packet.WriteInt64(0x00)
packet.WriteInt32(0x00) // premium service id
packet.WriteInt32(0x00) // premium service expire date
packet.WriteByte(0x00)
packet.WriteByte(r.SubPassChar) // subpassword exists for character
packet.WriteBytes(make([]byte, 7))
packet.WriteInt32(0x00) // language
packet.WriteString(r.AuthKey + "\x00")
for _, value := range r.CharList {
packet.WriteByte(value.Server)
packet.WriteByte(value.Count)
}
session.Send(packet)
if r.Status == account.Normal {
log.Infof("User `%s` successfully logged in.", name)
session.Data.AccountId = r.Id
session.Data.LoggedIn = true
// send url's
URLToClient(session)
// send normal system message
session.Send(SystemMessg(message.Normal, 0))
// send server list periodically
var t = time.NewTicker(time.Second * 5)
go func(s *network.Session) {
for {
if !s.Connected {
break
}
s.Send(ServerSate())
<-t.C
}
}(session)
} else if r.Status == account.Online {
session.Data.AccountId = r.Id
log.Infof("User `%s` double login attempt.", name)
} else {
log.Infof("User `%s` failed to log in.", name)
}
}