84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
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
|
|
}
|