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.
 
 
 
 
 
 

59 lines
2.2 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 {
claims.MaxAttachments = a.store.running[claims.Channel].Operation1.MaxClients
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.releaseDirectSessionWriter(ctx, claims.Channel, claims.SessionID)
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
}