adc: handle passworded logins, more error message types
--HG-- branch : adc
This commit is contained in:
parent
4c70900ef5
commit
916874e8bd
117
AdcProtocol.go
117
AdcProtocol.go
@ -112,8 +112,13 @@ func (this *AdcProtocol) ProcessCommand(msg string) {
|
|||||||
}
|
}
|
||||||
this.sid = parts[1]
|
this.sid = parts[1]
|
||||||
|
|
||||||
|
// State transition IDENTIFY --> VERIFY and send our own info
|
||||||
|
this.hc.SayRaw("BINF " + this.escape(this.sid) + " " + this.ourINFO(true) + "\n")
|
||||||
|
this.state = adcStateVerify
|
||||||
|
|
||||||
case "IINF":
|
case "IINF":
|
||||||
// Hub telling information about itself
|
// Hub telling information about itself
|
||||||
|
// ADCH++ sends this once we are successfully logged in
|
||||||
|
|
||||||
flags, err := this.parts2flags(parts[1:])
|
flags, err := this.parts2flags(parts[1:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -132,18 +137,8 @@ func (this *AdcProtocol) ProcessCommand(msg string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if this.state == adcStateIdentify {
|
if this.state != adcStateNormal {
|
||||||
// Transition to state VERIFY and send our own info
|
this.enterNormalState() // successful login
|
||||||
this.hc.SayRaw("BINF " + this.escape(this.sid) + " " + this.ourINFO(true) + "\n")
|
|
||||||
this.state = adcStateVerify
|
|
||||||
|
|
||||||
} else if this.state == adcStateNormal || this.state == adcStateVerify {
|
|
||||||
// OK
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Bad state to be in
|
|
||||||
this.malformed(parts)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "BINF":
|
case "BINF":
|
||||||
@ -211,8 +206,17 @@ func (this *AdcProtocol) ProcessCommand(msg string) {
|
|||||||
handleNewUser()
|
handleNewUser()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "IMSG":
|
||||||
|
// General message from the hub
|
||||||
|
if len(parts) < 2 {
|
||||||
|
this.malformed(parts)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.hc.processEvent(HubEvent{EventType: EVENT_SYSTEM_MESSAGE_FROM_HUB, Message: this.unescape(parts[1])})
|
||||||
|
|
||||||
case "ISTA":
|
case "ISTA":
|
||||||
// Message from the hub
|
// Error message from the hub
|
||||||
if len(parts) < 3 {
|
if len(parts) < 3 {
|
||||||
this.malformed(parts)
|
this.malformed(parts)
|
||||||
return
|
return
|
||||||
@ -222,8 +226,75 @@ func (this *AdcProtocol) ProcessCommand(msg string) {
|
|||||||
msg := this.unescape(parts[2])
|
msg := this.unescape(parts[2])
|
||||||
this.hc.processEvent(HubEvent{EventType: EVENT_SYSTEM_MESSAGE_FROM_HUB, Message: this.ErrorMessage(code, msg)})
|
this.hc.processEvent(HubEvent{EventType: EVENT_SYSTEM_MESSAGE_FROM_HUB, Message: this.ErrorMessage(code, msg)})
|
||||||
|
|
||||||
|
case "IQUI":
|
||||||
|
// Error message from the hub
|
||||||
|
// IQUI V3M6 DI1 MSNick\staken,\splease\spick\sanother\sone TL-1
|
||||||
|
flags, err := this.parts2flags(parts[1:])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if msg, ok := flags["MS"]; ok {
|
||||||
|
this.hc.processEvent(HubEvent{EventType: EVENT_SYSTEM_MESSAGE_FROM_HUB, Message: "The hub is closing our connection because: " + this.unescape(msg)})
|
||||||
|
} else {
|
||||||
|
this.hc.processEvent(HubEvent{EventType: EVENT_SYSTEM_MESSAGE_FROM_HUB, Message: "The hub is closing our connection"})
|
||||||
|
}
|
||||||
|
|
||||||
|
case "BMSG":
|
||||||
|
// Message from a user
|
||||||
|
if len(parts) < 3 {
|
||||||
|
this.malformed(parts)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sid := this.unescape(parts[1])
|
||||||
|
msg := this.unescape(parts[2])
|
||||||
|
|
||||||
|
this.hc.usersMut.Lock()
|
||||||
|
defer this.hc.usersMut.Unlock()
|
||||||
|
nick, ok := this.hc.userSIDs[sid]
|
||||||
|
if !ok {
|
||||||
|
this.logError(fmt.Errorf("Recieved message from unknown SID '%s'", sid))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.hc.processEvent(HubEvent{EventType: EVENT_PUBLIC, Nick: nick, Message: msg})
|
||||||
|
|
||||||
case "IGPA":
|
case "IGPA":
|
||||||
//
|
// Password is needed
|
||||||
|
// IGPA 7EIAAAECLMAAAPJQAAADQQYAAAWAYAAAKVFQAAF6EAAAAAYFAAAA
|
||||||
|
// HPAS LZDIJOTZDPWHINHGPT5RHT6WLU7DRME7DQO2O3Q
|
||||||
|
if len(parts) < 2 {
|
||||||
|
this.malformed(parts)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
For GPA/PAS, assuming that '12345' is the random data supplied in GPA, then;
|
||||||
|
PAS = Base32( Hash( password + '12345' ) )
|
||||||
|
|
||||||
|
GPA: The data parameter is at least 24 random bytes (base32 encoded).
|
||||||
|
*/
|
||||||
|
|
||||||
|
data_base32 := parts[1]
|
||||||
|
if len(data_base32)%5 != 0 {
|
||||||
|
data_base32 += strings.Repeat("=", 6-(len(data_base32)%5))
|
||||||
|
}
|
||||||
|
|
||||||
|
data_raw, err := base32.StdEncoding.DecodeString(data_base32)
|
||||||
|
if err != nil {
|
||||||
|
this.logError(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := Base32(Tiger(this.hc.Hco.NickPassword + string(data_raw)))
|
||||||
|
this.hc.SayRaw("HPAS " + resp + "\n")
|
||||||
|
|
||||||
|
case "EMSG":
|
||||||
|
// Private message from other user
|
||||||
|
// EMSG I5RO FMWH test\spm PMI5RO
|
||||||
|
|
||||||
|
case "DCTM": // Client-client ConnectToMe
|
||||||
|
// ignore
|
||||||
|
|
||||||
default:
|
default:
|
||||||
this.malformed(parts)
|
this.malformed(parts)
|
||||||
@ -250,23 +321,7 @@ func (this *AdcProtocol) infoFlagsFor(u *UserInfo) map[string]string {
|
|||||||
parts["VE"] = fmt.Sprintf("%s %s", u.ClientVersion, u.ClientTag)
|
parts["VE"] = fmt.Sprintf("%s %s", u.ClientVersion, u.ClientTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
ct := 0 // 1=bot, 2=registered user, 4=operator, 8=super user, 16=hub owner, 32=hub
|
// Do not send the hub a CT (it decides what type we are)
|
||||||
if u.IsBot {
|
|
||||||
ct |= 1
|
|
||||||
}
|
|
||||||
if u.IsRegistered {
|
|
||||||
ct |= 2
|
|
||||||
}
|
|
||||||
if u.IsOperator {
|
|
||||||
ct |= 4
|
|
||||||
}
|
|
||||||
if u.IsSuperUser {
|
|
||||||
ct |= 8
|
|
||||||
}
|
|
||||||
if u.IsHubOwner {
|
|
||||||
ct |= 16
|
|
||||||
}
|
|
||||||
parts["CT"] = fmt.Sprintf("%d", ct)
|
|
||||||
|
|
||||||
return parts
|
return parts
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user