From 5cb34d9076b4fd0155285c81ee8cf8bf61da3701 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:48:20 +0000 Subject: [PATCH 1/4] Initial plan From 8f3a102db5321275e68ffde913c286b07eb76738 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:55:39 +0000 Subject: [PATCH 2/4] Add support for local user TCC.db without requiring sudo Co-authored-by: jacobsalmela <3843505+jacobsalmela@users.noreply.github.com> --- README.md | 53 +++++++++++++++++++++------- __pycache__/tccutil.cpython-312.pyc | Bin 0 -> 16099 bytes tccutil.py | 14 ++++++-- 3 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 __pycache__/tccutil.cpython-312.pyc diff --git a/README.md b/README.md index dbc9fb1..bec4430 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,20 @@ Apple has a utility in `/usr/bin` named `tccutil`, but it only supports one command, which is to `reset` the entire database. It has been like this for many versions of macOS. I wanted a command-line utility that would be able to add, remove, list, and take other actions. +## Understanding Global vs Local TCC Databases + +macOS maintains two separate TCC databases: + +1. **Global TCC Database** (`/Library/Application Support/com.apple.TCC/TCC.db`) + - System-wide permissions that apply to all users + - **Requires sudo/admin privileges** to modify + - Used by default when running `tccutil.py` without the `--user` flag + +2. **Local User TCC Database** (`~/Library/Application Support/com.apple.TCC/TCC.db`) + - User-specific permissions + - **Does NOT require sudo** - users can modify their own database + - Accessed by using the `--user` flag (e.g., `tccutil.py --list -u`) + ## SIP Notice This tool needs SIP disabled in order to function. The risk of doing so is up to you. @@ -58,7 +72,10 @@ Clone this repo and manually copy `tccutil.py` to `/usr/local/bin` or run from a ## Usage -**This utility needs super-user priveleges for most operations.** It is important that you either run this as root or use `sudo`, otherwise it won't work and you will end up with “permission denied” errors. +**Important:** The privileges required depend on which database you're modifying: + +- **Global TCC Database** (default): Requires super-user privileges. Run with `sudo`. +- **Local User TCC Database** (with `--user` flag): Does NOT require `sudo`. Can be run as a regular user. ``` @@ -96,30 +113,20 @@ optional arguments: ### Examples +#### Global TCC Database (System-wide, requires sudo) + List existing Entries in the Accessibility Database ```bash sudo tccutil.py --list ``` -List existing Entries in the Accessibility Database specific to the current user - -```bash -sudo tccutil.py --list -u -``` - Add `/usr/bin/osascript` to the Accessibility Database (using UNIX-Style Option) ```bash sudo tccutil.py -i /usr/bin/osascript ```` -Add `/usr/bin/osascript` to the Accessibility Database specific to user 'myuser' (using UNIX-Style Option) - -```bash -sudo tccutil.py -i /usr/bin/osascript -u myuser -```` - Add *Script Editor* to the Accessibility Database (using Long Option) ```bash @@ -150,6 +157,26 @@ Reset system wide accessibility database sudo tccutil.py reset ALL ``` +#### Local User TCC Database (User-specific, no sudo required) + +List existing Entries in the current user's Accessibility Database + +```bash +tccutil.py --list -u +``` + +Add `/usr/bin/osascript` to the current user's Accessibility Database + +```bash +tccutil.py -i /usr/bin/osascript -u +``` + +Add `/usr/bin/osascript` to a specific user's Accessibility Database + +```bash +tccutil.py -i /usr/bin/osascript -u myuser +``` + ## Contributing Many people have contributed already, so feel free to make a PR and we'll get it merged in. diff --git a/__pycache__/tccutil.cpython-312.pyc b/__pycache__/tccutil.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb5868ff21ca7e4f9f96b4b35fdfa52b34e6f27b GIT binary patch literal 16099 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 O{mvCD#gviz^8XD)T9pd` literal 0 HcmV?d00001 diff --git a/tccutil.py b/tccutil.py index e27e923..b193271 100755 --- a/tccutil.py +++ b/tccutil.py @@ -36,6 +36,9 @@ # Set "sudo" to True if called with Admin-Privileges. sudo = True if os.getuid() == 0 else False +# Track if we're using local (user-specific) database +using_local_db = False + # Default Verbosity verbose = False @@ -105,9 +108,14 @@ def display_version(): def sudo_required(): """Check if user has root priveleges to access the database.""" + # Local user database doesn't require sudo + if using_local_db: + return + if not sudo: print("Error:", file=sys.stderr) - print(f" When accessing the Accessibility Database, {util_name} needs to be run with admin-privileges.\n", file=sys.stderr) + print(f" When accessing the global TCC Database, {util_name} needs to be run with admin-privileges.", file=sys.stderr) + print(f" To modify the local user database without sudo, use the --user flag.\n", file=sys.stderr) display_help(1) @@ -333,10 +341,12 @@ def main(): return global tcc_db + global using_local_db if args.user != None: try: if (len(args.user) > 0): pwd.getpwnam(args.user) - tcc_db = os.path.abspath(os.path.expanduser(f'~{args.user}/{tcc_db}')) + tcc_db = os.path.abspath(os.path.expanduser(f'~{args.user}/Library/Application Support/com.apple.TCC/TCC.db')) + using_local_db = True except KeyError: print(f'User "{args.user}" does not exist. Do you mean to use "{args.user}" as ACTION?', file=sys.stderr) sys.exit(1) From 0ccd9bf7c23e06fcd8adfdcdab1524fd3f61f688 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:56:11 +0000 Subject: [PATCH 3/4] Add .gitignore and remove __pycache__ Co-authored-by: jacobsalmela <3843505+jacobsalmela@users.noreply.github.com> --- .gitignore | 96 ++++++++++++++++++++++++++++ __pycache__/tccutil.cpython-312.pyc | Bin 16099 -> 0 bytes 2 files changed, 96 insertions(+) create mode 100644 .gitignore delete mode 100644 __pycache__/tccutil.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d9bfac --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/__pycache__/tccutil.cpython-312.pyc b/__pycache__/tccutil.cpython-312.pyc deleted file mode 100644 index fb5868ff21ca7e4f9f96b4b35fdfa52b34e6f27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16099 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 O{mvCD#gviz^8XD)T9pd` From a40f2ad8970a96156f6b5793799d9d440f7dd425 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Oct 2025 00:27:40 +0000 Subject: [PATCH 4/4] Bump version to 1.5.1 Co-authored-by: jacobsalmela <3843505+jacobsalmela@users.noreply.github.com> --- tccutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tccutil.py b/tccutil.py index b193271..de89cc0 100755 --- a/tccutil.py +++ b/tccutil.py @@ -25,7 +25,7 @@ util_name = os.path.basename(sys.argv[0]) # Utility Version -util_version = '1.5.0' +util_version = '1.5.1' # Current OS X version osx_version = version(mac_ver()[0]) # mac_ver() returns 10.16 for Big Sur instead 11.+