@@ -8,13 +8,15 @@ import (
88)
99
1010const (
11- serviceName = "slack-cli"
12- botTokenKey = "bot_token"
13- userTokenKey = "user_token"
14- teamIDKey = "team_id"
15- teamNameKey = "team_name"
16- userIDKey = "user_id"
17- userNameKey = "user_name"
11+ serviceName = "slack-cli"
12+ botTokenKey = "bot_token"
13+ userTokenKey = "user_token"
14+ teamIDKey = "team_id"
15+ teamNameKey = "team_name"
16+ userIDKey = "user_id"
17+ userNameKey = "user_name"
18+ botUserIDKey = "bot_user_id"
19+ botUserNameKey = "bot_user_name"
1820)
1921
2022// StoreBotToken saves a bot token (xoxb-) to the OS keyring, falling back to plaintext.
@@ -43,22 +45,19 @@ func StoreTeamInfo(teamID, teamName string) error {
4345 return ac .Save ()
4446}
4547
46- // ResolveUserID returns the user's Slack ID, fetching it via auth.test if not
47- // already stored (e.g. tokens saved before UserID tracking was added).
48- // The result is cached to the keyring/file for future calls .
48+ // ResolveUserID returns the human user's Slack ID, fetching it via auth.test
49+ // on the user token if not already stored. Only uses the user token (not bot)
50+ // to ensure the returned ID is the human's, not the bot's .
4951func ResolveUserID () (userID , userName string , err error ) {
5052 userID , userName = GetUserInfo ()
5153 if userID != "" {
5254 return userID , userName , nil
5355 }
5456
55- // Try user token first, then bot token
57+ // Only use user token — bot token would return the bot's identity
5658 token , tokenErr := GetUserToken ()
5759 if tokenErr != nil || token == "" {
58- token , tokenErr = GetBotToken ()
59- if tokenErr != nil || token == "" {
60- return "" , "" , fmt .Errorf ("no tokens available to resolve user ID" )
61- }
60+ return "" , "" , fmt .Errorf ("no user token available to resolve user ID (bot token returns bot identity, not yours)" )
6261 }
6362
6463 info , err := ValidateToken (token )
@@ -85,7 +84,7 @@ func GetUserToken() (string, error) {
8584 })
8685}
8786
88- // StoreUserInfo saves the authenticated user's Slack ID and username.
87+ // StoreUserInfo saves the human user's Slack ID and username (from user token auth.test) .
8988func StoreUserInfo (userID , userName string ) error {
9089 _ = keyring .Set (serviceName , userIDKey , userID )
9190 _ = keyring .Set (serviceName , userNameKey , userName )
@@ -97,7 +96,19 @@ func StoreUserInfo(userID, userName string) error {
9796 return ac .Save ()
9897}
9998
100- // GetUserInfo retrieves the stored user ID and username.
99+ // StoreBotUserInfo saves the bot's Slack user ID and username (from bot token auth.test).
100+ func StoreBotUserInfo (userID , userName string ) error {
101+ _ = keyring .Set (serviceName , botUserIDKey , userID )
102+ _ = keyring .Set (serviceName , botUserNameKey , userName )
103+
104+ // Also persist to file as fallback
105+ ac , _ := config .LoadAuth ()
106+ ac .BotUserID = userID
107+ ac .BotUserName = userName
108+ return ac .Save ()
109+ }
110+
111+ // GetUserInfo retrieves the stored human user ID and username.
101112func GetUserInfo () (userID , userName string ) {
102113 userID , _ = keyring .Get (serviceName , userIDKey )
103114 userName , _ = keyring .Get (serviceName , userNameKey )
@@ -112,6 +123,21 @@ func GetUserInfo() (userID, userName string) {
112123 return ac .UserID , ac .UserName
113124}
114125
126+ // GetBotUserInfo retrieves the stored bot user ID and username.
127+ func GetBotUserInfo () (userID , userName string ) {
128+ userID , _ = keyring .Get (serviceName , botUserIDKey )
129+ userName , _ = keyring .Get (serviceName , botUserNameKey )
130+ if userID != "" {
131+ return
132+ }
133+
134+ ac , err := config .LoadAuth ()
135+ if err != nil {
136+ return "" , ""
137+ }
138+ return ac .BotUserID , ac .BotUserName
139+ }
140+
115141// GetTeamInfo retrieves the stored team ID and name.
116142func GetTeamInfo () (teamID , teamName string ) {
117143 teamID , _ = keyring .Get (serviceName , teamIDKey )
@@ -135,6 +161,8 @@ func ClearTokens() error {
135161 _ = keyring .Delete (serviceName , teamNameKey )
136162 _ = keyring .Delete (serviceName , userIDKey )
137163 _ = keyring .Delete (serviceName , userNameKey )
164+ _ = keyring .Delete (serviceName , botUserIDKey )
165+ _ = keyring .Delete (serviceName , botUserNameKey )
138166
139167 ac := & config.AuthConfig {}
140168 _ = ac .Clear ()
0 commit comments