mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
Changed autodetection of SiteURL (#3764)
* Changed autoconfiguration of SiteURL to be done on every request * Added SiteURL to system console
This commit is contained in:
@@ -39,6 +39,7 @@ type Context struct {
|
||||
Err *model.AppError
|
||||
teamURLValid bool
|
||||
teamURL string
|
||||
siteURL string
|
||||
T goi18n.TranslateFunc
|
||||
Locale string
|
||||
TeamId string
|
||||
@@ -141,10 +142,11 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
isTokenFromQueryString = true
|
||||
}
|
||||
|
||||
// if the site url in the config isn't specified, infer if from this request and write it back to the config
|
||||
if *utils.Cfg.ServiceSettings.SiteURL == "" {
|
||||
*utils.Cfg.ServiceSettings.SiteURL = GetProtocol(r) + "://" + r.Host
|
||||
utils.RegenerateClientConfig()
|
||||
if *utils.Cfg.ServiceSettings.SiteURL != "" {
|
||||
c.SetSiteURL(*utils.Cfg.ServiceSettings.SiteURL)
|
||||
} else {
|
||||
protocol := GetProtocol(r)
|
||||
c.SetSiteURL(protocol + "://" + r.Host)
|
||||
}
|
||||
|
||||
w.Header().Set(model.HEADER_REQUEST_ID, c.RequestId)
|
||||
@@ -439,6 +441,10 @@ func (c *Context) SetTeamURLFromSession() {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Context) SetSiteURL(url string) {
|
||||
c.siteURL = url
|
||||
}
|
||||
|
||||
func (c *Context) GetTeamURLFromTeam(team *model.Team) string {
|
||||
return c.GetSiteURL() + "/" + team.Name
|
||||
}
|
||||
@@ -454,7 +460,7 @@ func (c *Context) GetTeamURL() string {
|
||||
}
|
||||
|
||||
func (c *Context) GetSiteURL() string {
|
||||
return *utils.Cfg.ServiceSettings.SiteURL
|
||||
return c.siteURL
|
||||
}
|
||||
|
||||
func IsApiCall(r *http.Request) bool {
|
||||
|
||||
@@ -458,6 +458,7 @@ func handleWebhookEvents(c *Context, post *model.Post, team *model.Team, channel
|
||||
Err: nil,
|
||||
teamURLValid: c.teamURLValid,
|
||||
teamURL: c.teamURL,
|
||||
siteURL: c.siteURL,
|
||||
T: c.T,
|
||||
Locale: c.Locale,
|
||||
TeamId: hook.TeamId,
|
||||
|
||||
@@ -870,10 +870,6 @@ func (o *Config) IsValid() *AppError {
|
||||
return NewLocAppError("Config.IsValid", "model.config.is_valid.listen_address.app_error", nil, "")
|
||||
}
|
||||
|
||||
if len(o.ServiceSettings.ListenAddress) == 0 {
|
||||
return NewLocAppError("Config.IsValid", "model.config.is_valid.listen_address.app_error", nil, "")
|
||||
}
|
||||
|
||||
if o.TeamSettings.MaxUsersPerTeam <= 0 {
|
||||
return NewLocAppError("Config.IsValid", "model.config.is_valid.max_users.app_error", nil, "")
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ func LoadConfig(fileName string) {
|
||||
|
||||
Cfg = &config
|
||||
CfgHash = fmt.Sprintf("%x", md5.Sum([]byte(Cfg.ToJson())))
|
||||
RegenerateClientConfig()
|
||||
ClientCfg = getClientConfig(Cfg)
|
||||
|
||||
// Actions that need to run every time the config is loaded
|
||||
if ldapI := einterfaces.GetLdapInterface(); ldapI != nil {
|
||||
@@ -199,10 +199,6 @@ func LoadConfig(fileName string) {
|
||||
}
|
||||
}
|
||||
|
||||
func RegenerateClientConfig() {
|
||||
ClientCfg = getClientConfig(Cfg)
|
||||
}
|
||||
|
||||
func getClientConfig(c *model.Config) map[string]string {
|
||||
props := make(map[string]string)
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ const MAX_WEBSOCKET_FAILS = 7;
|
||||
|
||||
export function initialize() {
|
||||
if (window.WebSocket) {
|
||||
let connUrl = window.mm_config.SiteURL;
|
||||
let connUrl = Utils.getSiteURL();
|
||||
|
||||
// replace the protocol with a websocket one
|
||||
if (connUrl.startsWith('https:')) {
|
||||
|
||||
@@ -28,6 +28,7 @@ export default class ConfigurationSettings extends AdminSettings {
|
||||
}
|
||||
|
||||
getConfigFromState(config) {
|
||||
config.ServiceSettings.SiteURL = this.state.siteURL;
|
||||
config.ServiceSettings.ListenAddress = this.state.listenAddress;
|
||||
config.ServiceSettings.WebserverMode = this.state.webserverMode;
|
||||
|
||||
@@ -36,6 +37,7 @@ export default class ConfigurationSettings extends AdminSettings {
|
||||
|
||||
getStateFromConfig(config) {
|
||||
return {
|
||||
siteURL: config.ServiceSettings.SiteURL,
|
||||
listenAddress: config.ServiceSettings.ListenAddress,
|
||||
webserverMode: config.ServiceSettings.WebserverMode
|
||||
};
|
||||
@@ -55,6 +57,24 @@ export default class ConfigurationSettings extends AdminSettings {
|
||||
renderSettings() {
|
||||
return (
|
||||
<SettingsGroup>
|
||||
<TextSetting
|
||||
id='siteURL'
|
||||
label={
|
||||
<FormattedMessage
|
||||
id='admin.service.siteURL'
|
||||
defaultMessage='Site URL:'
|
||||
/>
|
||||
}
|
||||
placeholder={Utils.localizeMessage('admin.service.siteURLExample', 'Ex "https://mattermost.example.com:1234"')}
|
||||
helpText={
|
||||
<FormattedMessage
|
||||
id='admin.service.siteURLDescription'
|
||||
defaultMessage='The URL, including port number and protocol, from which users will access Mattermost. Leave blank to automatically configure based on incoming traffic.'
|
||||
/>
|
||||
}
|
||||
value={this.state.siteURL}
|
||||
onChange={this.handleChange}
|
||||
/>
|
||||
<TextSetting
|
||||
id='listenAddress'
|
||||
label={
|
||||
|
||||
@@ -105,7 +105,7 @@ export default class TeamUrl extends React.Component {
|
||||
nameDivClass += ' has-error';
|
||||
}
|
||||
|
||||
const title = `${window.mm_config.SiteURL}/`;
|
||||
const title = `${Utils.getSiteURL()}/`;
|
||||
const urlTooltip = (
|
||||
<Tooltip id='urlTooltip'>{title}</Tooltip>
|
||||
);
|
||||
|
||||
@@ -97,7 +97,7 @@ export default class InstalledIncomingWebhook extends React.Component {
|
||||
id='installed_integrations.url'
|
||||
defaultMessage='URL: {url}'
|
||||
values={{
|
||||
url: window.mm_config.SiteURL + '/hooks/' + incomingWebhook.id
|
||||
url: Utils.getSiteURL() + '/hooks/' + incomingWebhook.id
|
||||
}}
|
||||
/>
|
||||
</span>
|
||||
|
||||
@@ -640,6 +640,9 @@
|
||||
"admin.service.sessionCache": "Session Cache (minutes):",
|
||||
"admin.service.sessionCacheDesc": "The number of minutes to cache a session in memory.",
|
||||
"admin.service.sessionDaysEx": "Ex \"30\"",
|
||||
"admin.service.siteURL": "Site URL:",
|
||||
"admin.service.siteURLDescription": "The URL, including port number and protocol, from which users will access Mattermost. Leave blank to automatically configure based on incoming traffic.",
|
||||
"admin.service.siteURLExample": "Ex \"https://mattermost.example.com:1234\"",
|
||||
"admin.service.ssoSessionDays": "Session length SSO (days):",
|
||||
"admin.service.ssoSessionDaysDesc": "The number of days from the last time a user entered their credentials to the expiry of the user's session. If the authentication method is SAML or GitLab, the user may automatically be logged back in to Mattermost if they are already logged in to SAML or GitLab. After changing this setting, the setting will take effect after the next time the user enters their credentials.",
|
||||
"admin.service.testingDescription": "When true, /loadtest slash command is enabled to load test accounts, data and text formatting. Changing this requires a server restart before taking effect.",
|
||||
|
||||
@@ -60,13 +60,7 @@ class TeamStoreClass extends EventEmitter {
|
||||
}
|
||||
|
||||
getCurrentId() {
|
||||
var team = this.get(this.currentTeamId);
|
||||
|
||||
if (team) {
|
||||
return team.id;
|
||||
}
|
||||
|
||||
return null;
|
||||
return this.currentTeamId;
|
||||
}
|
||||
|
||||
getCurrent() {
|
||||
@@ -80,10 +74,7 @@ class TeamStoreClass extends EventEmitter {
|
||||
}
|
||||
|
||||
getCurrentTeamUrl() {
|
||||
if (this.getCurrent()) {
|
||||
return window.mm_config.SiteURL + '/' + this.getCurrent().name;
|
||||
}
|
||||
return '';
|
||||
return this.getTeamUrl(this.currentTeamId);
|
||||
}
|
||||
|
||||
getCurrentTeamRelativeUrl() {
|
||||
@@ -97,7 +88,10 @@ class TeamStoreClass extends EventEmitter {
|
||||
const current = this.getCurrent();
|
||||
|
||||
if (current) {
|
||||
return window.mm_config.SiteURL + '/signup_user_complete/?id=' + current.invite_id;
|
||||
// can't call Utils.getSiteURL here because that introduces a circular dependency
|
||||
const origin = window.mm_config.SiteURL || window.location.origin;
|
||||
|
||||
return origin + '/signup_user_complete/?id=' + current.invite_id;
|
||||
}
|
||||
|
||||
return '';
|
||||
@@ -105,11 +99,15 @@ class TeamStoreClass extends EventEmitter {
|
||||
|
||||
getTeamUrl(id) {
|
||||
const team = this.get(id);
|
||||
if (team) {
|
||||
return window.mm_config.SiteURL + '/' + team.name;
|
||||
|
||||
if (!team) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return '';
|
||||
// can't call Utils.getSiteURL here because that introduces a circular dependency
|
||||
const origin = window.mm_config.SiteURL || window.location.origin;
|
||||
|
||||
return origin + '/' + team.name;
|
||||
}
|
||||
|
||||
saveTeam(team) {
|
||||
|
||||
@@ -1338,3 +1338,7 @@ export function isValidPassword(password) {
|
||||
|
||||
return errorMsg;
|
||||
}
|
||||
|
||||
export function getSiteURL() {
|
||||
return global.mm_config.SiteURL || window.location.origin;
|
||||
}
|
||||
Reference in New Issue
Block a user