Administration page: can search for domains and see users' zones.
This commit is contained in:
		
							parent
							
								
									acf3f92dcd
								
							
						
					
					
						commit
						35ff1d1347
					
				
					 4 changed files with 85 additions and 50 deletions
				
			
		| 
						 | 
				
			
			@ -582,10 +582,12 @@ handleAction = case _ of
 | 
			
		|||
    PageSetup.Log message -> handleAction $ Log message
 | 
			
		||||
 | 
			
		||||
  EventPageAdministration ev     -> case ev of
 | 
			
		||||
    PageAdministration.MessageToSend message -> H.tell _ws_auth unit (WS.ToSend message)
 | 
			
		||||
    PageAdministration.Log message           -> handleAction $ Log message
 | 
			
		||||
    PageAdministration.StoreState s          -> H.modify_ _ { childstates { administration = Just s } }
 | 
			
		||||
    PageAdministration.AskState              -> do
 | 
			
		||||
    PageAdministration.SendToAuthd message      -> H.tell _ws_auth unit (WS.ToSend message)
 | 
			
		||||
    PageAdministration.SendToDNSManager message -> H.tell _ws_dns  unit (WS.ToSend message)
 | 
			
		||||
    PageAdministration.ShowZone domain          -> handleAction $ Routing $ Zone domain
 | 
			
		||||
    PageAdministration.Log message              -> handleAction $ Log message
 | 
			
		||||
    PageAdministration.StoreState s             -> H.modify_ _ { childstates { administration = Just s } }
 | 
			
		||||
    PageAdministration.AskState                 -> do
 | 
			
		||||
      state <- H.get
 | 
			
		||||
      H.tell _admini unit (PageAdministration.ProvideState state.childstates.administration)
 | 
			
		||||
    PageAdministration.DeleteUserAccount uid -> do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,9 @@ module App.Page.Administration where
 | 
			
		|||
import Prelude (Unit, bind, discard, not, pure, show, ($), (<<<), (<>), (=<<), map, (/=), (==), unit)
 | 
			
		||||
import Data.Eq (class Eq)
 | 
			
		||||
 | 
			
		||||
import Utils (not_empty_string)
 | 
			
		||||
import Web as Web
 | 
			
		||||
import App.Templates.Table as Templates
 | 
			
		||||
 | 
			
		||||
import Data.Maybe (Maybe(..))
 | 
			
		||||
import Data.Array as A
 | 
			
		||||
| 
						 | 
				
			
			@ -35,23 +37,21 @@ import App.Type.UserPublic (UserPublic)
 | 
			
		|||
import Data.ArrayBuffer.Types (ArrayBuffer)
 | 
			
		||||
 | 
			
		||||
import App.Type.LogMessage
 | 
			
		||||
-- import App.IPC as IPC
 | 
			
		||||
import App.Type.Email as Email
 | 
			
		||||
 | 
			
		||||
import App.Message.DNSManagerDaemon as DNSManager
 | 
			
		||||
import App.Message.AuthenticationDaemon as AuthD
 | 
			
		||||
 | 
			
		||||
data Output
 | 
			
		||||
  = MessageToSend ArrayBuffer
 | 
			
		||||
  = SendToAuthd ArrayBuffer
 | 
			
		||||
  | SendToDNSManager ArrayBuffer
 | 
			
		||||
  | ShowZone String
 | 
			
		||||
  | Log LogMessage
 | 
			
		||||
  | AskState
 | 
			
		||||
  | StoreState State
 | 
			
		||||
  | DeleteUserAccount Int
 | 
			
		||||
  | GetOrphanDomains
 | 
			
		||||
 | 
			
		||||
  --| DeleteDomain String
 | 
			
		||||
  --| RequestDomain String
 | 
			
		||||
 | 
			
		||||
data Query a
 | 
			
		||||
  = MessageReceived AuthD.AnswerMessage a
 | 
			
		||||
  | GotOrphanDomainList (Array String) a
 | 
			
		||||
