2024-12-07 03:53:46 -05:00
|
|
|
package extractor
|
|
|
|
|
|
|
|
import (
|
2024-12-23 03:18:50 -05:00
|
|
|
"net/url"
|
|
|
|
"strings"
|
2024-12-07 03:53:46 -05:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Cookie struct {
|
2024-12-23 03:18:50 -05:00
|
|
|
Host string
|
2024-12-07 03:53:46 -05:00
|
|
|
Path string
|
|
|
|
Expires time.Time
|
|
|
|
Secure bool
|
|
|
|
HttpOnly bool
|
2024-12-23 03:18:50 -05:00
|
|
|
Name string
|
|
|
|
Value string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c Cookie) IsTargetMatch(target string) (bool, error) {
|
|
|
|
u, err := url.Parse(target)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// the host of the cookie is the same as the host of the target
|
|
|
|
// if the cookie host starts with a dot, that means it matches any subdomain
|
|
|
|
if c.Host == u.Host || strings.HasPrefix(c.Host, ".") && strings.HasSuffix(u.Host, c.Host) {
|
|
|
|
if c.Path != "" {
|
|
|
|
if !strings.HasPrefix(u.Path, c.Path) {
|
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the cookie path is a prefix of the target path, then it's a match
|
|
|
|
// so now these would both match:
|
|
|
|
// cookie path: /foo
|
|
|
|
// target path: /foo/bar
|
|
|
|
// cookie path: /foo
|
|
|
|
// target path: /foosball
|
|
|
|
// because foseball is not an actual match, we need to check to see that either the path is an exact match
|
|
|
|
// or that the next character in the target path is a slash
|
|
|
|
|
|
|
|
if len(u.Path) > len(c.Path) && u.Path[len(c.Path)] != '/' {
|
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false, nil
|
2024-12-07 03:53:46 -05:00
|
|
|
}
|
2024-12-23 03:18:50 -05:00
|
|
|
|
2024-12-07 03:53:46 -05:00
|
|
|
type CookieJar interface {
|
|
|
|
GetAll() ([]Cookie, error)
|
2024-12-23 03:18:50 -05:00
|
|
|
Get(url string) ([]Cookie, error)
|
2024-12-07 03:53:46 -05:00
|
|
|
Set(cookie Cookie) error
|
|
|
|
Delete(cookie Cookie) error
|
|
|
|
}
|
2024-12-17 23:16:13 -05:00
|
|
|
|
|
|
|
// ReadOnlyCookieJar is a wrapper for CookieJar that allows only read operations on cookies, but all
|
|
|
|
// write operations are no-ops.
|
|
|
|
type ReadOnlyCookieJar struct {
|
|
|
|
Jar CookieJar
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r ReadOnlyCookieJar) GetAll() ([]Cookie, error) {
|
|
|
|
return r.Jar.GetAll()
|
|
|
|
}
|
|
|
|
|
2024-12-23 03:18:50 -05:00
|
|
|
func (r ReadOnlyCookieJar) Get(url string) ([]Cookie, error) {
|
|
|
|
return r.Jar.Get(url)
|
|
|
|
}
|
|
|
|
|
2024-12-17 23:16:13 -05:00
|
|
|
func (r ReadOnlyCookieJar) Set(_ Cookie) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r ReadOnlyCookieJar) Delete(_ Cookie) error {
|
|
|
|
return nil
|
|
|
|
}
|