matrix-react-sdk
Version:
SDK for matrix.org using React
116 lines (114 loc) • 19 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _Validation = _interopRequireDefault(require("../elements/Validation"));
var _languageHandler = require("../../../languageHandler");
var _Field = _interopRequireDefault(require("../elements/Field"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class PassphraseField extends _react.PureComponent {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "validate", (0, _Validation.default)({
description: function (complexity) {
const score = complexity ? complexity.score : 0;
return /*#__PURE__*/_react.default.createElement("progress", {
className: "mx_PassphraseField_progress",
max: 4,
value: score
});
},
deriveData: async ({
value
}) => {
if (!value) return null;
const {
scorePassword
} = await Promise.resolve().then(() => _interopRequireWildcard(require("../../../utils/PasswordScorer")));
return scorePassword(_MatrixClientPeg.MatrixClientPeg.get(), value, this.props.userInputs);
},
rules: [{
key: "required",
test: ({
value,
allowEmpty
}) => allowEmpty || !!value,
invalid: () => (0, _languageHandler._t)(this.props.labelEnterPassword)
}, {
key: "complexity",
test: async function ({
value
}, complexity) {
if (!value || !complexity) {
return false;
}
const safe = complexity.score >= this.props.minScore;
const allowUnsafe = _SdkConfig.default.get("dangerously_allow_unsafe_and_insecure_passwords");
return allowUnsafe || safe;
},
valid: function (complexity) {
// Unsafe passwords that are valid are only possible through a
// configuration flag. We'll print some helper text to signal
// to the user that their password is allowed, but unsafe.
if (complexity && complexity.score >= this.props.minScore) {
return (0, _languageHandler._t)(this.props.labelStrongPassword);
}
return (0, _languageHandler._t)(this.props.labelAllowedButUnsafe);
},
invalid: function (complexity) {
if (!complexity) {
return null;
}
const {
feedback
} = complexity;
return feedback.warning || feedback.suggestions[0] || (0, _languageHandler._t)("auth|password_field_keep_going_prompt");
}
}],
memoize: true
}));
(0, _defineProperty2.default)(this, "onValidate", async fieldState => {
const result = await this.validate(fieldState);
if (this.props.onValidate) {
this.props.onValidate(result);
}
return result;
});
}
render() {
return /*#__PURE__*/_react.default.createElement(_Field.default, {
id: this.props.id,
autoFocus: this.props.autoFocus,
className: (0, _classnames.default)("mx_PassphraseField", this.props.className),
ref: this.props.fieldRef,
type: "password",
autoComplete: "new-password",
label: (0, _languageHandler._t)(this.props.label),
value: this.props.value,
onChange: this.props.onChange,
onValidate: this.onValidate,
tooltipAlignment: this.props.tooltipAlignment
});
}
}
(0, _defineProperty2.default)(PassphraseField, "defaultProps", {
label: (0, _languageHandler._td)("common|password"),
labelEnterPassword: (0, _languageHandler._td)("auth|password_field_label"),
labelStrongPassword: (0, _languageHandler._td)("auth|password_field_strong_label"),
labelAllowedButUnsafe: (0, _languageHandler._td)("auth|password_field_weak_label")
});
var _default = exports.default = PassphraseField;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfU2RrQ29uZmlnIiwiX1ZhbGlkYXRpb24iLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0ZpZWxkIiwiX01hdHJpeENsaWVudFBlZyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlBhc3NwaHJhc2VGaWVsZCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwid2l0aFZhbGlkYXRpb24iLCJkZXNjcmlwdGlvbiIsImNvbXBsZXhpdHkiLCJzY29yZSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJtYXgiLCJ2YWx1ZSIsImRlcml2ZURhdGEiLCJzY29yZVBhc3N3b3JkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiTWF0cml4Q2xpZW50UGVnIiwicHJvcHMiLCJ1c2VySW5wdXRzIiwicnVsZXMiLCJrZXkiLCJ0ZXN0IiwiYWxsb3dFbXB0eSIsImludmFsaWQiLCJfdCIsImxhYmVsRW50ZXJQYXNzd29yZCIsInNhZmUiLCJtaW5TY29yZSIsImFsbG93VW5zYWZlIiwiU2RrQ29uZmlnIiwidmFsaWQiLCJsYWJlbFN0cm9uZ1Bhc3N3b3JkIiwibGFiZWxBbGxvd2VkQnV0VW5zYWZlIiwiZmVlZGJhY2siLCJ3YXJuaW5nIiwic3VnZ2VzdGlvbnMiLCJtZW1vaXplIiwiZmllbGRTdGF0ZSIsInJlc3VsdCIsInZhbGlkYXRlIiwib25WYWxpZGF0ZSIsInJlbmRlciIsImlkIiwiYXV0b0ZvY3VzIiwiY2xhc3NOYW1lcyIsInJlZiIsImZpZWxkUmVmIiwidHlwZSIsImF1dG9Db21wbGV0ZSIsImxhYmVsIiwib25DaGFuZ2UiLCJ0b29sdGlwQWxpZ25tZW50IiwiX3RkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvYXV0aC9QYXNzcGhyYXNlRmllbGQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50LCBSZWZDYWxsYmFjaywgUmVmT2JqZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFp4Y3ZiblJlc3VsdCB9IGZyb20gXCJAenhjdmJuLXRzL2NvcmVcIjtcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IHdpdGhWYWxpZGF0aW9uLCB7IElGaWVsZFN0YXRlLCBJVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gXCIuLi9lbGVtZW50cy9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBfdCwgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBGaWVsZCwgeyBJSW5wdXRQcm9wcyB9IGZyb20gXCIuLi9lbGVtZW50cy9GaWVsZFwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgQWxpZ25tZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRzL1Rvb2x0aXBcIjtcblxuaW50ZXJmYWNlIElQcm9wcyBleHRlbmRzIE9taXQ8SUlucHV0UHJvcHMsIFwib25WYWxpZGF0ZVwiIHwgXCJlbGVtZW50XCI+IHtcbiAgICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICBtaW5TY29yZTogMCB8IDEgfCAyIHwgMyB8IDQ7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBmaWVsZFJlZj86IFJlZkNhbGxiYWNrPEZpZWxkPiB8IFJlZk9iamVjdDxGaWVsZD47XG4gICAgLy8gQWRkaXRpb25hbCBzdHJpbmdzIHN1Y2ggYXMgYSB1c2VybmFtZSB1c2VkIHRvIGNhdGNoIGJhZCBwYXNzd29yZHNcbiAgICB1c2VySW5wdXRzPzogc3RyaW5nW107XG5cbiAgICBsYWJlbDogVHJhbnNsYXRpb25LZXk7XG4gICAgbGFiZWxFbnRlclBhc3N3b3JkOiBUcmFuc2xhdGlvbktleTtcbiAgICBsYWJlbFN0cm9uZ1Bhc3N3b3JkOiBUcmFuc2xhdGlvbktleTtcbiAgICBsYWJlbEFsbG93ZWRCdXRVbnNhZmU6IFRyYW5zbGF0aW9uS2V5O1xuICAgIHRvb2x0aXBBbGlnbm1lbnQ/OiBBbGlnbm1lbnQ7XG5cbiAgICBvbkNoYW5nZShldjogUmVhY3QuRm9ybUV2ZW50PEhUTUxFbGVtZW50Pik6IHZvaWQ7XG4gICAgb25WYWxpZGF0ZT8ocmVzdWx0OiBJVmFsaWRhdGlvblJlc3VsdCk6IHZvaWQ7XG59XG5cbmNsYXNzIFBhc3NwaHJhc2VGaWVsZCBleHRlbmRzIFB1cmVDb21wb25lbnQ8SVByb3BzPiB7XG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGxhYmVsOiBfdGQoXCJjb21tb258cGFzc3dvcmRcIiksXG4gICAgICAgIGxhYmVsRW50ZXJQYXNzd29yZDogX3RkKFwiYXV0aHxwYXNzd29yZF9maWVsZF9sYWJlbFwiKSxcbiAgICAgICAgbGFiZWxTdHJvbmdQYXNzd29yZDogX3RkKFwiYXV0aHxwYXNzd29yZF9maWVsZF9zdHJvbmdfbGFiZWxcIiksXG4gICAgICAgIGxhYmVsQWxsb3dlZEJ1dFVuc2FmZTogX3RkKFwiYXV0aHxwYXNzd29yZF9maWVsZF93ZWFrX2xhYmVsXCIpLFxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGUgPSB3aXRoVmFsaWRhdGlvbjx0aGlzLCBaeGN2Ym5SZXN1bHQgfCBudWxsPih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBmdW5jdGlvbiAoY29tcGxleGl0eSkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSBjb21wbGV4aXR5ID8gY29tcGxleGl0eS5zY29yZSA6IDA7XG4gICAgICAgICAgICByZXR1cm4gPHByb2dyZXNzIGNsYXNzTmFtZT1cIm14X1Bhc3NwaHJhc2VGaWVsZF9wcm9ncmVzc1wiIG1heD17NH0gdmFsdWU9e3Njb3JlfSAvPjtcbiAgICAgICAgfSxcbiAgICAgICAgZGVyaXZlRGF0YTogYXN5bmMgKHsgdmFsdWUgfSk6IFByb21pc2U8WnhjdmJuUmVzdWx0IHwgbnVsbD4gPT4ge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB7IHNjb3JlUGFzc3dvcmQgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uLy4uL3V0aWxzL1Bhc3N3b3JkU2NvcmVyXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHNjb3JlUGFzc3dvcmQoTWF0cml4Q2xpZW50UGVnLmdldCgpLCB2YWx1ZSwgdGhpcy5wcm9wcy51c2VySW5wdXRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgICB0ZXN0OiAoeyB2YWx1ZSwgYWxsb3dFbXB0eSB9KSA9PiBhbGxvd0VtcHR5IHx8ICEhdmFsdWUsXG4gICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QodGhpcy5wcm9wcy5sYWJlbEVudGVyUGFzc3dvcmQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiY29tcGxleGl0eVwiLFxuICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jIGZ1bmN0aW9uICh7IHZhbHVlIH0sIGNvbXBsZXhpdHkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhY29tcGxleGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhZmUgPSBjb21wbGV4aXR5LnNjb3JlID49IHRoaXMucHJvcHMubWluU2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93VW5zYWZlID0gU2RrQ29uZmlnLmdldChcImRhbmdlcm91c2x5X2FsbG93X3Vuc2FmZV9hbmRfaW5zZWN1cmVfcGFzc3dvcmRzXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dVbnNhZmUgfHwgc2FmZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZhbGlkOiBmdW5jdGlvbiAoY29tcGxleGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVbnNhZmUgcGFzc3dvcmRzIHRoYXQgYXJlIHZhbGlkIGFyZSBvbmx5IHBvc3NpYmxlIHRocm91Z2ggYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGZsYWcuIFdlJ2xsIHByaW50IHNvbWUgaGVscGVyIHRleHQgdG8gc2lnbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSB1c2VyIHRoYXQgdGhlaXIgcGFzc3dvcmQgaXMgYWxsb3dlZCwgYnV0IHVuc2FmZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhpdHkgJiYgY29tcGxleGl0eS5zY29yZSA+PSB0aGlzLnByb3BzLm1pblNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3QodGhpcy5wcm9wcy5sYWJlbFN0cm9uZ1Bhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3QodGhpcy5wcm9wcy5sYWJlbEFsbG93ZWRCdXRVbnNhZmUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW52YWxpZDogZnVuY3Rpb24gKGNvbXBsZXhpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV4aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZlZWRiYWNrIH0gPSBjb21wbGV4aXR5O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmVlZGJhY2sud2FybmluZyB8fCBmZWVkYmFjay5zdWdnZXN0aW9uc1swXSB8fCBfdChcImF1dGh8cGFzc3dvcmRfZmllbGRfa2VlcF9nb2luZ19wcm9tcHRcIik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG1lbW9pemU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgb25WYWxpZGF0ZSA9IGFzeW5jIChmaWVsZFN0YXRlOiBJRmllbGRTdGF0ZSk6IFByb21pc2U8SVZhbGlkYXRpb25SZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZShmaWVsZFN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25WYWxpZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblZhbGlkYXRlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgaWQ9e3RoaXMucHJvcHMuaWR9XG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzPXt0aGlzLnByb3BzLmF1dG9Gb2N1c31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9QYXNzcGhyYXNlRmllbGRcIiwgdGhpcy5wcm9wcy5jbGFzc05hbWUpfVxuICAgICAgICAgICAgICAgIHJlZj17dGhpcy5wcm9wcy5maWVsZFJlZn1cbiAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgbGFiZWw9e190KHRoaXMucHJvcHMubGFiZWwpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLnZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uVmFsaWRhdGU9e3RoaXMub25WYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICB0b29sdGlwQWxpZ25tZW50PXt0aGlzLnByb3BzLnRvb2x0aXBBbGlnbm1lbnR9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFzc3BocmFzZUZpZWxkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUdBLElBQUFHLFVBQUEsR0FBQUQsc0JBQUEs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