| 
						 | 
				
			
			@ -85,13 +85,15 @@ data Action
 | 
			
		|||
  | SearchDomainAttempt
 | 
			
		||||
  | PreventSubmit Event
 | 
			
		||||
 | 
			
		||||
  -- Users.
 | 
			
		||||
  | ShowUser Int
 | 
			
		||||
  | RemoveUser Int
 | 
			
		||||
 | 
			
		||||
  -- Domains.
 | 
			
		||||
  | ShowOrphanDomains
 | 
			
		||||
  | RemoveDomain String
 | 
			
		||||
  | ShowDomain String
 | 
			
		||||
  | EnterDomain String
 | 
			
		||||
 | 
			
		||||
  | ShowOrphanDomains
 | 
			
		||||
 | 
			
		||||
  -- | Change the displayed tab.
 | 
			
		||||
  | ChangeTab Tab
 | 
			
		||||
| 
						 | 
				
			
			@ -151,11 +153,11 @@ render { addUserForm, searchUserForm, searchDomainForm
 | 
			
		|||
          Home -> Web.h3 "Select an action"
 | 
			
		||||
          SearchUser -> Web.columns_
 | 
			
		||||
            [ Web.column [C.is 3] [Web.article (Web.p "Search users") render_searchuser_form]
 | 
			
		||||
            , Web.column_ [ Web.h3 "Result", show_found_users ]
 | 
			
		||||
            , Web.column_ [ Templates.found_users ShowUser matching_users ]
 | 
			
		||||
            ]
 | 
			
		||||
          SearchDomain -> Web.columns_
 | 
			
		||||
            [ Web.column [C.is 3] [Web.article (Web.p "Search domains") render_searchdomain_form]
 | 
			
		||||
            , Web.column_ [ Web.h3 "Result", show_found_domains ]
 | 
			
		||||
            , Web.column_ [ Templates.found_domains EnterDomain RemoveDomain matching_domains ]
 | 
			
		||||
            ]
 | 
			
		||||
          Add -> Web.columns_
 | 
			
		||||
            [ Web.column [C.is 5] [Web.article (Web.p "Add a new user") render_adduser_form] ]
 | 
			
		||||
| 
						 | 
				
			
			@ -175,19 +177,9 @@ render { addUserForm, searchUserForm, searchDomainForm
 | 
			
		|||
        ]
 | 
			
		||||
    is_tab_active tab = current_tab == tab
 | 
			
		||||
 | 
			
		||||
    show_found_users = Web.box [ HH.ul_ $ map user_card matching_users ]
 | 
			
		||||
    user_card user = HH.li_ [ Web.btn_delete (RemoveUser user.uid)
 | 
			
		||||
                            , Web.btn_ [C.is_small] user.login (ShowUser user.uid)
 | 
			
		||||
                            ]
 | 
			
		||||
 | 
			
		||||
    show_found_domains = Web.box [ HH.ul_ $ map domain_card matching_domains ]
 | 
			
		||||
    domain_card domain_ = HH.li_ [ Web.p domain_
 | 
			
		||||
                                 -- , Web.btn_delete (RemoveUser domain_)
 | 
			
		||||
                                 -- , Web.btn_ [C.is_small] user.login (ShowUser user.uid)
 | 
			
		||||
                                 ]
 | 
			
		||||
    show_orphan_domains = Web.box [ HH.ul_ $ map domain_entry orphan_domains ]
 | 
			
		||||
    domain_entry domain = HH.li_ [ Web.btn_delete (RemoveDomain domain)
 | 
			
		||||
                                 , Web.btn_ [C.is_small] domain (ShowDomain domain)
 | 
			
		||||
                                 , Web.btn_ [C.is_small] domain (EnterDomain domain)
 | 
			
		||||
                                 ]
 | 
			
		||||
 | 
			
		||||
    render_adduser_form =
 | 
			
		||||
| 
						 | 
				
			
			@ -245,18 +237,18 @@ handleAction = case _ of
 | 
			
		|||
  ActionOnAddUserForm adduserinp -> do
 | 
			
		||||
    { addUserForm } <- H.get
 | 
			
		||||
    case adduserinp of
 | 
			
		||||
      ADDUSER_INP_login  v      -> H.modify_ _ { addUserForm    { login  = v                     } }
 | 
			
		||||
      ADDUSER_INP_email  v      -> H.modify_ _ { addUserForm    { email  = v                     } }
 | 
			
		||||
      ADDUSER_toggle_admin      -> H.modify_ _ { addUserForm    { admin  = not addUserForm.admin } }
 | 
			
		||||
      ADDUSER_INP_pass   v      -> H.modify_ _ { addUserForm    { pass   = v                     } }
 | 
			
		||||
      ADDUSER_INP_login  v  -> H.modify_ _ { addUserForm { login  = v                     } }
 | 
			
		||||
      ADDUSER_INP_email  v  -> H.modify_ _ { addUserForm { email  = v                     } }
 | 
			
		||||
      ADDUSER_toggle_admin  -> H.modify_ _ { addUserForm { admin  = not addUserForm.admin } }
 | 
			
		||||
      ADDUSER_INP_pass   v  -> H.modify_ _ { addUserForm { pass   = v                     } }
 | 
			
		||||
 | 
			
		||||
  ActionOnSearchUserForm searchuserinp -> do
 | 
			
		||||
    case searchuserinp of
 | 
			
		||||
      SEARCHUSER_INP_regex  v   -> H.modify_ _ { searchUserForm { regex  = v                     } }
 | 
			
		||||
      SEARCHUSER_INP_regex v -> H.modify_ _ { searchUserForm { regex  = v } }
 | 
			
		||||
 | 
			
		||||
  ActionOnSearchDomainForm searchdomaininp -> do
 | 
			
		||||
    case searchdomaininp of
 | 
			
		||||
      SEARCHDOMAIN_INP_domain v   -> H.modify_ _ { searchDomainForm { domain = v                 } }
 | 
			
		||||
      SEARCHDOMAIN_INP_domain v -> H.modify_ _ { searchDomainForm { domain = v } }
 | 
			
		||||
 | 
			
		||||
  PreventSubmit ev -> H.liftEffect $ Event.preventDefault ev
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -275,9 +267,9 @@ handleAction = case _ of
 | 
			
		|||
    H.raise $ Log $ SystemLog $ "TODO: remove domain " <> domain
 | 
			
		||||
    --H.raise $ DeleteDomain domain
 | 
			
		||||
 | 
			
		||||
  ShowDomain domain -> do
 | 
			
		||||
    H.raise $ Log $ SystemLog $ "TODO: show domain " <> domain
 | 
			
		||||
    -- H.raise $ RequestDomain domain
 | 
			
		||||
  EnterDomain domain -> do
 | 
			
		||||
    H.raise $ Log $ SystemLog $ "show domain " <> domain
 | 
			
		||||
    H.raise $ ShowZone domain
 | 
			
		||||
 | 
			
		||||
  AddUserAttempt -> do
 | 
			
		||||
    { addUserForm } <- H.get
 | 
			
		||||
| 
						 | 
				
			
			@ -296,7 +288,7 @@ handleAction = case _ of
 | 
			
		|||
                          , admin: addUserForm.admin
 | 
			
		||||
                          , email: Just (Email.Email email)
 | 
			
		||||
                          , password: pass }
 | 
			
		||||
        H.raise $ MessageToSend ab
 | 
			
		||||
        H.raise $ SendToAuthd ab
 | 
			
		||||
        H.raise $ Log $ SystemLog "Add a user"
 | 
			
		||||
 | 
			
		||||
  ChangeTab current_tab -> do
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +307,7 @@ handleAction = case _ of
 | 
			
		|||
    let regex  = searchUserForm.regex
 | 
			
		||||
    ab <- H.liftEffect $ AuthD.serialize $
 | 
			
		||||
      AuthD.MkSearchUser { regex: not_empty_string regex, offset: Just 0 }
 | 
			
		||||
    H.raise $ MessageToSend ab
 | 
			
		||||
    H.raise $ SendToAuthd ab
 | 
			
		||||
    H.modify_ _ { matching_users = [] }
 | 
			
		||||
 | 
			
		||||
  SearchDomainAttempt -> do
 | 
			
		||||
| 
						 | 
				
			
			@ -323,13 +315,9 @@ handleAction = case _ of
 | 
			
		|||
    let domain  = searchDomainForm.domain
 | 
			
		||||
    H.raise $ Log $ SystemLog $ "TODO: search for this domain: " <> domain
 | 
			
		||||
    ab <- H.liftEffect $ DNSManager.serialize $ DNSManager.MkSearchDomain { domain, offset: Just 0 }
 | 
			
		||||
    -- H.raise $ MessageToSend ab
 | 
			
		||||
    H.raise $ SendToDNSManager ab
 | 
			
		||||
    H.modify_ _ { matching_domains = [] }
 | 
			
		||||
 | 
			
		||||
not_empty_string :: String -> Maybe String
 | 
			
		||||
not_empty_string "" = Nothing
 | 
			
		||||
not_empty_string v = Just v
 | 
			
		||||
 | 
			
		||||
handleQuery :: forall a m. MonadAff m => Query a -> H.HalogenM State Action () Output m (Maybe a)
 | 
			
		||||
handleQuery = case _ of
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,12 +8,15 @@ module App.Templates.Table
 | 
			
		|||
  , display_dmarc_mail_addresses
 | 
			
		||||
  , display_modifiers
 | 
			
		||||
  , display_mechanisms
 | 
			
		||||
  , found_users
 | 
			
		||||
  , found_domains
 | 
			
		||||
  ) where
 | 
			
		||||
 | 
			
		||||
