client_ad_integration_test.go 6.0 KB

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