Merge pull request #3059 from Bilb/fix-dont-password-protect-settings

feat: dont password protect the settings except the seed one
pull/3067/head
Audric Ackermann 1 year ago committed by GitHub
commit 5f6af1e2cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -25,13 +25,9 @@ const StyledButtonContainer = styled.div`
padding-inline-start: var(--margins-lg); padding-inline-start: var(--margins-lg);
`; `;
export const SessionNotificationGroupSettings = (props: { hasPassword: boolean | null }) => { export const SessionNotificationGroupSettings = () => {
const forceUpdate = useUpdate(); const forceUpdate = useUpdate();
if (props.hasPassword === null) {
return null;
}
const initialNotificationEnabled = const initialNotificationEnabled =
window.getSettingValue(SettingsKey.settingsNotification) || NOTIFICATION.MESSAGE; window.getSettingValue(SettingsKey.settingsNotification) || NOTIFICATION.MESSAGE;

@ -1,23 +1,24 @@
import { shell } from 'electron'; import { shell } from 'electron';
import React from 'react'; import React, { useState } from 'react';
import autoBind from 'auto-bind';
import styled from 'styled-components'; import styled from 'styled-components';
import { useDispatch } from 'react-redux';
import useMount from 'react-use/lib/useMount';
import { SettingsHeader } from './SessionSettingsHeader'; import { SettingsHeader } from './SessionSettingsHeader';
import { SessionIconButton } from '../icon'; import { SessionIconButton } from '../icon';
import { SessionNotificationGroupSettings } from './SessionNotificationGroupSettings'; import { SessionNotificationGroupSettings } from './SessionNotificationGroupSettings';
import { CategoryConversations } from './section/CategoryConversations';
import { SettingsCategoryPrivacy } from './section/CategoryPrivacy';
import { SettingsCategoryAppearance } from './section/CategoryAppearance';
import { Data } from '../../data/data'; import { Data } from '../../data/data';
import { SettingsCategoryPermissions } from './section/CategoryPermissions';
import { SettingsCategoryHelp } from './section/CategoryHelp';
import { sessionPassword } from '../../state/ducks/modalDialog'; import { sessionPassword } from '../../state/ducks/modalDialog';
import { PasswordAction } from '../dialog/SessionPasswordDialog';
import { SectionType, showLeftPaneSection } from '../../state/ducks/section'; import { SectionType, showLeftPaneSection } from '../../state/ducks/section';
import { PasswordAction } from '../dialog/SessionPasswordDialog';
import { SettingsCategoryAppearance } from './section/CategoryAppearance';
import { CategoryConversations } from './section/CategoryConversations';
import { SettingsCategoryHelp } from './section/CategoryHelp';
import { SettingsCategoryPermissions } from './section/CategoryPermissions';
import { SettingsCategoryPrivacy } from './section/CategoryPrivacy';
export function displayPasswordModal( export function displayPasswordModal(
passwordAction: PasswordAction, passwordAction: PasswordAction,
@ -57,11 +58,6 @@ export interface SettingsViewProps {
category: SessionSettingCategory; category: SessionSettingCategory;
} }
interface State {
hasPassword: boolean | null;
shouldLockSettings: boolean | null;
}
const StyledVersionInfo = styled.div` const StyledVersionInfo = styled.div`
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -110,30 +106,27 @@ const SessionInfo = () => {
const SettingInCategory = (props: { const SettingInCategory = (props: {
category: SessionSettingCategory; category: SessionSettingCategory;
hasPassword: boolean;
onPasswordUpdated: (action: string) => void; onPasswordUpdated: (action: string) => void;
hasPassword: boolean;
}) => { }) => {
const { category, hasPassword, onPasswordUpdated } = props; const { category, onPasswordUpdated, hasPassword } = props;
if (hasPassword === null) {
return null;
}
switch (category) { switch (category) {
// special case for blocked user // special case for blocked user
case SessionSettingCategory.Conversations: case SessionSettingCategory.Conversations:
return <CategoryConversations />; return <CategoryConversations />;
case SessionSettingCategory.Appearance: case SessionSettingCategory.Appearance:
return <SettingsCategoryAppearance hasPassword={hasPassword} />; return <SettingsCategoryAppearance />;
case SessionSettingCategory.Notifications: case SessionSettingCategory.Notifications:
return <SessionNotificationGroupSettings hasPassword={hasPassword} />; return <SessionNotificationGroupSettings />;
case SessionSettingCategory.Privacy: case SessionSettingCategory.Privacy:
return ( return (
<SettingsCategoryPrivacy onPasswordUpdated={onPasswordUpdated} hasPassword={hasPassword} /> <SettingsCategoryPrivacy onPasswordUpdated={onPasswordUpdated} hasPassword={hasPassword} />
); );
case SessionSettingCategory.Help: case SessionSettingCategory.Help:
return <SettingsCategoryHelp hasPassword={hasPassword} />; return <SettingsCategoryHelp />;
case SessionSettingCategory.Permissions: case SessionSettingCategory.Permissions:
return <SettingsCategoryPermissions hasPassword={hasPassword} />; return <SettingsCategoryPermissions />;
// these three down there have no options, they are just a button // these three down there have no options, they are just a button
case SessionSettingCategory.ClearData: case SessionSettingCategory.ClearData:
@ -159,87 +152,48 @@ const StyledSettingsList = styled.div`
flex-direction: column; flex-direction: column;
`; `;
export class SessionSettingsView extends React.Component<SettingsViewProps, State> { export const SessionSettingsView = (props: SettingsViewProps) => {
public settingsViewRef: React.RefObject<HTMLDivElement>; const { category } = props;
const dispatch = useDispatch();
public constructor(props: any) {
super(props);
this.state = {
hasPassword: null,
shouldLockSettings: true,
};
this.settingsViewRef = React.createRef();
autoBind(this);
const [hasPassword, setHasPassword] = useState(true);
useMount(() => {
let isMounted = true;
// eslint-disable-next-line more/no-then // eslint-disable-next-line more/no-then
void Data.getPasswordHash().then(hash => { void Data.getPasswordHash().then(hash => {
this.setState({ if (isMounted) {
hasPassword: !!hash, setHasPassword(!!hash);
}
}); });
return () => {
isMounted = false;
};
}); });
}
public componentDidUpdate(_: SettingsViewProps, _prevState: State) { function onPasswordUpdated(action: string) {
const oldShouldRenderPasswordLock = _prevState.shouldLockSettings && _prevState.hasPassword; if (action === 'set' || action === 'change') {
const newShouldRenderPasswordLock = this.state.shouldLockSettings && this.state.hasPassword; setHasPassword(true);
dispatch(showLeftPaneSection(SectionType.Message));
if (
newShouldRenderPasswordLock &&
newShouldRenderPasswordLock !== oldShouldRenderPasswordLock
) {
displayPasswordModal('enter', action => {
if (action === 'enter') {
// Unlocked settings
this.setState({
shouldLockSettings: false,
});
} }
});
if (action === 'remove') {
setHasPassword(false);
} }
} }
public render() {
const { category } = this.props;
const shouldRenderPasswordLock = this.state.shouldLockSettings && this.state.hasPassword;
return ( return (
<div className="session-settings"> <div className="session-settings">
{shouldRenderPasswordLock ? (
<></>
) : (
<>
<SettingsHeader category={category} /> <SettingsHeader category={category} />
<StyledSettingsView> <StyledSettingsView>
<StyledSettingsList ref={this.settingsViewRef}> <StyledSettingsList>
<SettingInCategory <SettingInCategory
category={category} category={category}
onPasswordUpdated={this.onPasswordUpdated} onPasswordUpdated={onPasswordUpdated}
hasPassword={Boolean(this.state.hasPassword)} hasPassword={hasPassword}
/> />
</StyledSettingsList> </StyledSettingsList>
<SessionInfo /> <SessionInfo />
</StyledSettingsView> </StyledSettingsView>
</>
)}
</div> </div>
); );
} };
public onPasswordUpdated(action: string) {
if (action === 'set' || action === 'change') {
this.setState({
hasPassword: true,
shouldLockSettings: true,
});
window.inboxStore?.dispatch(showLeftPaneSection(SectionType.Message));
}
if (action === 'remove') {
this.setState({
hasPassword: false,
});
}
}
}

