Skip to content

Commit

Permalink
Allow user to provide login credentials by pasting an openrc file
Browse files Browse the repository at this point in the history
  • Loading branch information
c-mart committed Jan 11, 2018
1 parent 8ba7240 commit 4376435
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 4 deletions.
1 change: 1 addition & 0 deletions elm-package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"exposed-modules": [],
"dependencies": {
"basti1302/elm-human-readable-filesize": "1.1.0 <= v < 2.0.0",
"elm-community/maybe-extra": "4.0.0 <= v < 5.0.0",
"elm-lang/core": "5.1.1 <= v < 6.0.0",
"elm-lang/html": "2.0.0 <= v < 3.0.0",
"elm-lang/http": "1.0.0 <= v < 2.0.0",
Expand Down
41 changes: 40 additions & 1 deletion src/Helpers.elm
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Helpers exposing (processError, providerNameFromUrl, serviceCatalogToEndpoints, getExternalNetwork, checkFloatingIpState, serverLookup, providerLookup, flavorLookup, imageLookup)
module Helpers exposing (processError, processOpenRc, providerNameFromUrl, serviceCatalogToEndpoints, getExternalNetwork, checkFloatingIpState, serverLookup, providerLookup, flavorLookup, imageLookup)

import Regex
import Maybe.Extra
import Types.HelperTypes as HelperTypes
import Types.Types exposing (..)
import Types.OpenstackTypes as OpenstackTypes
Expand All @@ -15,6 +16,44 @@ processError model error =
( { model | messages = newMsgs }, Cmd.none )


processOpenRc : Model -> String -> ( Model, Cmd Msg )
processOpenRc model openRc =
let
regexes =
{ authURL = Regex.regex "export OS_AUTH_URL=(.*)"
, projectDomain = Regex.regex "export OS_PROJECT_DOMAIN_NAME=(.*)"
, projectName = Regex.regex "export OS_PROJECT_NAME=(.*)"
, userDomain = Regex.regex "export OS_USER_DOMAIN_NAME=(.*)"
, username = Regex.regex "export OS_USERNAME=(.*)"
, password = Regex.regex "export OS_PASSWORD=(.*)"
}

getMatch text regex =
Regex.find (Regex.AtMost 1) regex text
|> List.head
|> Maybe.map (\x -> x.submatches)
|> Maybe.andThen List.head
|> Maybe.Extra.join

newField regex oldField =
getMatch openRc regex
|> Maybe.withDefault oldField

newCreds =
Creds
(newField regexes.authURL model.creds.authURL)
(newField regexes.projectDomain model.creds.projectDomain)
(newField regexes.projectName model.creds.projectName)
(newField regexes.userDomain model.creds.userDomain)
(newField regexes.username model.creds.username)
(newField regexes.password model.creds.password)

newModel =
{ model | creds = newCreds }
in
( newModel, Cmd.none )


providerNameFromUrl : HelperTypes.Url -> ProviderName
providerNameFromUrl url =
let
Expand Down
3 changes: 3 additions & 0 deletions src/State.elm
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ update msg model =
in
( { model | creds = { creds | password = password } }, Cmd.none )

InputOpenRc openRc ->
Helpers.processOpenRc model openRc

InputCreateServerName createServerRequest name ->
let
viewState =
Expand Down
1 change: 1 addition & 0 deletions src/Types/Types.elm
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ type Msg
| InputUserDomain String
| InputUsername String
| InputPassword String
| InputOpenRc String
| InputCreateServerName CreateServerRequest String
| InputCreateServerCount CreateServerRequest String
| InputCreateServerUserData CreateServerRequest String
Expand Down
28 changes: 25 additions & 3 deletions src/View.elm
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module View exposing (view)

import Html exposing (Html, button, div, fieldset, h2, input, label, legend, p, strong, table, td, text, textarea, th, tr)
import Html.Attributes exposing (cols, for, name, hidden, placeholder, rows, type_, value, class, checked, disabled)
import Html exposing (Html, a, button, div, fieldset, h2, input, label, legend, p, strong, table, td, text, textarea, th, tr)
import Html.Attributes exposing (cols, for, name, hidden, href, placeholder, rows, type_, value, class, checked, disabled)
import Html.Attributes as Attr
import Html.Events exposing (onClick, onInput)
import Base64
Expand Down Expand Up @@ -92,6 +92,7 @@ viewLogin : Model -> Html Msg
viewLogin model =
div []
[ h2 [] [ text "Please log in" ]
, p [] [ text "Either enter your credentials..." ]
, table []
[ tr []
[ td [] [ text "Keystone auth URL" ]
Expand Down Expand Up @@ -161,7 +162,28 @@ viewLogin model =
]
]
]
, button [ onClick RequestNewProviderToken ] [ text "Log in" ]
, p []
[ text "...or paste an "
{-
Todo this link opens in Electron, should open in user's browser
https://github.com/electron/electron/blob/master/docs/api/shell.md#shellopenexternalurl-options-callback
-}
, a
[ href "https://docs.openstack.org/newton/install-guide-rdo/keystone-openrc.html" ]
[ text "OpenRC"
]
, text " file"
]
, textarea
[ rows 10
, cols 40
, onInput (InputOpenRc)
, placeholder "export..."
]
[]
, div []
[ button [ onClick RequestNewProviderToken ] [ text "Log in" ]
]
]


Expand Down

0 comments on commit 4376435

Please sign in to comment.