diff --git a/src/angular/components/view.component.ts b/src/angular/components/view.component.ts index b645f92ff5..1fd26d1015 100644 --- a/src/angular/components/view.component.ts +++ b/src/angular/components/view.component.ts @@ -134,7 +134,7 @@ export class ViewComponent implements OnDestroy, OnInit { } this.platformUtilsService.eventTrack('Launched Login URI'); - this.platformUtilsService.launchUri(uri.uri); + this.platformUtilsService.launchUri(uri.launchUri); } copy(value: string, typeI18nKey: string, aType: string) { diff --git a/src/misc/utils.ts b/src/misc/utils.ts index 2760d2af6c..d07c6f6af4 100644 --- a/src/misc/utils.ts +++ b/src/misc/utils.ts @@ -12,6 +12,7 @@ export class Utils { static isBrowser = true; static isMobileBrowser = false; static global: any = null; + static tldEndingRegex = /.*\.(com|net|org|edu|uk|gov|ca|de|jp|fr|au|ru|ch|io|es|us|co|xyz|info|ly|mil)$/; static init() { if (Utils.inited) { @@ -175,7 +176,13 @@ export class Utils { return null; } - if (uriString.startsWith('http://') || uriString.startsWith('https://')) { + let httpUrl = uriString.startsWith('http://') || uriString.startsWith('https://'); + if (!httpUrl && Utils.tldEndingRegex.test(uriString)) { + uriString = 'http://' + uriString; + httpUrl = true; + } + + if (httpUrl) { try { const url = Utils.getUrlObject(uriString); if (url.hostname === 'localhost' || Utils.validIpAddress(url.hostname)) { diff --git a/src/models/view/loginUriView.ts b/src/models/view/loginUriView.ts index 2ac71bd8f2..70698ca33d 100644 --- a/src/models/view/loginUriView.ts +++ b/src/models/view/loginUriView.ts @@ -70,7 +70,8 @@ export class LoginUriView implements View { } get isWebsite(): boolean { - return this.uri != null && (this.uri.indexOf('http://') === 0 || this.uri.indexOf('https://') === 0); + return this.uri != null && (this.uri.indexOf('http://') === 0 || this.uri.indexOf('https://') === 0 || + (this.uri.indexOf('://') < 0 && Utils.tldEndingRegex.test(this.uri))); } get canLaunch(): boolean { @@ -78,8 +79,9 @@ export class LoginUriView implements View { return this._canLaunch; } if (this.uri != null) { + const uri = this.launchUri; for (let i = 0; i < CanLaunchWhitelist.length; i++) { - if (this.uri.indexOf(CanLaunchWhitelist[i]) === 0) { + if (uri.indexOf(CanLaunchWhitelist[i]) === 0) { this._canLaunch = true; return this._canLaunch; } @@ -88,4 +90,8 @@ export class LoginUriView implements View { this._canLaunch = false; return this._canLaunch; } + + get launchUri(): string { + return this.uri.indexOf('://') < 0 && Utils.tldEndingRegex.test(this.uri) ? ('http://' + this.uri) : this.uri; + } } diff --git a/src/models/view/loginView.ts b/src/models/view/loginView.ts index e0c7b06bf0..822a9361d3 100644 --- a/src/models/view/loginView.ts +++ b/src/models/view/loginView.ts @@ -34,6 +34,10 @@ export class LoginView implements View { return this.hasUris && this.uris[0].canLaunch; } + get launchUri(): string { + return this.canLaunch ? this.uris[0].launchUri : null; + } + get hasUris(): boolean { return this.uris != null && this.uris.length > 0; }