// SPDX-FileCopyrightText: © 2017 EteSync Authors // SPDX-License-Identifier: AGPL-3.0-only import * as React from 'react'; import { Action } from 'redux-actions'; import Container from './widgets/Container'; import ExternalLink from './widgets/ExternalLink'; import SyncGate from './SyncGate'; import LoginForm from './components/LoginForm'; import EncryptionLoginForm from './components/EncryptionLoginForm'; import { store, StoreState, CredentialsDataRemote } from './store'; import { deriveKey, fetchCredentials, fetchUserInfo, logout } from './store/actions'; import * as EteSync from 'etesync'; import * as C from './constants'; import SignedPagesBadge from './images/signed-pages-badge.svg'; import LoadingIndicator from './widgets/LoadingIndicator'; import { useCredentials, useRemoteCredentials } from './login'; import { useSelector } from 'react-redux'; function EncryptionPart(props: { credentials: CredentialsDataRemote }) { const [fetched, setFetched] = React.useState(false); const [userInfo, setUserInfo] = React.useState(); const [error, setError] = React.useState(); const credentials = props.credentials; React.useEffect(() => { store.dispatch(fetchUserInfo(credentials, credentials.credentials.email)).then((fetchedUserInfo: Action) => { setUserInfo(fetchedUserInfo.payload); }).catch((e: Error) => { // Do nothing. if (e instanceof EteSync.HTTPError) { if (e.status === 404) { // Do nothing } else if (e.status === 401) { store.dispatch(logout(credentials)); } else { setError(e); } } }).finally(() => { setFetched(true); }); }, [credentials]); if (!fetched) { return ; } function onEncryptionFormSubmit(encryptionPassword: string) { const derivedAction = deriveKey(credentials.credentials.email, encryptionPassword); if (userInfo) { const userInfoCryptoManager = userInfo.getCryptoManager(derivedAction.payload!); try { userInfo.verify(userInfoCryptoManager); } catch (e) { setError(new EteSync.EncryptionPasswordError('Wrong encryption password')); return; } } store.dispatch(derivedAction); } const isNewUser = !userInfo; return (

Encryption Password

{(isNewUser) ?

Welcome to EteSync!

Please set your encryption password below, and make sure you got it right, as it can't be recovered if lost!

:

You are logged in as {credentials.credentials.email}. Please enter your encryption password to continue, or log out from the side menu.

}
); } export default function LoginGate() { const remoteCredentials = useRemoteCredentials(); const credentials = useCredentials(); const fetchCount = useSelector((state: StoreState) => state.fetchCount); const [fetchError, setFetchError] = React.useState(); async function onFormSubmit(username: string, password: string, serviceApiUrl?: string) { serviceApiUrl = serviceApiUrl ? serviceApiUrl : C.serviceApiBase; try { setFetchError(undefined); const ret = fetchCredentials(username, password, serviceApiUrl); await ret.payload; store.dispatch(ret); } catch (e) { setFetchError(e); } } if (remoteCredentials === null) { const style = { isSafe: { textDecoration: 'none', display: 'block', }, divider: { margin: '30px 0', color: '#00000025', }, }; return (

Please Log In

0} />
SignedPgaes badge
  • The EteSync Website
  • Is the web client safe to use?
  • Source code
); } else if (credentials === null) { return ( ); } return ( ); }