From 90fd3e4054804e2b66ca734dbc66b7fd369fa8bf Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 07 Mar 2025 17:17:46 +0800 Subject: [PATCH] fedauth: Support Codeberg and GitHub too --- fedauth.go | 103 ++++++++++++++++++++++++++++------------------------- diff --git a/fedauth.go b/fedauth.go index 3f403e77a0823df770b7f346c3ef231d63825cf0..ed277dfaf2f30bd9163af97337d1ff463ef9fdf3 100644 --- a/fedauth.go +++ b/fedauth.go @@ -13,63 +13,70 @@ "github.com/jackc/pgx/v5" ) func check_and_update_federated_user_status(ctx context.Context, user_id int, service, remote_username, pubkey string) (bool, error) { + var err error + var resp *http.Response + matched := false + username_escaped := url.PathEscape(remote_username) switch service { case "sr.ht": - username_escaped := url.PathEscape(remote_username) + resp, err = http.Get("https://meta.sr.ht/~" + username_escaped + ".keys") + case "github": + resp, err = http.Get("https://github.com/" + username_escaped + ".keys") + case "codeberg": + resp, err = http.Get("https://codeberg.org/" + username_escaped + ".keys") + default: + return false, errors.New("unknown federated service") + } - resp, err := http.Get("https://meta.sr.ht/~" + username_escaped + ".keys") - if err != nil { + if err != nil { + return false, err + } + + defer func() { + _ = resp.Body.Close() + }() + buf := bufio.NewReader(resp.Body) + + for { + line, err := buf.ReadString('\n') + if errors.Is(err, io.EOF) { + break + } else if err != nil { return false, err } - defer func() { - _ = resp.Body.Close() - }() - buf := bufio.NewReader(resp.Body) - - matched := false - for { - line, err := buf.ReadString('\n') - if errors.Is(err, io.EOF) { - break - } else if err != nil { - return false, err - } + line_split := strings.Split(line, " ") + if len(line_split) < 2 { + continue + } + line = strings.Join(line_split[:2], " ") - line_split := strings.Split(line, " ") - if len(line_split) < 2 { - continue - } - line = strings.Join(line_split[:2], " ") - - if line == pubkey { - matched = true - break - } + if line == pubkey { + matched = true + break } - if !matched { - return false, nil - } + } - var tx pgx.Tx - if tx, err = database.Begin(ctx); err != nil { - return false, err - } - defer func() { - _ = tx.Rollback(ctx) - }() - if _, err = tx.Exec(ctx, `UPDATE users SET type = 'federated' WHERE id = $1 AND type = 'pubkey_only'`, user_id); err != nil { - return false, err - } - if _, err = tx.Exec(ctx, `INSERT INTO federated_identities (user_id, service, remote_username) VALUES ($1, $2, $3)`, user_id, service, remote_username); err != nil { - return false, err - } - if err = tx.Commit(ctx); err != nil { - return false, err - } + if !matched { + return false, nil + } - return true, nil - default: - return false, errors.New("unknown federated service") + var tx pgx.Tx + if tx, err = database.Begin(ctx); err != nil { + return false, err + } + defer func() { + _ = tx.Rollback(ctx) + }() + if _, err = tx.Exec(ctx, `UPDATE users SET type = 'federated' WHERE id = $1 AND type = 'pubkey_only'`, user_id); err != nil { + return false, err } + if _, err = tx.Exec(ctx, `INSERT INTO federated_identities (user_id, service, remote_username) VALUES ($1, $2, $3)`, user_id, service, remote_username); err != nil { + return false, err + } + if err = tx.Commit(ctx); err != nil { + return false, err + } + + return true, nil } -- 2.48.1