[Gekidou] Unique servers (#5798)

* Disallow the same server from being added the twice

* Add Default Server name config & EMM managed config

* Update android/app/src/main/res/values/strings.xml

Co-authored-by: Jason Frerich <jason.frerich@mattermost.com>

Co-authored-by: Jason Frerich <jason.frerich@mattermost.com>
This commit is contained in:
Elias Nahum
2021-11-03 11:12:52 -03:00
committed by GitHub
parent a5254992d3
commit 9372bb7c04
7 changed files with 57 additions and 12 deletions

View File

@@ -174,7 +174,8 @@ class DatabaseHelper {
if (lastId == key) { if (lastId == key) {
earliest = post.get("create_at") as Double earliest = post.get("create_at") as Double
} else if (firstId == key) { }
if (firstId == key) {
latest = post.get("create_at") as Double latest = post.get("create_at") as Double
} }

View File

@@ -9,7 +9,9 @@
<string name="copyAndPasteProtection_title">Copy&amp;Paste Protection</string> <string name="copyAndPasteProtection_title">Copy&amp;Paste Protection</string>
<string name="copyAndPasteProtection_description">Disable the ability to copy from or paste into any text inputs in the app.</string> <string name="copyAndPasteProtection_description">Disable the ability to copy from or paste into any text inputs in the app.</string>
<string name="serverUrl_title">Mattermost Server URL</string> <string name="serverUrl_title">Mattermost Server URL</string>
<string name="serverUrl_description">Set a default Mattermost server URL.</string> <string name="serverUrl_description">Set a default Server URL for your Mattermost instance.</string>
<string name="serverName_title">Mattermost Server Name</string>
<string name="serverName_description">Set a default Server Name for your Mattermost instance.</string>
<string name="allowOtherServers_title">Allow Other Servers</string> <string name="allowOtherServers_title">Allow Other Servers</string>
<string name="allowOtherServers_description">Allow the user to change the above server URL.</string> <string name="allowOtherServers_description">Allow the user to change the above server URL.</string>
<string name="username_title">Default Username</string> <string name="username_title">Default Username</string>

View File

@@ -37,6 +37,12 @@
android:description="@string/serverUrl_description" android:description="@string/serverUrl_description"
android:restrictionType="string" android:restrictionType="string"
android:defaultValue="" /> android:defaultValue="" />
<restriction
android:key="serverName"
android:title="@string/serverName_title"
android:description="@string/serverName_description"
android:restrictionType="string"
android:defaultValue="" />
<restriction <restriction
android:key="allowOtherServers" android:key="allowOtherServers"
android:title="@string/allowOtherServers_title" android:title="@string/allowOtherServers_title"

View File

@@ -37,6 +37,12 @@ export const queryServerByIdentifier = async (appDatabase: Database, identifier:
} }
}; };
export const queryServerByDisplayName = async (appDatabase: Database, displayName: string) => {
const servers = await queryAllServers(appDatabase);
const server = servers.find((s) => s.displayName.toLowerCase() === displayName.toLowerCase());
return server;
};
export const queryServerName = async (appDatabase: Database, serverUrl: string) => { export const queryServerName = async (appDatabase: Database, serverUrl: string) => {
try { try {
const servers = (await appDatabase.get<ServerModel>(SERVERS).query(Q.where('url', serverUrl)).fetch()); const servers = (await appDatabase.get<ServerModel>(SERVERS).query(Q.where('url', serverUrl)).fetch());
@@ -45,4 +51,3 @@ export const queryServerName = async (appDatabase: Database, serverUrl: string)
return serverUrl; return serverUrl;
} }
}; };

View File

