2016-02-14 10:10:21 +01:00
|
|
|
-- This file is part of Vervis.
|
|
|
|
--
|
2019-01-26 13:56:15 +01:00
|
|
|
-- Written in 2016, 2018, 2019 by fr33domlover <fr33domlover@riseup.net>.
|
2016-02-14 10:10:21 +01:00
|
|
|
--
|
|
|
|
-- ♡ Copying is an act of love. Please copy, reuse and share.
|
|
|
|
--
|
|
|
|
-- The author(s) have dedicated all copyright and related and neighboring
|
|
|
|
-- rights to this software to the public domain worldwide. This software is
|
|
|
|
-- distributed without any warranty.
|
|
|
|
--
|
|
|
|
-- You should have received a copy of the CC0 Public Domain Dedication along
|
|
|
|
-- with this software. If not, see
|
|
|
|
-- <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
|
|
|
2019-03-22 21:46:42 +01:00
|
|
|
RemoteRawObject
|
2019-03-23 16:29:50 +01:00
|
|
|
content PersistJSONObject
|
2019-03-21 23:57:15 +01:00
|
|
|
received UTCTime
|
|
|
|
|
2016-05-24 10:28:57 +02:00
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
-- People
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
|
2016-02-16 12:41:13 +01:00
|
|
|
Sharer
|
2016-05-24 10:34:40 +02:00
|
|
|
ident ShrIdent
|
|
|
|
name Text Maybe
|
2016-08-20 19:32:27 +02:00
|
|
|
created UTCTime
|
2016-02-16 12:41:13 +01:00
|
|
|
|
2016-05-23 22:46:54 +02:00
|
|
|
UniqueSharer ident
|
2016-02-16 12:41:13 +01:00
|
|
|
|
|
|
|
Person
|
2018-04-01 05:02:35 +02:00
|
|
|
ident SharerId
|
|
|
|
login Text
|
|
|
|
passphraseHash ByteString
|
|
|
|
email EmailAddress
|
|
|
|
verified Bool
|
|
|
|
verifiedKey Text
|
|
|
|
verifiedKeyCreated UTCTime
|
|
|
|
resetPassKey Text
|
|
|
|
resetPassKeyCreated UTCTime
|
2019-01-27 00:39:13 +01:00
|
|
|
about Text
|
2016-02-16 12:41:13 +01:00
|
|
|
|
|
|
|
UniquePersonIdent ident
|
|
|
|
UniquePersonLogin login
|
2018-04-11 13:09:42 +02:00
|
|
|
UniquePersonEmail email
|
2016-02-16 12:41:13 +01:00
|
|
|
|
2019-03-28 22:08:30 +01:00
|
|
|
OutboxItem
|
|
|
|
person PersonId
|
|
|
|
activity PersistActivity
|
|
|
|
published UTCTime
|
|
|
|
|
2019-04-11 15:44:44 +02:00
|
|
|
InboxItemLocal
|
|
|
|
person PersonId
|
|
|
|
activity OutboxItemId
|
|
|
|
|
|
|
|
UniqueInboxItemLocal person activity
|
|
|
|
|
2019-04-16 16:27:50 +02:00
|
|
|
UnlinkedDelivery
|
|
|
|
recipient UnfetchedRemoteActorId
|
|
|
|
activity OutboxItemId
|
|
|
|
running Bool
|
|
|
|
|
|
|
|
UniqueUnlinkedDelivery recipient activity
|
|
|
|
|
|
|
|
Delivery
|
|
|
|
recipient RemoteActorId
|
|
|
|
activity OutboxItemId
|
|
|
|
running Bool
|
|
|
|
|
|
|
|
UniqueDelivery recipient activity
|
|
|
|
|
2019-02-03 14:58:14 +01:00
|
|
|
VerifKey
|
2019-02-22 00:59:53 +01:00
|
|
|
ident LocalURI
|
2019-02-06 03:48:23 +01:00
|
|
|
instance InstanceId
|
|
|
|
expires UTCTime Maybe
|
2019-03-11 00:15:42 +01:00
|
|
|
public PublicVerifKey
|
2019-04-12 02:56:27 +02:00
|
|
|
sharer RemoteActorId Maybe
|
2019-02-03 14:58:14 +01:00
|
|
|
|
2019-02-22 00:59:53 +01:00
|
|
|
UniqueVerifKey instance ident
|
2019-02-03 14:58:14 +01:00
|
|
|
|
Record usage of instance keys in the DB
When we verify an HTTP signature,
* If we know the key, check in the DB whether we know the actor lists it. If it
doesn't, and there's room left for keys, HTTP GET the actor and update the DB
accordingly.
* If we know the key but had to update it, do the same, check usage in DB and
update DB if needed
* If we don't know the key, record usage in DB
However,
* If we're GETing a key and discovering it's a shared key, we GET the actor to
verify it lists the key. When we don't know the key at all yet, that's fine
(can be further optimized but it's marginal), but if it's a key we do know,
it means we already know the actor and for now it's enough for us to rely
only on the DB to test usage.
2019-02-19 11:54:55 +01:00
|
|
|
VerifKeySharedUsage
|
|
|
|
key VerifKeyId
|
2019-04-12 02:56:27 +02:00
|
|
|
user RemoteActorId
|
Record usage of instance keys in the DB
When we verify an HTTP signature,
* If we know the key, check in the DB whether we know the actor lists it. If it
doesn't, and there's room left for keys, HTTP GET the actor and update the DB
accordingly.
* If we know the key but had to update it, do the same, check usage in DB and
update DB if needed
* If we don't know the key, record usage in DB
However,
* If we're GETing a key and discovering it's a shared key, we GET the actor to
verify it lists the key. When we don't know the key at all yet, that's fine
(can be further optimized but it's marginal), but if it's a key we do know,
it means we already know the actor and for now it's enough for us to rely
only on the DB to test usage.
2019-02-19 11:54:55 +01:00
|
|
|
|
|
|
|
UniqueVerifKeySharedUsage key user
|
|
|
|
|
2019-04-16 16:27:50 +02:00
|
|
|
UnfetchedRemoteActor
|
|
|
|
instance InstanceId
|
|
|
|
ident LocalURI
|
|
|
|
since UTCTime Maybe
|
|
|
|
|
|
|
|
UniqueUnfetchedRemoteActor instance ident
|
|
|
|
|
2019-04-12 02:56:27 +02:00
|
|
|
RemoteActor
|
2019-04-12 03:09:45 +02:00
|
|
|
ident LocalURI
|
|
|
|
instance InstanceId
|
|
|
|
inbox LocalURI
|
|
|
|
errorSince UTCTime Maybe
|
Support remote actors specifying 2 keys, and DB storage of these keys
It's now possible for activities we be attributed to actors that have more than
one key. We allow up to 2 keys. We also store in the DB. Scaling to support any
number of keys is trivial, but I'm limiting to 2 to avoid potential trouble and
because 2 is the actual number we need.
By having 2 keys, and replacing only one of them in each rotation, we avoid
race conditions. With 1 key, the following can happen:
1. We send an activity to another server
2. We rotate our key
3. The server reaches the activity in its processing queue, tries to verify our
request signature, but fails because it can't fetch the key. It's the old
key and we discarded it already, replaced it with the new one
When we use 2 keys, the previous key remains available and other servers have
time to finish processing our requests signed with that key. We can safely
rotate, without worrying about whether the user sent anything right before the
rotation time.
Caveat: With this feature, we allow OTHER servers to rotate freely. It's safe
because it's optional, but it's just Vervis right now. Once Vervis itself
starts using 2 keys, it will be able to rotate freely without race condition
risk, but probably Mastodon etc. won't accept its signatures because of the use
of 2 keys and because they're server-scope keys.
Maybe I can get these features adopted by the fediverse?
2019-02-04 20:38:50 +01:00
|
|
|
|
2019-04-12 02:56:27 +02:00
|
|
|
UniqueRemoteActor instance ident
|
Support remote actors specifying 2 keys, and DB storage of these keys
It's now possible for activities we be attributed to actors that have more than
one key. We allow up to 2 keys. We also store in the DB. Scaling to support any
number of keys is trivial, but I'm limiting to 2 to avoid potential trouble and
because 2 is the actual number we need.
By having 2 keys, and replacing only one of them in each rotation, we avoid
race conditions. With 1 key, the following can happen:
1. We send an activity to another server
2. We rotate our key
3. The server reaches the activity in its processing queue, tries to verify our
request signature, but fails because it can't fetch the key. It's the old
key and we discarded it already, replaced it with the new one
When we use 2 keys, the previous key remains available and other servers have
time to finish processing our requests signed with that key. We can safely
rotate, without worrying about whether the user sent anything right before the
rotation time.
Caveat: With this feature, we allow OTHER servers to rotate freely. It's safe
because it's optional, but it's just Vervis right now. Once Vervis itself
starts using 2 keys, it will be able to rotate freely without race condition
risk, but probably Mastodon etc. won't accept its signatures because of the use
of 2 keys and because they're server-scope keys.
Maybe I can get these features adopted by the fediverse?
2019-02-04 20:38:50 +01:00
|
|
|
|
2019-02-06 03:48:23 +01:00
|
|
|
Instance
|
|
|
|
host Text
|
|
|
|
|
|
|
|
UniqueInstance host
|
|
|
|
|
2019-04-11 15:26:57 +02:00
|
|
|
FollowerSet
|
|
|
|
|
|
|
|
Follow
|
|
|
|
person PersonId
|
|
|
|
target FollowerSetId
|
|
|
|
|
|
|
|
UniqueFollow person target
|
|
|
|
|
|
|
|
RemoteFollow
|
2019-04-12 02:56:27 +02:00
|
|
|
actor RemoteActorId
|
2019-04-11 15:26:57 +02:00
|
|
|
target FollowerSetId
|
|
|
|
|
|
|
|
UniqueRemoteFollow actor target
|
|
|
|
|
2016-03-06 12:58:48 +01:00
|
|
|
SshKey
|
2016-05-23 22:46:54 +02:00
|
|
|
ident KyIdent
|
2016-03-06 12:58:48 +01:00
|
|
|
person PersonId
|
|
|
|
algo ByteString
|
|
|
|
content ByteString
|
|
|
|
|
2016-05-23 22:46:54 +02:00
|
|
|
UniqueSshKey person ident
|
2016-03-06 12:58:48 +01:00
|
|
|
|
2016-02-16 12:41:13 +01:00
|
|
|
Group
|
|
|
|
ident SharerId
|
|
|
|
|
2016-05-24 10:28:57 +02:00
|
|
|
UniqueGroup ident
|
|
|
|
|
|
|
|
GroupMember
|
|
|
|
person PersonId
|
|
|
|
group GroupId
|
2016-05-25 17:52:15 +02:00
|
|
|
role GroupRole
|
2016-05-26 18:25:23 +02:00
|
|
|
joined UTCTime
|
2016-05-24 10:28:57 +02:00
|
|
|
|
|
|
|
UniqueGroupMember person group
|
|
|
|
|
2016-06-01 10:52:14 +02:00
|
|
|
ProjectRole
|
|
|
|
ident RlIdent
|
2016-06-06 19:29:54 +02:00
|
|
|
sharer SharerId
|
2016-06-01 10:52:14 +02:00
|
|
|
desc Text
|
|
|
|
|
2016-06-06 19:29:54 +02:00
|
|
|
UniqueProjectRole sharer ident
|
2016-06-01 10:52:14 +02:00
|
|
|
|
2016-06-21 09:35:19 +02:00
|
|
|
ProjectRoleInherit
|
|
|
|
parent ProjectRoleId
|
|
|
|
child ProjectRoleId
|
|
|
|
|
|
|
|
UniqueProjectRoleInherit parent child
|
|
|
|
|
2016-06-01 10:52:14 +02:00
|
|
|
ProjectAccess
|
|
|
|
role ProjectRoleId
|
|
|
|
op ProjectOperation
|
|
|
|
|
|
|
|
UniqueProjectAccess role op
|
|
|
|
|
2016-05-24 10:28:57 +02:00
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
-- Projects
|
|
|
|
-------------------------------------------------------------------------------
|
2016-02-16 12:41:13 +01:00
|
|
|
|
|
|
|
Project
|
2016-05-23 22:46:54 +02:00
|
|
|
ident PrjIdent
|
2016-04-30 22:40:33 +02:00
|
|
|
sharer SharerId
|
2019-01-29 23:24:32 +01:00
|
|
|
name Text Maybe
|
|
|
|
desc Text Maybe
|
2016-08-08 21:05:22 +02:00
|
|
|
workflow WorkflowId
|
2016-08-08 20:35:01 +02:00
|
|
|
nextTicket Int
|
2019-01-29 23:24:32 +01:00
|
|
|
wiki RepoId Maybe
|
|
|
|
collabUser ProjectRoleId Maybe
|
|
|
|
collabAnon ProjectRoleId Maybe
|
2016-02-16 12:41:13 +01:00
|
|
|
|
|
|
|
UniqueProject ident sharer
|
|
|
|
|
|
|
|
Repo
|
2016-05-23 22:46:54 +02:00
|
|
|
ident RpIdent
|
2016-04-12 19:37:31 +02:00
|
|
|
sharer SharerId
|
2016-08-08 20:35:01 +02:00
|
|
|
vcs VersionControlSystem
|
2016-05-03 01:51:53 +02:00
|
|
|
project ProjectId Maybe
|
|
|
|
desc Text Maybe
|
2016-08-08 20:35:01 +02:00
|
|
|
mainBranch Text
|
2019-01-29 23:24:32 +01:00
|
|
|
collabUser ProjectRoleId Maybe
|
|
|
|
collabAnon ProjectRoleId Maybe
|
2016-02-16 12:41:13 +01:00
|
|
|
|
2016-04-12 19:37:31 +02:00
|
|
|
UniqueRepo ident sharer
|
2016-02-16 12:41:13 +01:00
|
|
|
|
2016-08-08 13:05:19 +02:00
|
|
|
Workflow
|
|
|
|
sharer SharerId
|
|
|
|
ident WflIdent
|
|
|
|
name Text Maybe
|
|
|
|
desc Text Maybe
|
2016-09-01 19:40:02 +02:00
|
|
|
scope WorkflowScope
|
2016-08-08 13:05:19 +02:00
|
|
|
|
|
|
|
UniqueWorkflow sharer ident
|
|
|
|
|
2016-08-08 16:01:06 +02:00
|
|
|
WorkflowField
|
2016-08-11 11:27:30 +02:00
|
|
|
workflow WorkflowId
|
|
|
|
ident FldIdent
|
|
|
|
name Text
|
|
|
|
desc Text Maybe
|
|
|
|
type WorkflowFieldType
|
|
|
|
enm WorkflowFieldEnumId Maybe
|
|
|
|
required Bool
|
|
|
|
constant Bool
|
|
|
|
filterNew Bool
|
|
|
|
filterTodo Bool
|
|
|
|
filterClosed Bool
|
2016-08-08 16:01:06 +02:00
|
|
|
|
|
|
|
UniqueWorkflowField workflow ident
|
|
|
|
|
2016-08-08 16:48:38 +02:00
|
|
|
WorkflowFieldEnum
|
|
|
|
workflow WorkflowId
|
|
|
|
ident EnmIdent
|
|
|
|
name Text
|
|
|
|
desc Text Maybe
|
|
|
|
|
|
|
|
UniqueWorkflowFieldEnum workflow ident
|
|
|
|
|
2016-08-08 19:05:09 +02:00
|
|
|
WorkflowFieldEnumCtor
|
|
|
|
enum WorkflowFieldEnumId
|
|
|
|
name Text
|
|
|
|
desc Text Maybe
|
|
|
|
|
|
|
|
UniqueWorkflowFieldEnumCtor enum name
|
|
|
|
|
2016-08-08 22:51:58 +02:00
|
|
|
TicketParamText
|
|
|
|
ticket TicketId
|
|
|
|
field WorkflowFieldId
|
|
|
|
value Text
|
|
|
|
|
|
|
|
UniqueTicketParamText ticket field
|
|
|
|
|
2016-08-09 13:36:14 +02:00
|
|
|
TicketParamEnum
|
|
|
|
ticket TicketId
|
|
|
|
field WorkflowFieldId
|
|
|
|
value WorkflowFieldEnumCtorId
|
|
|
|
|
|
|
|
UniqueTicketParamEnum ticket field value
|
|
|
|
|
2016-04-30 22:40:33 +02:00
|
|
|
Ticket
|
2016-06-01 18:20:19 +02:00
|
|
|
project ProjectId
|
|
|
|
number Int
|
|
|
|
created UTCTime
|
|
|
|
creator PersonId
|
|
|
|
title Text
|
|
|
|
desc Text -- Assume this is Pandoc Markdown
|
|
|
|
assignee PersonId Maybe
|
2016-08-11 02:44:11 +02:00
|
|
|
status TicketStatus
|
2016-06-01 18:20:19 +02:00
|
|
|
closed UTCTime
|
|
|
|
closer PersonId
|
|
|
|
discuss DiscussionId
|
2019-04-11 15:26:57 +02:00
|
|
|
followers FollowerSetId
|
2016-04-30 22:40:33 +02:00
|
|
|
|
|
|
|
UniqueTicket project number
|
2019-03-22 21:46:42 +01:00
|
|
|
UniqueTicketDiscussion discuss
|
2019-04-11 15:26:57 +02:00
|
|
|
UniqueTicketFollowers followers
|
2016-05-17 22:34:22 +02:00
|
|
|
|
2016-06-07 22:16:15 +02:00
|
|
|
TicketDependency
|
|
|
|
parent TicketId
|
|
|
|
child TicketId
|
|
|
|
|
|
|
|
UniqueTicketDependency parent child
|
|
|
|
|
2016-06-07 12:01:57 +02:00
|
|
|
TicketClaimRequest
|
|
|
|
person PersonId
|
|
|
|
ticket TicketId
|
2016-06-07 18:31:55 +02:00
|
|
|
message Text -- Assume this is Pandoc Markdown
|
2016-06-07 12:01:57 +02:00
|
|
|
created UTCTime
|
|
|
|
|
|
|
|
UniqueTicketClaimRequest person ticket
|
|
|
|
|
2016-05-17 22:34:22 +02:00
|
|
|
Discussion
|
|
|
|
|
2019-03-22 21:46:42 +01:00
|
|
|
RemoteDiscussion
|
2019-04-11 15:26:57 +02:00
|
|
|
instance InstanceId
|
|
|
|
ident LocalURI
|
|
|
|
discuss DiscussionId
|
2019-03-22 21:46:42 +01:00
|
|
|
|
|
|
|
UniqueRemoteDiscussionIdent instance ident
|
|
|
|
UniqueRemoteDiscussion discuss
|
|
|
|
|
2016-05-17 22:34:22 +02:00
|
|
|
Message
|
|
|
|
created UTCTime
|
|
|
|
content Text -- Assume this is Pandoc Markdown
|
|
|
|
parent MessageId Maybe
|
|
|
|
root DiscussionId
|
2019-02-12 12:46:12 +01:00
|
|
|
|
2019-03-20 09:07:37 +01:00
|
|
|
LocalMessage
|
2019-03-28 22:08:30 +01:00
|
|
|
author PersonId
|
|
|
|
rest MessageId
|
|
|
|
unlinkedParent FedURI Maybe
|
2019-03-20 09:07:37 +01:00
|
|
|
|
|
|
|
UniqueLocalMessage rest
|
|
|
|
|
|
|
|
RemoteMessage
|
2019-04-12 02:56:27 +02:00
|
|
|
author RemoteActorId
|
2019-03-21 23:57:15 +01:00
|
|
|
instance InstanceId
|
|
|
|
ident LocalURI
|
|
|
|
rest MessageId
|
2019-03-22 21:46:42 +01:00
|
|
|
raw RemoteRawObjectId
|
|
|
|
lostParent FedURI Maybe
|
2019-03-21 23:57:15 +01:00
|
|
|
|
|
|
|
UniqueRemoteMessageIdent instance ident
|
2019-03-20 09:07:37 +01:00
|
|
|
UniqueRemoteMessage rest
|
|
|
|
|
2019-02-12 12:46:12 +01:00
|
|
|
RepoCollab
|
|
|
|
repo RepoId
|
|
|
|
person PersonId
|
|
|
|
role ProjectRoleId Maybe
|
|
|
|
|
|
|
|
UniqueRepoCollab repo person
|
|
|
|
|
|
|
|
ProjectCollab
|
|
|
|
project ProjectId
|
|
|
|
person PersonId
|
|
|
|
role ProjectRoleId Maybe
|
|
|
|
|
|
|
|
UniqueProjectCollab project person
|