package httpapi import ( "errors" "fmt" "calllinesystem/server/internal/model" ) var errTicketPhoneUnavailable = errors.New("ticket phone data is unavailable") func cloneStringPointer(value *string) *string { if value == nil { return nil } copy := *value return © } func stringPointer(value string) *string { return &value } func (s *Server) decryptTicketPersonal(ticket model.QueueTicket) (string, string, error) { phone, err := s.decryptTicketPhone(ticket) if err != nil { return "", "", err } lastName, err := s.decryptTicketLastName(ticket) if err != nil { return "", "", err } return phone, lastName, nil } func (s *Server) decryptTicketPhone(ticket model.QueueTicket) (string, error) { if ticket.PhoneHMAC == nil || len(ticket.PhoneCiphertext) == 0 || len(ticket.PhoneNonce) == 0 { return "", errTicketPhoneUnavailable } phone, err := s.cipher.Decrypt(ticket.PhoneCiphertext, ticket.PhoneNonce, []byte("phone:"+ticket.ProjectID)) if err != nil { return "", fmt.Errorf("decrypt ticket phone: %w", err) } return phone, nil } func (s *Server) decryptTicketLastName(ticket model.QueueTicket) (string, error) { if len(ticket.LastNameCiphertext) == 0 && len(ticket.LastNameNonce) == 0 { return "", nil } if len(ticket.LastNameCiphertext) == 0 || len(ticket.LastNameNonce) == 0 { return "", errors.New("ticket last name data is incomplete") } lastName, err := s.cipher.Decrypt(ticket.LastNameCiphertext, ticket.LastNameNonce, []byte("last_name:"+ticket.ProjectID)) if err != nil { return "", fmt.Errorf("decrypt ticket last name: %w", err) } return lastName, nil } func (s *Server) ticketPhoneLast4(ticket model.QueueTicket) (string, error) { phone, err := s.decryptTicketPhone(ticket) if err != nil { if errors.Is(err, errTicketPhoneUnavailable) { return "", nil } return "", err } return phoneLast4(phone) } func phoneLast4(phone string) (string, error) { digits := make([]byte, 0, len(phone)) for i := 0; i < len(phone); i++ { if phone[i] >= '0' && phone[i] <= '9' { digits = append(digits, phone[i]) } } if len(digits) < 4 { return "", errors.New("ticket phone has fewer than four digits") } return string(digits[len(digits)-4:]), nil }