Add automated login
parent
9dec58b3d4
commit
692a42bdf8
|
@ -8,11 +8,13 @@ that the credentials type needs to know about before it can make a request.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
|
import Internal.Api.PreApi.Objects.Login as L
|
||||||
import Internal.Api.PreApi.Objects.Versions as V
|
import Internal.Api.PreApi.Objects.Versions as V
|
||||||
import Internal.Api.Request as R
|
import Internal.Api.Request as R
|
||||||
import Internal.Tools.Exceptions as X
|
import Internal.Tools.Exceptions as X
|
||||||
import Internal.Tools.LoginValues exposing (AccessToken(..))
|
import Internal.Tools.LoginValues exposing (AccessToken(..))
|
||||||
import Internal.Tools.ValueGetter exposing (ValueGetter)
|
import Internal.Tools.ValueGetter exposing (ValueGetter)
|
||||||
|
import Json.Encode as E
|
||||||
import Task
|
import Task
|
||||||
import Time
|
import Time
|
||||||
|
|
||||||
|
@ -30,10 +32,33 @@ accessToken baseUrl t =
|
||||||
UsernameAndPassword { token } ->
|
UsernameAndPassword { token } ->
|
||||||
token
|
token
|
||||||
, getValue =
|
, getValue =
|
||||||
"Automated login yet needs to be implemented."
|
case t of
|
||||||
|> X.NotSupportedYet
|
UsernameAndPassword { username, password } ->
|
||||||
|> X.SDKException
|
R.rawApiCall
|
||||||
|> Task.fail
|
{ headers = R.NoHeaders
|
||||||
|
, method = "POST"
|
||||||
|
, baseUrl = baseUrl
|
||||||
|
, path = "/_matrix/client/v3/login"
|
||||||
|
, pathParams = []
|
||||||
|
, queryParams = []
|
||||||
|
, bodyParams =
|
||||||
|
[ [ ( "type", E.string "m.id.user" )
|
||||||
|
, ( "user", E.string username )
|
||||||
|
]
|
||||||
|
|> E.object
|
||||||
|
|> R.RequiredValue "identifier"
|
||||||
|
, R.RequiredString "password" password
|
||||||
|
, R.RequiredString "type" "m.login.password"
|
||||||
|
]
|
||||||
|
, timeout = Nothing
|
||||||
|
, decoder = \_ -> L.loggedInResponseDecoder
|
||||||
|
}
|
||||||
|
|> Task.map .accessToken
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
X.NoAccessToken
|
||||||
|
|> X.SDKException
|
||||||
|
|> Task.fail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
module Internal.Api.PreApi.Objects.Login exposing
|
||||||
|
( DiscoveryInformation
|
||||||
|
, HomeserverInformation
|
||||||
|
, IdentityServerInformation
|
||||||
|
, LoggedInResponse
|
||||||
|
, discoveryInformationDecoder
|
||||||
|
, encodeDiscoveryInformation
|
||||||
|
, encodeHomeserverInformation
|
||||||
|
, encodeIdentityServerInformation
|
||||||
|
, encodeLoggedInResponse
|
||||||
|
, homeserverInformationDecoder
|
||||||
|
, identityServerInformationDecoder
|
||||||
|
, loggedInResponseDecoder
|
||||||
|
)
|
||||||
|
|
||||||
|
{-| Automatically generated 'Login'
|
||||||
|
|
||||||
|
Last generated at Unix time 1677859025
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Internal.Tools.DecodeExtra exposing (opField)
|
||||||
|
import Internal.Tools.EncodeExtra exposing (maybeObject)
|
||||||
|
import Json.Decode as D
|
||||||
|
import Json.Encode as E
|
||||||
|
|
||||||
|
|
||||||
|
{-| Information that overwrites the credential's base url and more.
|
||||||
|
-}
|
||||||
|
type alias DiscoveryInformation =
|
||||||
|
{ mHomeserver : HomeserverInformation
|
||||||
|
, mIdentityServer : Maybe IdentityServerInformation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeDiscoveryInformation : DiscoveryInformation -> E.Value
|
||||||
|
encodeDiscoveryInformation data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "m.homeserver", Just <| encodeHomeserverInformation data.mHomeserver )
|
||||||
|
, ( "m.identity_server", Maybe.map encodeIdentityServerInformation data.mIdentityServer )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
discoveryInformationDecoder : D.Decoder DiscoveryInformation
|
||||||
|
discoveryInformationDecoder =
|
||||||
|
D.map2
|
||||||
|
(\a b ->
|
||||||
|
{ mHomeserver = a, mIdentityServer = b }
|
||||||
|
)
|
||||||
|
(D.field "m.homeserver" homeserverInformationDecoder)
|
||||||
|
(opField "m.identity_server" identityServerInformationDecoder)
|
||||||
|
|
||||||
|
|
||||||
|
{-| Used by clients to discover homeserver information.
|
||||||
|
-}
|
||||||
|
type alias HomeserverInformation =
|
||||||
|
{ baseUrl : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeHomeserverInformation : HomeserverInformation -> E.Value
|
||||||
|
encodeHomeserverInformation data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "base_url", Just <| E.string data.baseUrl )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
homeserverInformationDecoder : D.Decoder HomeserverInformation
|
||||||
|
homeserverInformationDecoder =
|
||||||
|
D.map
|
||||||
|
(\a ->
|
||||||
|
{ baseUrl = a }
|
||||||
|
)
|
||||||
|
(D.field "base_url" D.string)
|
||||||
|
|
||||||
|
|
||||||
|
{-| Used by clients to discover identity server information.
|
||||||
|
-}
|
||||||
|
type alias IdentityServerInformation =
|
||||||
|
{ baseUrl : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeIdentityServerInformation : IdentityServerInformation -> E.Value
|
||||||
|
encodeIdentityServerInformation data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "base_url", Just <| E.string data.baseUrl )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
identityServerInformationDecoder : D.Decoder IdentityServerInformation
|
||||||
|
identityServerInformationDecoder =
|
||||||
|
D.map
|
||||||
|
(\a ->
|
||||||
|
{ baseUrl = a }
|
||||||
|
)
|
||||||
|
(D.field "base_url" D.string)
|
||||||
|
|
||||||
|
|
||||||
|
{-| Confirmation that the user has successfully logged in.
|
||||||
|
-}
|
||||||
|
type alias LoggedInResponse =
|
||||||
|
{ accessToken : String
|
||||||
|
, deviceId : String
|
||||||
|
, expiresInMs : Maybe Int
|
||||||
|
, refreshToken : Maybe String
|
||||||
|
, userId : String
|
||||||
|
, wellKnown : Maybe DiscoveryInformation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeLoggedInResponse : LoggedInResponse -> E.Value
|
||||||
|
encodeLoggedInResponse data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "access_token", Just <| E.string data.accessToken )
|
||||||
|
, ( "device_id", Just <| E.string data.deviceId )
|
||||||
|
, ( "expires_in_ms", Maybe.map E.int data.expiresInMs )
|
||||||
|
, ( "refresh_token", Maybe.map E.string data.refreshToken )
|
||||||
|
, ( "user_id", Just <| E.string data.userId )
|
||||||
|
, ( "well_known", Maybe.map encodeDiscoveryInformation data.wellKnown )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
loggedInResponseDecoder : D.Decoder LoggedInResponse
|
||||||
|
loggedInResponseDecoder =
|
||||||
|
D.map6
|
||||||
|
(\a b c d e f ->
|
||||||
|
{ accessToken = a, deviceId = b, expiresInMs = c, refreshToken = d, userId = e, wellKnown = f }
|
||||||
|
)
|
||||||
|
(D.field "access_token" D.string)
|
||||||
|
(D.field "device_id" D.string)
|
||||||
|
(opField "expires_in_ms" D.int)
|
||||||
|
(opField "refresh_token" D.string)
|
||||||
|
(D.field "user_id" D.string)
|
||||||
|
(opField "well_known" discoveryInformationDecoder)
|
|
@ -0,0 +1,45 @@
|
||||||
|
version: V_1
|
||||||
|
name: Login
|
||||||
|
objects:
|
||||||
|
LoggedInResponse:
|
||||||
|
description: Confirmation that the user has successfully logged in.
|
||||||
|
fields:
|
||||||
|
access_token:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
device_id:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
expires_in_ms:
|
||||||
|
type: int
|
||||||
|
required: false
|
||||||
|
refresh_token:
|
||||||
|
type: string
|
||||||
|
required: false
|
||||||
|
user_id:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
well_known:
|
||||||
|
type: DiscoveryInformation
|
||||||
|
required: false
|
||||||
|
DiscoveryInformation:
|
||||||
|
description: Information that overwrites the credential's base url and more.
|
||||||
|
fields:
|
||||||
|
m.homeserver:
|
||||||
|
type: HomeserverInformation
|
||||||
|
required: true
|
||||||
|
m.identity_server:
|
||||||
|
type: IdentityServerInformation
|
||||||
|
required: false
|
||||||
|
HomeserverInformation:
|
||||||
|
description: Used by clients to discover homeserver information.
|
||||||
|
fields:
|
||||||
|
base_url:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
IdentityServerInformation:
|
||||||
|
description: Used by clients to discover identity server information.
|
||||||
|
fields:
|
||||||
|
base_url:
|
||||||
|
type: string
|
||||||
|
required: true
|
|
@ -161,7 +161,7 @@ updateWith credUpdate ((Credentials ({ cred, context } as data)) as credentials)
|
||||||
-- Add new room
|
-- Add new room
|
||||||
Nothing ->
|
Nothing ->
|
||||||
jroom
|
jroom
|
||||||
|> Room.initFromJoinedRoom { nextBatch = output.nextBatch, roomId = roomId }
|
|> Room.initFromJoinedRoom { nextBatch = output.nextBatch, roomId = roomId }
|
||||||
)
|
)
|
||||||
in
|
in
|
||||||
cred
|
cred
|
||||||
|
|
Loading…
Reference in New Issue