attempt anonymous only when logging in without JID and password

This commit is contained in:
James Andariese 2015-04-12 22:12:16 -07:00
parent cc56ae0810
commit e8c25dcffe
2 changed files with 101 additions and 79 deletions

View File

@ -32,7 +32,9 @@ func main() {
} }
flag.Parse() flag.Parse()
if *username == "" || *password == "" { if *username == "" || *password == "" {
flag.Usage() if *debug {
fmt.Fprintf(os.Stderr, "no username or password were given; attempting ANONYMOUS auth\n")
}
} }
if !*notls { if !*notls {

24
xmpp.go
View File

@ -44,6 +44,10 @@ const (
// Default TLS configuration options // Default TLS configuration options
var DefaultConfig tls.Config var DefaultConfig tls.Config
func init() {
DefaultConfig.InsecureSkipVerify = true
}
// Cookie is a unique XMPP session identifier // Cookie is a unique XMPP session identifier
type Cookie uint64 type Cookie uint64
@ -272,11 +276,14 @@ func (c *Client) init(o *Options) error {
c.p = xml.NewDecoder(c.conn) c.p = xml.NewDecoder(c.conn)
} }
var domain string
a := strings.SplitN(o.User, "@", 2) a := strings.SplitN(o.User, "@", 2)
if len(o.User) > 0 {
if len(a) != 2 { if len(a) != 2 {
return errors.New("xmpp: invalid username (want user@domain): " + o.User) return errors.New("xmpp: invalid username (want user@domain): " + o.User)
} }
domain := a[1] domain = a[1]
} // Otherwise, we'll be attempting ANONYMOUS
// Declare intent to be a jabber client and gather stream features. // Declare intent to be a jabber client and gather stream features.
f, err := c.startStream(o, domain) f, err := c.startStream(o, domain)
@ -289,6 +296,19 @@ func (c *Client) init(o *Options) error {
return err return err
} }
if o.User == "" && o.Password == "" {
found_anonymous := false
for _, m := range f.Mechanisms.Mechanism {
if m == "ANONYMOUS" {
fmt.Fprintf(c.conn, "<auth xmlns='%s' mechanism='ANONYMOUS' />\n", nsSASL)
found_anonymous = true
break
}
}
if !found_anonymous {
return fmt.Errorf("ANONYMOUS authentication is not an option and username and password were not specified")
}
} else {
// Even digest forms of authentication are unsafe if we do not know that the host // Even digest forms of authentication are unsafe if we do not know that the host
// we are talking to is the actual server, and not a man in the middle playing // we are talking to is the actual server, and not a man in the middle playing
// proxy. // proxy.
@ -370,7 +390,7 @@ func (c *Client) init(o *Options) error {
if mechanism == "" { if mechanism == "" {
return fmt.Errorf("PLAIN authentication is not an option: %v", f.Mechanisms.Mechanism) return fmt.Errorf("PLAIN authentication is not an option: %v", f.Mechanisms.Mechanism)
} }
}
// Next message should be either success or failure. // Next message should be either success or failure.
name, val, err := next(c.p) name, val, err := next(c.p)
if err != nil { if err != nil {