@ -2,18 +2,17 @@ import React from 'react';
import useUpdate from 'react-use/lib/useUpdate'; import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key'; import { SettingsKey } from '../../../data/settings-key';
import { isHideMenuBarSupported } from '../../../types/Settings';
import { useHasFollowSystemThemeEnabled } from '../../../state/selectors/settings'; import { useHasFollowSystemThemeEnabled } from '../../../state/selectors/settings';
import { ensureThemeConsistency } from '../../../themes/SessionTheme'; import { ensureThemeConsistency } from '../../../themes/SessionTheme';
import { isHideMenuBarSupported } from '../../../types/Settings';
import { SessionToggleWithDescription } from '../SessionSettingListItem'; import { SessionToggleWithDescription } from '../SessionSettingListItem';
import { SettingsThemeSwitcher } from '../SettingsThemeSwitcher'; import { SettingsThemeSwitcher } from '../SettingsThemeSwitcher';
import { ZoomingSessionSlider } from '../ZoomingSessionSlider'; import { ZoomingSessionSlider } from '../ZoomingSessionSlider';
export const SettingsCategoryAppearance = (props: { hasPassword: boolean | null }) => { export const SettingsCategoryAppearance = () => {
const forceUpdate = useUpdate(); const forceUpdate = useUpdate();
const isFollowSystemThemeEnabled = useHasFollowSystemThemeEnabled(); const isFollowSystemThemeEnabled = useHasFollowSystemThemeEnabled();
if (props.hasPassword !== null) {
const isHideMenuBarActive = const isHideMenuBarActive =
window.getSettingValue(SettingsKey.settingsMenuBar) === undefined window.getSettingValue(SettingsKey.settingsMenuBar) === undefined
? true ? true
@ -50,6 +49,4 @@ export const SettingsCategoryAppearance = (props: { hasPassword: boolean | null
/> />
</> </>
); );
}
return null;
}; };

