Skip to content

Commit 7b3b177

Browse files
committed
fix(slack): unify workspace name sanitization, improve credential handling
- Extract SanitizeWorkspaceName to source/slack for shared use - DeleteCredentials now returns non-"not found" keyring errors - Require cookie when xoxc- token is used in manual login - Remove dead Workspace field from SlackToolDeps
1 parent 80bd9b5 commit 7b3b177

File tree

5 files changed

+25
-13
lines changed

5 files changed

+25
-13
lines changed

channel/telegram/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ func (sm *SessionManager) registerSlackTools(reg *tools.Registry) {
263263
return
264264
}
265265
client := slacksrc.NewClient(creds.Token, creds.Cookie)
266-
deps := tools.SlackToolDeps{Client: client, Interactor: sm.interactor, Workspace: sm.cfg.Slack.DefaultWorkspace}
266+
deps := tools.SlackToolDeps{Client: client, Interactor: sm.interactor}
267267
reg.Register(tools.NewSlackSearchTool(deps))
268268
reg.Register(tools.NewSlackReadChannelTool(deps))
269269
reg.Register(tools.NewSlackReadThreadTool(deps))

internal/cli/auth/slack.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func slackLoginDesktop() error {
6565
return fmt.Errorf("desktop extraction failed: %w", err)
6666
}
6767

68-
workspace := sanitizeWorkspaceName(creds.TeamName)
68+
workspace := slacksrc.SanitizeWorkspaceName(creds.TeamName)
6969
if err := slacksrc.SaveCredentials(workspace, creds.Token, creds.Cookie); err != nil {
7070
return fmt.Errorf("save credentials: %w", err)
7171
}
@@ -120,7 +120,7 @@ func slackLoginToken() error {
120120
return err
121121
}
122122

123-
workspace = sanitizeWorkspaceName(strings.TrimSpace(workspace))
123+
workspace = slacksrc.SanitizeWorkspaceName(strings.TrimSpace(workspace))
124124
token = strings.TrimSpace(token)
125125
cookie = strings.TrimSpace(cookie)
126126

@@ -130,6 +130,9 @@ func slackLoginToken() error {
130130
if err := slacksrc.ValidateToken(token); err != nil {
131131
return err
132132
}
133+
if strings.HasPrefix(token, "xoxc-") && cookie == "" {
134+
return fmt.Errorf("xoxc- tokens require a cookie (xoxd-) value")
135+
}
133136

134137
client := slacksrc.NewClient(token, cookie)
135138
teamID, teamName, _, err := client.AuthTest(context.Background())
@@ -248,12 +251,6 @@ var slackStatusCmd = &cobra.Command{
248251
},
249252
}
250253

251-
func sanitizeWorkspaceName(name string) string {
252-
name = strings.ToLower(name)
253-
name = strings.ReplaceAll(name, " ", "-")
254-
return name
255-
}
256-
257254
func init() {
258255
slackCmd.AddCommand(slackLoginCmd)
259256
slackCmd.AddCommand(slackLogoutCmd)

internal/cli/chat.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func registerSlackTools(cfg *config.Config, reg *tools.Registry, ch *clicli.Chan
205205
}
206206
client := slacksrc.NewClient(creds.Token, creds.Cookie)
207207
inter := &cliInteractor{ch: ch}
208-
deps := tools.SlackToolDeps{Client: client, Interactor: inter, Workspace: cfg.Slack.DefaultWorkspace}
208+
deps := tools.SlackToolDeps{Client: client, Interactor: inter}
209209

210210
reg.Register(tools.NewSlackSearchTool(deps))
211211
reg.Register(tools.NewSlackReadChannelTool(deps))

internal/cli/setup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ func setupSlack(cfg *config.Config) error {
435435

436436
creds, err := desktop.Extract()
437437
if err == nil {
438-
workspace := strings.ToLower(strings.ReplaceAll(creds.TeamName, " ", "-"))
438+
workspace := slacksrc.SanitizeWorkspaceName(creds.TeamName)
439439
if err := slacksrc.SaveCredentials(workspace, creds.Token, creds.Cookie); err != nil {
440440
return fmt.Errorf("save credentials: %w", err)
441441
}

source/slack/credential.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,26 @@ func LoadCredentials(workspace string) (*Credentials, error) {
3939
}
4040

4141
func DeleteCredentials(workspace string) error {
42-
_ = keyring.Delete(keyringService, tokenAccount(workspace))
43-
_ = keyring.Delete(keyringService, cookieAccount(workspace))
42+
var errs []error
43+
if err := keyring.Delete(keyringService, tokenAccount(workspace)); err != nil && err != keyring.ErrNotFound {
44+
errs = append(errs, fmt.Errorf("delete token: %w", err))
45+
}
46+
if err := keyring.Delete(keyringService, cookieAccount(workspace)); err != nil && err != keyring.ErrNotFound {
47+
errs = append(errs, fmt.Errorf("delete cookie: %w", err))
48+
}
49+
if len(errs) > 0 {
50+
return errs[0]
51+
}
4452
return nil
4553
}
4654

55+
// SanitizeWorkspaceName normalizes a workspace name for use as a key.
56+
func SanitizeWorkspaceName(name string) string {
57+
name = strings.ToLower(name)
58+
name = strings.ReplaceAll(name, " ", "-")
59+
return name
60+
}
61+
4762
func ListWorkspaces() ([]string, error) {
4863
// go-keyring doesn't support listing, so we rely on config.
4964
// This is a helper that callers fill from config.Slack.Workspaces keys.

0 commit comments

Comments
 (0)