// Copyright 2016 Sam Whited. // Use of this source code is governed by the BSD 2-clause license that can be // found in the LICENSE file. package sasl_test import ( "fmt" "mellium.im/sasl" ) func Example_plainSuccess() { const ( username = "miranda" password = "pencil" ) creds := sasl.Credentials(func() ([]byte, []byte, []byte) { // In a real auth system this would probably be user input. return []byte(username), []byte(password), []byte{} }) server := sasl.NewServer(sasl.Plain, func(n *sasl.Negotiator) bool { user, pass, ident := n.Credentials() // In a real auth system you might want to consider a constant time // comparison and this would probably involve hashing and a database lookup. if len(ident) == 0 && string(user) == username && string(pass) == password { fmt.Println("auth success!") return true } fmt.Println("auth failed!") return false }, creds) client := sasl.NewClient(sasl.Plain, creds) _, resp, err := client.Step(nil) if err != nil { fmt.Println(err) return } // Normally the response would come from the network, not from a client on the // same machine. _, resp, err = server.Step(resp) if err != nil { fmt.Println(err) return } // Output: auth success! } func Example_plainFailure() { const ( username = "miranda" password = "pencil" ) creds := sasl.Credentials(func() ([]byte, []byte, []byte) { return []byte(username), []byte(password), []byte{} }) server := sasl.NewServer(sasl.Plain, func(n *sasl.Negotiator) bool { user, pass, ident := n.Credentials() // In a real auth system you might want to consider a constant time // comparison and this would probably involve hashing and a database lookup. if len(ident) == 0 && string(user) == username && string(pass) == password { fmt.Println("auth success!") return true } fmt.Println("auth failed!") return false }, creds) client := sasl.NewClient(sasl.Plain, sasl.Credentials(func() ([]byte, []byte, []byte) { // In a real auth system this would probably be user input. return []byte(username), []byte("password!"), []byte{} })) _, resp, err := client.Step(nil) if err != nil { fmt.Println(err) return } // Normally the response would come from the network, not from a client on the // same machine. _, resp, err = server.Step(resp) if err != sasl.ErrAuthn { fmt.Println(err) return } // Output: auth failed! }