From 9e2bd3b34d354ca85293998ae566268ef55bab31 Mon Sep 17 00:00:00 2001 From: abhishekacharya200 Date: Fri, 16 Oct 2026 11:26:23 +0545 Subject: [PATCH] fix(oauth): save installer-latest in FileInstallationStore when historical data is disabled With historical_data_enabled=False, FileInstallationStore.save() only wrote the per-user installer file, so find_installation() without a user_id never found the installation. Write the workspace-level installer-latest file as well, matching AmazonS3InstallationStore. --- .../oauth/installation_store/file/__init__.py | 10 +++++-- .../oauth/installation_store/test_file.py | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/slack_sdk/oauth/installation_store/file/__init__.py b/slack_sdk/oauth/installation_store/file/__init__.py index aa6f6c52d..097792389 100644 --- a/slack_sdk/oauth/installation_store/file/__init__.py +++ b/slack_sdk/oauth/installation_store/file/__init__.py @@ -70,10 +70,14 @@ def save(self, installation: Installation): f.write(entity) else: + # per workspace + entity = json.dumps(installation.__dict__) + with open(f"{team_installation_dir}/installer-latest", "w") as f: + f.write(entity) + + # per workspace per user u_id = installation.user_id or none - installer_filepath = f"{team_installation_dir}/installer-{u_id}-latest" - with open(installer_filepath, "w") as f: - entity = json.dumps(installation.__dict__) + with open(f"{team_installation_dir}/installer-{u_id}-latest", "w") as f: f.write(entity) def save_bot(self, bot: Bot): diff --git a/tests/slack_sdk/oauth/installation_store/test_file.py b/tests/slack_sdk/oauth/installation_store/test_file.py index 74675452a..dbc21599f 100644 --- a/tests/slack_sdk/oauth/installation_store/test_file.py +++ b/tests/slack_sdk/oauth/installation_store/test_file.py @@ -1,3 +1,4 @@ +import tempfile import unittest from slack_sdk.oauth.installation_store import Installation, FileInstallationStore @@ -78,6 +79,34 @@ def test_save_and_find(self): bot = store.find_bot(enterprise_id="E111", team_id="T222") self.assertIsNone(bot) + def test_save_and_find_without_historical_data(self): + with tempfile.TemporaryDirectory() as base_dir: + store = FileInstallationStore(base_dir=base_dir, client_id="111.222", historical_data_enabled=False) + installation = Installation( + app_id="A111", + enterprise_id="E111", + team_id="T111", + user_id="U111", + bot_id="B111", + bot_token="xoxb-111", + bot_scopes=["chat:write"], + bot_user_id="U222", + ) + store.save(installation) + + bot = store.find_bot(enterprise_id="E111", team_id="T111") + self.assertIsNotNone(bot) + + i = store.find_installation(enterprise_id="E111", team_id="T111") + self.assertIsNotNone(i) + self.assertEqual(i.bot_token, "xoxb-111") + i = store.find_installation(enterprise_id="E111", team_id="T111", user_id="U111") + self.assertIsNotNone(i) + + store.delete_installation(enterprise_id="E111", team_id="T111") + i = store.find_installation(enterprise_id="E111", team_id="T111") + self.assertIsNone(i) + def test_org_installation(self): store = FileInstallationStore(client_id="111.222") installation = Installation(