From 90fd3e4054804e2b66ca734dbc66b7fd369fa8bf Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 7 Mar 2025 17:17:46 +0800 Subject: fedauth: Support Codeberg and GitHub too --- fedauth.go | 103 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/fedauth.go b/fedauth.go index 3f403e7..ed277df 100644 --- a/fedauth.go +++ b/fedauth.go @@ -13,63 +13,70 @@ import ( ) 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") - 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 - } + 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") + } - line_split := strings.Split(line, " ") - if len(line_split) < 2 { - continue - } - line = strings.Join(line_split[:2], " ") + if err != nil { + return false, err + } - if line == pubkey { - matched = true - break - } - } - if !matched { - return false, nil - } + defer func() { + _ = resp.Body.Close() + }() + buf := bufio.NewReader(resp.Body) - 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 { + for { + line, err := buf.ReadString('\n') + if errors.Is(err, io.EOF) { + break + } else if 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 + + line_split := strings.Split(line, " ") + if len(line_split) < 2 { + continue } - if err = tx.Commit(ctx); err != nil { - return false, err + line = strings.Join(line_split[:2], " ") + + if line == pubkey { + matched = true + break } + } - return true, nil - default: - return false, errors.New("unknown federated service") + 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 + } + + return true, nil } -- cgit v1.2.3