github.com/gravitational/teleport/api@v0.0.0-20240507183017-3110591cbafc/types/events/oneof.go (about) 1 /* 2 Copyright 2021 Gravitational, Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package events 18 19 import ( 20 "context" 21 "encoding/json" 22 "log/slog" 23 "reflect" 24 25 "github.com/gravitational/trace" 26 ) 27 28 // MustToOneOf converts audit event to OneOf 29 // or panics, used in tests 30 func MustToOneOf(in AuditEvent) *OneOf { 31 out, err := ToOneOf(in) 32 if err != nil { 33 panic(err) 34 } 35 return out 36 } 37 38 // ToOneOf converts audit event to union type of the events 39 func ToOneOf(in AuditEvent) (*OneOf, error) { 40 out := OneOf{} 41 42 switch e := in.(type) { 43 case *UserLogin: 44 out.Event = &OneOf_UserLogin{ 45 UserLogin: e, 46 } 47 case *UserCreate: 48 out.Event = &OneOf_UserCreate{ 49 UserCreate: e, 50 } 51 case *UserUpdate: 52 out.Event = &OneOf_UserUpdate{ 53 UserUpdate: e, 54 } 55 case *UserDelete: 56 out.Event = &OneOf_UserDelete{ 57 UserDelete: e, 58 } 59 case *UserPasswordChange: 60 out.Event = &OneOf_UserPasswordChange{ 61 UserPasswordChange: e, 62 } 63 case *SessionStart: 64 out.Event = &OneOf_SessionStart{ 65 SessionStart: e, 66 } 67 case *SessionJoin: 68 out.Event = &OneOf_SessionJoin{ 69 SessionJoin: e, 70 } 71 case *SessionPrint: 72 out.Event = &OneOf_SessionPrint{ 73 SessionPrint: e, 74 } 75 case *SessionReject: 76 out.Event = &OneOf_SessionReject{ 77 SessionReject: e, 78 } 79 case *Resize: 80 out.Event = &OneOf_Resize{ 81 Resize: e, 82 } 83 case *SessionEnd: 84 out.Event = &OneOf_SessionEnd{ 85 SessionEnd: e, 86 } 87 case *SessionCommand: 88 out.Event = &OneOf_SessionCommand{ 89 SessionCommand: e, 90 } 91 case *SessionDisk: 92 out.Event = &OneOf_SessionDisk{ 93 SessionDisk: e, 94 } 95 case *SessionNetwork: 96 out.Event = &OneOf_SessionNetwork{ 97 SessionNetwork: e, 98 } 99 case *SessionData: 100 out.Event = &OneOf_SessionData{ 101 SessionData: e, 102 } 103 case *SessionLeave: 104 out.Event = &OneOf_SessionLeave{ 105 SessionLeave: e, 106 } 107 case *PortForward: 108 out.Event = &OneOf_PortForward{ 109 PortForward: e, 110 } 111 case *X11Forward: 112 out.Event = &OneOf_X11Forward{ 113 X11Forward: e, 114 } 115 case *Subsystem: 116 out.Event = &OneOf_Subsystem{ 117 Subsystem: e, 118 } 119 case *SCP: 120 out.Event = &OneOf_SCP{ 121 SCP: e, 122 } 123 case *Exec: 124 out.Event = &OneOf_Exec{ 125 Exec: e, 126 } 127 case *ClientDisconnect: 128 out.Event = &OneOf_ClientDisconnect{ 129 ClientDisconnect: e, 130 } 131 case *AuthAttempt: 132 out.Event = &OneOf_AuthAttempt{ 133 AuthAttempt: e, 134 } 135 case *AccessRequestCreate: 136 out.Event = &OneOf_AccessRequestCreate{ 137 AccessRequestCreate: e, 138 } 139 case *AccessRequestResourceSearch: 140 out.Event = &OneOf_AccessRequestResourceSearch{ 141 AccessRequestResourceSearch: e, 142 } 143 case *RoleCreate: 144 out.Event = &OneOf_RoleCreate{ 145 RoleCreate: e, 146 } 147 case *RoleUpdate: 148 out.Event = &OneOf_RoleUpdate{ 149 RoleUpdate: e, 150 } 151 case *RoleDelete: 152 out.Event = &OneOf_RoleDelete{ 153 RoleDelete: e, 154 } 155 case *UserTokenCreate: 156 out.Event = &OneOf_UserTokenCreate{ 157 UserTokenCreate: e, 158 } 159 case *TrustedClusterCreate: 160 out.Event = &OneOf_TrustedClusterCreate{ 161 TrustedClusterCreate: e, 162 } 163 case *TrustedClusterDelete: 164 out.Event = &OneOf_TrustedClusterDelete{ 165 TrustedClusterDelete: e, 166 } 167 case *TrustedClusterTokenCreate: 168 out.Event = &OneOf_TrustedClusterTokenCreate{ 169 TrustedClusterTokenCreate: e, 170 } 171 case *ProvisionTokenCreate: 172 out.Event = &OneOf_ProvisionTokenCreate{ 173 ProvisionTokenCreate: e, 174 } 175 case *GithubConnectorCreate: 176 out.Event = &OneOf_GithubConnectorCreate{ 177 GithubConnectorCreate: e, 178 } 179 case *GithubConnectorUpdate: 180 out.Event = &OneOf_GithubConnectorUpdate{ 181 GithubConnectorUpdate: e, 182 } 183 case *GithubConnectorDelete: 184 out.Event = &OneOf_GithubConnectorDelete{ 185 GithubConnectorDelete: e, 186 } 187 case *OIDCConnectorCreate: 188 out.Event = &OneOf_OIDCConnectorCreate{ 189 OIDCConnectorCreate: e, 190 } 191 case *OIDCConnectorUpdate: 192 out.Event = &OneOf_OIDCConnectorUpdate{ 193 OIDCConnectorUpdate: e, 194 } 195 case *OIDCConnectorDelete: 196 out.Event = &OneOf_OIDCConnectorDelete{ 197 OIDCConnectorDelete: e, 198 } 199 case *SAMLConnectorCreate: 200 out.Event = &OneOf_SAMLConnectorCreate{ 201 SAMLConnectorCreate: e, 202 } 203 case *SAMLConnectorUpdate: 204 out.Event = &OneOf_SAMLConnectorUpdate{ 205 SAMLConnectorUpdate: e, 206 } 207 case *SAMLConnectorDelete: 208 out.Event = &OneOf_SAMLConnectorDelete{ 209 SAMLConnectorDelete: e, 210 } 211 case *KubeRequest: 212 out.Event = &OneOf_KubeRequest{ 213 KubeRequest: e, 214 } 215 case *AppSessionStart: 216 out.Event = &OneOf_AppSessionStart{ 217 AppSessionStart: e, 218 } 219 case *AppSessionEnd: 220 out.Event = &OneOf_AppSessionEnd{ 221 AppSessionEnd: e, 222 } 223 case *AppSessionChunk: 224 out.Event = &OneOf_AppSessionChunk{ 225 AppSessionChunk: e, 226 } 227 case *AppSessionRequest: 228 out.Event = &OneOf_AppSessionRequest{ 229 AppSessionRequest: e, 230 } 231 case *AppSessionDynamoDBRequest: 232 out.Event = &OneOf_AppSessionDynamoDBRequest{ 233 AppSessionDynamoDBRequest: e, 234 } 235 case *AppCreate: 236 out.Event = &OneOf_AppCreate{ 237 AppCreate: e, 238 } 239 case *AppUpdate: 240 out.Event = &OneOf_AppUpdate{ 241 AppUpdate: e, 242 } 243 case *AppDelete: 244 out.Event = &OneOf_AppDelete{ 245 AppDelete: e, 246 } 247 case *DatabaseCreate: 248 out.Event = &OneOf_DatabaseCreate{ 249 DatabaseCreate: e, 250 } 251 case *DatabaseUpdate: 252 out.Event = &OneOf_DatabaseUpdate{ 253 DatabaseUpdate: e, 254 } 255 case *DatabaseDelete: 256 out.Event = &OneOf_DatabaseDelete{ 257 DatabaseDelete: e, 258 } 259 case *DatabaseSessionStart: 260 out.Event = &OneOf_DatabaseSessionStart{ 261 DatabaseSessionStart: e, 262 } 263 case *DatabaseSessionEnd: 264 out.Event = &OneOf_DatabaseSessionEnd{ 265 DatabaseSessionEnd: e, 266 } 267 case *DatabaseSessionQuery: 268 out.Event = &OneOf_DatabaseSessionQuery{ 269 DatabaseSessionQuery: e, 270 } 271 case *DatabasePermissionUpdate: 272 out.Event = &OneOf_DatabasePermissionUpdate{ 273 DatabasePermissionUpdate: e, 274 } 275 case *PostgresParse: 276 out.Event = &OneOf_PostgresParse{ 277 PostgresParse: e, 278 } 279 case *PostgresBind: 280 out.Event = &OneOf_PostgresBind{ 281 PostgresBind: e, 282 } 283 case *PostgresExecute: 284 out.Event = &OneOf_PostgresExecute{ 285 PostgresExecute: e, 286 } 287 case *PostgresClose: 288 out.Event = &OneOf_PostgresClose{ 289 PostgresClose: e, 290 } 291 case *PostgresFunctionCall: 292 out.Event = &OneOf_PostgresFunctionCall{ 293 PostgresFunctionCall: e, 294 } 295 case *SessionUpload: 296 out.Event = &OneOf_SessionUpload{ 297 SessionUpload: e, 298 } 299 case *MFADeviceAdd: 300 out.Event = &OneOf_MFADeviceAdd{ 301 MFADeviceAdd: e, 302 } 303 case *MFADeviceDelete: 304 out.Event = &OneOf_MFADeviceDelete{ 305 MFADeviceDelete: e, 306 } 307 case *DeviceEvent: 308 out.Event = &OneOf_DeviceEvent{ 309 DeviceEvent: e, 310 } 311 case *DeviceEvent2: 312 out.Event = &OneOf_DeviceEvent2{ 313 DeviceEvent2: e, 314 } 315 case *BillingCardCreate: 316 out.Event = &OneOf_BillingCardCreate{ 317 BillingCardCreate: e, 318 } 319 case *BillingCardDelete: 320 out.Event = &OneOf_BillingCardDelete{ 321 BillingCardDelete: e, 322 } 323 case *LockCreate: 324 out.Event = &OneOf_LockCreate{ 325 LockCreate: e, 326 } 327 case *LockDelete: 328 out.Event = &OneOf_LockDelete{ 329 LockDelete: e, 330 } 331 case *BillingInformationUpdate: 332 out.Event = &OneOf_BillingInformationUpdate{ 333 BillingInformationUpdate: e, 334 } 335 case *RecoveryCodeGenerate: 336 out.Event = &OneOf_RecoveryCodeGenerate{ 337 RecoveryCodeGenerate: e, 338 } 339 case *RecoveryCodeUsed: 340 out.Event = &OneOf_RecoveryCodeUsed{ 341 RecoveryCodeUsed: e, 342 } 343 case *WindowsDesktopSessionStart: 344 out.Event = &OneOf_WindowsDesktopSessionStart{ 345 WindowsDesktopSessionStart: e, 346 } 347 case *WindowsDesktopSessionEnd: 348 out.Event = &OneOf_WindowsDesktopSessionEnd{ 349 WindowsDesktopSessionEnd: e, 350 } 351 case *SessionConnect: 352 out.Event = &OneOf_SessionConnect{ 353 SessionConnect: e, 354 } 355 case *AccessRequestDelete: 356 out.Event = &OneOf_AccessRequestDelete{ 357 AccessRequestDelete: e, 358 } 359 case *CertificateCreate: 360 out.Event = &OneOf_CertificateCreate{ 361 CertificateCreate: e, 362 } 363 case *DesktopRecording: 364 out.Event = &OneOf_DesktopRecording{ 365 DesktopRecording: e, 366 } 367 case *DesktopClipboardReceive: 368 out.Event = &OneOf_DesktopClipboardReceive{ 369 DesktopClipboardReceive: e, 370 } 371 case *DesktopClipboardSend: 372 out.Event = &OneOf_DesktopClipboardSend{ 373 DesktopClipboardSend: e, 374 } 375 case *MySQLStatementPrepare: 376 out.Event = &OneOf_MySQLStatementPrepare{ 377 MySQLStatementPrepare: e, 378 } 379 case *MySQLStatementExecute: 380 out.Event = &OneOf_MySQLStatementExecute{ 381 MySQLStatementExecute: e, 382 } 383 case *MySQLStatementSendLongData: 384 out.Event = &OneOf_MySQLStatementSendLongData{ 385 MySQLStatementSendLongData: e, 386 } 387 case *MySQLStatementClose: 388 out.Event = &OneOf_MySQLStatementClose{ 389 MySQLStatementClose: e, 390 } 391 case *MySQLStatementReset: 392 out.Event = &OneOf_MySQLStatementReset{ 393 MySQLStatementReset: e, 394 } 395 case *MySQLStatementFetch: 396 out.Event = &OneOf_MySQLStatementFetch{ 397 MySQLStatementFetch: e, 398 } 399 case *MySQLStatementBulkExecute: 400 out.Event = &OneOf_MySQLStatementBulkExecute{ 401 MySQLStatementBulkExecute: e, 402 } 403 case *MySQLInitDB: 404 out.Event = &OneOf_MySQLInitDB{ 405 MySQLInitDB: e, 406 } 407 case *MySQLCreateDB: 408 out.Event = &OneOf_MySQLCreateDB{ 409 MySQLCreateDB: e, 410 } 411 case *MySQLDropDB: 412 out.Event = &OneOf_MySQLDropDB{ 413 MySQLDropDB: e, 414 } 415 case *MySQLShutDown: 416 out.Event = &OneOf_MySQLShutDown{ 417 MySQLShutDown: e, 418 } 419 case *MySQLProcessKill: 420 out.Event = &OneOf_MySQLProcessKill{ 421 MySQLProcessKill: e, 422 } 423 case *MySQLDebug: 424 out.Event = &OneOf_MySQLDebug{ 425 MySQLDebug: e, 426 } 427 case *MySQLRefresh: 428 out.Event = &OneOf_MySQLRefresh{ 429 MySQLRefresh: e, 430 } 431 case *SQLServerRPCRequest: 432 out.Event = &OneOf_SQLServerRPCRequest{ 433 SQLServerRPCRequest: e, 434 } 435 case *ElasticsearchRequest: 436 out.Event = &OneOf_ElasticsearchRequest{ 437 ElasticsearchRequest: e, 438 } 439 case *OpenSearchRequest: 440 out.Event = &OneOf_OpenSearchRequest{ 441 OpenSearchRequest: e, 442 } 443 case *DynamoDBRequest: 444 out.Event = &OneOf_DynamoDBRequest{ 445 DynamoDBRequest: e, 446 } 447 case *DatabaseSessionMalformedPacket: 448 out.Event = &OneOf_DatabaseSessionMalformedPacket{ 449 DatabaseSessionMalformedPacket: e, 450 } 451 case *RenewableCertificateGenerationMismatch: 452 out.Event = &OneOf_RenewableCertificateGenerationMismatch{ 453 RenewableCertificateGenerationMismatch: e, 454 } 455 case *SFTP: 456 out.Event = &OneOf_SFTP{ 457 SFTP: e, 458 } 459 case *UpgradeWindowStartUpdate: 460 out.Event = &OneOf_UpgradeWindowStartUpdate{ 461 UpgradeWindowStartUpdate: e, 462 } 463 case *SessionRecordingAccess: 464 out.Event = &OneOf_SessionRecordingAccess{ 465 SessionRecordingAccess: e, 466 } 467 case *SSMRun: 468 out.Event = &OneOf_SSMRun{ 469 SSMRun: e, 470 } 471 case *Unknown: 472 out.Event = &OneOf_Unknown{ 473 Unknown: e, 474 } 475 case *CassandraBatch: 476 out.Event = &OneOf_CassandraBatch{ 477 CassandraBatch: e, 478 } 479 case *CassandraPrepare: 480 out.Event = &OneOf_CassandraPrepare{ 481 CassandraPrepare: e, 482 } 483 case *CassandraRegister: 484 out.Event = &OneOf_CassandraRegister{ 485 CassandraRegister: e, 486 } 487 case *CassandraExecute: 488 out.Event = &OneOf_CassandraExecute{ 489 CassandraExecute: e, 490 } 491 case *KubernetesClusterCreate: 492 out.Event = &OneOf_KubernetesClusterCreate{ 493 KubernetesClusterCreate: e, 494 } 495 case *KubernetesClusterUpdate: 496 out.Event = &OneOf_KubernetesClusterUpdate{ 497 KubernetesClusterUpdate: e, 498 } 499 case *KubernetesClusterDelete: 500 out.Event = &OneOf_KubernetesClusterDelete{ 501 KubernetesClusterDelete: e, 502 } 503 case *DesktopSharedDirectoryStart: 504 out.Event = &OneOf_DesktopSharedDirectoryStart{ 505 DesktopSharedDirectoryStart: e, 506 } 507 case *DesktopSharedDirectoryRead: 508 out.Event = &OneOf_DesktopSharedDirectoryRead{ 509 DesktopSharedDirectoryRead: e, 510 } 511 case *DesktopSharedDirectoryWrite: 512 out.Event = &OneOf_DesktopSharedDirectoryWrite{ 513 DesktopSharedDirectoryWrite: e, 514 } 515 case *BotJoin: 516 out.Event = &OneOf_BotJoin{ 517 BotJoin: e, 518 } 519 case *InstanceJoin: 520 out.Event = &OneOf_InstanceJoin{ 521 InstanceJoin: e, 522 } 523 case *BotCreate: 524 out.Event = &OneOf_BotCreate{ 525 BotCreate: e, 526 } 527 case *BotUpdate: 528 out.Event = &OneOf_BotUpdate{ 529 BotUpdate: e, 530 } 531 case *BotDelete: 532 out.Event = &OneOf_BotDelete{ 533 BotDelete: e, 534 } 535 case *LoginRuleCreate: 536 out.Event = &OneOf_LoginRuleCreate{ 537 LoginRuleCreate: e, 538 } 539 case *LoginRuleDelete: 540 out.Event = &OneOf_LoginRuleDelete{ 541 LoginRuleDelete: e, 542 } 543 case *SAMLIdPAuthAttempt: 544 out.Event = &OneOf_SAMLIdPAuthAttempt{ 545 SAMLIdPAuthAttempt: e, 546 } 547 case *SAMLIdPServiceProviderCreate: 548 out.Event = &OneOf_SAMLIdPServiceProviderCreate{ 549 SAMLIdPServiceProviderCreate: e, 550 } 551 case *SAMLIdPServiceProviderUpdate: 552 out.Event = &OneOf_SAMLIdPServiceProviderUpdate{ 553 SAMLIdPServiceProviderUpdate: e, 554 } 555 case *SAMLIdPServiceProviderDelete: 556 out.Event = &OneOf_SAMLIdPServiceProviderDelete{ 557 SAMLIdPServiceProviderDelete: e, 558 } 559 case *SAMLIdPServiceProviderDeleteAll: 560 out.Event = &OneOf_SAMLIdPServiceProviderDeleteAll{ 561 SAMLIdPServiceProviderDeleteAll: e, 562 } 563 case *OktaResourcesUpdate: 564 out.Event = &OneOf_OktaResourcesUpdate{ 565 OktaResourcesUpdate: e, 566 } 567 case *OktaSyncFailure: 568 out.Event = &OneOf_OktaSyncFailure{ 569 OktaSyncFailure: e, 570 } 571 case *OktaAssignmentResult: 572 out.Event = &OneOf_OktaAssignmentResult{ 573 OktaAssignmentResult: e, 574 } 575 case *AccessListCreate: 576 out.Event = &OneOf_AccessListCreate{ 577 AccessListCreate: e, 578 } 579 case *AccessListUpdate: 580 out.Event = &OneOf_AccessListUpdate{ 581 AccessListUpdate: e, 582 } 583 case *AccessListDelete: 584 out.Event = &OneOf_AccessListDelete{ 585 AccessListDelete: e, 586 } 587 case *AccessListReview: 588 out.Event = &OneOf_AccessListReview{ 589 AccessListReview: e, 590 } 591 case *AccessListMemberCreate: 592 out.Event = &OneOf_AccessListMemberCreate{ 593 AccessListMemberCreate: e, 594 } 595 case *AccessListMemberUpdate: 596 out.Event = &OneOf_AccessListMemberUpdate{ 597 AccessListMemberUpdate: e, 598 } 599 case *AccessListMemberDelete: 600 out.Event = &OneOf_AccessListMemberDelete{ 601 AccessListMemberDelete: e, 602 } 603 case *AccessListMemberDeleteAllForAccessList: 604 out.Event = &OneOf_AccessListMemberDeleteAllForAccessList{ 605 AccessListMemberDeleteAllForAccessList: e, 606 } 607 case *AuditQueryRun: 608 out.Event = &OneOf_AuditQueryRun{ 609 AuditQueryRun: e, 610 } 611 case *SecurityReportRun: 612 out.Event = &OneOf_SecurityReportRun{ 613 SecurityReportRun: e, 614 } 615 case *ExternalAuditStorageEnable: 616 out.Event = &OneOf_ExternalAuditStorageEnable{ 617 ExternalAuditStorageEnable: e, 618 } 619 case *ExternalAuditStorageDisable: 620 out.Event = &OneOf_ExternalAuditStorageDisable{ 621 ExternalAuditStorageDisable: e, 622 } 623 case *CreateMFAAuthChallenge: 624 out.Event = &OneOf_CreateMFAAuthChallenge{ 625 CreateMFAAuthChallenge: e, 626 } 627 case *ValidateMFAAuthResponse: 628 out.Event = &OneOf_ValidateMFAAuthResponse{ 629 ValidateMFAAuthResponse: e, 630 } 631 case *OktaAccessListSync: 632 out.Event = &OneOf_OktaAccessListSync{ 633 OktaAccessListSync: e, 634 } 635 case *OktaUserSync: 636 out.Event = &OneOf_OktaUserSync{ 637 OktaUserSync: e, 638 } 639 case *SPIFFESVIDIssued: 640 out.Event = &OneOf_SPIFFESVIDIssued{ 641 SPIFFESVIDIssued: e, 642 } 643 case *AuthPreferenceUpdate: 644 out.Event = &OneOf_AuthPreferenceUpdate{ 645 AuthPreferenceUpdate: e, 646 } 647 case *ClusterNetworkingConfigUpdate: 648 out.Event = &OneOf_ClusterNetworkingConfigUpdate{ 649 ClusterNetworkingConfigUpdate: e, 650 } 651 case *SessionRecordingConfigUpdate: 652 out.Event = &OneOf_SessionRecordingConfigUpdate{ 653 SessionRecordingConfigUpdate: e, 654 } 655 case *DatabaseUserCreate: 656 out.Event = &OneOf_DatabaseUserCreate{ 657 DatabaseUserCreate: e, 658 } 659 case *DatabaseUserDeactivate: 660 out.Event = &OneOf_DatabaseUserDeactivate{ 661 DatabaseUserDeactivate: e, 662 } 663 664 default: 665 slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) 666 unknown := &Unknown{} 667 unknown.Type = UnknownEvent 668 unknown.Code = UnknownCode 669 unknown.Time = in.GetTime() 670 unknown.ClusterName = in.GetClusterName() 671 unknown.UnknownType = in.GetType() 672 unknown.UnknownCode = in.GetCode() 673 data, err := json.Marshal(in) 674 if err != nil { 675 return nil, trace.Wrap(err) 676 } 677 678 unknown.Data = string(data) 679 out.Event = &OneOf_Unknown{ 680 Unknown: unknown, 681 } 682 } 683 return &out, nil 684 } 685 686 // FromOneOf converts audit event from one of wrapper to interface 687 func FromOneOf(in OneOf) (AuditEvent, error) { 688 e := in.GetEvent() 689 if e == nil { 690 return nil, trace.BadParameter("failed to parse event, session record is corrupted") 691 } 692 693 // We go from e (isOneOf_Event) -> reflect.Value (*OneOf_SomeStruct) -> reflect.Value(OneOf_SomeStruct). 694 elem := reflect.ValueOf(in.GetEvent()).Elem() 695 696 // OneOfs only have one inner field, verify and then read it. 697 if elem.NumField() != 1 { 698 // This should never happen for proto one-ofs. 699 return nil, trace.BadParameter("unexpected number in value %v: %v != 1", elem.Kind(), elem.NumField()) 700 } 701 702 auditEvent, ok := elem.Field(0).Interface().(AuditEvent) 703 if !ok || reflect.ValueOf(auditEvent).IsNil() { 704 return nil, trace.BadParameter("received unsupported event %T", in.Event) 705 } 706 return auditEvent, nil 707 }