summaryrefslogtreecommitdiffhomepage
path: root/internal/permission
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-21 19:59:35 +0200
committerGitHub <[email protected]>2025-04-21 19:59:35 +0200
commitf33dff87725764af0b675b5e5b2e011b21c14c90 (patch)
tree4fe2c022305f13775f2cab3cdd80cd808259765b /internal/permission
parent6b1c64bcc75b89c530294b6a2d4404682b435d56 (diff)
parent3a6a26981a8074b6ab0eaadb520db986e04799ff (diff)
downloadopencode-f33dff87725764af0b675b5e5b2e011b21c14c90.tar.gz
opencode-f33dff87725764af0b675b5e5b2e011b21c14c90.zip
Merge pull request #27 from kujtimiihoxha/opencode
OpenCode - Initial Implementation
Diffstat (limited to 'internal/permission')
-rw-r--r--internal/permission/permission.go32
1 files changed, 27 insertions, 5 deletions
diff --git a/internal/permission/permission.go b/internal/permission/permission.go
index ebf3fe092..f36efea65 100644
--- a/internal/permission/permission.go
+++ b/internal/permission/permission.go
@@ -1,20 +1,28 @@
package permission
import (
+ "errors"
+ "path/filepath"
+ "slices"
"sync"
"time"
"github.com/google/uuid"
- "github.com/kujtimiihoxha/termai/internal/pubsub"
+ "github.com/kujtimiihoxha/opencode/internal/config"
+ "github.com/kujtimiihoxha/opencode/internal/pubsub"
)
+var ErrorPermissionDenied = errors.New("permission denied")
+
type CreatePermissionRequest struct {
+ SessionID string `json:"session_id"`
ToolName string `json:"tool_name"`
Description string `json:"description"`
Action string `json:"action"`
Params any `json:"params"`
Path string `json:"path"`
}
+
type PermissionRequest struct {
ID string `json:"id"`
SessionID string `json:"session_id"`
@@ -31,13 +39,15 @@ type Service interface {
Grant(permission PermissionRequest)
Deny(permission PermissionRequest)
Request(opts CreatePermissionRequest) bool
+ AutoApproveSession(sessionID string)
}
type permissionService struct {
*pubsub.Broker[PermissionRequest]
- sessionPermissions []PermissionRequest
- pendingRequests sync.Map
+ sessionPermissions []PermissionRequest
+ pendingRequests sync.Map
+ autoApproveSessions []string
}
func (s *permissionService) GrantPersistant(permission PermissionRequest) {
@@ -63,9 +73,17 @@ func (s *permissionService) Deny(permission PermissionRequest) {
}
func (s *permissionService) Request(opts CreatePermissionRequest) bool {
+ if slices.Contains(s.autoApproveSessions, opts.SessionID) {
+ return true
+ }
+ dir := filepath.Dir(opts.Path)
+ if dir == "." {
+ dir = config.WorkingDirectory()
+ }
permission := PermissionRequest{
ID: uuid.New().String(),
- Path: opts.Path,
+ Path: dir,
+ SessionID: opts.SessionID,
ToolName: opts.ToolName,
Description: opts.Description,
Action: opts.Action,
@@ -73,7 +91,7 @@ func (s *permissionService) Request(opts CreatePermissionRequest) bool {
}
for _, p := range s.sessionPermissions {
- if p.ToolName == permission.ToolName && p.Action == permission.Action {
+ if p.ToolName == permission.ToolName && p.Action == permission.Action && p.SessionID == permission.SessionID && p.Path == permission.Path {
return true
}
}
@@ -94,6 +112,10 @@ func (s *permissionService) Request(opts CreatePermissionRequest) bool {
}
}
+func (s *permissionService) AutoApproveSession(sessionID string) {
+ s.autoApproveSessions = append(s.autoApproveSessions, sessionID)
+}
+
func NewPermissionService() Service {
return &permissionService{
Broker: pubsub.NewBroker[PermissionRequest](),