| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- // +build integration
- // To turn on this test use -tags=integration in go test command
- package client
- import (
- "encoding/hex"
- "github.com/jcmturner/gokrb5/config"
- "github.com/jcmturner/gokrb5/credentials"
- "github.com/jcmturner/gokrb5/iana/etypeID"
- "github.com/jcmturner/gokrb5/keytab"
- "github.com/jcmturner/gokrb5/testdata"
- "github.com/stretchr/testify/assert"
- "net/http"
- "testing"
- )
- func TestClient_SuccessfulLogin(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_TCPOnly(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- c.LibDefaults.UDPPreferenceLimit = 1
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_OlderKDC(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_OLDERKDC)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_ETYPE_DES3_CBC_SHA1_KD(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- c.LibDefaults.DefaultTktEnctypes = []string{"des3-cbc-sha1-kd"}
- c.LibDefaults.DefaultTktEnctypeIDs = []int{etypeID.DES3_CBC_SHA1_KD}
- c.LibDefaults.DefaultTGSEnctypes = []string{"des3-cbc-sha1-kd"}
- c.LibDefaults.DefaultTGSEnctypeIDs = []int{etypeID.DES3_CBC_SHA1_KD}
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_ETYPE_AES128_CTS_HMAC_SHA256_128(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_LATESTKDC)
- c.LibDefaults.DefaultTktEnctypes = []string{"aes128-cts-hmac-sha256-128"}
- c.LibDefaults.DefaultTktEnctypeIDs = []int{etypeID.AES128_CTS_HMAC_SHA256_128}
- c.LibDefaults.DefaultTGSEnctypes = []string{"aes128-cts-hmac-sha256-128"}
- c.LibDefaults.DefaultTGSEnctypeIDs = []int{etypeID.AES128_CTS_HMAC_SHA256_128}
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_ETYPE_AES256_CTS_HMAC_SHA384_192(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_LATESTKDC)
- c.LibDefaults.DefaultTktEnctypes = []string{"aes256-cts-hmac-sha384-192"}
- c.LibDefaults.DefaultTktEnctypeIDs = []int{etypeID.AES256_CTS_HMAC_SHA384_192}
- c.LibDefaults.DefaultTGSEnctypes = []string{"aes256-cts-hmac-sha384-192"}
- c.LibDefaults.DefaultTGSEnctypeIDs = []int{etypeID.AES256_CTS_HMAC_SHA384_192}
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_RC4HMAC(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_AD)
- c.LibDefaults.DefaultTktEnctypes = []string{"rc4-hmac"}
- c.LibDefaults.DefaultTktEnctypeIDs = []int{etypeID.RC4_HMAC}
- c.LibDefaults.DefaultTGSEnctypes = []string{"rc4-hmac"}
- c.LibDefaults.DefaultTGSEnctypeIDs = []int{etypeID.RC4_HMAC}
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_AD(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_AD)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_TGSExchange_EncTypes(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_LATESTKDC)
- var tests = []string{
- "des3-cbc-sha1-kd",
- "aes128-cts-hmac-sha1-96",
- "aes256-cts-hmac-sha1-96",
- "aes128-cts-hmac-sha256-128",
- "aes256-cts-hmac-sha384-192",
- "rc4-hmac",
- }
- for _, test := range tests {
- c.LibDefaults.DefaultTktEnctypes = []string{test}
- c.LibDefaults.DefaultTktEnctypeIDs = []int{etypeID.ETypesByName[test]}
- c.LibDefaults.DefaultTGSEnctypes = []string{test}
- c.LibDefaults.DefaultTGSEnctypeIDs = []int{etypeID.ETypesByName[test]}
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Errorf("Error on login using enctype %s: %v\n", test, err)
- }
- tkt, key, err := cl.GetServiceTicket("HTTP/host.test.gokrb5")
- if err != nil {
- t.Errorf("Error in TGS exchange using enctype %s: %v", test, err)
- }
- assert.Equal(t, "TEST.GOKRB5", tkt.Realm, "Realm in ticket not as expected for %s test", test)
- assert.Equal(t, etypeID.ETypesByName[test], key.KeyType, "Key is not for enctype %s", test)
- }
- }
- func TestClient_FailedLogin(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_WRONGPASSWD)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err == nil {
- t.Fatal("Login with incorrect password did not error")
- }
- }
- func TestClient_SuccessfulLogin_UserRequiringPreAuth(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER2_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl := NewClientWithKeytab("testuser2", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_SuccessfulLogin_UserRequiringPreAuth_TCPOnly(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER2_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- c.LibDefaults.UDPPreferenceLimit = 1
- cl := NewClientWithKeytab("testuser2", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- }
- func TestClient_NetworkTimeout(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_BAD_KDC_ADDRESS)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err == nil {
- t.Fatal("Login with incorrect KDC address did not error")
- }
- }
- func TestClient_GetServiceTicket(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- spn := "HTTP/host.test.gokrb5"
- tkt, key, err := cl.GetServiceTicket(spn)
- if err != nil {
- t.Fatalf("Error getting service ticket: %v\n", err)
- }
- assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
- assert.Equal(t, 18, key.KeyType)
- //Check cache use - should get the same values back again
- tkt2, key2, err := cl.GetServiceTicket(spn)
- if err != nil {
- t.Fatalf("Error getting service ticket: %v\n", err)
- }
- assert.Equal(t, tkt.EncPart.Cipher, tkt2.EncPart.Cipher)
- assert.Equal(t, key.KeyValue, key2.KeyValue)
- }
- func TestClient_GetServiceTicket_OlderKDC(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_OLDERKDC)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- spn := "HTTP/host.test.gokrb5"
- tkt, key, err := cl.GetServiceTicket(spn)
- if err != nil {
- t.Fatalf("Error getting service ticket: %v\n", err)
- }
- assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
- assert.Equal(t, 18, key.KeyType)
- }
- func TestClient_GetServiceTicket_AD(t *testing.T) {
- b, err := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF_AD)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err = cl.Login()
- if err != nil {
- t.Fatalf("Error on login: %v\n", err)
- }
- spn := "HTTP/host.test.gokrb5"
- tkt, key, err := cl.GetServiceTicket(spn)
- if err != nil {
- t.Fatalf("Error getting service ticket: %v\n", err)
- }
- assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
- assert.Equal(t, 18, key.KeyType)
- }
- func TestClient_SetSPNEGOHeader(t *testing.T) {
- b, _ := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
- kt, _ := keytab.Parse(b)
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
- cl.WithConfig(c)
- err := cl.Login()
- if err != nil {
- t.Fatalf("Error on AS_REQ: %v\n", err)
- }
- r, _ := http.NewRequest("GET", "http://10.80.88.90/index.html", nil)
- httpResp, err := http.DefaultClient.Do(r)
- if err != nil {
- t.Fatalf("Request error: %v\n", err)
- }
- assert.Equal(t, http.StatusUnauthorized, httpResp.StatusCode, "Status code in response to client with no SPNEGO not as expected")
- err = cl.SetSPNEGOHeader(r, "HTTP/host.test.gokrb5")
- if err != nil {
- t.Fatalf("Error setting client SPNEGO header: %v", err)
- }
- httpResp, err = http.DefaultClient.Do(r)
- if err != nil {
- t.Fatalf("Request error: %v\n", err)
- }
- assert.Equal(t, http.StatusOK, httpResp.StatusCode, "Status code in response to client SPNEGO request not as expected")
- }
- func TestNewClientFromCCache(t *testing.T) {
- b, err := hex.DecodeString(testdata.CCACHE_TEST)
- if err != nil {
- t.Fatalf("Error decoding test data")
- }
- cc, err := credentials.ParseCCache(b)
- if err != nil {
- t.Fatal("Error getting test CCache")
- }
- cl, err := NewClientFromCCache(cc)
- if err != nil {
- t.Fatalf("Error creating client from CCache: %v", err)
- }
- c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
- cl.WithConfig(c)
- if ok, err := cl.IsConfigured(); !ok {
- t.Fatalf("Client was not configured from CCache: %v", err)
- }
- }
|