3
0
Fork 0
forked from mirrors/nixpkgs

types.singleLineStr: strings that don't contain '\n'

Add a new type, inheriting 'types.str' but checking whether the value
doesn't contain any newline characters.

The motivation comes from a problem with the
'users.users.${u}.openssh.authorizedKeys' option.
It is easy to unintentionally insert a newline character at the end of a
string, or even in the middle, for example:

    restricted_ssh_keys = command: keys:
      let
        prefix = ''
          command="${command}",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding
        '';
      in map (key: "${prefix} ${key}") keys;

The 'prefix' string ends with a newline, which ends up in the middle of
a key entry after a few manipulations.

This is problematic because the key file is built by concatenating all
the keys with 'concatStringsSep "\n"', with result in two entries for
the faulty key:

    ''
      command="...",options...
      MY_KEY
    ''

This is hard to debug and might be dangerous. This is now caught at
build time.
This commit is contained in:
Jules Aguillon 2022-01-18 21:56:14 +01:00
parent 0f9d1064e7
commit df590070b0
2 changed files with 8 additions and 1 deletions

View file

@ -300,6 +300,13 @@ rec {
inherit (str) merge;
};
singleLineStr = mkOptionType {
name = "singleLineStr";
description = "string that doesn't contain '\\n'";
check = x: str.check x && !(lib.hasInfix "\n" x);
inherit (str) merge;
};
strMatching = pattern: mkOptionType {
name = "strMatching ${escapeNixString pattern}";
description = "string matching the pattern ${pattern}";

View file

@ -30,7 +30,7 @@ let
options.openssh.authorizedKeys = {
keys = mkOption {
type = types.listOf types.str;
type = types.listOf types.singleLineStr;
default = [];
description = ''
A list of verbatim OpenSSH public keys that should be added to the