@ -4,8 +4,7 @@ import { SessionButtonShape, SessionButtonType } from '../../basic/SessionButton
import { SessionSettingButtonItem, SessionSettingsTitleWithLink } from '../SessionSettingListItem'; import { SessionSettingButtonItem, SessionSettingsTitleWithLink } from '../SessionSettingListItem';
export const SettingsCategoryHelp = (props: { hasPassword: boolean | null }) => { export const SettingsCategoryHelp = () => {
if (props.hasPassword !== null) {
return ( return (
<> <>
<SessionSettingButtonItem <SessionSettingButtonItem
@ -36,6 +35,4 @@ export const SettingsCategoryHelp = (props: { hasPassword: boolean | null }) =>
/> />
</> </>
); );
}
return null;
}; };

@ -53,11 +53,10 @@ async function toggleStartInTray() {
} }
} }
export const SettingsCategoryPermissions = (props: { hasPassword: boolean | null }) => { export const SettingsCategoryPermissions = () => {
const forceUpdate = useUpdate(); const forceUpdate = useUpdate();
const isStartInTrayActive = Boolean(window.getSettingValue(SettingsKey.settingsStartInTray)); const isStartInTrayActive = Boolean(window.getSettingValue(SettingsKey.settingsStartInTray));
if (props.hasPassword !== null) {
return ( return (
<> <>
<SessionToggleWithDescription <SessionToggleWithDescription
@ -101,6 +100,4 @@ export const SettingsCategoryPermissions = (props: { hasPassword: boolean | null
/> />
</> </>
); );
}
return null;
}; };

@ -61,7 +61,6 @@ export const SettingsCategoryPrivacy = (props: {
const isLinkPreviewsOn = useHasLinkPreviewEnabled(); const isLinkPreviewsOn = useHasLinkPreviewEnabled();
const areBlindedRequestsEnabled = useHasBlindedMsgRequestsEnabled(); const areBlindedRequestsEnabled = useHasBlindedMsgRequestsEnabled();
if (props.hasPassword !== null) {
return ( return (
<> <>
<SessionToggleWithDescription <SessionToggleWithDescription
@ -109,7 +108,7 @@ export const SettingsCategoryPrivacy = (props: {
active={areBlindedRequestsEnabled} active={areBlindedRequestsEnabled}
/> />
{!props.hasPassword && ( {!props.hasPassword ? (
<SessionSettingButtonItem <SessionSettingButtonItem
title={window.i18n('setAccountPasswordTitle')} title={window.i18n('setAccountPasswordTitle')}
description={window.i18n('setAccountPasswordDescription')} description={window.i18n('setAccountPasswordDescription')}
@ -119,8 +118,9 @@ export const SettingsCategoryPrivacy = (props: {
buttonText={window.i18n('setPassword')} buttonText={window.i18n('setPassword')}
dataTestId={'set-password-button'} dataTestId={'set-password-button'}
/> />
)} ) : (
{props.hasPassword && ( <>
{/* We have a password, let's show the 'change' and 'remove' password buttons */}
<SessionSettingButtonItem <SessionSettingButtonItem
title={window.i18n('changeAccountPasswordTitle')} title={window.i18n('changeAccountPasswordTitle')}
description={window.i18n('changeAccountPasswordDescription')} description={window.i18n('changeAccountPasswordDescription')}
@ -130,8 +130,6 @@ export const SettingsCategoryPrivacy = (props: {
buttonText={window.i18n('changePassword')} buttonText={window.i18n('changePassword')}
dataTestId="change-password-settings-button" dataTestId="change-password-settings-button"
/> />
)}
{props.hasPassword && (
<SessionSettingButtonItem <SessionSettingButtonItem
title={window.i18n('removeAccountPasswordTitle')} title={window.i18n('removeAccountPasswordTitle')}
description={window.i18n('removeAccountPasswordDescription')} description={window.i18n('removeAccountPasswordDescription')}
@ -142,9 +140,8 @@ export const SettingsCategoryPrivacy = (props: {
buttonText={window.i18n('removePassword')} buttonText={window.i18n('removePassword')}
dataTestId="remove-password-settings-button" dataTestId="remove-password-settings-button"
/> />
</>
)} )}
</> </>
); );
}
return null;
}; };

Loading…
Cancel
Save