40 lines
1.3 KiB
JavaScript
40 lines
1.3 KiB
JavaScript
function isOpera(userAgent) {
|
|
return userAgent.indexOf('Opera') >= 0 || userAgent.indexOf('OPR') >= 0;
|
|
}
|
|
|
|
function getOperaVersion(userAgent) {
|
|
const match = userAgent.match(/OPR[^0-9]*([0-9]+)[^0-9]+/);
|
|
return match ? parseInt(match[1], 10) : false;
|
|
}
|
|
|
|
function isChrome(userAgent) {
|
|
return userAgent.indexOf('Chrom') >= 0 && !isOpera(userAgent);
|
|
}
|
|
|
|
function getChromeVersion(userAgent) {
|
|
const match = userAgent.match(/Chrom(?:e|ium)\/([0-9]+)\./);
|
|
return match ? parseInt(match[1], 10) : false;
|
|
}
|
|
|
|
export function canInjectU2fApi(userAgent) {
|
|
const isSupportedChrome = isChrome(userAgent) && getChromeVersion(userAgent) >= 41;
|
|
const isSupportedOpera = isOpera(userAgent) && getOperaVersion(userAgent) >= 40;
|
|
const isMobile =
|
|
userAgent.indexOf('droid') >= 0 ||
|
|
userAgent.indexOf('CriOS') >= 0 ||
|
|
/\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);
|
|
return (isSupportedChrome || isSupportedOpera) && !isMobile;
|
|
}
|
|
|
|
export default function importU2FLibrary() {
|
|
if (window.u2f) {
|
|
return Promise.resolve(window.u2f);
|
|
}
|
|
|
|
const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';
|
|
if (canInjectU2fApi(userAgent) || (gon && gon.test_env)) {
|
|
return import(/* webpackMode: "eager" */ 'vendor/u2f').then(() => window.u2f);
|
|
}
|
|
|
|
return Promise.reject();
|
|
}
|