client_ad_integration_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // +build adintegration
  2. // To turn on this test use -tags=integration in go test command
  3. package client
  4. import (
  5. "encoding/hex"
  6. "github.com/stretchr/testify/assert"
  7. "gopkg.in/jcmturner/gokrb5.v6/config"
  8. "gopkg.in/jcmturner/gokrb5.v6/iana/etypeID"
  9. "gopkg.in/jcmturner/gokrb5.v6/keytab"
  10. "gopkg.in/jcmturner/gokrb5.v6/testdata"
  11. "testing"
  12. )
  13. func TestClient_SuccessfulLogin_AD(t *testing.T) {
  14. b, _ := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
  15. kt, _ := keytab.Parse(b)
  16. c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
  17. c.Realms[0].KDC = []string{testdata.TEST_KDC_AD}
  18. cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
  19. cl.WithConfig(c)
  20. err := cl.Login()
  21. if err != nil {
  22. t.Fatalf("Error on login: %v\n", err)
  23. }
  24. }
  25. func TestClient_GetServiceTicket_AD(t *testing.T) {
  26. b, _ := hex.DecodeString(testdata.TESTUSER1_KEYTAB)
  27. kt, _ := keytab.Parse(b)
  28. c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
  29. c.Realms[0].KDC = []string{testdata.TEST_KDC_AD}
  30. cl := NewClientWithKeytab("testuser1", "TEST.GOKRB5", kt)
  31. cl.WithConfig(c)
  32. err := cl.Login()
  33. if err != nil {
  34. t.Fatalf("Error on login: %v\n", err)
  35. }
  36. spn := "HTTP/host.test.gokrb5"
  37. tkt, key, err := cl.GetServiceTicket(spn)
  38. if err != nil {
  39. t.Fatalf("Error getting service ticket: %v\n", err)
  40. }
  41. assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
  42. assert.Equal(t, int32(18), key.KeyType)
  43. b, _ = hex.DecodeString(testdata.SYSHTTP_KEYTAB)
  44. skt, _ := keytab.Parse(b)
  45. err = tkt.DecryptEncPart(skt, "sysHTTP")
  46. if err != nil {
  47. t.Errorf("could not decrypt service ticket: %v", err)
  48. }
  49. isPAC, pac, e := tkt.GetPACType(skt, "sysHTTP")
  50. if e != nil {
  51. t.Errorf("error getting PAC: %v", e)
  52. }
  53. assert.True(t, isPAC, "should have PAC")
  54. assert.Equal(t, "TEST.GOKRB5", pac.KerbValidationInfo.LogonDomainName.String(), "domain name in PAC not correct")
  55. }
  56. func TestClient_SuccessfulLogin_AD_TRUST_USER_DOMAIN(t *testing.T) {
  57. b, _ := hex.DecodeString(testdata.TESTUSER1_USERKRB5_AD_KEYTAB)
  58. kt, _ := keytab.Parse(b)
  59. c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
  60. c.Realms[0].KDC = []string{testdata.TEST_KDC_AD_TRUST_USER_DOMAIN}
  61. c.LibDefaults.DefaultRealm = "USER.GOKRB5"
  62. cl := NewClientWithKeytab("testuser1", "USER.GOKRB5", kt)
  63. cl.WithConfig(c)
  64. cl.GoKrb5Conf.DisablePAFXFast = true
  65. err := cl.Login()
  66. if err != nil {
  67. t.Fatalf("Error on login: %v\n", err)
  68. }
  69. }
  70. func TestClient_GetServiceTicket_AD_TRUST_USER_DOMAIN(t *testing.T) {
  71. b, _ := hex.DecodeString(testdata.TESTUSER1_USERKRB5_AD_KEYTAB)
  72. kt, _ := keytab.Parse(b)
  73. c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
  74. c.Realms[0].KDC = []string{testdata.TEST_KDC_AD_TRUST_USER_DOMAIN}
  75. c.LibDefaults.DefaultRealm = "USER.GOKRB5"
  76. c.LibDefaults.Canonicalize = true
  77. cl := NewClientWithKeytab("testuser1", "USER.GOKRB5", kt)
  78. c.LibDefaults.DefaultTktEnctypes = []string{"rc4-hmac"}
  79. c.LibDefaults.DefaultTktEnctypeIDs = []int32{etypeID.ETypesByName["rc4-hmac"]}
  80. c.LibDefaults.DefaultTGSEnctypes = []string{"rc4-hmac"}
  81. c.LibDefaults.DefaultTGSEnctypeIDs = []int32{etypeID.ETypesByName["rc4-hmac"]}
  82. cl.WithConfig(c)
  83. cl.GoKrb5Conf.DisablePAFXFast = true
  84. err := cl.Login()
  85. if err != nil {
  86. t.Fatalf("Error on login: %v\n", err)
  87. }
  88. spn := "HTTP/host.res.gokrb5"
  89. tkt, key, err := cl.GetServiceTicket(spn)
  90. if err != nil {
  91. t.Fatalf("Error getting service ticket: %v\n", err)
  92. }
  93. assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
  94. assert.Equal(t, etypeID.ETypesByName["rc4-hmac"], key.KeyType)
  95. b, _ = hex.DecodeString(testdata.SYSHTTP_RESGOKRB5_AD_KEYTAB)
  96. skt, _ := keytab.Parse(b)
  97. err = tkt.DecryptEncPart(skt, "sysHTTP")
  98. if err != nil {
  99. t.Errorf("error decrypting ticket with service keytab: %v", err)
  100. }
  101. isPAC, pac, err := tkt.GetPACType(skt, "sysHTTP")
  102. if err != nil {
  103. t.Errorf("error getting PAC: %v", err)
  104. }
  105. assert.True(t, isPAC, "Did not find PAC in service ticket")
  106. assert.Equal(t, "testuser1", pac.KerbValidationInfo.EffectiveName.Value, "PAC value not parsed")
  107. }
  108. func TestClient_GetServiceTicket_AD_USER_DOMAIN(t *testing.T) {
  109. b, _ := hex.DecodeString(testdata.TESTUSER1_USERKRB5_AD_KEYTAB)
  110. kt, _ := keytab.Parse(b)
  111. c, _ := config.NewConfigFromString(testdata.TEST_KRB5CONF)
  112. c.Realms[0].KDC = []string{testdata.TEST_KDC_AD_TRUST_USER_DOMAIN}
  113. c.LibDefaults.DefaultRealm = "USER.GOKRB5"
  114. c.LibDefaults.Canonicalize = true
  115. cl := NewClientWithKeytab("testuser1", "USER.GOKRB5", kt)
  116. c.LibDefaults.DefaultTktEnctypes = []string{"rc4-hmac"}
  117. c.LibDefaults.DefaultTktEnctypeIDs = []int32{etypeID.ETypesByName["rc4-hmac"]}
  118. c.LibDefaults.DefaultTGSEnctypes = []string{"rc4-hmac"}
  119. c.LibDefaults.DefaultTGSEnctypeIDs = []int32{etypeID.ETypesByName["rc4-hmac"]}
  120. cl.WithConfig(c)
  121. cl.GoKrb5Conf.DisablePAFXFast = true
  122. err := cl.Login()
  123. if err != nil {
  124. t.Fatalf("Error on login: %v\n", err)
  125. }
  126. spn := "HTTP/user2.user.gokrb5"
  127. tkt, _, err := cl.GetServiceTicket(spn)
  128. if err != nil {
  129. t.Fatalf("Error getting service ticket: %v\n", err)
  130. }
  131. assert.Equal(t, spn, tkt.SName.GetPrincipalNameString())
  132. //assert.Equal(t, etypeID.ETypesByName["rc4-hmac"], key.KeyType)
  133. b, _ = hex.DecodeString(testdata.TESTUSER2_USERKRB5_AD_KEYTAB)
  134. skt, _ := keytab.Parse(b)
  135. err = tkt.DecryptEncPart(skt, "testuser2")
  136. if err != nil {
  137. t.Errorf("error decrypting ticket with service keytab: %v", err)
  138. }
  139. isPAC, pac, err := tkt.GetPACType(skt, "testuser2")
  140. if err != nil {
  141. t.Errorf("error getting PAC: %v", err)
  142. }
  143. assert.True(t, isPAC, "Did not find PAC in service ticket")
  144. assert.Equal(t, "testuser1", pac.KerbValidationInfo.EffectiveName.Value, "PAC value not parsed")
  145. }