client_ad_integration_test.go 5.6 KB

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