@@ -191,12 +191,14 @@ const ServerForm = ({
value={displayName} value={displayName}
/> />
</View> </View>
{!displayNameError &&
<FormattedText <FormattedText
defaultMessage={'Choose a display name for your server'} defaultMessage={'Choose a display name for your server'}
id={'mobile.components.select_server_view.displayHelp'} id={'mobile.components.select_server_view.displayHelp'}
style={styles.chooseText} style={styles.chooseText}
testID={'mobile.components.select_server_view.displayHelp'} testID={'mobile.components.select_server_view.displayHelp'}
/> />
}
<Button <Button
containerStyle={[styles.connectButton, styleButtonBackground]} containerStyle={[styles.connectButton, styleButtonBackground]}
disabled={buttonDisabled} disabled={buttonDisabled}

View File

@@ -15,8 +15,10 @@ import LocalConfig from '@assets/config.json';
import ClientError from '@client/rest/error'; import ClientError from '@client/rest/error';
import AppVersion from '@components/app_version'; import AppVersion from '@components/app_version';
import {Screens} from '@constants'; import {Screens} from '@constants';
import DatabaseManager from '@database/manager';
import {t} from '@i18n'; import {t} from '@i18n';
import NetworkManager from '@init/network_manager'; import NetworkManager from '@init/network_manager';
import {queryServerByDisplayName, queryServerByIdentifier} from '@queries/app/servers';
import {goToScreen} from '@screens/navigation'; import {goToScreen} from '@screens/navigation';
import {DeepLinkWithData, LaunchProps, LaunchType} from '@typings/launch'; import {DeepLinkWithData, LaunchProps, LaunchType} from '@typings/launch';
import {getErrorMessage} from '@utils/client_error'; import {getErrorMessage} from '@utils/client_error';
@@ -49,11 +51,13 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
const [displayName, setDisplayName] = useState<string>(''); const [displayName, setDisplayName] = useState<string>('');
const [buttonDisabled, setButtonDisabled] = useState(true); const [buttonDisabled, setButtonDisabled] = useState(true);
const [url, setUrl] = useState<string>(''); const [url, setUrl] = useState<string>('');
const [urlError, setUrlError] = useState<string | undefined>(undefined); const [displayNameError, setDisplayNameError] = useState<string | undefined>();
const [urlError, setUrlError] = useState<string | undefined>();
const styles = getStyleSheet(theme); const styles = getStyleSheet(theme);
const {formatMessage} = intl; const {formatMessage} = intl;
useEffect(() => { useEffect(() => {
const serverName = managedConfig?.serverName || LocalConfig.DefaultServerName;
let serverUrl = managedConfig?.serverUrl || LocalConfig.DefaultServerUrl; let serverUrl = managedConfig?.serverUrl || LocalConfig.DefaultServerUrl;
let autoconnect = managedConfig?.allowOtherServers === 'false' || LocalConfig.AutoSelectServerUrl; let autoconnect = managedConfig?.allowOtherServers === 'false' || LocalConfig.AutoSelectServerUrl;
@@ -76,11 +80,15 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
if (serverUrl) { if (serverUrl) {
// If a server Url is set by the managed or local configuration, use it. // If a server Url is set by the managed or local configuration, use it.
setUrl(serverUrl); setUrl(serverUrl);
}
if (autoconnect) { if (serverName) {
// If no other servers are allowed or the local config for AutoSelectServerUrl is set, attempt to connect setDisplayName(serverName);
handleConnect(managedConfig?.serverUrl || LocalConfig.DefaultServerUrl); }
}
if (serverUrl && serverName && autoconnect) {
// If no other servers are allowed or the local config for AutoSelectServerUrl is set, attempt to connect
handleConnect(managedConfig?.serverUrl || LocalConfig.DefaultServerUrl);
} }
}, []); }, []);
@@ -151,7 +159,7 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
}; };
const handleConnect = preventDoubleTap(async (manualUrl?: string) => { const handleConnect = preventDoubleTap(async (manualUrl?: string) => {
if (buttonDisabled) { if (buttonDisabled && !manualUrl) {
return; return;
} }
@@ -170,15 +178,23 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
return; return;
} }
// TODO: Query to see if there is a server with the same display name const server = await queryServerByDisplayName(DatabaseManager.appDatabase!.database, displayName);
// Set the error here and return if (server && server.lastActiveAt > 0) {
// Elias to add this change in a Later PR. as soon as this one goes in setButtonDisabled(true);
setDisplayNameError(formatMessage({
id: 'mobile.server_name.exists',
defaultMessage: 'You are using this name for another server.',
}));
setConnecting(false);
return;
}
pingServer(serverUrl); pingServer(serverUrl);
}); });
const handleDisplayNameTextChanged = useCallback((text: string) => { const handleDisplayNameTextChanged = useCallback((text: string) => {
setDisplayName(text); setDisplayName(text);
setDisplayNameError(undefined);
}, []); }, []);
const handleUrlTextChanged = useCallback((text: string) => { const handleUrlTextChanged = useCallback((text: string) => {
@@ -235,6 +251,17 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
return; return;
} }
const server = await queryServerByIdentifier(DatabaseManager.appDatabase!.database, data.config!.DiagnosticId);
if (server && server.lastActiveAt > 0) {
setButtonDisabled(true);
setUrlError(formatMessage({
id: 'mobile.server_identifier.exists',
defaultMessage: 'You are already connected to this server.',
}));
setConnecting(false);
return;
}
displayLogin(serverUrl, data.config!, data.license!); displayLogin(serverUrl, data.config!, data.license!);
}; };
@@ -266,6 +293,7 @@ const Server = ({componentId, extra, launchType, launchError, theme}: ServerProp
buttonDisabled={buttonDisabled} buttonDisabled={buttonDisabled}
connecting={connecting} connecting={connecting}
displayName={displayName} displayName={displayName}
displayNameError={displayNameError}
handleConnect={handleConnect} handleConnect={handleConnect}
handleDisplayNameTextChanged={handleDisplayNameTextChanged} handleDisplayNameTextChanged={handleDisplayNameTextChanged}
handleUrlTextChanged={handleUrlTextChanged} handleUrlTextChanged={handleUrlTextChanged}

View File

@@ -1,5 +1,6 @@
{ {
"DefaultServerUrl": "", "DefaultServerUrl": "",
"DefaultServerName": "",
"TestServerUrl": "http://localhost:8065", "TestServerUrl": "http://localhost:8065",
"DefaultTheme": "default", "DefaultTheme": "default",
"ShowErrorsList": false, "ShowErrorsList": false,