Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Synopsis
- data ClientCapability
- newtype ClientCapabilityList = ClientCapabilityList {}
- data ClientInfo = ClientInfo {}
- newtype UserClientMap a = UserClientMap {
- userClientMap :: Map UserId (Map ClientId a)
- newtype UserClientPrekeyMap = UserClientPrekeyMap {}
- mkUserClientPrekeyMap :: Map UserId (Map ClientId (Maybe Prekey)) -> UserClientPrekeyMap
- newtype QualifiedUserClientMap a = QualifiedUserClientMap {}
- newtype QualifiedUserClientPrekeyMap = QualifiedUserClientPrekeyMap {}
- data QualifiedUserClientPrekeyMapV4 = QualifiedUserClientPrekeyMapV4 {}
- mkQualifiedUserClientPrekeyMap :: Map Domain UserClientPrekeyMap -> QualifiedUserClientPrekeyMap
- qualifiedUserClientPrekeyMapFromList :: [Qualified UserClientPrekeyMap] -> QualifiedUserClientPrekeyMap
- newtype UserClientsFull = UserClientsFull {
- userClientsFull :: Map UserId (Set Client)
- newtype UserClients = UserClients {
- userClients :: Map UserId (Set ClientId)
- mkUserClients :: [(UserId, [ClientId])] -> UserClients
- newtype QualifiedUserClients = QualifiedUserClients {}
- qualifiedUserClientsValueSchema :: ValueSchema SwaggerDoc QualifiedUserClients
- filterClients :: (Set ClientId -> Bool) -> UserClients -> UserClients
- filterClientsFull :: (Set Client -> Bool) -> UserClientsFull -> UserClientsFull
- data Client = Client {}
- clientSchema :: Maybe Version -> ValueSchema NamedSwaggerDoc Client
- data PubClient = PubClient {}
- data ClientType
- data ClientClass
- type MLSPublicKeys = Map SignatureSchemeTag ByteString
- data NewClient = NewClient {
- newClientPrekeys :: [Prekey]
- newClientLastKey :: LastPrekey
- newClientType :: ClientType
- newClientLabel :: Maybe Text
- newClientClass :: Maybe ClientClass
- newClientCookie :: Maybe CookieLabel
- newClientPassword :: Maybe PlainTextPassword6
- newClientModel :: Maybe Text
- newClientCapabilities :: Maybe ClientCapabilityList
- newClientMLSPublicKeys :: MLSPublicKeys
- newClientVerificationCode :: Maybe Value
- newClient :: ClientType -> LastPrekey -> NewClient
- data UpdateClient = UpdateClient {}
- defUpdateClient :: UpdateClient
- newtype RmClient = RmClient {}
- newtype Latitude = Latitude Double
- newtype Longitude = Longitude Double
- data ClientList = ClientList {}
ClientCapability
data ClientCapability Source #
Names of capabilities clients can claim to support in order to be treated differently by the backend.
- *The cost of capability keywords**
Avoid this wherever possible. Adding capability keywords in the backend code makes testing exponentially more expensive (in principle, you should always test all combinations of supported capabilitiess. But even if you only test those known to occur in the wild, it will still make your life harder.)
Consider dropping support for clients without ancient capabilitiess if you have "enough" clients that are younger. This will always be disruptive for a minority of users, but maybe this can be mitigated by giving those users clear feedback that they need to upgrade in order to get their expected UX back.
- *An alternative design**
Consider replacing ClientCapability
with platform and version in formation (I
played with data Platform = Android | IOS | WebApp | TeamSettings | AccountPages
and
Version
from the semver
package in https://github.com/wireapp/wire-server/pull/1503,
but ended up deciding against it). This data could be passed in a similar way as the
ClientCapabilityList
is now (similar end-point, different path, different body
type), and the two approaches could be used in parallel indefinitely.
Capability keywords reveal the minimum amount of information necessary to handle the client, making it harder to fingerprint and track clients; they are straight-forward and self-documenting (to an extent), and make it easier to release a capability on the backend and clients independently.
Platform/version info is if you have many different capability keywords, even though it doesn't solve the problem of having to explore the entire capability space in your tests. They give you a better idea of the time line, and how to gently discontinue support for ancient capabilities.
ClientSupportsLegalholdImplicitConsent | Clients have minimum support for LH, but not for explicit consent. Implicit consent is granted via the galley server config and cassandra table `galley.legalhold_whitelisted`. |
ClientSupportsConsumableNotifications |
Instances
newtype ClientCapabilityList Source #
Instances
ClientInfo
data ClientInfo Source #
A client, together with extra information about it.
Instances
UserClients
newtype UserClientMap a Source #
UserClientMap | |
|
Instances
newtype UserClientPrekeyMap Source #
Instances
newtype QualifiedUserClientMap a Source #
Instances
newtype QualifiedUserClientPrekeyMap Source #
Instances
data QualifiedUserClientPrekeyMapV4 Source #
Instances
mkQualifiedUserClientPrekeyMap :: Map Domain UserClientPrekeyMap -> QualifiedUserClientPrekeyMap Source #
qualifiedUserClientPrekeyMapFromList :: [Qualified UserClientPrekeyMap] -> QualifiedUserClientPrekeyMap Source #
newtype UserClientsFull Source #
Instances
newtype UserClients Source #
Instances
mkUserClients :: [(UserId, [ClientId])] -> UserClients Source #
newtype QualifiedUserClients Source #
Instances
filterClients :: (Set ClientId -> Bool) -> UserClients -> UserClients Source #
filterClientsFull :: (Set Client -> Bool) -> UserClientsFull -> UserClientsFull Source #
Client
Instances
Instances
Arbitrary PubClient Source # | |
FromJSON PubClient Source # | |
ToJSON PubClient Source # | |
Generic PubClient Source # | |
Show PubClient Source # | |
Eq PubClient Source # | |
Ord PubClient Source # | |
Defined in Wire.API.User.Client | |
ToSchema PubClient Source # | |
Defined in Wire.API.User.Client | |
ToSchema PubClient Source # | |
Defined in Wire.API.User.Client | |
type Rep PubClient Source # | |
Defined in Wire.API.User.Client type Rep PubClient = D1 ('MetaData "PubClient" "Wire.API.User.Client" "wire-api-0.1.0-EbZS9CKNOfZ8BBy5DRJfXi" 'False) (C1 ('MetaCons "PubClient" 'PrefixI 'True) (S1 ('MetaSel ('Just "pubClientId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 ClientId) :*: S1 ('MetaSel ('Just "pubClientClass") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 (Maybe ClientClass)))) |
data ClientType Source #
Instances
data ClientClass Source #
Instances
NewUpdateRemove Client
Instances
newClient :: ClientType -> LastPrekey -> NewClient Source #
data UpdateClient Source #
Instances
Instances
Arbitrary RmClient Source # | |
FromJSON RmClient Source # | |
ToJSON RmClient Source # | |
Generic RmClient Source # | |
Show RmClient Source # | |
Eq RmClient Source # | |
ToSchema RmClient Source # | |
Defined in Wire.API.User.Client | |
ToSchema RmClient Source # | |
Defined in Wire.API.User.Client | |
type Rep RmClient Source # | |
Defined in Wire.API.User.Client type Rep RmClient = D1 ('MetaData "RmClient" "Wire.API.User.Client" "wire-api-0.1.0-EbZS9CKNOfZ8BBy5DRJfXi" 'True) (C1 ('MetaCons "RmClient" 'PrefixI 'True) (S1 ('MetaSel ('Just "rmPassword") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe PlainTextPassword6)))) |
re-exports
List of MLS client ids
data ClientList Source #
Client list for internal API.