Commit graph

145 commits

Author SHA1 Message Date
Michael Jerger c2a42587d2 remove panics - that is not a exception replacement 2024-02-10 15:14:23 +01:00
Michael Jerger b27460d3fe minor refactorings & reviews 2024-02-10 15:14:20 +01:00
Michael Jerger bad8e04c3c cleanup & minor refactorings 2024-02-10 15:14:15 +01:00
Michael Jerger 1fe35e14a5 mv our actor code to forgefed 2024-02-10 15:14:07 +01:00
Michael Jerger abdf56dde1 move forgefed to models 2024-02-10 15:14:06 +01:00
Michael Jerger b5a467e94d remove unused & implement webfinger 2024-02-10 15:10:38 +01:00
Michael Jerger 73a38ea0d1 use new factory function 2024-02-10 15:10:38 +01:00
Michael Jerger e8371ca94c ActorId -> PersonId 2024-02-10 15:10:37 +01:00
Michael Jerger be4d3544ae Refactor ActorID -> ActorId 2024-02-10 15:10:36 +01:00
Michael Jerger 7c86f13728 make route more compact 2024-02-10 15:10:36 +01:00
erik a10a9141f8 Remove useless call to repo, add todos 2024-02-10 15:10:34 +01:00
erik 3c515c2614 Add review todos 2024-02-10 15:10:33 +01:00
erik 22d71e6b30 Update ToDo 2024-02-10 15:10:33 +01:00
erik afe659f9f4 Implement 5s waiting 2024-02-10 15:10:32 +01:00
erik 745598bba4 Implement starring 2024-02-10 15:10:29 +01:00
erik 976256bf3d Refactor if conditional to switch, use split up functions 2024-02-10 15:10:28 +01:00
erik 75ee273f40 Split user creation and saving user to db 2024-02-10 15:10:27 +01:00
erik 7f4667696f Cleanup imports 2024-02-10 15:10:25 +01:00
erik f84e0b27e1 Use ValidateAndParseIRI, pass this to ParseActorID 2024-02-10 15:10:21 +01:00
erik 54ef78034e Don't parse received repoID 2024-02-10 15:10:15 +01:00
erik e3defaa212 Split getPersonByRest function
This leaves us with two easier to read functions, encapsulating
two different functionalities.
2024-02-10 15:10:14 +01:00
Michael Jerger 28a290da10 reviewed current work 2024-02-10 15:10:13 +01:00
erik d27cac5bae Move federated user creation to func 2024-02-10 15:10:11 +01:00
erik 01506f9836 Clearer description 2024-02-10 15:10:11 +01:00
erik 77b6402e77 Add missing error treatment 2024-02-10 15:10:10 +01:00
erik 946e5cf34c Remove typo in func 2024-02-10 15:10:10 +01:00
erik 2fb893843b Move getting person to own function 2024-02-10 15:10:08 +01:00
erik 6d143e74cf More clear distinction between sender and receiver of star 2024-02-10 15:10:07 +01:00
Michael Jerger 9b5d8bbeda If we use user.loginname to store the actor.id we can search for local users earlier 2024-02-10 15:10:04 +01:00
erik ed1af14ceb Panic on error, use correct function names 2024-02-10 15:10:04 +01:00
erik 9dcbe0177e Rename targe to remoteStargazer 2024-02-10 15:10:03 +01:00
erik de9e4dea61 Update todos, remove comments 2024-02-10 15:10:02 +01:00
erik 68cc74d139 Use actionsUser for creating http client 2024-02-10 15:10:01 +01:00
erik d65e5aa70e Move helper functions to top 2024-02-10 15:10:00 +01:00
Mirco 1c145d9d68 WIP: fit generateUUIDMail for testing purposes 2024-02-10 15:10:00 +01:00
Mirco 11e93784fe WIP: log Info User created 2024-02-10 15:09:59 +01:00
Mirco a20f535211 WIP: pwdgen, username 2024-02-10 15:09:58 +01:00
erik 85e09a7ada WIP: Generate User if not exists 2024-02-10 15:09:58 +01:00
Michael Jerger 94880d64f4 higlight the need for id normalization 2024-02-10 15:09:57 +01:00
Michael Jerger 231bdb65b8 searching for the local person 2024-02-10 15:09:57 +01:00
erik edd7fb77fd WIP create user if not exists 2024-02-10 15:09:56 +01:00
erik 41e12d09ef WIP create User from person 2024-02-10 15:09:55 +01:00
erik c8456d57ff Add thoughts on user creation 2024-02-10 15:09:54 +01:00
erik 22ba03ae4d Don't use redundant implementation of person 2024-02-10 15:09:51 +01:00
erik a8d5e7ba77 Fix typos and format 2024-02-10 15:09:41 +01:00
erik d43c4ba739 Use person generation 2024-02-10 15:09:38 +01:00
erik 9f016d3673 Move to extra var 2024-02-10 15:09:37 +01:00
erik fde8de4f90 Rename to ParseActorIDFromStarActivity 2024-02-10 15:09:35 +01:00
erik e60d89cb67 Use correct target for get request 2024-02-10 15:09:33 +01:00
erik 0388240039 WIP Use non generated HTTP client 2024-02-10 15:09:32 +01:00
erik 6284355e1e Remove redundant ValidateStar and err check, call coorect function 2024-02-10 15:09:29 +01:00
erik 546ce50337 Use PanicIfInvalid in repository.go 2024-02-10 15:09:27 +01:00
erik 8300d3fbde Add ToDos from code review 2024-02-10 15:09:25 +01:00
erik 34c511ae98 Use data from actor, improve formatting 2024-02-10 15:09:24 +01:00
erik aee2ee2596 Also log error on person creation 2024-02-10 15:09:24 +01:00
erik 3d2b5115ad Implement and use Validatable interface 2024-02-10 15:09:18 +01:00
erik 235ed7cd1e Rename to actorID 2024-02-10 15:09:18 +01:00
Michael Jerger 5e111f14ef use the swagger-api 2024-02-10 15:09:17 +01:00
Michael Jerger 5c998a5c46 add comment 2024-02-10 15:09:08 +01:00
erik 5729cee3e5 Move test to model/activitypub 2024-02-10 15:09:07 +01:00
erik 7193c0bd9b WIP test for parsing the actor 2024-02-10 15:09:07 +01:00
erik 0c367070af Call validate star 2024-02-10 15:09:06 +01:00
erik 78fc75135f Rename to ActorData 2024-02-10 15:09:04 +01:00
erik 91dcd59e68 Import parser from model and call validation 2024-02-10 15:09:00 +01:00
erik e44321221e WIP: Add test for parser 2024-02-10 15:08:55 +01:00
erik ad65976677 Reorder functions 2024-02-10 15:08:54 +01:00
erik d52bb4bf8f Remove newline from error string 2024-02-10 15:08:52 +01:00
erik b869d91dc1 Parse Actor URL 2024-02-10 15:08:51 +01:00
erik 9fa8d19cf4 Fix typo 2024-02-10 15:08:47 +01:00
Michael Jerger d10c1094d9 add some pseudocode 2024-02-10 15:08:45 +01:00
erik ab92891091 Use actor 2024-02-10 15:08:41 +01:00
erik f48b4d1f55 Get Activity field from star 2024-02-10 15:08:29 +01:00
Michael Jerger 1044e44ee5 we got a parsed actor 2024-02-10 15:08:12 +01:00
Michael Jerger b08580280a np in case of unauthenticated user 2024-02-10 15:08:10 +01:00
Michael Jerger 460e2fb644 prepare next steps 2024-02-10 15:08:00 +01:00
erik 5b01517c12 Get data from form 2024-02-10 15:08:00 +01:00
Michael Jerger dc1a82bf4c use star as swagger model 2024-02-10 15:07:48 +01:00
Michael Jerger ff5a4405fd introduce repo from exosy 2024-02-10 15:07:39 +01:00
Michael Jerger 6587b6d62b log who is doing the inbox post 2024-02-10 15:07:28 +01:00
Michael Jerger 4e1e65e14f log repository under activity 2024-02-10 15:07:26 +01:00
Michael Jerger 0d5702e501 fill in some minimal information to an actor 2024-02-10 15:07:20 +01:00
Michael Jerger fe2a3d86d4 get repo now works somehow 2024-02-10 15:07:14 +01:00
Michael Jerger 64abf87fb0 added some logs 2024-02-10 15:07:11 +01:00
Michael Jerger 317b7fac8f wip: load repo to ctx 2024-02-10 15:07:05 +01:00
Michael Jerger d4f507a223 remove unused imports 2024-02-10 15:07:04 +01:00
Michael Jerger a87cbda165 add repository actor 2024-02-10 15:07:03 +01:00
JakobDev c548dde205
More refactoring of db.DefaultContext (#27083)
Next step of #27065
2023-09-15 06:13:19 +00:00
silverwind 887a683af9
Update tool dependencies, lock govulncheck and actionlint (#25655)
- Update all tool dependencies
- Lock `govulncheck` and `actionlint` to their latest tags

---------

Co-authored-by: 6543 <m.huber@kithara.com>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2023-07-09 11:58:06 +00:00
wxiaoguang 17f23182ff
Use User.ID instead of User.Name in ActivityPub API for Person IRI (#23823)
Thanks to @trwnh

Close #23802

The ActivityPub id is an HTTPS URI that should remain constant, even if
the user changes their name.
2023-04-04 10:08:23 +08:00
Lunny Xiao bd820aa9c5
Add context cache as a request level cache (#22294)
To avoid duplicated load of the same data in an HTTP request, we can set
a context cache to do that. i.e. Some pages may load a user from a
database with the same id in different areas on the same page. But the
code is hidden in two different deep logic. How should we share the
user? As a result of this PR, now if both entry functions accept
`context.Context` as the first parameter and we just need to refactor
`GetUserByID` to reuse the user from the context cache. Then it will not
be loaded twice on an HTTP request.

But of course, sometimes we would like to reload an object from the
database, that's why `RemoveContextData` is also exposed.

The core context cache is here. It defines a new context
```go
type cacheContext struct {
	ctx  context.Context
	data map[any]map[any]any
        lock sync.RWMutex
}

var cacheContextKey = struct{}{}

func WithCacheContext(ctx context.Context) context.Context {
	return context.WithValue(ctx, cacheContextKey, &cacheContext{
		ctx:  ctx,
		data: make(map[any]map[any]any),
	})
}
```

Then you can use the below 4 methods to read/write/del the data within
the same context.

```go
func GetContextData(ctx context.Context, tp, key any) any
func SetContextData(ctx context.Context, tp, key, value any)
func RemoveContextData(ctx context.Context, tp, key any)
func GetWithContextCache[T any](ctx context.Context, cacheGroupKey string, cacheTargetID any, f func() (T, error)) (T, error)
```

Then let's take a look at how `system.GetString` implement it.

```go
func GetSetting(ctx context.Context, key string) (string, error) {
	return cache.GetWithContextCache(ctx, contextCacheKey, key, func() (string, error) {
		return cache.GetString(genSettingCacheKey(key), func() (string, error) {
			res, err := GetSettingNoCache(ctx, key)
			if err != nil {
				return "", err
			}
			return res.SettingValue, nil
		})
	})
}
```

First, it will check if context data include the setting object with the
key. If not, it will query from the global cache which may be memory or
a Redis cache. If not, it will get the object from the database. In the
end, if the object gets from the global cache or database, it will be
set into the context cache.

An object stored in the context cache will only be destroyed after the
context disappeared.
2023-02-15 21:37:34 +08:00
flynnnnnnnnnn e81ccc406b
Implement FSFE REUSE for golang files (#21840)
Change all license headers to comply with REUSE specification.

Fix #16132

Co-authored-by: flynnnnnnnnnn <flynnnnnnnnnn@github>
Co-authored-by: John Olheiser <john.olheiser@gmail.com>
2022-11-27 18:20:29 +00:00
delvh 0ebb45cfe7
Replace all instances of fmt.Errorf(%v) with fmt.Errorf(%w) (#21551)
Found using
`find . -type f -name '*.go' -print -exec vim {} -c
':%s/fmt\.Errorf(\(.*\)%v\(.*\)err/fmt.Errorf(\1%w\2err/g' -c ':wq' \;`

Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2022-10-24 20:29:17 +01:00
John Olheiser a48d6ba4b4
Go 1.19 format (#20758)
* 1.19 gofumpt

Signed-off-by: jolheiser <john.olheiser@gmail.com>

* Change CSV test

Signed-off-by: jolheiser <john.olheiser@gmail.com>

* Commit whitespace fixes from @zeripath

Co-authored-by: zeripath <art27@cantab.net>

* Update emoji

Signed-off-by: jolheiser <john.olheiser@gmail.com>

* bump swagger & fix generate-swagger

Signed-off-by: jolheiser <john.olheiser@gmail.com>
Co-authored-by: zeripath <art27@cantab.net>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Lauris BH <lauris@nix.lv>
2022-08-30 21:15:45 -05:00
Wim cb50375e2b
Add more linters to improve code readability (#19989)
Add nakedret, unconvert, wastedassign, stylecheck and nolintlint linters to improve code readability

- nakedret - https://github.com/alexkohler/nakedret - nakedret is a Go static analysis tool to find naked returns in functions greater than a specified function length.
- unconvert - https://github.com/mdempsky/unconvert - Remove unnecessary type conversions
- wastedassign - https://github.com/sanposhiho/wastedassign -  wastedassign finds wasted assignment statements.
- notlintlint -  Reports ill-formed or insufficient nolint directives
- stylecheck - https://staticcheck.io/docs/checks/#ST - keep style consistent
  - excluded: [ST1003 - Poorly chosen identifier](https://staticcheck.io/docs/checks/#ST1003) and [ST1005 - Incorrectly formatted error string](https://staticcheck.io/docs/checks/#ST1005)
2022-06-20 12:02:49 +02:00
Anthony Wang e86f18a05a
User keypairs and HTTP signatures for ActivityPub federation using go-ap (#19133)
* go.mod: add go-fed/{httpsig,activity/pub,activity/streams} dependency

go get github.com/go-fed/activity/streams@master
go get github.com/go-fed/activity/pub@master
go get github.com/go-fed/httpsig@master

* activitypub: implement /api/v1/activitypub/user/{username} (#14186)

Return informations regarding a Person (as defined in ActivityStreams
https://www.w3.org/TR/activitystreams-vocabulary/#dfn-person).

Refs: https://github.com/go-gitea/gitea/issues/14186

Signed-off-by: Loïc Dachary <loic@dachary.org>

* activitypub: add the public key to Person (#14186)

Refs: https://github.com/go-gitea/gitea/issues/14186

Signed-off-by: Loïc Dachary <loic@dachary.org>

* activitypub: go-fed conformant Clock instance

Signed-off-by: Loïc Dachary <loic@dachary.org>

* activitypub: signing http client

Signed-off-by: Loïc Dachary <loic@dachary.org>

* activitypub: implement the ReqSignature middleware

Signed-off-by: Loïc Dachary <loic@dachary.org>

* activitypub: hack_16834

Signed-off-by: Loïc Dachary <loic@dachary.org>

* Fix CI checks-backend errors with go mod tidy

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Change 2021 to 2022, properly format package imports

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Run make fmt and make generate-swagger

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Use Gitea JSON library, add assert for pkp

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Run make fmt again, fix err var redeclaration

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Remove LogSQL from ActivityPub person test

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Assert if json.Unmarshal succeeds

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Cleanup, handle invalid usernames for ActivityPub person GET request

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Rename hack_16834 to user_settings

Signed-off-by: Anthony Wang <ta180m@pm.me>

* Use the httplib module instead of http for GET requests

* Clean up whitespace with make fmt

* Use time.RFC1123 and make the http.Client proxy-aware

* Check if digest algo is supported in setting module

* Clean up some variable declarations

* Remove unneeded copy

* Use system timezone instead of setting.DefaultUILocation

* Use named constant for httpsigExpirationTime

* Make pubKey IRI #main-key instead of /#main-key

* Move /#main-key to #main-key in tests

* Implemented Webfinger endpoint.

* Add visible check.

* Add user profile as alias.

* Add actor IRI and remote interaction URL to WebFinger response

* fmt

* Fix lint errors

* Use go-ap instead of go-fed

* Run go mod tidy to fix missing modules in go.mod and go.sum

* make fmt

* Convert remaining code to go-ap

* Clean up go.sum

* Fix JSON unmarshall error

* Fix CI errors by adding @context to Person() and making sure types match

* Correctly decode JSON in api_activitypub_person_test.go

* Force CI rerun

* Fix TestActivityPubPersonInbox segfault

* Fix lint error

* Use @mariusor's suggestions for idiomatic go-ap usage

* Correctly add inbox/outbox IRIs to person

* Code cleanup

* Remove another LogSQL from ActivityPub person test

* Move httpsig algos slice to an init() function

* Add actor IRI and remote interaction URL to WebFinger response

* Update TestWebFinger to check for ActivityPub IRI in aliases

* make fmt

* Force CI rerun

* WebFinger: Add CORS header and fix Href -> Template for remote interactions

The CORS header is needed due to https://datatracker.ietf.org/doc/html/rfc7033#section-5 and fixes some Peertube <-> Gitea federation issues

* make lint-backend

* Make sure Person endpoint has Content-Type application/activity+json and includes PreferredUsername, URL, and Icon

Setting the correct Content-Type is essential for federating with Mastodon

* Use UTC instead of GMT

* Rename pkey to pubKey

* Make sure HTTP request Date in GMT

* make fmt

* dont drop err

* Make sure API responses always refer to username in original case

Copied from what I wrote on #19133 discussion: Handling username case is a very tricky issue and I've already encountered a Mastodon <-> Gitea federation bug due to Gitea considering Ta180m and ta180m to be the same user while Mastodon thinks they are two different users. I think the best way forward is for Gitea to only use the original case version of the username for federation so other AP software don't get confused.

* Move httpsig algs constant slice to modules/setting/federation.go

* Add new federation settings to app.example.ini and config-cheat-sheet

* Return if marshalling error

* Make sure Person IRIs are generated correctly

This commit ensures that if the setting.AppURL is something like "http://127.0.0.1:42567" (like in the integration tests), a trailing slash will be added after that URL.

* If httpsig verification fails, fix Host header and try again

This fixes a very rare bug when Gitea and another AP server (confirmed to happen with Mastodon) are running on the same machine, Gitea fails to verify incoming HTTP signatures. This is because the other AP server creates the sig with the public Gitea domain as the Host. However, when Gitea receives the request, the Host header is instead localhost, so the signature verification fails. Manually changing the host header to the correct value and trying the veification again fixes the bug.


* Revert "If httpsig verification fails, fix Host header and try again"

This reverts commit f53e46c721.

The bug was actually caused by nginx messing up the Host header when reverse-proxying since I didn't have the line `proxy_set_header Host $host;` in my nginx config for Gitea.

* Go back to using ap.IRI to generate inbox and outbox IRIs

* use const for key values

* Update routers/web/webfinger.go

* Use ctx.JSON in Person response to make code cleaner

* Revert "Use ctx.JSON in Person response to make code cleaner"

This doesn't work because the ctx.JSON() function already sends the response out and it's too late to edit the headers.

This reverts commit 95aad98897.

* Use activitypub.ActivityStreamsContentType for Person response Content Type

* Limit maximum ActivityPub request and response sizes to a configurable setting

* Move setting key constants to models/user/setting_keys.go

* Fix failing ActivityPubPerson integration test by checking the correct field for username

* Add a warning about changing settings that can break federation

* Add better comments

* Don't multiply Federation.MaxSize by 1<<20 twice

* Add more better comments

* Fix failing ActivityPubMissingPerson test

We now use ctx.ContextUser so the message printed out when a user does not exist is slightly different

* make generate-swagger

For some reason I didn't realize that /templates/swagger/v1_json.tmpl was machine-generated by make generate-swagger... I've been editing it by hand for three months! 🤦

* Move getting the RFC 2616 time to a separate function

* More code cleanup

* Update go-ap to fix empty liked collection and removed unneeded HTTP headers

* go mod tidy

* Add ed25519 to httpsig algorithms

* Use go-ap/jsonld to add @context and marshal JSON

* Change Gitea user agent from the default to Gitea/Version

* Use ctx.ServerError and remove all remote interaction code from webfinger.go
2022-06-19 07:25:12 +02:00