mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-15 00:19:29 +01:00
ee7f818674
* implement SASL OAUTHBEARER and draft/bearer * Upgrade JWT lib * Fix an edge case in SASL EXTERNAL * Accept longer SASL responses * review fix: allow multiple token definitions * enhance tests * use SASL utilities from irc-go * test expired tokens
79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
|
|
// released under the MIT license
|
|
|
|
package caps
|
|
|
|
import "errors"
|
|
|
|
// Capability represents an optional feature that a client may request from the server.
|
|
type Capability uint
|
|
|
|
// actual capability definitions appear in defs.go
|
|
|
|
var (
|
|
nameToCapability map[string]Capability
|
|
|
|
NoSuchCap = errors.New("Unsupported capability name")
|
|
)
|
|
|
|
// Name returns the name of the given capability.
|
|
func (capability Capability) Name() string {
|
|
return capabilityNames[capability]
|
|
}
|
|
|
|
func NameToCapability(name string) (result Capability, err error) {
|
|
result, found := nameToCapability[name]
|
|
if !found {
|
|
err = NoSuchCap
|
|
}
|
|
return
|
|
}
|
|
|
|
// Version is used to select which max version of CAP the client supports.
|
|
type Version uint
|
|
|
|
const (
|
|
// Cap301 refers to the base CAP spec.
|
|
Cap301 Version = 301
|
|
// Cap302 refers to the IRCv3.2 CAP spec.
|
|
Cap302 Version = 302
|
|
)
|
|
|
|
// State shows whether we're negotiating caps, finished, etc for connection registration.
|
|
type State uint
|
|
|
|
const (
|
|
// NoneState means CAP hasn't been negotiated at all.
|
|
NoneState State = iota
|
|
// NegotiatingState means CAP is being negotiated and registration should be paused.
|
|
NegotiatingState State = iota
|
|
// NegotiatedState means CAP negotiation has been successfully ended and reg should complete.
|
|
NegotiatedState State = iota
|
|
)
|
|
|
|
const (
|
|
// LabelTagName is the tag name used for the labeled-response spec.
|
|
// https://ircv3.net/specs/extensions/labeled-response.html
|
|
LabelTagName = "label"
|
|
// More draft names associated with draft/multiline:
|
|
MultilineBatchType = "draft/multiline"
|
|
MultilineConcatTag = "draft/multiline-concat"
|
|
// draft/relaymsg:
|
|
RelaymsgTagName = "draft/relaymsg"
|
|
// BOT mode: https://ircv3.net/specs/extensions/bot-mode
|
|
BotTagName = "bot"
|
|
// https://ircv3.net/specs/extensions/chathistory
|
|
ChathistoryTargetsBatchType = "draft/chathistory-targets"
|
|
|
|
// draft/bearer defines this prefix namespace for authcids, enabling tunneling bearer tokens
|
|
// in SASL PLAIN:
|
|
BearerTokenPrefix = "*bearer*"
|
|
)
|
|
|
|
func init() {
|
|
nameToCapability = make(map[string]Capability)
|
|
for capab, name := range capabilityNames {
|
|
nameToCapability[name] = Capability(capab)
|
|
}
|
|
}
|