Hi… I am well aware that this diff view is very suboptimal. It will be fixed when the refactored server comes along!
*: Add missing license headers
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
root = true [*] end_of_line = lf insert_final_newline = true indent_style = tab indent_size = 8 tab_size = 8 [*.py] indent_style = space indent_size = 4 [*.yaml] indent_style = space indent_size = 2
// SPDX-License-Identifier: AGPL-3.0-only // SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
package main
import (
"bufio"
"context"
"errors"
"io"
"net/http"
"net/url"
"strings"
"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":
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")
case "tangled":
resp, err = http.Get("https://tangled.sh/keys/" + username_escaped)
// TODO: Don't rely on one webview
default:
return false, errors.New("unknown federated service")
}
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
}
line_split := strings.Split(line, " ")
if len(line_split) < 2 {
continue
}
line = strings.Join(line_split[:2], " ")
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
}
return true, nil
}
#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
golangci-lint run . --enable-all --disable wsl,wrapcheck,nlreturn,nonamedreturns,mnd,lll,intrange,godox,gochecknoglobals,gochecknoinits,forcetypeassert,gofmt,gofumpt,revive,stylecheck,exhaustruct,godot,unparam,err113,depguard
#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
set -eux go get -t -u go mod tidy go get github.com/go-git/go-git/v5@main
-- SPDX-License-Identifier: AGPL-3.0-only -- SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
-- SPDX-License-Identifier: AGPL-3.0-only -- SPDX-FileContributor: Runxi Yu <https://runxiyu.org>
WITH parent_group AS (
INSERT INTO groups (name, description)
VALUES ('lindenii', 'The Lindenii Project')
RETURNING id
),
child_group AS (
INSERT INTO groups (name, description, parent_group)
SELECT 'forge', 'Lindenii Forge', id
FROM parent_group
RETURNING id
),
create_repos AS (
INSERT INTO repos (name, group_id, contrib_requirements, filesystem_path)
SELECT 'server', id, 'public', '/home/runxiyu/Lindenii/forge/server/.git'
FROM child_group
),
new_user AS (
INSERT INTO users (username, type, password)
VALUES ('test', 'registered', '$argon2id$v=19$m=4096,t=3,p=1$YWFhYWFhYWFhYWFh$i40k7TPFHqXRH4eQOAYGH3LvzwQ38jqqlfap9Rtiy3c')
RETURNING id
),
new_ssh AS (
INSERT INTO ssh_public_keys (key_string, user_id)
SELECT 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAuavKDhEM1L6CufIecy2P712gp151CqZuwSYahTWvmq', id
FROM new_user
RETURNING user_id
)
INSERT INTO user_group_roles (group_id, user_id)
SELECT child_group.id, new_ssh.user_id
FROM child_group, new_ssh;
SELECT * FROM groups;
SELECT * FROM repos;
SELECT * FROM users;
SELECT * FROM ssh_public_keys;
SELECT * FROM user_group_roles;