Add user+pass login and 2fa support

This commit is contained in:
y a t s
2026-06-05 17:30:22 -04:00
parent 8e0720d587
commit 412f3108e1
6 changed files with 519 additions and 129 deletions
+80 -20
View File
@@ -1,52 +1,112 @@
package libkiwi
import (
"log"
"net/http"
"net/http/cookiejar"
"net/url"
"os"
"testing"
"golang.org/x/net/proxy"
)
const TEST_HOST = "kiwifarms.st"
const _TEST_HOST = "kiwifarms.st"
func TestGetPage(t *testing.T) {
cookies := os.Getenv("TEST_COOKIES")
kf, err := NewKF(http.Client{}, TEST_HOST, cookies)
kf, err := newTestKF()
if err != nil {
t.Error(err)
}
log.Println("Getting homepage")
resp, err := kf.GetPage(t.Context(), kf.domain)
ctx := t.Context()
t.Log("Getting homepage\n")
resp, err := kf.GetPage(ctx, kf.domain)
if err != nil {
t.Error(err)
return
}
defer resp.Body.Close()
log.Printf("Response status code: %d\n\n", resp.StatusCode)
t.Logf("Response status code: %d\n\n", resp.StatusCode)
for k, v := range resp.Header {
if len(v) > 0 {
log.Printf("%s: %s\n", k, v[0])
t.Logf("%s: %s\n", k, v[0])
}
}
log.Printf("Response host: %s\n\n", kf.domain)
log.Printf("Cookies: %+v\n", resp.Cookies())
t.Logf("Response host: %s\n\n", kf.domain)
}
func TestRefreshSession(t *testing.T) {
cookies := os.Getenv("TEST_COOKIES")
kf, err := NewKF(http.Client{}, TEST_HOST, cookies)
if err != nil {
t.Error(err)
}
log.Println("Refreshing xf_session")
tk, err := kf.RefreshSession(t.Context())
func TestGetPost(t *testing.T) {
kf, err := newTestKF()
if err != nil {
t.Error(err)
return
}
log.Println("New xf_session token: " + tk)
const POST_ID = 22058462
ctx := t.Context()
t.Logf("Getting post #%d\n", POST_ID)
post, err := kf.GetPost(ctx, POST_ID)
if err != nil {
t.Error(err)
return
}
t.Logf("Post author: %+v\n", post.Author)
}
func newTestKF() (*KF, error) {
host := os.Getenv("KF_HOST")
if host == "" {
host = _TEST_HOST
}
u, err := url.Parse("https://" + host)
if err != nil {
return nil, err
}
p := proxy.FromEnvironment()
tr := http.DefaultTransport.(*http.Transport).Clone()
tr.DialContext = p.(proxy.ContextDialer).DialContext
jar, err := cookiejar.New(nil)
if err != nil {
return nil, err
}
hc := http.Client{
Jar: jar,
Transport: tr,
}
return NewKF(hc, u)
}
func TestLogin(t *testing.T) {
user, pass := os.Getenv("TEST_USER"), os.Getenv("TEST_PASS")
if user == "" || pass == "" {
t.Log("TEST_USER and/or TEST_PASS empty. Skipping.\n")
return
}
kf, err := newTestKF()
if err != nil {
t.Error(err)
return
}
ctx := t.Context()
resp, err := kf.Login(ctx, user, pass)
if err != nil {
t.Error(err)
return
}
defer resp.Body.Close()
t.Logf("Login response: %+v\n", resp)
}