summaryrefslogtreecommitdiffstats
path: root/vendor/maunium.net/go/mautrix/id/trust.go
blob: 04f6e36bedf6d32bcd1012464bb29dee1397f80c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (c) 2022 Tulir Asokan
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

package id

import (
	"fmt"
	"strings"
)

// TrustState determines how trusted a device is.
type TrustState int

const (
	TrustStateBlacklisted          TrustState = -100
	TrustStateUnset                TrustState = 0
	TrustStateUnknownDevice        TrustState = 10
	TrustStateForwarded            TrustState = 20
	TrustStateCrossSignedUntrusted TrustState = 50
	TrustStateCrossSignedTOFU      TrustState = 100
	TrustStateCrossSignedVerified  TrustState = 200
	TrustStateVerified             TrustState = 300
	TrustStateInvalid              TrustState = (1 << 31) - 1
)

func (ts *TrustState) UnmarshalText(data []byte) error {
	strData := string(data)
	state := ParseTrustState(strData)
	if state == TrustStateInvalid {
		return fmt.Errorf("invalid trust state %q", strData)
	}
	*ts = state
	return nil
}

func (ts *TrustState) MarshalText() ([]byte, error) {
	return []byte(ts.String()), nil
}

func ParseTrustState(val string) TrustState {
	switch strings.ToLower(val) {
	case "blacklisted":
		return TrustStateBlacklisted
	case "unverified":
		return TrustStateUnset
	case "cross-signed-untrusted":
		return TrustStateCrossSignedUntrusted
	case "unknown-device":
		return TrustStateUnknownDevice
	case "forwarded":
		return TrustStateForwarded
	case "cross-signed-tofu", "cross-signed":
		return TrustStateCrossSignedTOFU
	case "cross-signed-verified", "cross-signed-trusted":
		return TrustStateCrossSignedVerified
	case "verified":
		return TrustStateVerified
	default:
		return TrustStateInvalid
	}
}

func (ts TrustState) String() string {
	switch ts {
	case TrustStateBlacklisted:
		return "blacklisted"
	case TrustStateUnset:
		return "unverified"
	case TrustStateCrossSignedUntrusted:
		return "cross-signed-untrusted"
	case TrustStateUnknownDevice:
		return "unknown-device"
	case TrustStateForwarded:
		return "forwarded"
	case TrustStateCrossSignedTOFU:
		return "cross-signed-tofu"
	case TrustStateCrossSignedVerified:
		return "cross-signed-verified"
	case TrustStateVerified:
		return "verified"
	default:
		return "invalid"
	}
}