import Prelude (comparing, map, not, show, (#), ($), (&&), (<<<), (<>), (==), (>))
 | 
			
		||||
 | 
			
		||||
import CSSClasses as C
 | 
			
		||||
 | 
			
		||||
import App.Type.UserPublic (UserPublic)
 | 
			
		||||
import Data.Array.NonEmpty as NonEmpty
 | 
			
		||||
import Data.Array as A
 | 
			
		||||
import Data.Maybe (Maybe(..), fromMaybe, maybe)
 | 
			
		||||
| 
						 | 
				
			
			@ -551,19 +554,57 @@ display_modifiers action_remove_modifier ms =
 | 
			
		|||
                ]
 | 
			
		||||
 | 
			
		||||
display_dmarc_mail_addresses :: forall w i. (Int -> i) -> Array DMARC.DMARCURI -> HH.HTML w i
 | 
			
		||||
display_dmarc_mail_addresses f ms =
 | 
			
		||||
    Web.table [] [ dmarc_dmarcuri_table_header, HH.tbody_ $ map render_dmarcuri_row $ attach_id 0 ms]
 | 
			
		||||
display_dmarc_mail_addresses f ms = Web.table [] [ header, HH.tbody_ $ map row $ attach_id 0 ms]
 | 
			
		||||
  where
 | 
			
		||||
  render_dmarcuri_row :: (Tuple Int DMARC.DMARCURI) -> HH.HTML w i
 | 
			
		||||
  render_dmarcuri_row (Tuple i m) = HH.tr_
 | 
			
		||||
    [ HH.td_ [ Web.p m.mail ]
 | 
			
		||||
    , HH.td_ [ Web.p $ maybe "(no size limit)" show m.limit ]
 | 
			
		||||
    , HH.td_ [ Button.alert_btn "x" (f i) ]
 | 
			
		||||
    ]
 | 
			
		||||
  dmarc_dmarcuri_table_header :: HH.HTML w i
 | 
			
		||||
  dmarc_dmarcuri_table_header
 | 
			
		||||
  header :: HH.HTML w i
 | 
			
		||||
  header
 | 
			
		||||
    = HH.thead_ [ HH.tr_ [ HH.th_ [ HH.text "Email address" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "Report size limit" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "" ]
 | 
			
		||||
                         ]
 | 
			
		||||
                ]
 | 
			
		||||
  row :: (Tuple Int DMARC.DMARCURI) -> HH.HTML w i
 | 
			
		||||
  row (Tuple i m) = HH.tr_
 | 
			
		||||
    [ HH.td_ [ Web.p m.mail ]
 | 
			
		||||
    , HH.td_ [ Web.p $ maybe "(no size limit)" show m.limit ]
 | 
			
		||||
    , HH.td_ [ Button.alert_btn "x" (f i) ]
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
found_users :: forall w i. (Int -> i) -> Array UserPublic -> HH.HTML w i
 | 
			
		||||
found_users f users = Web.table [] [ header, HH.tbody_ $ map row users ]
 | 
			
		||||
  where
 | 
			
		||||
  header :: HH.HTML w i
 | 
			
		||||
  header
 | 
			
		||||
    = HH.thead_ [ HH.tr_ [ HH.th_ [ HH.text "Username" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "UID" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "Date of registration" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "" ]
 | 
			
		||||
                         ]
 | 
			
		||||
                ]
 | 
			
		||||
  row :: UserPublic -> HH.HTML w i
 | 
			
		||||
  row user = HH.tr_
 | 
			
		||||
    [ HH.td_ [ Web.p user.login ]
 | 
			
		||||
    , HH.td_ [ Web.p $ show user.uid ]
 | 
			
		||||
    , HH.td_ [ Web.p $ fromMaybe "" user.date_registration ]
 | 
			
		||||
    , HH.td_ [ Button.alert_btn "x" (f user.uid) ]
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
type ActionEnterDomain i = (String -> i)
 | 
			
		||||
type ActionDeleteDomain i = (String -> i)
 | 
			
		||||
found_domains :: forall w i.
 | 
			
		||||
  ActionEnterDomain i -> ActionDeleteDomain i -> Array String -> HH.HTML w i
 | 
			
		||||
found_domains action_enter_domain action_delete_domain domains = Web.table [] [ header, HH.tbody_ $ map row domains ]
 | 
			
		||||
  where
 | 
			
		||||
  row :: String -> HH.HTML w i
 | 
			
		||||
  row dom = HH.tr_
 | 
			
		||||
    [ HH.td_ [ Button.btn dom (action_enter_domain dom) ]
 | 
			
		||||
    , HH.td_ [ Web.p "" ]
 | 
			
		||||
    , HH.td_ [ Button.alert_btn "x" (action_delete_domain  dom) ]
 | 
			
		||||
    ]
 | 
			
		||||
  header :: HH.HTML w i
 | 
			
		||||
  header
 | 
			
		||||
    = HH.thead_ [ HH.tr_ [ HH.th_ [ HH.text "Domain name" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "" ]
 | 
			
		||||
                         , HH.th_ [ HH.text "" ]
 | 
			
		||||
                         ]
 | 
			
		||||
                ]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,3 +21,7 @@ remove_id i arr = case A.head arr of
 | 
			
		|||
 | 
			
		||||
id :: forall a. a -> a
 | 
			
		||||
id x = x
 | 
			
		||||
 | 
			
		||||
not_empty_string :: String -> Maybe String
 | 
			
		||||
not_empty_string "" = Nothing
 | 
			
		||||
not_empty_string v = Just v
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue