Skip to content

zshell: add Zephyr-compatible obscured input and root command selection #59

Description

@swoisz

Summary

Add the missing Zephyr-compatible shell primitives needed for applications to
implement login/logout flows while keeping authentication policy outside
zshell.

This is a compatibility feature, not a request for zshell to own passwords,
hashing, credential storage, or authorization policy.

Upstream Zephyr behavior

Zephyr documents a login pattern composed from general shell features:

  • CONFIG_SHELL_START_OBSCURED and shell_obscure_set() obscure entered
    characters.
  • CONFIG_SHELL_CMD_ROOT and shell_set_root_cmd() restrict command dispatch
    to a selected root command.
  • CONFIG_SHELL_PROMPT_CHANGE and shell_prompt_change() switch between login
    and normal prompts.
  • The application supplies the login/logout commands and credential
    verification.

References:

Proposed Boreas surface

Add Zephyr-compatible APIs:

int shell_obscure_set(const struct shell *sh, bool obscure);
int shell_prompt_change(const struct shell *sh, const char *prompt);
int shell_set_root_cmd(const char *cmd);

Add analogous Boreas Kconfig options using the existing ZSHELL namespace:

CONFIG_ZSHELL_START_OBSCURED
CONFIG_ZSHELL_PROMPT_CHANGE
CONFIG_ZSHELL_PROMPT_BUFF_SIZE
CONFIG_ZSHELL_CMD_ROOT

CONFIG_ZSHELL_CMDS_SELECT and the user-facing select command may be included
for broader parity, but they are not required for the core login/logout
composition if runtime root selection is otherwise supported.

Behavioral requirements

Obscured input

  • When obscured, printable input is represented by * rather than the original
    character.
  • Backspace and cursor behavior remain coherent.
  • shell_obscure_set() returns the previous state, matching Zephyr's API
    contract.
  • Startup state honors CONFIG_ZSHELL_START_OBSCURED.

Root command selection

  • A configured or runtime-selected root command becomes the effective root for
    parsing.
  • Input is passed as arguments beneath the selected command, matching Zephyr's
    login sample.
  • Other root commands cannot be executed while a root is selected.
  • Help and tab completion must not expose commands outside the selected root.
  • Passing NULL to shell_set_root_cmd() restores the full root command tree.
  • Invalid command names return -EINVAL.
  • The selection applies consistently to all shell instances, matching the
    Zephyr API contract.

Prompt changes

  • shell_prompt_change() updates the prompt at runtime.
  • Prompt storage is bounded by CONFIG_ZSHELL_PROMPT_BUFF_SIZE.
  • Invalid or oversized prompts return -EINVAL.
  • Existing static/default prompt behavior remains unchanged when runtime prompt
    changes are disabled.

History

Provide a safe, documented way for an application login handler to purge the
credential-bearing history entry after authentication. The upstream sample
explicitly purges history before enabling the full command tree.

Tests

Add host tests covering:

  • obscured character insertion and deletion;
  • initial obscured state from Kconfig;
  • valid and invalid runtime root selection;
  • dispatch beneath a selected root;
  • rejection of unrelated root commands;
  • root-aware help/completion behavior;
  • clearing the selected root;
  • runtime prompt changes and bounds;
  • history purge;
  • unchanged behavior when the new options are disabled.

A small example modeled on Zephyr's login/logout sample would make the intended
composition and compatibility goal clear without embedding any authentication
policy in zshell.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions