@atproto/ozone 0.2.8 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/package.json +25 -21
- package/bin/migration-create.ts +0 -38
- package/jest.config.cjs +0 -22
- package/src/api/chat/getActorMetadata.ts +0 -23
- package/src/api/chat/getConvo.ts +0 -23
- package/src/api/chat/getConvoMembers.ts +0 -23
- package/src/api/chat/getConvos.ts +0 -23
- package/src/api/chat/getMessageContext.ts +0 -42
- package/src/api/chat/index.ts +0 -16
- package/src/api/communication/createTemplate.ts +0 -51
- package/src/api/communication/deleteTemplate.ts +0 -23
- package/src/api/communication/listTemplates.ts +0 -31
- package/src/api/communication/updateTemplate.ts +0 -51
- package/src/api/health.ts +0 -27
- package/src/api/index.ts +0 -146
- package/src/api/label/fetchLabels.ts +0 -32
- package/src/api/label/queryLabels.ts +0 -57
- package/src/api/label/subscribeLabels.ts +0 -25
- package/src/api/moderation/cancelScheduledActions.ts +0 -72
- package/src/api/moderation/emitEvent.ts +0 -475
- package/src/api/moderation/getAccountTimeline.ts +0 -160
- package/src/api/moderation/getEvent.ts +0 -19
- package/src/api/moderation/getRecord.ts +0 -40
- package/src/api/moderation/getRecords.ts +0 -50
- package/src/api/moderation/getRepo.ts +0 -34
- package/src/api/moderation/getReporterStats.ts +0 -18
- package/src/api/moderation/getRepos.ts +0 -41
- package/src/api/moderation/getSubjects.ts +0 -101
- package/src/api/moderation/listScheduledActions.ts +0 -45
- package/src/api/moderation/queryEvents.ts +0 -72
- package/src/api/moderation/queryStatuses.ts +0 -23
- package/src/api/moderation/scheduleAction.ts +0 -129
- package/src/api/moderation/searchRepos.ts +0 -46
- package/src/api/moderation/util.ts +0 -96
- package/src/api/proxied.ts +0 -327
- package/src/api/queue/assignModerator.ts +0 -31
- package/src/api/queue/createQueue.ts +0 -62
- package/src/api/queue/deleteQueue.ts +0 -56
- package/src/api/queue/getAssignments.ts +0 -19
- package/src/api/queue/listQueues.ts +0 -39
- package/src/api/queue/routeReports.ts +0 -44
- package/src/api/queue/unassignModerator.ts +0 -26
- package/src/api/queue/updateQueue.ts +0 -54
- package/src/api/report/assignModerator.ts +0 -36
- package/src/api/report/createActivity.ts +0 -57
- package/src/api/report/createReport.ts +0 -93
- package/src/api/report/getAssignments.ts +0 -20
- package/src/api/report/getHistoricalStats.ts +0 -41
- package/src/api/report/getLatestReport.ts +0 -44
- package/src/api/report/getLiveStats.ts +0 -26
- package/src/api/report/getReport.ts +0 -55
- package/src/api/report/listActivities.ts +0 -37
- package/src/api/report/queryActivities.ts +0 -64
- package/src/api/report/queryReports.ts +0 -44
- package/src/api/report/reassignQueue.ts +0 -68
- package/src/api/report/refreshStats.ts +0 -27
- package/src/api/report/unassignModerator.ts +0 -21
- package/src/api/safelink/addRule.ts +0 -48
- package/src/api/safelink/queryEvents.ts +0 -32
- package/src/api/safelink/queryRules.ts +0 -58
- package/src/api/safelink/removeRule.ts +0 -42
- package/src/api/safelink/updateRule.ts +0 -48
- package/src/api/server/getConfig.ts +0 -35
- package/src/api/set/addValues.ts +0 -28
- package/src/api/set/deleteSet.ts +0 -34
- package/src/api/set/deleteValues.ts +0 -31
- package/src/api/set/getValues.ts +0 -42
- package/src/api/set/querySets.ts +0 -36
- package/src/api/set/upsertSet.ts +0 -38
- package/src/api/setting/listOptions.ts +0 -44
- package/src/api/setting/removeOptions.ts +0 -64
- package/src/api/setting/upsertOption.ts +0 -156
- package/src/api/team/addMember.ts +0 -51
- package/src/api/team/deleteMember.ts +0 -29
- package/src/api/team/listMembers.ts +0 -20
- package/src/api/team/updateMember.ts +0 -47
- package/src/api/util.ts +0 -265
- package/src/api/verification/grantVerifications.ts +0 -90
- package/src/api/verification/listVerifications.ts +0 -44
- package/src/api/verification/revokeVerifications.ts +0 -43
- package/src/api/well-known.ts +0 -46
- package/src/assignment/index.ts +0 -728
- package/src/auth-verifier.ts +0 -227
- package/src/background.ts +0 -183
- package/src/communication-service/template.ts +0 -110
- package/src/communication-service/util.ts +0 -8
- package/src/config/config.ts +0 -211
- package/src/config/env.ts +0 -95
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -17
- package/src/context.ts +0 -399
- package/src/daemon/blob-diverter.ts +0 -186
- package/src/daemon/context.ts +0 -247
- package/src/daemon/event-pusher.ts +0 -363
- package/src/daemon/event-reverser.ts +0 -128
- package/src/daemon/index.ts +0 -33
- package/src/daemon/job-cursor.ts +0 -33
- package/src/daemon/materialized-view-refresher.ts +0 -33
- package/src/daemon/queue-router.ts +0 -101
- package/src/daemon/scheduled-action-processor.ts +0 -304
- package/src/daemon/stats-computer.ts +0 -101
- package/src/daemon/strike-expiry-processor.ts +0 -95
- package/src/daemon/team-profile-synchronizer.ts +0 -15
- package/src/daemon/verification-listener.ts +0 -169
- package/src/db/index.ts +0 -203
- package/src/db/migrations/20231219T205730722Z-init.ts +0 -170
- package/src/db/migrations/20240116T085607200Z-communication-template.ts +0 -23
- package/src/db/migrations/20240201T051104136Z-mod-event-blobs.ts +0 -15
- package/src/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.ts +0 -31
- package/src/db/migrations/20240228T003647759Z-add-label-sigs.ts +0 -25
- package/src/db/migrations/20240408T192432676Z-mute-reporting.ts +0 -15
- package/src/db/migrations/20240506T225055595Z-message-subject.ts +0 -21
- package/src/db/migrations/20240521T211332580Z-member.ts +0 -17
- package/src/db/migrations/20240814T003647759Z-event-created-at-index.ts +0 -13
- package/src/db/migrations/20240903T205730722Z-add-template-lang.ts +0 -12
- package/src/db/migrations/20240904T205730722Z-add-subject-did-index.ts +0 -13
- package/src/db/migrations/20241001T205730722Z-subject-status-review-state-index.ts +0 -15
- package/src/db/migrations/20241008T205730722Z-sets.ts +0 -53
- package/src/db/migrations/20241018T205730722Z-setting.ts +0 -27
- package/src/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.ts +0 -57
- package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +0 -215
- package/src/db/migrations/20250204T003647759Z-add-subject-priority-score.ts +0 -22
- package/src/db/migrations/20250211T003647759Z-add-reporter-stats-index.ts +0 -38
- package/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts +0 -26
- package/src/db/migrations/20250221T132135150Z-member-details.ts +0 -14
- package/src/db/migrations/20250404T201720309Z-subject-status-sort-idxs.ts +0 -18
- package/src/db/migrations/20250415T201720309Z-verification.ts +0 -34
- package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +0 -16
- package/src/db/migrations/20250609T110704000Z-safelink.ts +0 -53
- package/src/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.ts +0 -18
- package/src/db/migrations/20250701T000000000Z-add-age-assurance-state.ts +0 -25
- package/src/db/migrations/20250715T000000000Z-add-mod-event-external-id.ts +0 -15
- package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +0 -310
- package/src/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.ts +0 -14
- package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +0 -56
- package/src/db/migrations/20251008T120000000Z-add-strike-system.ts +0 -87
- package/src/db/migrations/20260210T154806448Z-mod-event-created-by-indexes.ts +0 -22
- package/src/db/migrations/20260219T164523000Z-create-report-table.ts +0 -155
- package/src/db/migrations/20260219T165302248Z-moderator-assignment.ts +0 -42
- package/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts +0 -41
- package/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts +0 -48
- package/src/db/migrations/20260318T152058935Z-add-report-stat.ts +0 -35
- package/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts +0 -32
- package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +0 -114
- package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +0 -17
- package/src/db/migrations/index.ts +0 -44
- package/src/db/migrations/provider.ts +0 -26
- package/src/db/pagination.ts +0 -335
- package/src/db/schema/account_events_stats.ts +0 -16
- package/src/db/schema/account_record_events_stats.ts +0 -15
- package/src/db/schema/account_record_status_stats.ts +0 -15
- package/src/db/schema/account_strike.ts +0 -13
- package/src/db/schema/blob_push_event.ts +0 -21
- package/src/db/schema/communication_template.ts +0 -19
- package/src/db/schema/expiring_tag.ts +0 -18
- package/src/db/schema/firehose_cursor.ts +0 -13
- package/src/db/schema/index.ts +0 -60
- package/src/db/schema/job_cursor.ts +0 -13
- package/src/db/schema/label.ts +0 -22
- package/src/db/schema/member.ts +0 -22
- package/src/db/schema/moderation_event.ts +0 -61
- package/src/db/schema/moderation_subject_status.ts +0 -52
- package/src/db/schema/moderator_assignment.ts +0 -16
- package/src/db/schema/ozone_set.ts +0 -24
- package/src/db/schema/record_events_stats.ts +0 -15
- package/src/db/schema/record_push_event.ts +0 -21
- package/src/db/schema/repo_push_event.ts +0 -19
- package/src/db/schema/report.ts +0 -28
- package/src/db/schema/report_activity.ts +0 -22
- package/src/db/schema/report_queue.ts +0 -21
- package/src/db/schema/report_stat.ts +0 -27
- package/src/db/schema/safelink.ts +0 -39
- package/src/db/schema/scheduled-action.ts +0 -25
- package/src/db/schema/setting.ts +0 -24
- package/src/db/schema/signing_key.ts +0 -10
- package/src/db/schema/verification.ts +0 -21
- package/src/db/types.ts +0 -24
- package/src/error.ts +0 -12
- package/src/image-invalidator.ts +0 -7
- package/src/index.ts +0 -154
- package/src/jetstream/service.ts +0 -107
- package/src/logger.ts +0 -29
- package/src/mod-service/expiring-tags.ts +0 -104
- package/src/mod-service/index.ts +0 -1842
- package/src/mod-service/profile.ts +0 -139
- package/src/mod-service/report.ts +0 -429
- package/src/mod-service/status.ts +0 -549
- package/src/mod-service/strike.ts +0 -96
- package/src/mod-service/subject.ts +0 -311
- package/src/mod-service/types.ts +0 -96
- package/src/mod-service/util.ts +0 -99
- package/src/mod-service/views.ts +0 -912
- package/src/queue/service.ts +0 -603
- package/src/report/activity.ts +0 -281
- package/src/report/handle-report-update.ts +0 -209
- package/src/report/reassign.ts +0 -109
- package/src/report/stats.ts +0 -852
- package/src/report/views.ts +0 -239
- package/src/safelink/service.ts +0 -304
- package/src/scheduled-action/service.ts +0 -281
- package/src/scheduled-action/types.ts +0 -17
- package/src/sequencer/index.ts +0 -2
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -147
- package/src/set/service.ts +0 -230
- package/src/setting/constants.ts +0 -3
- package/src/setting/service.ts +0 -148
- package/src/setting/types.ts +0 -3
- package/src/setting/validators.ts +0 -333
- package/src/tag-service/content-tagger.ts +0 -30
- package/src/tag-service/embed-tagger.ts +0 -70
- package/src/tag-service/index.ts +0 -70
- package/src/tag-service/language-data.ts +0 -561
- package/src/tag-service/language-tagger.ts +0 -101
- package/src/tag-service/util.ts +0 -13
- package/src/team/index.ts +0 -296
- package/src/util.ts +0 -230
- package/src/verification/issuer.ts +0 -146
- package/src/verification/service.ts +0 -208
- package/src/verification/util.ts +0 -53
- package/test.env +0 -2
- package/tests/3p-labeler.test.ts +0 -288
- package/tests/__snapshots__/account-strikes.test.ts.snap +0 -159
- package/tests/__snapshots__/age-assurance.test.ts.snap +0 -66
- package/tests/__snapshots__/blob-divert.test.ts.snap +0 -219
- package/tests/__snapshots__/get-account-timeline.test.ts.snap +0 -36
- package/tests/__snapshots__/get-record.test.ts.snap +0 -271
- package/tests/__snapshots__/get-records.test.ts.snap +0 -175
- package/tests/__snapshots__/get-repo.test.ts.snap +0 -91
- package/tests/__snapshots__/get-repos.test.ts.snap +0 -127
- package/tests/__snapshots__/get-starter-pack.test.ts.snap +0 -535
- package/tests/__snapshots__/get-subjects.test.ts.snap +0 -529
- package/tests/__snapshots__/moderation-events.test.ts.snap +0 -347
- package/tests/__snapshots__/moderation-statuses.test.ts.snap +0 -276
- package/tests/__snapshots__/moderation.test.ts.snap +0 -85
- package/tests/__snapshots__/report-reason.test.ts.snap +0 -14
- package/tests/__snapshots__/safelink.test.ts.snap +0 -179
- package/tests/__snapshots__/scheduled-action.test.ts.snap +0 -61
- package/tests/__snapshots__/sets.test.ts.snap +0 -46
- package/tests/__snapshots__/settings.test.ts.snap +0 -52
- package/tests/__snapshots__/team.test.ts.snap +0 -374
- package/tests/__snapshots__/verification-listener.test.ts.snap +0 -152
- package/tests/__snapshots__/verification.test.ts.snap +0 -302
- package/tests/_util.ts +0 -242
- package/tests/account-strikes.test.ts +0 -184
- package/tests/ack-all-subjects-of-account.test.ts +0 -177
- package/tests/age-assurance.test.ts +0 -372
- package/tests/blob-divert.test.ts +0 -106
- package/tests/communication-templates.test.ts +0 -149
- package/tests/content-tagger.test.ts +0 -170
- package/tests/db.test.ts +0 -184
- package/tests/expiring-label.test.ts +0 -72
- package/tests/expiring-tags.test.ts +0 -232
- package/tests/get-account-timeline.test.ts +0 -85
- package/tests/get-config.test.ts +0 -55
- package/tests/get-lists.test.ts +0 -111
- package/tests/get-profiles.test.ts +0 -70
- package/tests/get-record.test.ts +0 -130
- package/tests/get-records.test.ts +0 -91
- package/tests/get-repo.test.ts +0 -171
- package/tests/get-report.test.ts +0 -136
- package/tests/get-reporter-stats.test.ts +0 -132
- package/tests/get-repos.test.ts +0 -91
- package/tests/get-starter-pack.test.ts +0 -115
- package/tests/get-subjects.test.ts +0 -81
- package/tests/mod-tool.test.ts +0 -268
- package/tests/moderation-appeals.test.ts +0 -260
- package/tests/moderation-events.test.ts +0 -756
- package/tests/moderation-status-tags.test.ts +0 -140
- package/tests/moderation-statuses.test.ts +0 -495
- package/tests/moderation.test.ts +0 -992
- package/tests/protected-tags.test.ts +0 -218
- package/tests/query-labels.test.ts +0 -238
- package/tests/query-reports.test.ts +0 -608
- package/tests/queue-assignment.test.ts +0 -428
- package/tests/queue-router.test.ts +0 -306
- package/tests/queues.test.ts +0 -690
- package/tests/record-and-account-events.test.ts +0 -197
- package/tests/repo-search.test.ts +0 -136
- package/tests/report-action.test.ts +0 -308
- package/tests/report-activity.test.ts +0 -711
- package/tests/report-assignment.test.ts +0 -517
- package/tests/report-muting.test.ts +0 -100
- package/tests/report-reason.test.ts +0 -154
- package/tests/report-reassign-queue.test.ts +0 -340
- package/tests/report-routing.test.ts +0 -245
- package/tests/report-stats.test.ts +0 -545
- package/tests/revoke-account-credentials.test.ts +0 -54
- package/tests/safelink.test.ts +0 -534
- package/tests/scheduled-action-processor.test.ts +0 -488
- package/tests/scheduled-action.test.ts +0 -334
- package/tests/sequencer.test.ts +0 -227
- package/tests/server.test.ts +0 -62
- package/tests/sets.test.ts +0 -246
- package/tests/settings.test.ts +0 -308
- package/tests/strike-expiry-processor.test.ts +0 -299
- package/tests/subject-priority-score.test.ts +0 -96
- package/tests/takedown.test.ts +0 -105
- package/tests/team.test.ts +0 -216
- package/tests/verification-listener.test.ts +0 -129
- package/tests/verification.test.ts +0 -186
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
package/src/api/util.ts
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AdminTokenOutput, ModeratorOutput } from '../auth-verifier.js'
|
|
3
|
-
import { AppContext } from '../context.js'
|
|
4
|
-
import { Member } from '../db/schema/member.js'
|
|
5
|
-
import { ModerationEvent } from '../db/schema/moderation_event.js'
|
|
6
|
-
import { ids } from '../lexicon/lexicons.js'
|
|
7
|
-
import { AccountView } from '../lexicon/types/com/atproto/admin/defs.js'
|
|
8
|
-
import { REASONAPPEAL } from '../lexicon/types/com/atproto/moderation/defs.js'
|
|
9
|
-
import {
|
|
10
|
-
REVIEWCLOSED,
|
|
11
|
-
REVIEWESCALATED,
|
|
12
|
-
REVIEWNONE,
|
|
13
|
-
REVIEWOPEN,
|
|
14
|
-
RepoView,
|
|
15
|
-
RepoViewDetail,
|
|
16
|
-
} from '../lexicon/types/tools/ozone/moderation/defs.js'
|
|
17
|
-
import {
|
|
18
|
-
ROLEADMIN,
|
|
19
|
-
ROLEMODERATOR,
|
|
20
|
-
ROLETRIAGE,
|
|
21
|
-
ROLEVERIFIER,
|
|
22
|
-
} from '../lexicon/types/tools/ozone/team/defs.js'
|
|
23
|
-
import { ModerationSubjectStatusRow } from '../mod-service/types.js'
|
|
24
|
-
|
|
25
|
-
export const getAuthDid = (
|
|
26
|
-
auth: ModeratorOutput | AdminTokenOutput,
|
|
27
|
-
serviceDid: string,
|
|
28
|
-
): string | undefined => {
|
|
29
|
-
return auth.credentials.type === 'moderator'
|
|
30
|
-
? auth.credentials.iss
|
|
31
|
-
: auth.credentials.type === 'admin_token'
|
|
32
|
-
? serviceDid
|
|
33
|
-
: undefined
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const getPdsAccountInfos = async (
|
|
37
|
-
ctx: AppContext,
|
|
38
|
-
dids: string[],
|
|
39
|
-
): Promise<Map<string, AccountView | null>> => {
|
|
40
|
-
const results = new Map<string, AccountView | null>()
|
|
41
|
-
|
|
42
|
-
const agent = ctx.pdsAgent
|
|
43
|
-
if (!agent || !dids.length) return results
|
|
44
|
-
|
|
45
|
-
const auth = await ctx.pdsAuth(ids.ComAtprotoAdminGetAccountInfos)
|
|
46
|
-
if (!auth) return results
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
const res = await agent.com.atproto.admin.getAccountInfos({ dids }, auth)
|
|
50
|
-
res.data.infos.forEach((info) => {
|
|
51
|
-
results.set(info.did, info)
|
|
52
|
-
})
|
|
53
|
-
return results
|
|
54
|
-
} catch {
|
|
55
|
-
return results
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function un$type<T extends object>(obj: T): Omit<T, '$type'> {
|
|
60
|
-
if ('$type' in obj) {
|
|
61
|
-
const { $type: _, ...rest } = obj
|
|
62
|
-
return rest
|
|
63
|
-
}
|
|
64
|
-
return obj
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export const addAccountInfoToRepoViewDetail = (
|
|
68
|
-
repoView: RepoView | RepoViewDetail,
|
|
69
|
-
accountInfo: AccountView | null,
|
|
70
|
-
includeEmail = false,
|
|
71
|
-
): RepoViewDetail => {
|
|
72
|
-
if (!accountInfo) {
|
|
73
|
-
return un$type({
|
|
74
|
-
...repoView,
|
|
75
|
-
moderation: un$type(repoView.moderation),
|
|
76
|
-
})
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const {
|
|
80
|
-
email,
|
|
81
|
-
deactivatedAt,
|
|
82
|
-
emailConfirmedAt,
|
|
83
|
-
inviteNote,
|
|
84
|
-
invitedBy,
|
|
85
|
-
invites,
|
|
86
|
-
invitesDisabled,
|
|
87
|
-
threatSignatures,
|
|
88
|
-
// pick some duplicate/unwanted details out
|
|
89
|
-
$type: _accountType,
|
|
90
|
-
did: _did,
|
|
91
|
-
handle: _handle,
|
|
92
|
-
indexedAt: _indexedAt,
|
|
93
|
-
relatedRecords: _relatedRecords,
|
|
94
|
-
...otherAccountInfo
|
|
95
|
-
} = accountInfo
|
|
96
|
-
return {
|
|
97
|
-
...otherAccountInfo,
|
|
98
|
-
...un$type(repoView),
|
|
99
|
-
moderation: un$type(repoView.moderation),
|
|
100
|
-
email: includeEmail ? email : undefined,
|
|
101
|
-
invitedBy,
|
|
102
|
-
invitesDisabled,
|
|
103
|
-
inviteNote,
|
|
104
|
-
invites,
|
|
105
|
-
emailConfirmedAt,
|
|
106
|
-
deactivatedAt,
|
|
107
|
-
threatSignatures,
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export const addAccountInfoToRepoView = (
|
|
112
|
-
repoView: RepoView,
|
|
113
|
-
accountInfo: AccountView | null,
|
|
114
|
-
includeEmail = false,
|
|
115
|
-
): RepoView => {
|
|
116
|
-
if (!accountInfo) return repoView
|
|
117
|
-
return {
|
|
118
|
-
...repoView,
|
|
119
|
-
email: includeEmail ? accountInfo.email : undefined,
|
|
120
|
-
invitedBy: accountInfo.invitedBy,
|
|
121
|
-
invitesDisabled: accountInfo.invitesDisabled,
|
|
122
|
-
inviteNote: accountInfo.inviteNote,
|
|
123
|
-
deactivatedAt: accountInfo.deactivatedAt,
|
|
124
|
-
threatSignatures: accountInfo.threatSignatures,
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export const getEventType = (type: string) => {
|
|
129
|
-
if (eventTypes.has(type)) {
|
|
130
|
-
return type as ModerationEvent['action']
|
|
131
|
-
}
|
|
132
|
-
throw new InvalidRequestError('Invalid event type')
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export const getReviewState = (reviewState?: string) => {
|
|
136
|
-
if (!reviewState) return undefined
|
|
137
|
-
if (reviewStates.has(reviewState)) {
|
|
138
|
-
return reviewState as ModerationSubjectStatusRow['reviewState']
|
|
139
|
-
}
|
|
140
|
-
throw new InvalidRequestError('Invalid review state')
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const reviewStates = new Set([
|
|
144
|
-
REVIEWCLOSED,
|
|
145
|
-
REVIEWESCALATED,
|
|
146
|
-
REVIEWOPEN,
|
|
147
|
-
REVIEWNONE,
|
|
148
|
-
])
|
|
149
|
-
|
|
150
|
-
const eventTypes = new Set([
|
|
151
|
-
'tools.ozone.moderation.defs#modEventTakedown',
|
|
152
|
-
'tools.ozone.moderation.defs#modEventAcknowledge',
|
|
153
|
-
'tools.ozone.moderation.defs#modEventEscalate',
|
|
154
|
-
'tools.ozone.moderation.defs#modEventComment',
|
|
155
|
-
'tools.ozone.moderation.defs#modEventLabel',
|
|
156
|
-
'tools.ozone.moderation.defs#modEventReport',
|
|
157
|
-
'tools.ozone.moderation.defs#modEventMute',
|
|
158
|
-
'tools.ozone.moderation.defs#modEventUnmute',
|
|
159
|
-
'tools.ozone.moderation.defs#modEventMuteReporter',
|
|
160
|
-
'tools.ozone.moderation.defs#modEventUnmuteReporter',
|
|
161
|
-
'tools.ozone.moderation.defs#modEventReverseTakedown',
|
|
162
|
-
'tools.ozone.moderation.defs#modEventEmail',
|
|
163
|
-
'tools.ozone.moderation.defs#modEventResolveAppeal',
|
|
164
|
-
'tools.ozone.moderation.defs#modEventTag',
|
|
165
|
-
'tools.ozone.moderation.defs#modEventDivert',
|
|
166
|
-
'tools.ozone.moderation.defs#accountEvent',
|
|
167
|
-
'tools.ozone.moderation.defs#identityEvent',
|
|
168
|
-
'tools.ozone.moderation.defs#recordEvent',
|
|
169
|
-
'tools.ozone.moderation.defs#modEventPriorityScore',
|
|
170
|
-
'tools.ozone.moderation.defs#ageAssuranceEvent',
|
|
171
|
-
'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
|
|
172
|
-
'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
|
|
173
|
-
'tools.ozone.moderation.defs#revokeAccountCredentialsEvent',
|
|
174
|
-
'tools.ozone.moderation.defs#scheduleTakedownEvent',
|
|
175
|
-
'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',
|
|
176
|
-
])
|
|
177
|
-
|
|
178
|
-
export const getMemberRole = (role: string) => {
|
|
179
|
-
if (memberRoles.has(role)) {
|
|
180
|
-
return role as Member['role']
|
|
181
|
-
}
|
|
182
|
-
throw new InvalidRequestError('Invalid member role')
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const memberRoles = new Set([
|
|
186
|
-
ROLEADMIN,
|
|
187
|
-
ROLEMODERATOR,
|
|
188
|
-
ROLETRIAGE,
|
|
189
|
-
ROLEVERIFIER,
|
|
190
|
-
])
|
|
191
|
-
|
|
192
|
-
export const OZONE_APPEAL_REASON_TYPE = 'tools.ozone.report.defs#reasonAppeal'
|
|
193
|
-
const APPEAL_REASON_TYPES = [REASONAPPEAL, OZONE_APPEAL_REASON_TYPE]
|
|
194
|
-
export const isAppealReport = (reasonType?: string): boolean => {
|
|
195
|
-
return !!reasonType && APPEAL_REASON_TYPES.includes(reasonType)
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export const getSafelinkPattern = (pattern: string): SafelinkPatternType => {
|
|
199
|
-
if (safelinkPatterns.has(pattern)) {
|
|
200
|
-
return pattern as SafelinkPatternType
|
|
201
|
-
}
|
|
202
|
-
throw new InvalidRequestError('Invalid safelink pattern type')
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export const getSafelinkAction = (action: string): SafelinkActionType => {
|
|
206
|
-
if (safelinkActions.has(action)) {
|
|
207
|
-
return action as SafelinkActionType
|
|
208
|
-
}
|
|
209
|
-
throw new InvalidRequestError('Invalid safelink action type')
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
export const getSafelinkReason = (reason: string): SafelinkReasonType => {
|
|
213
|
-
if (safelinkReasons.has(reason)) {
|
|
214
|
-
return reason as SafelinkReasonType
|
|
215
|
-
}
|
|
216
|
-
throw new InvalidRequestError('Invalid safelink reason type')
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export const getSafelinkEventType = (eventType: string): SafelinkEventType => {
|
|
220
|
-
if (safelinkEventTypes.has(eventType)) {
|
|
221
|
-
return eventType as SafelinkEventType
|
|
222
|
-
}
|
|
223
|
-
throw new InvalidRequestError('Invalid safelink event type')
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export type SafelinkEventType = 'addRule' | 'updateRule' | 'removeRule'
|
|
227
|
-
export type SafelinkPatternType = 'domain' | 'url'
|
|
228
|
-
export type SafelinkActionType = 'block' | 'warn' | 'whitelist'
|
|
229
|
-
export type SafelinkReasonType = 'csam' | 'spam' | 'phishing' | 'none'
|
|
230
|
-
|
|
231
|
-
const safelinkPatterns = new Set(['domain', 'url'])
|
|
232
|
-
const safelinkActions = new Set(['block', 'warn', 'whitelist'])
|
|
233
|
-
const safelinkReasons = new Set(['csam', 'spam', 'phishing', 'none'])
|
|
234
|
-
const safelinkEventTypes = new Set(['addRule', 'updateRule', 'removeRule'])
|
|
235
|
-
|
|
236
|
-
export const getScheduledActionType = (action: string): ScheduledActionType => {
|
|
237
|
-
if (scheduledActionTypes.has(action)) {
|
|
238
|
-
return action as ScheduledActionType
|
|
239
|
-
}
|
|
240
|
-
throw new InvalidRequestError('Invalid scheduled action type')
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export const getScheduledActionStatus = (
|
|
244
|
-
status: string,
|
|
245
|
-
): ScheduledActionStatus => {
|
|
246
|
-
if (scheduledActionStatuses.has(status)) {
|
|
247
|
-
return status as ScheduledActionStatus
|
|
248
|
-
}
|
|
249
|
-
throw new InvalidRequestError('Invalid scheduled action status')
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export type ScheduledActionType = 'takedown'
|
|
253
|
-
export type ScheduledActionStatus =
|
|
254
|
-
| 'pending'
|
|
255
|
-
| 'executed'
|
|
256
|
-
| 'cancelled'
|
|
257
|
-
| 'failed'
|
|
258
|
-
|
|
259
|
-
const scheduledActionTypes = new Set(['takedown'])
|
|
260
|
-
const scheduledActionStatuses = new Set([
|
|
261
|
-
'pending',
|
|
262
|
-
'executed',
|
|
263
|
-
'cancelled',
|
|
264
|
-
'failed',
|
|
265
|
-
])
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { Selectable } from 'kysely'
|
|
2
|
-
import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
|
|
3
|
-
import { AppContext } from '../../context.js'
|
|
4
|
-
import { Verification } from '../../db/schema/verification.js'
|
|
5
|
-
import { Server } from '../../lexicon/index.js'
|
|
6
|
-
import { getReposForVerifications } from '../../verification/util.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
server.tools.ozone.verification.grantVerifications({
|
|
10
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
11
|
-
handler: async ({ input, auth, req }) => {
|
|
12
|
-
if (!ctx.cfg.verifier) {
|
|
13
|
-
throw new InvalidRequestError('Verifier not configured')
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (!auth.credentials.isVerifier) {
|
|
17
|
-
throw new AuthRequiredError(
|
|
18
|
-
'Must be an admin or verifier to grant verifications',
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const modViews = ctx.modService(ctx.db).views
|
|
23
|
-
const profilesBefore = await modViews.getProfiles(
|
|
24
|
-
input.body.verifications.map((v) => v.subject),
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
// Filter out any subject for which, the current issuer already has a valid verification record indexed
|
|
28
|
-
const verificationsToBeGranted = input.body.verifications.filter(
|
|
29
|
-
(verificationInput) => {
|
|
30
|
-
const hasValidVerification = profilesBefore
|
|
31
|
-
.get(verificationInput.subject)
|
|
32
|
-
?.verification?.verifications.find(
|
|
33
|
-
(v) => v.issuer === ctx.cfg.verifier?.did && v.isValid,
|
|
34
|
-
)
|
|
35
|
-
return !hasValidVerification
|
|
36
|
-
},
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
const verificationIssuer = ctx.verificationIssuer(ctx.cfg.verifier)
|
|
40
|
-
const verificationService = ctx.verificationService(ctx.db)
|
|
41
|
-
const { grantedVerifications, failedVerifications } =
|
|
42
|
-
await verificationIssuer.verify(verificationsToBeGranted)
|
|
43
|
-
|
|
44
|
-
if (!grantedVerifications.length) {
|
|
45
|
-
return {
|
|
46
|
-
encoding: 'application/json',
|
|
47
|
-
body: {
|
|
48
|
-
verifications: [],
|
|
49
|
-
failedVerifications,
|
|
50
|
-
},
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const createdVerifications: Selectable<Verification>[] = []
|
|
55
|
-
const verificationEntries =
|
|
56
|
-
await verificationService.create(grantedVerifications)
|
|
57
|
-
|
|
58
|
-
const dids = new Set<string>([ctx.cfg.verifier.did])
|
|
59
|
-
|
|
60
|
-
for (const verification of verificationEntries) {
|
|
61
|
-
createdVerifications.push(verification)
|
|
62
|
-
dids.add(verification.subject)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const didsArr = Array.from(dids)
|
|
66
|
-
const [repos, profiles] = await Promise.all([
|
|
67
|
-
getReposForVerifications(
|
|
68
|
-
ctx,
|
|
69
|
-
ctx.reqLabelers(req),
|
|
70
|
-
ctx.modService(ctx.db),
|
|
71
|
-
didsArr,
|
|
72
|
-
auth.credentials.isModerator,
|
|
73
|
-
),
|
|
74
|
-
modViews.getProfiles(didsArr),
|
|
75
|
-
])
|
|
76
|
-
const verifications = verificationService.view(
|
|
77
|
-
createdVerifications,
|
|
78
|
-
repos,
|
|
79
|
-
profiles,
|
|
80
|
-
)
|
|
81
|
-
return {
|
|
82
|
-
encoding: 'application/json',
|
|
83
|
-
body: {
|
|
84
|
-
verifications,
|
|
85
|
-
failedVerifications,
|
|
86
|
-
},
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
})
|
|
90
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
import { getReposForVerifications } from '../../verification/util.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.verification.listVerifications({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ req, params, auth }) => {
|
|
9
|
-
const modViews = ctx.modService(ctx.db).views
|
|
10
|
-
const verificationService = ctx.verificationService(ctx.db)
|
|
11
|
-
const { verifications, cursor } = await verificationService.list(params)
|
|
12
|
-
|
|
13
|
-
const dids = new Set<string>()
|
|
14
|
-
for (const verification of verifications) {
|
|
15
|
-
dids.add(verification.subject)
|
|
16
|
-
dids.add(verification.issuer)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const didsArr = Array.from(dids)
|
|
20
|
-
const [repos, profiles] = await Promise.all([
|
|
21
|
-
getReposForVerifications(
|
|
22
|
-
ctx,
|
|
23
|
-
ctx.reqLabelers(req),
|
|
24
|
-
ctx.modService(ctx.db),
|
|
25
|
-
didsArr,
|
|
26
|
-
auth.credentials.isModerator,
|
|
27
|
-
),
|
|
28
|
-
modViews.getProfiles(didsArr),
|
|
29
|
-
])
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
encoding: 'application/json',
|
|
33
|
-
body: {
|
|
34
|
-
cursor,
|
|
35
|
-
verifications: verificationService.view(
|
|
36
|
-
verifications,
|
|
37
|
-
repos,
|
|
38
|
-
profiles,
|
|
39
|
-
),
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.verification.revokeVerifications({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ input, auth }) => {
|
|
9
|
-
if (!ctx.cfg.verifier) {
|
|
10
|
-
throw new InvalidRequestError('Verifier not configured')
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (!auth.credentials.isVerifier) {
|
|
14
|
-
throw new AuthRequiredError(
|
|
15
|
-
'Must be an admin or verifier to revoke verifications',
|
|
16
|
-
)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const verificationIssuer = ctx.verificationIssuer(ctx.cfg.verifier)
|
|
20
|
-
const { uris, revokeReason } = input.body
|
|
21
|
-
const { revokedVerifications, failedRevocations } =
|
|
22
|
-
await verificationIssuer.revoke({ uris })
|
|
23
|
-
|
|
24
|
-
if (revokedVerifications.length) {
|
|
25
|
-
const verificationService = ctx.verificationService(ctx.db)
|
|
26
|
-
await verificationService.markRevoked({
|
|
27
|
-
uris: revokedVerifications,
|
|
28
|
-
revokeReason,
|
|
29
|
-
revokedBy:
|
|
30
|
-
'iss' in auth.credentials ? auth.credentials.iss : undefined,
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
encoding: 'application/json',
|
|
36
|
-
body: {
|
|
37
|
-
revokedVerifications,
|
|
38
|
-
failedRevocations,
|
|
39
|
-
},
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
}
|
package/src/api/well-known.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express'
|
|
2
|
-
import { AppContext } from '../context.js'
|
|
3
|
-
|
|
4
|
-
export const createRouter = (ctx: AppContext): Router => {
|
|
5
|
-
const router = Router()
|
|
6
|
-
|
|
7
|
-
router.get('/.well-known/did.json', (_req, res) => {
|
|
8
|
-
const hostname =
|
|
9
|
-
ctx.cfg.service.publicUrl && new URL(ctx.cfg.service.publicUrl).hostname
|
|
10
|
-
if (!hostname || ctx.cfg.service.did !== `did:web:${hostname}`) {
|
|
11
|
-
return res.sendStatus(404)
|
|
12
|
-
}
|
|
13
|
-
res.json({
|
|
14
|
-
'@context': [
|
|
15
|
-
'https://www.w3.org/ns/did/v1',
|
|
16
|
-
'https://w3id.org/security/multikey/v1',
|
|
17
|
-
],
|
|
18
|
-
id: ctx.cfg.service.did,
|
|
19
|
-
verificationMethod: [
|
|
20
|
-
{
|
|
21
|
-
id: `${ctx.cfg.service.did}#atproto_label`,
|
|
22
|
-
type: 'Multikey',
|
|
23
|
-
controller: ctx.cfg.service.did,
|
|
24
|
-
publicKeyMultibase: ctx.signingKey.did().replace('did:key:', ''),
|
|
25
|
-
},
|
|
26
|
-
],
|
|
27
|
-
service: [
|
|
28
|
-
{
|
|
29
|
-
id: '#atproto_labeler',
|
|
30
|
-
type: 'AtprotoLabeler',
|
|
31
|
-
serviceEndpoint: `https://${hostname}`,
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
})
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
router.get('/.well-known/ozone-metadata.json', (_req, res) => {
|
|
38
|
-
return res.json({
|
|
39
|
-
did: ctx.cfg.service.did,
|
|
40
|
-
url: ctx.cfg.service.publicUrl,
|
|
41
|
-
publicKey: ctx.signingKey.did(),
|
|
42
|
-
})
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
return router
|
|
46
|
-
}
|