You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.1 KiB
58 lines
2.1 KiB
package mock
|
|
|
|
import (
|
|
"context"
|
|
|
|
"tera-clone/services/tera-api/internal/directstream"
|
|
"tera-clone/services/tera-api/internal/domain"
|
|
)
|
|
|
|
// DirectTicketAuthority keeps ticket issuance, consumption, lifecycle, and
|
|
// audit ownership in tera-api while tera-sessiond handles only streaming.
|
|
type DirectTicketAuthority struct {
|
|
store *Store
|
|
}
|
|
|
|
func NewDirectTicketAuthority(store *Store) *DirectTicketAuthority {
|
|
return &DirectTicketAuthority{store: store}
|
|
}
|
|
|
|
func (a *DirectTicketAuthority) ConsumeTicket(_ context.Context, value string, binding directstream.TicketBinding) (directstream.TicketClaims, error) {
|
|
claims, err := a.store.directTickets.Consume(value, binding)
|
|
a.store.mu.Lock()
|
|
defer a.store.mu.Unlock()
|
|
ctx := context.Background()
|
|
result := "rejected"
|
|
message := "Direct Mode stream ticket rejected"
|
|
if err == nil {
|
|
ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor})
|
|
result = "succeeded"
|
|
message = "Direct Mode stream ticket consumed by tera-sessiond for session " + claims.SessionID
|
|
}
|
|
a.store.recordAuditLocked(ctx, "direct.stream.ticket.consume", binding.Channel, result, message)
|
|
return claims, err
|
|
}
|
|
|
|
func (a *DirectTicketAuthority) CloseConsumedStream(ctx context.Context, claims directstream.TicketClaims) error {
|
|
ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor})
|
|
_, err := a.store.CloseDirectSession(ctx, claims.Channel, claims.SessionID)
|
|
return err
|
|
}
|
|
|
|
func (a *DirectTicketAuthority) ReleaseConsumedWriter(ctx context.Context, claims directstream.TicketClaims) error {
|
|
ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor})
|
|
_, err := a.store.ReleaseDirectWriter(ctx, claims.Channel)
|
|
return err
|
|
}
|
|
|
|
func (a *DirectTicketAuthority) RecordConsumedStreamEvent(ctx context.Context, claims directstream.TicketClaims, event directstream.SessionEvent) error {
|
|
ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor})
|
|
_, err := a.store.RecordPortLog(ctx, domain.PortLogEvent{
|
|
Timestamp: event.Timestamp,
|
|
Channel: claims.Channel,
|
|
EventType: "session",
|
|
Actor: claims.Actor + "/" + claims.SessionID,
|
|
Message: directstream.SessionEventMessage(claims, event),
|
|
})
|
|
return err
|
|
}
|
|
|