client_ad_integration_test.go 5.3 KB

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