forked from matrix/element-web
Add a script to generate a sample config
Addresses https://github.com/vector-im/riot-web/issues/8449
This commit is contained in:
parent
588030141b
commit
00096eddf5
|
@ -116,7 +116,7 @@ config.json
|
||||||
You can configure the app by copying `config.sample.json` to
|
You can configure the app by copying `config.sample.json` to
|
||||||
`config.json` and customising it:
|
`config.json` and customising it:
|
||||||
|
|
||||||
For a good example, see https://riot.im/develop/config.json.
|
For a good example of a production config, see https://riot.im/develop/config.json.
|
||||||
|
|
||||||
1. `default_server_name` sets the default server name to use for authentication.
|
1. `default_server_name` sets the default server name to use for authentication.
|
||||||
This will trigger Riot to ask
|
This will trigger Riot to ask
|
||||||
|
|
|
@ -1,34 +1,120 @@
|
||||||
{
|
{
|
||||||
"default_hs_url": "https://matrix.org",
|
"default_server_name": "matrix.org",
|
||||||
"default_is_url": "https://vector.im",
|
|
||||||
"disable_custom_urls": false,
|
"disable_custom_urls": false,
|
||||||
"disable_guests": false,
|
"disable_guests": false,
|
||||||
"disable_login_language_selector": false,
|
"disable_login_language_selector": false,
|
||||||
"disable_3pid_login": false,
|
"disable_3pid_login": false,
|
||||||
"brand": "Riot",
|
"brand": "Riot",
|
||||||
|
"welcomeUserId": "@riot-bot:matrix.org",
|
||||||
|
"default_federate": true,
|
||||||
|
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
|
||||||
"integrations_ui_url": "https://scalar.vector.im/",
|
"integrations_ui_url": "https://scalar.vector.im/",
|
||||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||||
"integrations_jitsi_widget_url": "https://scalar.vector.im/api/widgets/jitsi.html",
|
"integrations_jitsi_widget_url": "https://scalar.vector.im/api/widgets/jitsi.html",
|
||||||
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
|
"integrations_widgets_urls": [
|
||||||
"features": {
|
"https://scalar-staging.riot.im/scalar/api",
|
||||||
"feature_groups": "labs",
|
"https://scalar.vector.im/api"
|
||||||
"feature_pinning": "labs"
|
],
|
||||||
},
|
|
||||||
"default_federate": true,
|
|
||||||
"default_theme": "light",
|
"default_theme": "light",
|
||||||
"roomDirectory": {
|
"roomDirectory": {
|
||||||
"servers": [
|
"servers": [
|
||||||
"matrix.org"
|
"matrix.org"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"welcomeUserId": "@riot-bot:matrix.org",
|
|
||||||
"piwik": {
|
|
||||||
"url": "https://piwik.riot.im/",
|
|
||||||
"whitelistedHSUrls": ["https://matrix.org"],
|
|
||||||
"whitelistedISUrls": ["https://vector.im", "https://matrix.org"],
|
|
||||||
"siteId": 1
|
|
||||||
},
|
|
||||||
"enable_presence_by_hs_url": {
|
"enable_presence_by_hs_url": {
|
||||||
"https://matrix.org": false
|
"https://matrix.org": false
|
||||||
|
},
|
||||||
|
"piwik": {
|
||||||
|
"siteId": 1,
|
||||||
|
"url": "https://piwik.riot.im",
|
||||||
|
"whitelistedHSUrls": [
|
||||||
|
"https://matrix.org"
|
||||||
|
],
|
||||||
|
"whitelistedISUrls": [
|
||||||
|
"https://vector.im",
|
||||||
|
"https://matrix.org"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"embeddedPages": {
|
||||||
|
"homeUrl": "home.html",
|
||||||
|
"welcomeUrl": "welcome.html"
|
||||||
|
},
|
||||||
|
"cross_origin_renderer_url": "https://usercontent.riot.im/v1.html",
|
||||||
|
"branding": {
|
||||||
|
"authHeaderLogoUrl": "themes/riot/img/logos/riot-im-logo-black-text.svg",
|
||||||
|
"welcomeBackgroundUrl": "themes/riot/img/backgrounds/valley.jpg"
|
||||||
|
},
|
||||||
|
"update_base_url": "https://riot.im/download/desktop/update/",
|
||||||
|
"sync_timeline_limit": 8,
|
||||||
|
"terms_and_conditions_links": [
|
||||||
|
{
|
||||||
|
"url": "https://matrix.org/docs/guides/code_of_conduct",
|
||||||
|
"text": "matrix.org code of conduct"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"phasedRollOut": {
|
||||||
|
"feature_pinning": {
|
||||||
|
"offset": 1550893490769,
|
||||||
|
"period": 604800000
|
||||||
|
},
|
||||||
|
"feature_custom_status": {
|
||||||
|
"offset": 1550893490769,
|
||||||
|
"period": 604800000
|
||||||
|
},
|
||||||
|
"feature_room_breadcrumbs": {
|
||||||
|
"offset": 1550893490769,
|
||||||
|
"period": 604800000
|
||||||
|
},
|
||||||
|
"feature_custom_tags": {
|
||||||
|
"offset": 1550893490769,
|
||||||
|
"period": 604800000
|
||||||
|
},
|
||||||
|
"feature_state_counters": {
|
||||||
|
"offset": 1550893490769,
|
||||||
|
"period": 604800000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"feature_pinning": "labs",
|
||||||
|
"feature_custom_status": "labs",
|
||||||
|
"feature_room_breadcrumbs": "labs",
|
||||||
|
"feature_custom_tags": "labs",
|
||||||
|
"feature_state_counters": "labs"
|
||||||
|
},
|
||||||
|
"settingDefaults": {
|
||||||
|
"MessageComposerInput.dontSuggestEmoji": false,
|
||||||
|
"useCompactLayout": false,
|
||||||
|
"hideRedactions": false,
|
||||||
|
"hideJoinLeaves": false,
|
||||||
|
"hideAvatarChanges": false,
|
||||||
|
"hideDisplaynameChanges": false,
|
||||||
|
"hideReadReceipts": false,
|
||||||
|
"showTwelveHourTimestamps": false,
|
||||||
|
"alwaysShowTimestamps": false,
|
||||||
|
"autoplayGifsAndVideos": false,
|
||||||
|
"alwaysShowEncryptionIcons": true,
|
||||||
|
"showRoomRecoveryReminder": true,
|
||||||
|
"enableSyntaxHighlightLanguageDetection": false,
|
||||||
|
"Pill.shouldHidePillAvatar": false,
|
||||||
|
"TextualBody.disableBigEmoji": false,
|
||||||
|
"MessageComposerInput.isRichTextEnabled": false,
|
||||||
|
"MessageComposer.showFormatting": false,
|
||||||
|
"dontSendTypingNotifications": false,
|
||||||
|
"MessageComposerInput.autoReplaceEmoji": false,
|
||||||
|
"VideoView.flipVideoHorizontally": false,
|
||||||
|
"TagPanel.disableTagPanel": false,
|
||||||
|
"webRtcForceTURN": false,
|
||||||
|
"language": "en",
|
||||||
|
"analyticsOptIn": false,
|
||||||
|
"showCookieBar": true,
|
||||||
|
"autocompleteDelay": 200,
|
||||||
|
"urlPreviewsEnabled": true,
|
||||||
|
"roomColor": {
|
||||||
|
"primary_color": "#a442f4",
|
||||||
|
"secondary_color": "#cc92fc"
|
||||||
|
},
|
||||||
|
"enableWidgetScreenshots": false,
|
||||||
|
"promptBeforeInviteUnknownUsers": true,
|
||||||
|
"showDeveloperTools": false
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -30,6 +30,7 @@
|
||||||
"reskindex:watch": "reskindex -h src/header -w",
|
"reskindex:watch": "reskindex -h src/header -w",
|
||||||
"i18n": "matrix-gen-i18n",
|
"i18n": "matrix-gen-i18n",
|
||||||
"prunei18n": "matrix-prune-i18n",
|
"prunei18n": "matrix-prune-i18n",
|
||||||
|
"gensampleconf": "node scripts/gen-sample-config.js",
|
||||||
"build:res": "node scripts/copy-res.js",
|
"build:res": "node scripts/copy-res.js",
|
||||||
"build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
|
"build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
|
||||||
"build:compile": "npm run reskindex && babel --source-maps -d lib src",
|
"build:compile": "npm run reskindex && babel --source-maps -d lib src",
|
||||||
|
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 New Vector Ltd.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// The sample config is generated as follows:
|
||||||
|
// 1. Start with SdkConfig's DEFAULTS
|
||||||
|
// 2. Overwrite with features and Settings defaults
|
||||||
|
// 3. Overwrite with samples defined here
|
||||||
|
|
||||||
|
const SdkConfig = require("matrix-react-sdk/lib/SdkConfig");
|
||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
|
const SAMPLES = {
|
||||||
|
default_server_name: "matrix.org",
|
||||||
|
disable_custom_urls: false,
|
||||||
|
disable_guests: false,
|
||||||
|
disable_login_language_selector: false,
|
||||||
|
disable_3pid_login: false,
|
||||||
|
brand: "Riot",
|
||||||
|
welcomeUserId: "@riot-bot:matrix.org",
|
||||||
|
default_federate: true,
|
||||||
|
bug_report_endpoint_url: "https://riot.im/bugreports/submit",
|
||||||
|
integrations_ui_url: "https://scalar.vector.im/",
|
||||||
|
integrations_rest_url: "https://scalar.vector.im/api",
|
||||||
|
integrations_jitsi_widget_url: "https://scalar.vector.im/api/widgets/jitsi.html",
|
||||||
|
integrations_widgets_urls: [
|
||||||
|
"https://scalar-staging.riot.im/scalar/api",
|
||||||
|
"https://scalar.vector.im/api",
|
||||||
|
],
|
||||||
|
default_theme: "light",
|
||||||
|
roomDirectory: {
|
||||||
|
servers: [
|
||||||
|
"matrix.org",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
enable_presence_by_hs_url: {
|
||||||
|
"https://matrix.org": false,
|
||||||
|
},
|
||||||
|
piwik: {
|
||||||
|
siteId: 1,
|
||||||
|
url: "https://piwik.riot.im",
|
||||||
|
whitelistedHSUrls: ["https://matrix.org"],
|
||||||
|
whitelistedISUrls: ["https://vector.im", "https://matrix.org"],
|
||||||
|
},
|
||||||
|
embeddedPages: {
|
||||||
|
homeUrl: "home.html",
|
||||||
|
welcomeUrl: "welcome.html",
|
||||||
|
},
|
||||||
|
cross_origin_renderer_url: "https://usercontent.riot.im/v1.html",
|
||||||
|
branding: {
|
||||||
|
authHeaderLogoUrl: "themes/riot/img/logos/riot-im-logo-black-text.svg",
|
||||||
|
welcomeBackgroundUrl: "themes/riot/img/backgrounds/valley.jpg",
|
||||||
|
},
|
||||||
|
update_base_url: "https://riot.im/download/desktop/update/",
|
||||||
|
sync_timeline_limit: 8,
|
||||||
|
terms_and_conditions_links: [
|
||||||
|
{
|
||||||
|
url: "https://matrix.org/docs/guides/code_of_conduct",
|
||||||
|
text: "matrix.org code of conduct",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
function parseSettings() {
|
||||||
|
// This is by far the worst and cleanest way to load the settings config.
|
||||||
|
// We parse the file (and eval(!!!) it), stripping out lines that will cause
|
||||||
|
// us issues, like imports, controllers, and language references. If we don't
|
||||||
|
// strip out imports and such, we'll get all kinds of fun errors because we
|
||||||
|
// won't have loaded the dependency chain for a web browser, making things like
|
||||||
|
// the language handler complain.
|
||||||
|
const contents = fs.readFileSync(require.resolve("matrix-react-sdk/src/settings/Settings"));
|
||||||
|
const lines = (contents.toString()).split('\n').map(s => s.trim());
|
||||||
|
|
||||||
|
let foundFirstConst = false;
|
||||||
|
const rebuiltLines = lines.filter(s => {
|
||||||
|
// Strip everything up until the first variable definition (because multiline imports are a thing)
|
||||||
|
if (s.indexOf("const ") === 0) foundFirstConst = true;
|
||||||
|
if (!foundFirstConst) return false;
|
||||||
|
|
||||||
|
// Filter out anything else that might cause us problems when we eval it
|
||||||
|
return s.indexOf("controller:") === -1 && s.indexOf("_td(") === -1;
|
||||||
|
}).map(s => s.indexOf("export const") === 0 ? s.substring("export ".length) : s);
|
||||||
|
|
||||||
|
const scriptBase = rebuiltLines.join('\n');
|
||||||
|
|
||||||
|
// We wrap it to prevent variable leaking, but this doesn't protect us from random file access, etc.
|
||||||
|
const wrapper = `(function(){${scriptBase}\nreturn SETTINGS;})();`;
|
||||||
|
return eval(wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateSettingsConfig() {
|
||||||
|
const settingDefaults = {};
|
||||||
|
const phasedRollOut = {};
|
||||||
|
const features = {};
|
||||||
|
|
||||||
|
const overrides = {
|
||||||
|
"roomColor": {
|
||||||
|
"primary_color": "#a442f4",
|
||||||
|
"secondary_color": "#cc92fc"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const skipSettings = ['theme'];
|
||||||
|
|
||||||
|
const settings = parseSettings();
|
||||||
|
for (const settingName of Object.keys(settings)) {
|
||||||
|
const setting = settings[settingName];
|
||||||
|
|
||||||
|
if (setting.isFeature) {
|
||||||
|
phasedRollOut[settingName] = {
|
||||||
|
offset: new Date().getTime(),
|
||||||
|
period: 604800000,
|
||||||
|
};
|
||||||
|
|
||||||
|
features[settingName] = 'labs';
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setting.supportedLevels.indexOf('config') === -1) continue;
|
||||||
|
if (skipSettings.indexOf(settingName) !== -1) continue;
|
||||||
|
|
||||||
|
if (setting.invertedSettingName) {
|
||||||
|
settingDefaults[setting.invertedSettingName] = !setting.default;
|
||||||
|
} else {
|
||||||
|
settingDefaults[settingName] = setting.default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
phasedRollOut,
|
||||||
|
features,
|
||||||
|
settingDefaults: Object.assign(settingDefaults, overrides),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const finalSettings = Object.assign({},
|
||||||
|
SdkConfig.DEFAULTS,
|
||||||
|
SAMPLES,
|
||||||
|
generateSettingsConfig(),
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync("config.sample.json", JSON.stringify(finalSettings, null, 4));
|
||||||
|
console.log("Wrote new sample config");
|
Loading…
Reference in New Issue