mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
[enh] Avoid to have to retype password in cli
This commit is contained in:
parent
0dde7fca6b
commit
3efa2fe751
2 changed files with 36 additions and 15 deletions
|
@ -15,6 +15,8 @@
|
||||||
"app_already_up_to_date": "{app} is already up-to-date",
|
"app_already_up_to_date": "{app} is already up-to-date",
|
||||||
"app_argument_choice_invalid": "Use one of these choices '{choices}' for the argument '{name}' instead of '{value}'",
|
"app_argument_choice_invalid": "Use one of these choices '{choices}' for the argument '{name}' instead of '{value}'",
|
||||||
"app_argument_invalid": "Pick a valid value for the argument '{name}': {error}",
|
"app_argument_invalid": "Pick a valid value for the argument '{name}': {error}",
|
||||||
|
"app_argument_password_help": "Type the key Enter to keep the old value",
|
||||||
|
"app_argument_password_help_optional": "Type one space to empty the password",
|
||||||
"app_argument_password_no_default": "Error while parsing password argument '{name}': password argument can't have a default value for security reason",
|
"app_argument_password_no_default": "Error while parsing password argument '{name}': password argument can't have a default value for security reason",
|
||||||
"app_argument_required": "Argument '{name}' is required",
|
"app_argument_required": "Argument '{name}' is required",
|
||||||
"app_change_url_identical_domains": "The old and new domain/url_path are identical ('{domain}{path}'), nothing to do.",
|
"app_change_url_identical_domains": "The old and new domain/url_path are identical ('{domain}{path}'), nothing to do.",
|
||||||
|
|
|
@ -468,6 +468,20 @@ class Question(object):
|
||||||
def normalize(value, option={}):
|
def normalize(value, option={}):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def _prompt(self, text):
|
||||||
|
prefill = ""
|
||||||
|
if self.current_value is not None:
|
||||||
|
prefill = self.humanize(self.current_value, self)
|
||||||
|
elif self.default is not None:
|
||||||
|
prefill = self.humanize(self.default, self)
|
||||||
|
self.value = Moulinette.prompt(
|
||||||
|
message=text,
|
||||||
|
is_password=self.hide_user_input_in_prompt,
|
||||||
|
confirm=False, # We doesn't want to confirm this kind of password like in webadmin
|
||||||
|
prefill=prefill,
|
||||||
|
is_multiline=(self.type == "text"),
|
||||||
|
)
|
||||||
|
|
||||||
def ask_if_needed(self):
|
def ask_if_needed(self):
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
# Display question if no value filled or if it's a readonly message
|
# Display question if no value filled or if it's a readonly message
|
||||||
|
@ -475,20 +489,8 @@ class Question(object):
|
||||||
text_for_user_input_in_cli = self._format_text_for_user_input_in_cli()
|
text_for_user_input_in_cli = self._format_text_for_user_input_in_cli()
|
||||||
if getattr(self, "readonly", False):
|
if getattr(self, "readonly", False):
|
||||||
Moulinette.display(text_for_user_input_in_cli)
|
Moulinette.display(text_for_user_input_in_cli)
|
||||||
|
|
||||||
elif self.value is None:
|
elif self.value is None:
|
||||||
prefill = ""
|
self._prompt(text_for_user_input_in_cli)
|
||||||
if self.current_value is not None:
|
|
||||||
prefill = self.humanize(self.current_value, self)
|
|
||||||
elif self.default is not None:
|
|
||||||
prefill = self.humanize(self.default, self)
|
|
||||||
self.value = Moulinette.prompt(
|
|
||||||
message=text_for_user_input_in_cli,
|
|
||||||
is_password=self.hide_user_input_in_prompt,
|
|
||||||
confirm=self.hide_user_input_in_prompt,
|
|
||||||
prefill=prefill,
|
|
||||||
is_multiline=(self.type == "text"),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Apply default value
|
# Apply default value
|
||||||
class_default = getattr(self, "default_value", None)
|
class_default = getattr(self, "default_value", None)
|
||||||
|
@ -542,13 +544,13 @@ class Question(object):
|
||||||
choices=", ".join(self.choices),
|
choices=", ".join(self.choices),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _format_text_for_user_input_in_cli(self):
|
def _format_text_for_user_input_in_cli(self, column=False):
|
||||||
text_for_user_input_in_cli = _value_for_locale(self.ask)
|
text_for_user_input_in_cli = _value_for_locale(self.ask)
|
||||||
|
|
||||||
if self.choices:
|
if self.choices:
|
||||||
text_for_user_input_in_cli += " [{0}]".format(" | ".join(self.choices))
|
text_for_user_input_in_cli += " [{0}]".format(" | ".join(self.choices))
|
||||||
|
|
||||||
if self.help:
|
if self.help or column:
|
||||||
text_for_user_input_in_cli += ":\033[m"
|
text_for_user_input_in_cli += ":\033[m"
|
||||||
if self.help:
|
if self.help:
|
||||||
text_for_user_input_in_cli += "\n - "
|
text_for_user_input_in_cli += "\n - "
|
||||||
|
@ -689,6 +691,23 @@ class PasswordQuestion(Question):
|
||||||
|
|
||||||
assert_password_is_strong_enough("user", self.value)
|
assert_password_is_strong_enough("user", self.value)
|
||||||
|
|
||||||
|
def _format_text_for_user_input_in_cli(self):
|
||||||
|
need_column = self.current_value or self.optional
|
||||||
|
text_for_user_input_in_cli = super()._format_text_for_user_input_in_cli(need_column)
|
||||||
|
if self.current_value:
|
||||||
|
text_for_user_input_in_cli += "\n - " + m18n.n("app_argument_password_help")
|
||||||
|
if self.optional:
|
||||||
|
text_for_user_input_in_cli += "\n - " + m18n.n("app_argument_password_help_optional")
|
||||||
|
|
||||||
|
return text_for_user_input_in_cli
|
||||||
|
|
||||||
|
def _prompt(self, text):
|
||||||
|
super()._prompt(text)
|
||||||
|
if self.current_value and self.value == "":
|
||||||
|
self.value = self.current_value
|
||||||
|
elif self.value == " ":
|
||||||
|
self.value = ""
|
||||||
|
|
||||||
|
|
||||||
class PathQuestion(Question):
|
class PathQuestion(Question):
|
||||||
argument_type = "path"
|
argument_type = "path"
|
||||||
|
|
Loading…
Add table
Reference in a new issue