commit 00bc136f9206d43f6d0dfc233beed525570c4cf5 Author: Bradford White Date: Thu Mar 26 10:28:14 2026 -0400 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..c3686d2 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# BusyBox, Orwellian Edition + +Given that states and countries are now requiring that operating systems report +the age of users, it is important that BusyBox be able to comply. Why? BusyBox +is used in embedded devices that qualify for regulation under these bills (such +as California's [AB-1043](https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=202520260AB1043)). +For most hardware, this would actually amount to just reporting epoc for root, +as most devices won't directly have users. Applications on those may, but those +usually have their own user management features. + +This patch adds the `-b` option to BusyBox's adduser, and will record a birthday +in YYYYMMDD format. This can then be used to determine age, and/or the age +bracket of the user via the standard UNIX shell which serves as the UNIX +API/ABI, and thus makes BusyBox compliant with the law. The two UNIX commands +added here are `howoldami` and `useragerange`. diff --git a/adduser.bday.patch b/adduser.bday.patch new file mode 100644 index 0000000..c1b5ff7 --- /dev/null +++ b/adduser.bday.patch @@ -0,0 +1,67 @@ +--- loginutils/adduser.c.orig ++++ loginutils/adduser.c +@@ -44,6 +44,7 @@ + //usage: "\n -H Don't create home directory" + //usage: "\n -u UID User id" + //usage: "\n -k SKEL Skeleton directory (/etc/skel)" ++//usage: "\n -b DOB Date of birth (YYYYMMDD)" + + #include "libbb.h" + +@@ -61,6 +62,7 @@ + #define OPT_DONT_MAKE_HOME (1 << 6) + #define OPT_UID (1 << 7) + #define OPT_SKEL (1 << 8) ++#define OPT_DOB (1 << 9) + + /* remix */ + /* recoded such that the uid may be passed in *p */ +@@ -128,6 +130,7 @@ + "no-create-home\0" No_argument "H" + "uid\0" Required_argument "u" + "skel\0" Required_argument "k" ++ "dob\0" Required_argument "b" + ; + + /* +@@ -141,6 +144,7 @@ + unsigned opts; + char *uid; + const char *skel = "/etc/skel"; ++ char *dob = NULL; + + /* got root? */ + if (geteuid()) { +@@ -151,12 +155,12 @@ + pw.pw_dir = NULL; + + opts = getopt32long(argv, "^" +- "h:g:s:G:DSHu:k:" ++ "h:g:s:G:DSHu:k:b:" + /* at least one and at most two non-option args */ + /* disable interactive passwd for system accounts */ + "\0" "-1:?2:SD", + adduser_longopts, +- &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, +- &usegroup, &uid, &skel ++ &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, ++ &usegroup, &uid, &skel, &dob + ); + if (opts & OPT_UID) +@@ -200,6 +204,16 @@ + free(p); + #endif + ++ /* Record date of birth if specified */ ++ if (opts & OPT_DOB) { ++ FILE *f = fopen("/etc/birthdays", "a"); ++ if (f) { ++ fprintf(f, "%s:x:%s:\n", pw.pw_name, dob); ++ fclose(f); ++ } else { ++ bb_perror_msg("/etc/birthdays"); ++ } ++ } ++ + /* add to group */ + addgroup_wrapper(&pw, usegroup); diff --git a/bin/howoldami b/bin/howoldami new file mode 100644 index 0000000..8c54b06 --- /dev/null +++ b/bin/howoldami @@ -0,0 +1,6 @@ +#!/bin/bash +username=$(whoami) +dob=$(grep $username /etc/birthdays | cut -f 3 -d ':') +today=$(date +%Y%m%d) +age=$(echo "$today - $dob" | bc -l | cut -f 1 -d '.') +printf "%s%b" "$age" "\n" diff --git a/bin/useragerange b/bin/useragerange new file mode 100644 index 0000000..b197a8f --- /dev/null +++ b/bin/useragerange @@ -0,0 +1,12 @@ +#!/bin/bash +age=$(howoldami) + +if [ $age -lt 13 ]; then + echo "User is under the age of 13." +elif [ $age -ge 13 ] && [ $age -lt 16 ]; then + echo "User is under the age of 16, but at least 13." +elif [ $age -ge 16 ] && [ $age -lt 18 ]; then + echo "User is at least 16, but younger than 18." +else + echo "User is over 18" +fi diff --git a/etc/birthdays b/etc/birthdays new file mode 100644 index 0000000..4af6a15 --- /dev/null +++ b/etc/birthdays @@ -0,0 +1,2 @@ +# username:x:YYYYMMDD: +root:x:19700101: