die_if_bad_username.c 900 B

123456789101112131415161718192021222324252627282930313233343536
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * Ckeck user and group names for illegal characters
  4. *
  5. * Copyright (C) 2008 Tito Ragusa <farmatito@tiscali.it>
  6. *
  7. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  8. */
  9. #include "libbb.h"
  10. /* To avoid problems, the username should consist only of
  11. * letters, digits, underscores, periods, at signs and dashes,
  12. * and not start with a dash (as defined by IEEE Std 1003.1-2001).
  13. * For compatibility with Samba machine accounts $ is also supported
  14. * at the end of the username.
  15. */
  16. void die_if_bad_username(const char *name)
  17. {
  18. goto skip; /* 1st char being dash isn't valid */
  19. do {
  20. if (*name == '-')
  21. continue;
  22. skip:
  23. if (isalnum(*name)
  24. || *name == '_'
  25. || *name == '.'
  26. || *name == '@'
  27. || (*name == '$' && !*(name + 1))
  28. ) {
  29. continue;
  30. }
  31. bb_error_msg_and_die("illegal character '%c'", *name);
  32. } while (*++name);
  33. }