session.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package client
  2. import (
  3. "github.com/jcmturner/gokrb5/iana/nametype"
  4. "github.com/jcmturner/gokrb5/types"
  5. "time"
  6. )
  7. // Client session struct.
  8. type Session struct {
  9. AuthTime time.Time
  10. EndTime time.Time
  11. RenewTill time.Time
  12. TGT types.Ticket
  13. SessionKey types.EncryptionKey
  14. SessionKeyExpiration time.Time
  15. }
  16. //Enable the automatic renewal for the client's TGT session.
  17. func (cl *Client) EnableAutoSessionRenewal() {
  18. go func() {
  19. for {
  20. //Wait until one minute before endtime
  21. w := (cl.Session.EndTime.Sub(time.Now()) * 5) / 6
  22. if w < 0 {
  23. return
  24. }
  25. time.Sleep(w)
  26. cl.updateTGT()
  27. }
  28. }()
  29. }
  30. //Renew the client's TGT session.
  31. func (cl *Client) RenewTGT() error {
  32. spn := types.PrincipalName{
  33. NameType: nametype.KRB_NT_SRV_INST,
  34. NameString: []string{"krbtgt", cl.Session.TGT.Realm},
  35. }
  36. _, tgsRep, err := cl.TGSExchange(spn, cl.Session.TGT, cl.Session.SessionKey, true)
  37. if err != nil {
  38. return err
  39. }
  40. cl.Session = &Session{
  41. AuthTime: tgsRep.DecryptedEncPart.AuthTime,
  42. EndTime: tgsRep.DecryptedEncPart.EndTime,
  43. RenewTill: tgsRep.DecryptedEncPart.RenewTill,
  44. TGT: tgsRep.Ticket,
  45. SessionKey: tgsRep.DecryptedEncPart.Key,
  46. SessionKeyExpiration: tgsRep.DecryptedEncPart.KeyExpiration,
  47. }
  48. return nil
  49. }
  50. func (cl *Client) updateTGT() error {
  51. if time.Now().Before(cl.Session.RenewTill) {
  52. err := cl.RenewTGT()
  53. if err != nil {
  54. return err
  55. }
  56. } else {
  57. err := cl.Login()
  58. if err != nil {
  59. return err
  60. }
  61. }
  62. return nil
  63. }