diff --git a/api/artifacts.go b/api/artifacts.go index af7b1ded2e1..ec5691731e2 100644 --- a/api/artifacts.go +++ b/api/artifacts.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/Velocidex/ordereddict" + errors "github.com/go-errors/errors" context "golang.org/x/net/context" "www.velocidex.com/golang/velociraptor/acls" actions_proto "www.velocidex.com/golang/velociraptor/actions/proto" @@ -31,7 +32,11 @@ import ( artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" config_proto "www.velocidex.com/golang/velociraptor/config/proto" "www.velocidex.com/golang/velociraptor/constants" + "www.velocidex.com/golang/velociraptor/file_store" + "www.velocidex.com/golang/velociraptor/file_store/api" + "www.velocidex.com/golang/velociraptor/file_store/path_specs" flows_proto "www.velocidex.com/golang/velociraptor/flows/proto" + "www.velocidex.com/golang/velociraptor/paths" "www.velocidex.com/golang/velociraptor/services" "www.velocidex.com/golang/velociraptor/third_party/zip" "www.velocidex.com/golang/velociraptor/utils" @@ -136,6 +141,13 @@ func setArtifactFile( return artifact_definition, manager.DeleteArtifactFile(ctx, config_obj, principal, artifact_definition.Name) + case api_proto.SetArtifactRequest_CHECK: + tmp_repository := manager.NewRepository() + return tmp_repository.LoadYaml( + in.Artifact, services.ArtifactOptions{ + ValidateArtifact: true, + }) + case api_proto.SetArtifactRequest_SET: return manager.SetArtifactFile(ctx, config_obj, principal, in.Artifact, required_prefix) @@ -437,7 +449,7 @@ func searchArtifact( func (self *ApiServer) LoadArtifactPack( ctx context.Context, - in *api_proto.VFSFileBuffer) ( + in *api_proto.LoadArtifactPackRequest) ( *api_proto.LoadArtifactPackResponse, error) { users_manager := services.GetUserManager() @@ -454,15 +466,24 @@ func (self *ApiServer) LoadArtifactPack( "User is not allowed to upload artifact packs.") } - prefix := constants.ARTIFACT_PACK_NAME_PREFIX + prefix := in.Prefix + var filter_re *regexp.Regexp + if in.Filter != "" { + filter_re, err = regexp.Compile("(?i)" + in.Filter) + if err != nil { + return nil, Status(self.verbose, err) + } + } - result := &api_proto.LoadArtifactPackResponse{} - buffer := bytes.NewReader(in.Data) - zip_reader, err := zip.NewReader(buffer, int64(len(in.Data))) + zip_reader, closer, err := getZipReader(ctx, org_config_obj, in) if err != nil { return nil, Status(self.verbose, err) } + defer closer() + result := &api_proto.LoadArtifactPackResponse{ + VfsPath: in.VfsPath, + } for _, file := range zip_reader.File { if strings.HasSuffix(file.Name, ".yaml") { fd, err := file.Open() @@ -477,19 +498,37 @@ func (self *ApiServer) LoadArtifactPack( continue } - // Make sure the artifact is written into the - // Packs part to prevent clashes with built in - // names. + // Update the definition to include the prefix on the + // artifact name. artifact_definition := ensureArtifactPrefix( - string(data), prefix) + string(data), in.Prefix) request := &api_proto.SetArtifactRequest{ - Op: api_proto.SetArtifactRequest_SET, + Op: api_proto.SetArtifactRequest_CHECK, Artifact: artifact_definition, } definition, err := setArtifactFile(ctx, org_config_obj, principal, request, prefix) + if err != nil { + continue + } + + if filter_re != nil && !filter_re.MatchString(definition.Name) { + continue + } + + if !in.ReallyDoIt { + result.SuccessfulArtifacts = append(result.SuccessfulArtifacts, + definition.Name) + continue + } + + request.Op = api_proto.SetArtifactRequest_SET + + // Set the artifact for real. + definition, err = setArtifactFile(ctx, + org_config_obj, principal, request, prefix) if err == nil { services.LogAudit(ctx, org_config_obj, principal, "LoadArtifactPack", @@ -511,6 +550,65 @@ func (self *ApiServer) LoadArtifactPack( return result, nil } +func getZipReader( + ctx context.Context, + config_obj *config_proto.Config, + in *api_proto.LoadArtifactPackRequest) (*zip.Reader, func() error, error) { + + // Create a temp file and store the data in it. + if len(in.Data) > 0 { + // Check the file is a valid zip file first, before we cache + // it locally. + buffer := bytes.NewReader(in.Data) + zipfd, err := zip.NewReader(buffer, int64(len(in.Data))) + if err != nil { + return nil, nil, err + } + + path_manager := paths.NewTempPathManager("") + file_store_factory := file_store.GetFileStore(config_obj) + fd, err := file_store_factory.WriteFile(path_manager.Path()) + if err != nil { + return nil, nil, err + } + defer fd.Close() + + _, err = utils.Copy(ctx, fd, bytes.NewReader(in.Data)) + if err != nil { + return nil, nil, err + } + in.VfsPath = path_manager.Path().Components() + return zipfd, func() error { return nil }, nil + } + + // Otherwise open the filestore path + if len(in.VfsPath) < 2 { + return nil, nil, errors.New("vfs_path should be specified") + } + + if in.VfsPath[0] != paths.TEMP_ROOT.Components()[0] { + return nil, nil, errors.New("vfs_path should be a temp path") + } + + pathspec := path_specs.NewUnsafeFilestorePath(in.VfsPath...). + SetType(api.PATH_TYPE_FILESTORE_ANY) + + file_store_factory := file_store.GetFileStore(config_obj) + fd, err := file_store_factory.ReadFile(pathspec) + if err != nil { + return nil, nil, err + } + + stat, err := fd.Stat() + if err != nil { + return nil, nil, err + } + + zip_reader, err := zip.NewReader( + utils.MakeReaderAtter(fd), stat.Size()) + return zip_reader, fd.Close, err +} + // MakeCollectorRequest is a convenience function for creating // flows_proto.ArtifactCollectorArgs protobufs. func MakeCollectorRequest( diff --git a/api/mock/api_mock.go b/api/mock/api_mock.go index b3cb5ed98ac..19445a46084 100644 --- a/api/mock/api_mock.go +++ b/api/mock/api_mock.go @@ -842,7 +842,7 @@ func (mr *MockAPIClientMockRecorder) ListHunts(arg0, arg1 interface{}, arg2 ...i } // LoadArtifactPack mocks base method. -func (m *MockAPIClient) LoadArtifactPack(arg0 context.Context, arg1 *proto0.VFSFileBuffer, arg2 ...grpc.CallOption) (*proto0.LoadArtifactPackResponse, error) { +func (m *MockAPIClient) LoadArtifactPack(arg0 context.Context, arg1 *proto0.LoadArtifactPackRequest, arg2 ...grpc.CallOption) (*proto0.LoadArtifactPackResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { diff --git a/api/proto/api.pb.go b/api/proto/api.pb.go index 70e4c38d60c..e6d54d35e2e 100644 --- a/api/proto/api.pb.go +++ b/api/proto/api.pb.go @@ -662,7 +662,7 @@ var file_api_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x32, 0xf7, 0x34, 0x0a, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x32, 0x81, 0x35, 0x0a, 0x03, 0x41, 0x50, 0x49, 0x12, 0x52, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x75, 0x6e, 0x74, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x75, 0x6e, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x46, 0x6c, 0x6f, 0x77, @@ -914,182 +914,183 @@ var file_api_proto_rawDesc = []byte{ 0x74, 0x6f, 0x2e, 0x41, 0x50, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x6e, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, - 0x46, 0x53, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x1a, 0x1f, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x4c, - 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x3a, - 0x01, 0x2a, 0x12, 0x44, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, + 0x01, 0x2a, 0x12, 0x78, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, + 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x12, 0x44, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x1a, 0x0b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x1b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, - 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x54, - 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x54, 0x6f, 0x6f, 0x6c, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6f, - 0x6c, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x01, - 0x2a, 0x12, 0x5c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x7a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, - 0x73, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x18, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, + 0x54, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x01, 0x2a, 0x12, 0x5c, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7a, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, + 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, 0x22, 0x2b, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x41, 0x72, 0x67, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x53, 0x65, 0x74, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, - 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x53, 0x65, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x9c, 0x01, + 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x12, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, + 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, + 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x5f, + 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, + 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x01, 0x2a, 0x12, + 0x65, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, + 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, + 0x6f, 0x6f, 0x6b, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, + 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, + 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x22, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x3a, + 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, + 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, + 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x5f, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x17, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x3a, 0x01, 0x2a, 0x12, 0x65, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x22, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x0f, - 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x4e, 0x65, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x6c, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, + 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x22, 0x25, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, + 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x12, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x22, 0x1f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x6c, 0x0a, - 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, - 0x65, 0x6c, 0x6c, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x43, 0x65, 0x6c, 0x6c, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x12, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, - 0x6c, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4e, 0x6f, 0x74, - 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x65, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x81, 0x01, 0x0a, - 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x8c, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x3c, 0x0a, 0x0c, 0x56, 0x46, 0x53, 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, - 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x46, 0x53, 0x46, 0x69, 0x6c, 0x65, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x46, - 0x53, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x00, 0x12, 0x38, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, - 0x51, 0x4c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, 0x1a, - 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x0a, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x51, 0x4c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, - 0x65, 0x6e, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x19, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x6c, - 0x6f, 0x63, 0x69, 0x64, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, - 0x67, 0x2f, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x72, 0x61, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x43, + 0x65, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x81, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4e, 0x6f, + 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x8c, 0x01, 0x0a, 0x18, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x3c, 0x0a, 0x0c, 0x56, 0x46, 0x53, + 0x47, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x56, 0x46, 0x53, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x1a, + 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x46, 0x53, 0x46, 0x69, 0x6c, 0x65, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x51, 0x4c, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x56, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x3b, 0x0a, 0x0a, 0x57, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3f, + 0x0a, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x3a, 0x0a, 0x0a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, + 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0c, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x12, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x31, 0x5a, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x64, 0x65, 0x78, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x65, 0x6c, 0x6f, + 0x63, 0x69, 0x72, 0x61, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1141,52 +1142,53 @@ var file_api_proto_goTypes = []interface{}{ (*GetArtifactsRequest)(nil), // 32: proto.GetArtifactsRequest (*GetArtifactRequest)(nil), // 33: proto.GetArtifactRequest (*SetArtifactRequest)(nil), // 34: proto.SetArtifactRequest - (*proto1.Tool)(nil), // 35: proto.Tool - (*GetReportRequest)(nil), // 36: proto.GetReportRequest - (*proto.GetClientMonitoringStateRequest)(nil), // 37: proto.GetClientMonitoringStateRequest - (*proto.ClientEventTable)(nil), // 38: proto.ClientEventTable - (*ListAvailableEventResultsRequest)(nil), // 39: proto.ListAvailableEventResultsRequest - (*CreateDownloadRequest)(nil), // 40: proto.CreateDownloadRequest - (*NotebookCellRequest)(nil), // 41: proto.NotebookCellRequest - (*NotebookMetadata)(nil), // 42: proto.NotebookMetadata - (*NotebookExportRequest)(nil), // 43: proto.NotebookExportRequest - (*NotebookFileUploadRequest)(nil), // 44: proto.NotebookFileUploadRequest - (*proto2.VQLCollectorArgs)(nil), // 45: proto.VQLCollectorArgs - (*proto2.VQLResponse)(nil), // 46: proto.VQLResponse - (*DataRequest)(nil), // 47: proto.DataRequest - (*HealthCheckRequest)(nil), // 48: proto.HealthCheckRequest - (*HuntStats)(nil), // 49: proto.HuntStats - (*ListHuntsResponse)(nil), // 50: proto.ListHuntsResponse - (*GetTableResponse)(nil), // 51: proto.GetTableResponse - (*APIResponse)(nil), // 52: proto.APIResponse - (*SearchClientsResponse)(nil), // 53: proto.SearchClientsResponse - (*ApiClient)(nil), // 54: proto.ApiClient - (*ClientMetadata)(nil), // 55: proto.ClientMetadata - (*ApiFlowResponse)(nil), // 56: proto.ApiFlowResponse - (*ApiUser)(nil), // 57: proto.ApiUser - (*SetGUIOptionsResponse)(nil), // 58: proto.SetGUIOptionsResponse - (*Users)(nil), // 59: proto.Users - (*VelociraptorUser)(nil), // 60: proto.VelociraptorUser - (*Favorites)(nil), // 61: proto.Favorites - (*VFSListResponse)(nil), // 62: proto.VFSListResponse - (*proto.ArtifactCollectorResponse)(nil), // 63: proto.ArtifactCollectorResponse - (*proto.VFSDownloadInfo)(nil), // 64: proto.VFSDownloadInfo - (*SearchFileResponse)(nil), // 65: proto.SearchFileResponse - (*FlowDetails)(nil), // 66: proto.FlowDetails - (*ApiFlowRequestDetails)(nil), // 67: proto.ApiFlowRequestDetails - (*KeywordCompletions)(nil), // 68: proto.KeywordCompletions - (*proto1.ArtifactDescriptors)(nil), // 69: proto.ArtifactDescriptors - (*GetArtifactResponse)(nil), // 70: proto.GetArtifactResponse - (*LoadArtifactPackResponse)(nil), // 71: proto.LoadArtifactPackResponse - (*GetReportResponse)(nil), // 72: proto.GetReportResponse - (*ListAvailableEventResultsResponse)(nil), // 73: proto.ListAvailableEventResultsResponse - (*CreateDownloadResponse)(nil), // 74: proto.CreateDownloadResponse - (*Notebooks)(nil), // 75: proto.Notebooks - (*NotebookCell)(nil), // 76: proto.NotebookCell - (*NotebookFileUploadResponse)(nil), // 77: proto.NotebookFileUploadResponse - (*DataResponse)(nil), // 78: proto.DataResponse - (*ListChildrenResponse)(nil), // 79: proto.ListChildrenResponse - (*HealthCheckResponse)(nil), // 80: proto.HealthCheckResponse + (*LoadArtifactPackRequest)(nil), // 35: proto.LoadArtifactPackRequest + (*proto1.Tool)(nil), // 36: proto.Tool + (*GetReportRequest)(nil), // 37: proto.GetReportRequest + (*proto.GetClientMonitoringStateRequest)(nil), // 38: proto.GetClientMonitoringStateRequest + (*proto.ClientEventTable)(nil), // 39: proto.ClientEventTable + (*ListAvailableEventResultsRequest)(nil), // 40: proto.ListAvailableEventResultsRequest + (*CreateDownloadRequest)(nil), // 41: proto.CreateDownloadRequest + (*NotebookCellRequest)(nil), // 42: proto.NotebookCellRequest + (*NotebookMetadata)(nil), // 43: proto.NotebookMetadata + (*NotebookExportRequest)(nil), // 44: proto.NotebookExportRequest + (*NotebookFileUploadRequest)(nil), // 45: proto.NotebookFileUploadRequest + (*proto2.VQLCollectorArgs)(nil), // 46: proto.VQLCollectorArgs + (*proto2.VQLResponse)(nil), // 47: proto.VQLResponse + (*DataRequest)(nil), // 48: proto.DataRequest + (*HealthCheckRequest)(nil), // 49: proto.HealthCheckRequest + (*HuntStats)(nil), // 50: proto.HuntStats + (*ListHuntsResponse)(nil), // 51: proto.ListHuntsResponse + (*GetTableResponse)(nil), // 52: proto.GetTableResponse + (*APIResponse)(nil), // 53: proto.APIResponse + (*SearchClientsResponse)(nil), // 54: proto.SearchClientsResponse + (*ApiClient)(nil), // 55: proto.ApiClient + (*ClientMetadata)(nil), // 56: proto.ClientMetadata + (*ApiFlowResponse)(nil), // 57: proto.ApiFlowResponse + (*ApiUser)(nil), // 58: proto.ApiUser + (*SetGUIOptionsResponse)(nil), // 59: proto.SetGUIOptionsResponse + (*Users)(nil), // 60: proto.Users + (*VelociraptorUser)(nil), // 61: proto.VelociraptorUser + (*Favorites)(nil), // 62: proto.Favorites + (*VFSListResponse)(nil), // 63: proto.VFSListResponse + (*proto.ArtifactCollectorResponse)(nil), // 64: proto.ArtifactCollectorResponse + (*proto.VFSDownloadInfo)(nil), // 65: proto.VFSDownloadInfo + (*SearchFileResponse)(nil), // 66: proto.SearchFileResponse + (*FlowDetails)(nil), // 67: proto.FlowDetails + (*ApiFlowRequestDetails)(nil), // 68: proto.ApiFlowRequestDetails + (*KeywordCompletions)(nil), // 69: proto.KeywordCompletions + (*proto1.ArtifactDescriptors)(nil), // 70: proto.ArtifactDescriptors + (*GetArtifactResponse)(nil), // 71: proto.GetArtifactResponse + (*LoadArtifactPackResponse)(nil), // 72: proto.LoadArtifactPackResponse + (*GetReportResponse)(nil), // 73: proto.GetReportResponse + (*ListAvailableEventResultsResponse)(nil), // 74: proto.ListAvailableEventResultsResponse + (*CreateDownloadResponse)(nil), // 75: proto.CreateDownloadResponse + (*Notebooks)(nil), // 76: proto.Notebooks + (*NotebookCell)(nil), // 77: proto.NotebookCell + (*NotebookFileUploadResponse)(nil), // 78: proto.NotebookFileUploadResponse + (*DataResponse)(nil), // 79: proto.DataResponse + (*ListChildrenResponse)(nil), // 80: proto.ListChildrenResponse + (*HealthCheckResponse)(nil), // 81: proto.HealthCheckResponse } var file_api_proto_depIdxs = []int32{ 1, // 0: proto.ApprovalList.items:type_name -> proto.Approval @@ -1230,104 +1232,104 @@ var file_api_proto_depIdxs = []int32{ 32, // 38: proto.API.GetArtifacts:input_type -> proto.GetArtifactsRequest 33, // 39: proto.API.GetArtifactFile:input_type -> proto.GetArtifactRequest 34, // 40: proto.API.SetArtifactFile:input_type -> proto.SetArtifactRequest - 4, // 41: proto.API.LoadArtifactPack:input_type -> proto.VFSFileBuffer - 35, // 42: proto.API.GetToolInfo:input_type -> proto.Tool - 35, // 43: proto.API.SetToolInfo:input_type -> proto.Tool - 36, // 44: proto.API.GetReport:input_type -> proto.GetReportRequest + 35, // 41: proto.API.LoadArtifactPack:input_type -> proto.LoadArtifactPackRequest + 36, // 42: proto.API.GetToolInfo:input_type -> proto.Tool + 36, // 43: proto.API.SetToolInfo:input_type -> proto.Tool + 37, // 44: proto.API.GetReport:input_type -> proto.GetReportRequest 20, // 45: proto.API.GetServerMonitoringState:input_type -> google.protobuf.Empty 30, // 46: proto.API.SetServerMonitoringState:input_type -> proto.ArtifactCollectorArgs - 37, // 47: proto.API.GetClientMonitoringState:input_type -> proto.GetClientMonitoringStateRequest - 38, // 48: proto.API.SetClientMonitoringState:input_type -> proto.ClientEventTable - 39, // 49: proto.API.ListAvailableEventResults:input_type -> proto.ListAvailableEventResultsRequest - 40, // 50: proto.API.CreateDownloadFile:input_type -> proto.CreateDownloadRequest - 41, // 51: proto.API.GetNotebooks:input_type -> proto.NotebookCellRequest - 42, // 52: proto.API.NewNotebook:input_type -> proto.NotebookMetadata - 42, // 53: proto.API.UpdateNotebook:input_type -> proto.NotebookMetadata - 41, // 54: proto.API.NewNotebookCell:input_type -> proto.NotebookCellRequest - 41, // 55: proto.API.GetNotebookCell:input_type -> proto.NotebookCellRequest - 41, // 56: proto.API.UpdateNotebookCell:input_type -> proto.NotebookCellRequest - 41, // 57: proto.API.CancelNotebookCell:input_type -> proto.NotebookCellRequest - 43, // 58: proto.API.CreateNotebookDownloadFile:input_type -> proto.NotebookExportRequest - 44, // 59: proto.API.UploadNotebookAttachment:input_type -> proto.NotebookFileUploadRequest + 38, // 47: proto.API.GetClientMonitoringState:input_type -> proto.GetClientMonitoringStateRequest + 39, // 48: proto.API.SetClientMonitoringState:input_type -> proto.ClientEventTable + 40, // 49: proto.API.ListAvailableEventResults:input_type -> proto.ListAvailableEventResultsRequest + 41, // 50: proto.API.CreateDownloadFile:input_type -> proto.CreateDownloadRequest + 42, // 51: proto.API.GetNotebooks:input_type -> proto.NotebookCellRequest + 43, // 52: proto.API.NewNotebook:input_type -> proto.NotebookMetadata + 43, // 53: proto.API.UpdateNotebook:input_type -> proto.NotebookMetadata + 42, // 54: proto.API.NewNotebookCell:input_type -> proto.NotebookCellRequest + 42, // 55: proto.API.GetNotebookCell:input_type -> proto.NotebookCellRequest + 42, // 56: proto.API.UpdateNotebookCell:input_type -> proto.NotebookCellRequest + 42, // 57: proto.API.CancelNotebookCell:input_type -> proto.NotebookCellRequest + 44, // 58: proto.API.CreateNotebookDownloadFile:input_type -> proto.NotebookExportRequest + 45, // 59: proto.API.UploadNotebookAttachment:input_type -> proto.NotebookFileUploadRequest 4, // 60: proto.API.VFSGetBuffer:input_type -> proto.VFSFileBuffer - 45, // 61: proto.API.Query:input_type -> proto.VQLCollectorArgs + 46, // 61: proto.API.Query:input_type -> proto.VQLCollectorArgs 6, // 62: proto.API.WatchEvent:input_type -> proto.EventRequest 8, // 63: proto.API.PushEvents:input_type -> proto.PushEventRequest - 46, // 64: proto.API.WriteEvent:input_type -> proto.VQLResponse - 47, // 65: proto.API.GetSubject:input_type -> proto.DataRequest - 47, // 66: proto.API.SetSubject:input_type -> proto.DataRequest - 47, // 67: proto.API.DeleteSubject:input_type -> proto.DataRequest - 47, // 68: proto.API.ListChildren:input_type -> proto.DataRequest - 48, // 69: proto.API.Check:input_type -> proto.HealthCheckRequest + 47, // 64: proto.API.WriteEvent:input_type -> proto.VQLResponse + 48, // 65: proto.API.GetSubject:input_type -> proto.DataRequest + 48, // 66: proto.API.SetSubject:input_type -> proto.DataRequest + 48, // 67: proto.API.DeleteSubject:input_type -> proto.DataRequest + 48, // 68: proto.API.ListChildren:input_type -> proto.DataRequest + 49, // 69: proto.API.Check:input_type -> proto.HealthCheckRequest 0, // 70: proto.API.CreateHunt:output_type -> proto.StartFlowResponse - 49, // 71: proto.API.EstimateHunt:output_type -> proto.HuntStats - 50, // 72: proto.API.ListHunts:output_type -> proto.ListHuntsResponse + 50, // 71: proto.API.EstimateHunt:output_type -> proto.HuntStats + 51, // 72: proto.API.ListHunts:output_type -> proto.ListHuntsResponse 9, // 73: proto.API.GetHunt:output_type -> proto.Hunt 20, // 74: proto.API.ModifyHunt:output_type -> google.protobuf.Empty - 51, // 75: proto.API.GetHuntFlows:output_type -> proto.GetTableResponse - 51, // 76: proto.API.GetHuntResults:output_type -> proto.GetTableResponse + 52, // 75: proto.API.GetHuntFlows:output_type -> proto.GetTableResponse + 52, // 76: proto.API.GetHuntResults:output_type -> proto.GetTableResponse 20, // 77: proto.API.NotifyClients:output_type -> google.protobuf.Empty - 52, // 78: proto.API.LabelClients:output_type -> proto.APIResponse - 53, // 79: proto.API.ListClients:output_type -> proto.SearchClientsResponse - 54, // 80: proto.API.GetClient:output_type -> proto.ApiClient - 55, // 81: proto.API.GetClientMetadata:output_type -> proto.ClientMetadata + 53, // 78: proto.API.LabelClients:output_type -> proto.APIResponse + 54, // 79: proto.API.ListClients:output_type -> proto.SearchClientsResponse + 55, // 80: proto.API.GetClient:output_type -> proto.ApiClient + 56, // 81: proto.API.GetClientMetadata:output_type -> proto.ClientMetadata 20, // 82: proto.API.SetClientMetadata:output_type -> google.protobuf.Empty - 56, // 83: proto.API.GetClientFlows:output_type -> proto.ApiFlowResponse - 57, // 84: proto.API.GetUserUITraits:output_type -> proto.ApiUser - 58, // 85: proto.API.SetGUIOptions:output_type -> proto.SetGUIOptionsResponse - 59, // 86: proto.API.GetUsers:output_type -> proto.Users - 59, // 87: proto.API.GetGlobalUsers:output_type -> proto.Users + 57, // 83: proto.API.GetClientFlows:output_type -> proto.ApiFlowResponse + 58, // 84: proto.API.GetUserUITraits:output_type -> proto.ApiUser + 59, // 85: proto.API.SetGUIOptions:output_type -> proto.SetGUIOptionsResponse + 60, // 86: proto.API.GetUsers:output_type -> proto.Users + 60, // 87: proto.API.GetGlobalUsers:output_type -> proto.Users 23, // 88: proto.API.GetUserRoles:output_type -> proto.UserRoles 20, // 89: proto.API.SetUserRoles:output_type -> google.protobuf.Empty - 60, // 90: proto.API.GetUser:output_type -> proto.VelociraptorUser + 61, // 90: proto.API.GetUser:output_type -> proto.VelociraptorUser 20, // 91: proto.API.CreateUser:output_type -> google.protobuf.Empty - 61, // 92: proto.API.GetUserFavorites:output_type -> proto.Favorites + 62, // 92: proto.API.GetUserFavorites:output_type -> proto.Favorites 20, // 93: proto.API.SetPassword:output_type -> google.protobuf.Empty - 62, // 94: proto.API.VFSListDirectory:output_type -> proto.VFSListResponse - 51, // 95: proto.API.VFSListDirectoryFiles:output_type -> proto.GetTableResponse - 63, // 96: proto.API.VFSRefreshDirectory:output_type -> proto.ArtifactCollectorResponse - 62, // 97: proto.API.VFSStatDirectory:output_type -> proto.VFSListResponse - 64, // 98: proto.API.VFSStatDownload:output_type -> proto.VFSDownloadInfo - 51, // 99: proto.API.GetTable:output_type -> proto.GetTableResponse - 65, // 100: proto.API.SearchFile:output_type -> proto.SearchFileResponse - 63, // 101: proto.API.CollectArtifact:output_type -> proto.ArtifactCollectorResponse + 63, // 94: proto.API.VFSListDirectory:output_type -> proto.VFSListResponse + 52, // 95: proto.API.VFSListDirectoryFiles:output_type -> proto.GetTableResponse + 64, // 96: proto.API.VFSRefreshDirectory:output_type -> proto.ArtifactCollectorResponse + 63, // 97: proto.API.VFSStatDirectory:output_type -> proto.VFSListResponse + 65, // 98: proto.API.VFSStatDownload:output_type -> proto.VFSDownloadInfo + 52, // 99: proto.API.GetTable:output_type -> proto.GetTableResponse + 66, // 100: proto.API.SearchFile:output_type -> proto.SearchFileResponse + 64, // 101: proto.API.CollectArtifact:output_type -> proto.ArtifactCollectorResponse 0, // 102: proto.API.CancelFlow:output_type -> proto.StartFlowResponse - 66, // 103: proto.API.GetFlowDetails:output_type -> proto.FlowDetails - 67, // 104: proto.API.GetFlowRequests:output_type -> proto.ApiFlowRequestDetails - 68, // 105: proto.API.GetKeywordCompletions:output_type -> proto.KeywordCompletions + 67, // 103: proto.API.GetFlowDetails:output_type -> proto.FlowDetails + 68, // 104: proto.API.GetFlowRequests:output_type -> proto.ApiFlowRequestDetails + 69, // 105: proto.API.GetKeywordCompletions:output_type -> proto.KeywordCompletions 31, // 106: proto.API.ReformatVQL:output_type -> proto.ReformatVQLMessage - 69, // 107: proto.API.GetArtifacts:output_type -> proto.ArtifactDescriptors - 70, // 108: proto.API.GetArtifactFile:output_type -> proto.GetArtifactResponse - 52, // 109: proto.API.SetArtifactFile:output_type -> proto.APIResponse - 71, // 110: proto.API.LoadArtifactPack:output_type -> proto.LoadArtifactPackResponse - 35, // 111: proto.API.GetToolInfo:output_type -> proto.Tool - 35, // 112: proto.API.SetToolInfo:output_type -> proto.Tool - 72, // 113: proto.API.GetReport:output_type -> proto.GetReportResponse + 70, // 107: proto.API.GetArtifacts:output_type -> proto.ArtifactDescriptors + 71, // 108: proto.API.GetArtifactFile:output_type -> proto.GetArtifactResponse + 53, // 109: proto.API.SetArtifactFile:output_type -> proto.APIResponse + 72, // 110: proto.API.LoadArtifactPack:output_type -> proto.LoadArtifactPackResponse + 36, // 111: proto.API.GetToolInfo:output_type -> proto.Tool + 36, // 112: proto.API.SetToolInfo:output_type -> proto.Tool + 73, // 113: proto.API.GetReport:output_type -> proto.GetReportResponse 30, // 114: proto.API.GetServerMonitoringState:output_type -> proto.ArtifactCollectorArgs 30, // 115: proto.API.SetServerMonitoringState:output_type -> proto.ArtifactCollectorArgs - 38, // 116: proto.API.GetClientMonitoringState:output_type -> proto.ClientEventTable + 39, // 116: proto.API.GetClientMonitoringState:output_type -> proto.ClientEventTable 20, // 117: proto.API.SetClientMonitoringState:output_type -> google.protobuf.Empty - 73, // 118: proto.API.ListAvailableEventResults:output_type -> proto.ListAvailableEventResultsResponse - 74, // 119: proto.API.CreateDownloadFile:output_type -> proto.CreateDownloadResponse - 75, // 120: proto.API.GetNotebooks:output_type -> proto.Notebooks - 42, // 121: proto.API.NewNotebook:output_type -> proto.NotebookMetadata - 42, // 122: proto.API.UpdateNotebook:output_type -> proto.NotebookMetadata - 42, // 123: proto.API.NewNotebookCell:output_type -> proto.NotebookMetadata - 76, // 124: proto.API.GetNotebookCell:output_type -> proto.NotebookCell - 76, // 125: proto.API.UpdateNotebookCell:output_type -> proto.NotebookCell + 74, // 118: proto.API.ListAvailableEventResults:output_type -> proto.ListAvailableEventResultsResponse + 75, // 119: proto.API.CreateDownloadFile:output_type -> proto.CreateDownloadResponse + 76, // 120: proto.API.GetNotebooks:output_type -> proto.Notebooks + 43, // 121: proto.API.NewNotebook:output_type -> proto.NotebookMetadata + 43, // 122: proto.API.UpdateNotebook:output_type -> proto.NotebookMetadata + 43, // 123: proto.API.NewNotebookCell:output_type -> proto.NotebookMetadata + 77, // 124: proto.API.GetNotebookCell:output_type -> proto.NotebookCell + 77, // 125: proto.API.UpdateNotebookCell:output_type -> proto.NotebookCell 20, // 126: proto.API.CancelNotebookCell:output_type -> google.protobuf.Empty 20, // 127: proto.API.CreateNotebookDownloadFile:output_type -> google.protobuf.Empty - 77, // 128: proto.API.UploadNotebookAttachment:output_type -> proto.NotebookFileUploadResponse + 78, // 128: proto.API.UploadNotebookAttachment:output_type -> proto.NotebookFileUploadResponse 4, // 129: proto.API.VFSGetBuffer:output_type -> proto.VFSFileBuffer - 46, // 130: proto.API.Query:output_type -> proto.VQLResponse + 47, // 130: proto.API.Query:output_type -> proto.VQLResponse 7, // 131: proto.API.WatchEvent:output_type -> proto.EventResponse 20, // 132: proto.API.PushEvents:output_type -> google.protobuf.Empty 20, // 133: proto.API.WriteEvent:output_type -> google.protobuf.Empty - 78, // 134: proto.API.GetSubject:output_type -> proto.DataResponse - 78, // 135: proto.API.SetSubject:output_type -> proto.DataResponse + 79, // 134: proto.API.GetSubject:output_type -> proto.DataResponse + 79, // 135: proto.API.SetSubject:output_type -> proto.DataResponse 20, // 136: proto.API.DeleteSubject:output_type -> google.protobuf.Empty - 79, // 137: proto.API.ListChildren:output_type -> proto.ListChildrenResponse - 80, // 138: proto.API.Check:output_type -> proto.HealthCheckResponse + 80, // 137: proto.API.ListChildren:output_type -> proto.ListChildrenResponse + 81, // 138: proto.API.Check:output_type -> proto.HealthCheckResponse 70, // [70:139] is the sub-list for method output_type 1, // [1:70] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name diff --git a/api/proto/api.pb.gw.go b/api/proto/api.pb.gw.go index 73ede2d133a..b3be2f90f81 100644 --- a/api/proto/api.pb.gw.go +++ b/api/proto/api.pb.gw.go @@ -22,8 +22,8 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" - proto_4 "www.velocidex.com/golang/velociraptor/artifacts/proto" - proto_1 "www.velocidex.com/golang/velociraptor/flows/proto" + proto_3 "www.velocidex.com/golang/velociraptor/artifacts/proto" + proto_0 "www.velocidex.com/golang/velociraptor/flows/proto" ) // Suppress "imported and not used" errors @@ -1313,7 +1313,7 @@ func local_request_API_SearchFile_0(ctx context.Context, marshaler runtime.Marsh } func request_API_CollectArtifact_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ArtifactCollectorArgs + var protoReq proto_0.ArtifactCollectorArgs var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1330,7 +1330,7 @@ func request_API_CollectArtifact_0(ctx context.Context, marshaler runtime.Marsha } func local_request_API_CollectArtifact_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ArtifactCollectorArgs + var protoReq proto_0.ArtifactCollectorArgs var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1609,7 +1609,7 @@ func local_request_API_SetArtifactFile_0(ctx context.Context, marshaler runtime. } func request_API_LoadArtifactPack_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VFSFileBuffer + var protoReq LoadArtifactPackRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1626,7 +1626,7 @@ func request_API_LoadArtifactPack_0(ctx context.Context, marshaler runtime.Marsh } func local_request_API_LoadArtifactPack_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VFSFileBuffer + var protoReq LoadArtifactPackRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1647,7 +1647,7 @@ var ( ) func request_API_GetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_4.Tool + var protoReq proto_3.Tool var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -1663,7 +1663,7 @@ func request_API_GetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, } func local_request_API_GetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_4.Tool + var protoReq proto_3.Tool var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -1679,7 +1679,7 @@ func local_request_API_GetToolInfo_0(ctx context.Context, marshaler runtime.Mars } func request_API_SetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_4.Tool + var protoReq proto_3.Tool var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1696,7 +1696,7 @@ func request_API_SetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, } func local_request_API_SetToolInfo_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_4.Tool + var protoReq proto_3.Tool var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1765,7 +1765,7 @@ func local_request_API_GetServerMonitoringState_0(ctx context.Context, marshaler } func request_API_SetServerMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ArtifactCollectorArgs + var protoReq proto_0.ArtifactCollectorArgs var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1782,7 +1782,7 @@ func request_API_SetServerMonitoringState_0(ctx context.Context, marshaler runti } func local_request_API_SetServerMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ArtifactCollectorArgs + var protoReq proto_0.ArtifactCollectorArgs var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1803,7 +1803,7 @@ var ( ) func request_API_GetClientMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.GetClientMonitoringStateRequest + var protoReq proto_0.GetClientMonitoringStateRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -1819,7 +1819,7 @@ func request_API_GetClientMonitoringState_0(ctx context.Context, marshaler runti } func local_request_API_GetClientMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.GetClientMonitoringStateRequest + var protoReq proto_0.GetClientMonitoringStateRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -1835,7 +1835,7 @@ func local_request_API_GetClientMonitoringState_0(ctx context.Context, marshaler } func request_API_SetClientMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, client APIClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ClientEventTable + var protoReq proto_0.ClientEventTable var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1852,7 +1852,7 @@ func request_API_SetClientMonitoringState_0(ctx context.Context, marshaler runti } func local_request_API_SetClientMonitoringState_0(ctx context.Context, marshaler runtime.Marshaler, server APIServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq proto_1.ClientEventTable + var protoReq proto_0.ClientEventTable var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) diff --git a/api/proto/api.proto b/api/proto/api.proto index 8ec0fa35dc9..9c8d47137c7 100644 --- a/api/proto/api.proto +++ b/api/proto/api.proto @@ -377,7 +377,7 @@ service API { }; } - rpc LoadArtifactPack(VFSFileBuffer) returns (LoadArtifactPackResponse) { + rpc LoadArtifactPack(LoadArtifactPackRequest) returns (LoadArtifactPackResponse) { option (google.api.http) = { post: "/api/v1/LoadArtifactPack", body: "*", diff --git a/api/proto/api_grpc.pb.go b/api/proto/api_grpc.pb.go index 9c421cb2274..7a8b8035e0f 100644 --- a/api/proto/api_grpc.pb.go +++ b/api/proto/api_grpc.pb.go @@ -74,7 +74,7 @@ type APIClient interface { GetArtifacts(ctx context.Context, in *GetArtifactsRequest, opts ...grpc.CallOption) (*proto1.ArtifactDescriptors, error) GetArtifactFile(ctx context.Context, in *GetArtifactRequest, opts ...grpc.CallOption) (*GetArtifactResponse, error) SetArtifactFile(ctx context.Context, in *SetArtifactRequest, opts ...grpc.CallOption) (*APIResponse, error) - LoadArtifactPack(ctx context.Context, in *VFSFileBuffer, opts ...grpc.CallOption) (*LoadArtifactPackResponse, error) + LoadArtifactPack(ctx context.Context, in *LoadArtifactPackRequest, opts ...grpc.CallOption) (*LoadArtifactPackResponse, error) // Tools GetToolInfo(ctx context.Context, in *proto1.Tool, opts ...grpc.CallOption) (*proto1.Tool, error) SetToolInfo(ctx context.Context, in *proto1.Tool, opts ...grpc.CallOption) (*proto1.Tool, error) @@ -492,7 +492,7 @@ func (c *aPIClient) SetArtifactFile(ctx context.Context, in *SetArtifactRequest, return out, nil } -func (c *aPIClient) LoadArtifactPack(ctx context.Context, in *VFSFileBuffer, opts ...grpc.CallOption) (*LoadArtifactPackResponse, error) { +func (c *aPIClient) LoadArtifactPack(ctx context.Context, in *LoadArtifactPackRequest, opts ...grpc.CallOption) (*LoadArtifactPackResponse, error) { out := new(LoadArtifactPackResponse) err := c.cc.Invoke(ctx, "/proto.API/LoadArtifactPack", in, out, opts...) if err != nil { @@ -855,7 +855,7 @@ type APIServer interface { GetArtifacts(context.Context, *GetArtifactsRequest) (*proto1.ArtifactDescriptors, error) GetArtifactFile(context.Context, *GetArtifactRequest) (*GetArtifactResponse, error) SetArtifactFile(context.Context, *SetArtifactRequest) (*APIResponse, error) - LoadArtifactPack(context.Context, *VFSFileBuffer) (*LoadArtifactPackResponse, error) + LoadArtifactPack(context.Context, *LoadArtifactPackRequest) (*LoadArtifactPackResponse, error) // Tools GetToolInfo(context.Context, *proto1.Tool) (*proto1.Tool, error) SetToolInfo(context.Context, *proto1.Tool) (*proto1.Tool, error) @@ -1030,7 +1030,7 @@ func (UnimplementedAPIServer) GetArtifactFile(context.Context, *GetArtifactReque func (UnimplementedAPIServer) SetArtifactFile(context.Context, *SetArtifactRequest) (*APIResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetArtifactFile not implemented") } -func (UnimplementedAPIServer) LoadArtifactPack(context.Context, *VFSFileBuffer) (*LoadArtifactPackResponse, error) { +func (UnimplementedAPIServer) LoadArtifactPack(context.Context, *LoadArtifactPackRequest) (*LoadArtifactPackResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LoadArtifactPack not implemented") } func (UnimplementedAPIServer) GetToolInfo(context.Context, *proto1.Tool) (*proto1.Tool, error) { @@ -1851,7 +1851,7 @@ func _API_SetArtifactFile_Handler(srv interface{}, ctx context.Context, dec func } func _API_LoadArtifactPack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(VFSFileBuffer) + in := new(LoadArtifactPackRequest) if err := dec(in); err != nil { return nil, err } @@ -1863,7 +1863,7 @@ func _API_LoadArtifactPack_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/proto.API/LoadArtifactPack", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(APIServer).LoadArtifactPack(ctx, req.(*VFSFileBuffer)) + return srv.(APIServer).LoadArtifactPack(ctx, req.(*LoadArtifactPackRequest)) } return interceptor(ctx, in, info, handler) } diff --git a/api/proto/artifacts.pb.go b/api/proto/artifacts.pb.go index 02b5d836136..e7f4b6f917e 100644 --- a/api/proto/artifacts.pb.go +++ b/api/proto/artifacts.pb.go @@ -25,6 +25,7 @@ type SetArtifactRequest_Operation int32 const ( SetArtifactRequest_SET SetArtifactRequest_Operation = 0 SetArtifactRequest_DELETE SetArtifactRequest_Operation = 1 + SetArtifactRequest_CHECK SetArtifactRequest_Operation = 2 ) // Enum value maps for SetArtifactRequest_Operation. @@ -32,10 +33,12 @@ var ( SetArtifactRequest_Operation_name = map[int32]string{ 0: "SET", 1: "DELETE", + 2: "CHECK", } SetArtifactRequest_Operation_value = map[string]int32{ "SET": 0, "DELETE": 1, + "CHECK": 2, } ) @@ -443,19 +446,100 @@ func (x *LoadArtifactError) GetError() string { return "" } +type LoadArtifactPackRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` + Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` + // NOTE: the vfs path must be in the VFS temp directory. + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + VfsPath []string `protobuf:"bytes,5,rep,name=vfs_path,json=vfsPath,proto3" json:"vfs_path,omitempty"` + ReallyDoIt bool `protobuf:"varint,4,opt,name=really_do_it,json=reallyDoIt,proto3" json:"really_do_it,omitempty"` +} + +func (x *LoadArtifactPackRequest) Reset() { + *x = LoadArtifactPackRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_artifacts_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoadArtifactPackRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoadArtifactPackRequest) ProtoMessage() {} + +func (x *LoadArtifactPackRequest) ProtoReflect() protoreflect.Message { + mi := &file_artifacts_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoadArtifactPackRequest.ProtoReflect.Descriptor instead. +func (*LoadArtifactPackRequest) Descriptor() ([]byte, []int) { + return file_artifacts_proto_rawDescGZIP(), []int{6} +} + +func (x *LoadArtifactPackRequest) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *LoadArtifactPackRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *LoadArtifactPackRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *LoadArtifactPackRequest) GetVfsPath() []string { + if x != nil { + return x.VfsPath + } + return nil +} + +func (x *LoadArtifactPackRequest) GetReallyDoIt() bool { + if x != nil { + return x.ReallyDoIt + } + return false +} + type LoadArtifactPackResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields SuccessfulArtifacts []string `protobuf:"bytes,1,rep,name=successful_artifacts,json=successfulArtifacts,proto3" json:"successful_artifacts,omitempty"` + VfsPath []string `protobuf:"bytes,3,rep,name=vfs_path,json=vfsPath,proto3" json:"vfs_path,omitempty"` Errors []*LoadArtifactError `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` } func (x *LoadArtifactPackResponse) Reset() { *x = LoadArtifactPackResponse{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[6] + mi := &file_artifacts_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -468,7 +552,7 @@ func (x *LoadArtifactPackResponse) String() string { func (*LoadArtifactPackResponse) ProtoMessage() {} func (x *LoadArtifactPackResponse) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[6] + mi := &file_artifacts_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -481,7 +565,7 @@ func (x *LoadArtifactPackResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadArtifactPackResponse.ProtoReflect.Descriptor instead. func (*LoadArtifactPackResponse) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{6} + return file_artifacts_proto_rawDescGZIP(), []int{7} } func (x *LoadArtifactPackResponse) GetSuccessfulArtifacts() []string { @@ -491,6 +575,13 @@ func (x *LoadArtifactPackResponse) GetSuccessfulArtifacts() []string { return nil } +func (x *LoadArtifactPackResponse) GetVfsPath() []string { + if x != nil { + return x.VfsPath + } + return nil +} + func (x *LoadArtifactPackResponse) GetErrors() []*LoadArtifactError { if x != nil { return x.Errors @@ -510,7 +601,7 @@ type APIResponse struct { func (x *APIResponse) Reset() { *x = APIResponse{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[7] + mi := &file_artifacts_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -523,7 +614,7 @@ func (x *APIResponse) String() string { func (*APIResponse) ProtoMessage() {} func (x *APIResponse) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[7] + mi := &file_artifacts_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -536,7 +627,7 @@ func (x *APIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use APIResponse.ProtoReflect.Descriptor instead. func (*APIResponse) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{7} + return file_artifacts_proto_rawDescGZIP(), []int{8} } func (x *APIResponse) GetError() bool { @@ -577,7 +668,7 @@ type GetReportRequest struct { func (x *GetReportRequest) Reset() { *x = GetReportRequest{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[8] + mi := &file_artifacts_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -590,7 +681,7 @@ func (x *GetReportRequest) String() string { func (*GetReportRequest) ProtoMessage() {} func (x *GetReportRequest) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[8] + mi := &file_artifacts_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,7 +694,7 @@ func (x *GetReportRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReportRequest.ProtoReflect.Descriptor instead. func (*GetReportRequest) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{8} + return file_artifacts_proto_rawDescGZIP(), []int{9} } func (x *GetReportRequest) GetArtifact() string { @@ -693,7 +784,7 @@ type GetReportResponse struct { func (x *GetReportResponse) Reset() { *x = GetReportResponse{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[9] + mi := &file_artifacts_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -706,7 +797,7 @@ func (x *GetReportResponse) String() string { func (*GetReportResponse) ProtoMessage() {} func (x *GetReportResponse) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[9] + mi := &file_artifacts_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -719,7 +810,7 @@ func (x *GetReportResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReportResponse.ProtoReflect.Descriptor instead. func (*GetReportResponse) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{9} + return file_artifacts_proto_rawDescGZIP(), []int{10} } func (x *GetReportResponse) GetData() string { @@ -753,7 +844,7 @@ type ArtifactCompressionDict struct { func (x *ArtifactCompressionDict) Reset() { *x = ArtifactCompressionDict{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[10] + mi := &file_artifacts_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -766,7 +857,7 @@ func (x *ArtifactCompressionDict) String() string { func (*ArtifactCompressionDict) ProtoMessage() {} func (x *ArtifactCompressionDict) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[10] + mi := &file_artifacts_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -779,7 +870,7 @@ func (x *ArtifactCompressionDict) ProtoReflect() protoreflect.Message { // Deprecated: Use ArtifactCompressionDict.ProtoReflect.Descriptor instead. func (*ArtifactCompressionDict) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{10} + return file_artifacts_proto_rawDescGZIP(), []int{11} } type ListAvailableEventResultsRequest struct { @@ -799,7 +890,7 @@ type ListAvailableEventResultsRequest struct { func (x *ListAvailableEventResultsRequest) Reset() { *x = ListAvailableEventResultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[11] + mi := &file_artifacts_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -812,7 +903,7 @@ func (x *ListAvailableEventResultsRequest) String() string { func (*ListAvailableEventResultsRequest) ProtoMessage() {} func (x *ListAvailableEventResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[11] + mi := &file_artifacts_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -825,7 +916,7 @@ func (x *ListAvailableEventResultsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAvailableEventResultsRequest.ProtoReflect.Descriptor instead. func (*ListAvailableEventResultsRequest) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{11} + return file_artifacts_proto_rawDescGZIP(), []int{12} } func (x *ListAvailableEventResultsRequest) GetClientId() string { @@ -870,7 +961,7 @@ type AvailableEvent struct { func (x *AvailableEvent) Reset() { *x = AvailableEvent{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[12] + mi := &file_artifacts_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -883,7 +974,7 @@ func (x *AvailableEvent) String() string { func (*AvailableEvent) ProtoMessage() {} func (x *AvailableEvent) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[12] + mi := &file_artifacts_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -896,7 +987,7 @@ func (x *AvailableEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AvailableEvent.ProtoReflect.Descriptor instead. func (*AvailableEvent) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{12} + return file_artifacts_proto_rawDescGZIP(), []int{13} } func (x *AvailableEvent) GetArtifact() string { @@ -938,7 +1029,7 @@ type ListAvailableEventResultsResponse struct { func (x *ListAvailableEventResultsResponse) Reset() { *x = ListAvailableEventResultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[13] + mi := &file_artifacts_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -951,7 +1042,7 @@ func (x *ListAvailableEventResultsResponse) String() string { func (*ListAvailableEventResultsResponse) ProtoMessage() {} func (x *ListAvailableEventResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[13] + mi := &file_artifacts_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -964,7 +1055,7 @@ func (x *ListAvailableEventResultsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListAvailableEventResultsResponse.ProtoReflect.Descriptor instead. func (*ListAvailableEventResultsResponse) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{13} + return file_artifacts_proto_rawDescGZIP(), []int{14} } func (x *ListAvailableEventResultsResponse) GetLogs() []*AvailableEvent { @@ -986,7 +1077,7 @@ type GetMonitoringStateRequest struct { func (x *GetMonitoringStateRequest) Reset() { *x = GetMonitoringStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[14] + mi := &file_artifacts_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -999,7 +1090,7 @@ func (x *GetMonitoringStateRequest) String() string { func (*GetMonitoringStateRequest) ProtoMessage() {} func (x *GetMonitoringStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[14] + mi := &file_artifacts_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1012,7 +1103,7 @@ func (x *GetMonitoringStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMonitoringStateRequest.ProtoReflect.Descriptor instead. func (*GetMonitoringStateRequest) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{14} + return file_artifacts_proto_rawDescGZIP(), []int{15} } func (x *GetMonitoringStateRequest) GetLabel() string { @@ -1034,7 +1125,7 @@ type GetMonitoringStateResponse struct { func (x *GetMonitoringStateResponse) Reset() { *x = GetMonitoringStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[15] + mi := &file_artifacts_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1047,7 +1138,7 @@ func (x *GetMonitoringStateResponse) String() string { func (*GetMonitoringStateResponse) ProtoMessage() {} func (x *GetMonitoringStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[15] + mi := &file_artifacts_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1060,7 +1151,7 @@ func (x *GetMonitoringStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMonitoringStateResponse.ProtoReflect.Descriptor instead. func (*GetMonitoringStateResponse) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{15} + return file_artifacts_proto_rawDescGZIP(), []int{16} } func (x *GetMonitoringStateResponse) GetRequests() []*SetMonitoringStateRequest { @@ -1084,7 +1175,7 @@ type SetMonitoringStateRequest struct { func (x *SetMonitoringStateRequest) Reset() { *x = SetMonitoringStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_artifacts_proto_msgTypes[16] + mi := &file_artifacts_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1097,7 +1188,7 @@ func (x *SetMonitoringStateRequest) String() string { func (*SetMonitoringStateRequest) ProtoMessage() {} func (x *SetMonitoringStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_artifacts_proto_msgTypes[16] + mi := &file_artifacts_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1110,7 +1201,7 @@ func (x *SetMonitoringStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMonitoringStateRequest.ProtoReflect.Descriptor instead. func (*SetMonitoringStateRequest) Descriptor() ([]byte, []int) { - return file_artifacts_proto_rawDescGZIP(), []int{16} + return file_artifacts_proto_rawDescGZIP(), []int{17} } func (x *SetMonitoringStateRequest) GetLabel() string { @@ -1176,7 +1267,7 @@ var file_artifacts_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x22, 0x12, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x08, - 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, + 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0xe3, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x22, 0x12, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, @@ -1188,122 +1279,134 @@ var file_artifacts_proto_rawDesc = []byte{ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x25, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x1f, 0x12, 0x1d, 0x57, 0x68, 0x61, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x3f, 0x52, 0x02, 0x6f, - 0x70, 0x22, 0x20, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x07, + 0x70, 0x22, 0x2b, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x10, 0x01, 0x22, 0x45, 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7f, 0x0a, 0x18, 0x4c, 0x6f, - 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x79, 0x0a, 0x0b, 0x41, - 0x50, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x2f, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, - 0x29, 0x12, 0x27, 0x41, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x63, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x64, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf9, 0x03, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x61, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe2, - 0xfc, 0xe3, 0xc4, 0x01, 0x22, 0x12, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x65, - 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x12, 0x4b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x37, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x31, 0x12, 0x2f, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, - 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, - 0x47, 0x5f, 0x44, 0x41, 0x49, 0x4c, 0x59, 0x29, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, - 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x12, 0x12, 0x10, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x65, - 0x2e, 0x67, 0x2e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x64, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, - 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x7c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x42, 0x42, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x3c, 0x12, 0x3a, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54, - 0x68, 0x65, 0x73, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x22, 0xe2, 0xfc, 0xe3, 0xc4, - 0x01, 0x1c, 0x12, 0x1a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x08, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, - 0x69, 0x63, 0x74, 0x22, 0xfb, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x09, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6b, 0xe2, 0xfc, - 0xe3, 0xc4, 0x01, 0x65, 0x12, 0x63, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x20, 0x49, 0x44, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x65, 0x6d, - 0x70, 0x74, 0x79, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x27, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, - 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, - 0x64, 0x22, 0xab, 0x01, 0x0a, 0x0e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x6f, 0x77, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x67, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x22, - 0x4e, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, - 0x31, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x22, 0x5a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x69, - 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x36, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x67, 0x73, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x31, 0x5a, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x64, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, - 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x72, 0x61, 0x70, 0x74, - 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x02, 0x22, 0x45, + 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x66, 0x73, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x76, 0x66, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x64, 0x6f, 0x5f, 0x69, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x44, 0x6f, + 0x49, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x18, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x14, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x61, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x66, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x76, 0x66, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, + 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, + 0x79, 0x0a, 0x0b, 0x41, 0x50, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x2f, 0xe2, + 0xfc, 0xe3, 0xc4, 0x01, 0x29, 0x12, 0x27, 0x41, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf9, 0x03, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x44, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x28, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x22, 0x12, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x08, 0x61, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x37, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x31, 0x12, 0x2f, 0x54, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x77, 0x65, 0x20, + 0x6e, 0x65, 0x65, 0x64, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x4d, 0x4f, 0x4e, 0x49, 0x54, + 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x49, 0x4c, 0x59, 0x29, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x18, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x12, 0x12, 0x10, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x52, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x68, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x68, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x7c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x42, 0x42, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x3c, 0x12, 0x3a, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x08, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x22, + 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x1c, 0x12, 0x1a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x72, + 0x20, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x63, 0x74, 0x22, 0xfb, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x88, 0x01, 0x0a, + 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x6b, 0xe2, 0xfc, 0xe3, 0xc4, 0x01, 0x65, 0x12, 0x63, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x20, 0x49, + 0x66, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x27, 0x73, 0x20, 0x6d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x52, 0x08, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, + 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x0e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x77, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x72, + 0x6f, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x73, 0x22, 0x4e, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x22, 0x31, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x5a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, + 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x22, 0x69, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x41, 0x72, 0x67, 0x73, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x31, 0x5a, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x64, 0x65, 0x78, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, + 0x72, 0x61, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1319,7 +1422,7 @@ func file_artifacts_proto_rawDescGZIP() []byte { } var file_artifacts_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_artifacts_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_artifacts_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_artifacts_proto_goTypes = []interface{}{ (SetArtifactRequest_Operation)(0), // 0: proto.SetArtifactRequest.Operation (*FieldSelector)(nil), // 1: proto.FieldSelector @@ -1328,30 +1431,31 @@ var file_artifacts_proto_goTypes = []interface{}{ (*GetArtifactResponse)(nil), // 4: proto.GetArtifactResponse (*SetArtifactRequest)(nil), // 5: proto.SetArtifactRequest (*LoadArtifactError)(nil), // 6: proto.LoadArtifactError - (*LoadArtifactPackResponse)(nil), // 7: proto.LoadArtifactPackResponse - (*APIResponse)(nil), // 8: proto.APIResponse - (*GetReportRequest)(nil), // 9: proto.GetReportRequest - (*GetReportResponse)(nil), // 10: proto.GetReportResponse - (*ArtifactCompressionDict)(nil), // 11: proto.ArtifactCompressionDict - (*ListAvailableEventResultsRequest)(nil), // 12: proto.ListAvailableEventResultsRequest - (*AvailableEvent)(nil), // 13: proto.AvailableEvent - (*ListAvailableEventResultsResponse)(nil), // 14: proto.ListAvailableEventResultsResponse - (*GetMonitoringStateRequest)(nil), // 15: proto.GetMonitoringStateRequest - (*GetMonitoringStateResponse)(nil), // 16: proto.GetMonitoringStateResponse - (*SetMonitoringStateRequest)(nil), // 17: proto.SetMonitoringStateRequest - (*proto.ArtifactParameter)(nil), // 18: proto.ArtifactParameter - (*proto.Artifact)(nil), // 19: proto.Artifact - (*proto1.ArtifactCollectorArgs)(nil), // 20: proto.ArtifactCollectorArgs + (*LoadArtifactPackRequest)(nil), // 7: proto.LoadArtifactPackRequest + (*LoadArtifactPackResponse)(nil), // 8: proto.LoadArtifactPackResponse + (*APIResponse)(nil), // 9: proto.APIResponse + (*GetReportRequest)(nil), // 10: proto.GetReportRequest + (*GetReportResponse)(nil), // 11: proto.GetReportResponse + (*ArtifactCompressionDict)(nil), // 12: proto.ArtifactCompressionDict + (*ListAvailableEventResultsRequest)(nil), // 13: proto.ListAvailableEventResultsRequest + (*AvailableEvent)(nil), // 14: proto.AvailableEvent + (*ListAvailableEventResultsResponse)(nil), // 15: proto.ListAvailableEventResultsResponse + (*GetMonitoringStateRequest)(nil), // 16: proto.GetMonitoringStateRequest + (*GetMonitoringStateResponse)(nil), // 17: proto.GetMonitoringStateResponse + (*SetMonitoringStateRequest)(nil), // 18: proto.SetMonitoringStateRequest + (*proto.ArtifactParameter)(nil), // 19: proto.ArtifactParameter + (*proto.Artifact)(nil), // 20: proto.Artifact + (*proto1.ArtifactCollectorArgs)(nil), // 21: proto.ArtifactCollectorArgs } var file_artifacts_proto_depIdxs = []int32{ 1, // 0: proto.GetArtifactsRequest.fields:type_name -> proto.FieldSelector 0, // 1: proto.SetArtifactRequest.op:type_name -> proto.SetArtifactRequest.Operation 6, // 2: proto.LoadArtifactPackResponse.errors:type_name -> proto.LoadArtifactError - 18, // 3: proto.GetReportRequest.parameters:type_name -> proto.ArtifactParameter - 19, // 4: proto.AvailableEvent.definition:type_name -> proto.Artifact - 13, // 5: proto.ListAvailableEventResultsResponse.logs:type_name -> proto.AvailableEvent - 17, // 6: proto.GetMonitoringStateResponse.requests:type_name -> proto.SetMonitoringStateRequest - 20, // 7: proto.SetMonitoringStateRequest.request:type_name -> proto.ArtifactCollectorArgs + 19, // 3: proto.GetReportRequest.parameters:type_name -> proto.ArtifactParameter + 20, // 4: proto.AvailableEvent.definition:type_name -> proto.Artifact + 14, // 5: proto.ListAvailableEventResultsResponse.logs:type_name -> proto.AvailableEvent + 18, // 6: proto.GetMonitoringStateResponse.requests:type_name -> proto.SetMonitoringStateRequest + 21, // 7: proto.SetMonitoringStateRequest.request:type_name -> proto.ArtifactCollectorArgs 8, // [8:8] is the sub-list for method output_type 8, // [8:8] is the sub-list for method input_type 8, // [8:8] is the sub-list for extension type_name @@ -1438,7 +1542,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadArtifactPackResponse); i { + switch v := v.(*LoadArtifactPackRequest); i { case 0: return &v.state case 1: @@ -1450,7 +1554,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*APIResponse); i { + switch v := v.(*LoadArtifactPackResponse); i { case 0: return &v.state case 1: @@ -1462,7 +1566,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetReportRequest); i { + switch v := v.(*APIResponse); i { case 0: return &v.state case 1: @@ -1474,7 +1578,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetReportResponse); i { + switch v := v.(*GetReportRequest); i { case 0: return &v.state case 1: @@ -1486,7 +1590,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArtifactCompressionDict); i { + switch v := v.(*GetReportResponse); i { case 0: return &v.state case 1: @@ -1498,7 +1602,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAvailableEventResultsRequest); i { + switch v := v.(*ArtifactCompressionDict); i { case 0: return &v.state case 1: @@ -1510,7 +1614,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AvailableEvent); i { + switch v := v.(*ListAvailableEventResultsRequest); i { case 0: return &v.state case 1: @@ -1522,7 +1626,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAvailableEventResultsResponse); i { + switch v := v.(*AvailableEvent); i { case 0: return &v.state case 1: @@ -1534,7 +1638,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMonitoringStateRequest); i { + switch v := v.(*ListAvailableEventResultsResponse); i { case 0: return &v.state case 1: @@ -1546,7 +1650,7 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMonitoringStateResponse); i { + switch v := v.(*GetMonitoringStateRequest); i { case 0: return &v.state case 1: @@ -1558,6 +1662,18 @@ func file_artifacts_proto_init() { } } file_artifacts_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMonitoringStateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_artifacts_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetMonitoringStateRequest); i { case 0: return &v.state @@ -1576,7 +1692,7 @@ func file_artifacts_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_artifacts_proto_rawDesc, NumEnums: 1, - NumMessages: 17, + NumMessages: 18, NumExtensions: 0, NumServices: 0, }, diff --git a/api/proto/artifacts.proto b/api/proto/artifacts.proto index 091f7a572e7..909126a509d 100644 --- a/api/proto/artifacts.proto +++ b/api/proto/artifacts.proto @@ -63,6 +63,7 @@ message SetArtifactRequest { enum Operation { SET = 0; DELETE = 1; + CHECK = 2; } Operation op = 3 [(sem_type) = { @@ -75,9 +76,28 @@ message LoadArtifactError { string error = 2; } +message LoadArtifactPackRequest { + string prefix = 1; + string filter = 2; + + // The API can specify the archive two ways: + + // 1. The raw data is attached in the data field. The server will + // store the data locally and return its VFS path components. + // 2. The caller can specify these components in subsequent calls + // to operate on the already uploaded file. + + // NOTE: the vfs path must be in the VFS temp directory. + bytes data = 3; + repeated string vfs_path = 5; + + bool really_do_it = 4; +} + + message LoadArtifactPackResponse { repeated string successful_artifacts = 1; - + repeated string vfs_path = 3; repeated LoadArtifactError errors = 2; } diff --git a/api/upload.go b/api/upload.go index 1d33eb2af87..d1957367550 100644 --- a/api/upload.go +++ b/api/upload.go @@ -12,7 +12,6 @@ import ( "www.velocidex.com/golang/velociraptor/api/authenticators" api_proto "www.velocidex.com/golang/velociraptor/api/proto" artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" - file_store "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/json" "www.velocidex.com/golang/velociraptor/logging" "www.velocidex.com/golang/velociraptor/paths" @@ -79,20 +78,13 @@ func toolUploadHandler() http.Handler { tool.Filename = path.Base(handler.Filename) tool.ServeLocally = true - // All tools are stored at the global public directory which is - // mapped to a http static handler. The downloaded URL is - // regardless of org - however each org has a different download - // name. We need to write the tool on the root org's public - // directory. - root_org_config, err := org_manager.GetOrgConfig(services.ROOT_ORG_ID) + path_manager := paths.NewInventoryPathManager(org_config_obj, tool) + pathspec, file_store_factory, err := path_manager.Path() if err != nil { returnError(w, 404, err.Error()) } - file_store_factory := file_store.GetFileStore(root_org_config) - path_manager := paths.NewInventoryPathManager(org_config_obj, tool) - - writer, err := file_store_factory.WriteFile(path_manager.Path()) + writer, err := file_store_factory.WriteFile(pathspec) if err != nil { returnError(w, http.StatusInternalServerError, fmt.Sprintf("Error: %v", err)) @@ -213,13 +205,16 @@ func formUploadHandler() http.Handler { form_desc.Filename = path.Base(handler.Filename) - file_store_factory := file_store.GetFileStore(org_config_obj) path_manager := paths.NewFormUploadPathManager( org_config_obj, form_desc.Filename) + pathspec, file_store_factory, err := path_manager.Path() + returnError(w, 403, fmt.Sprintf("Error: %v", err)) + return + form_desc.Url = path_manager.URL() - writer, err := file_store_factory.WriteFile(path_manager.Path()) + writer, err := file_store_factory.WriteFile(pathspec) if err != nil { returnError(w, http.StatusInternalServerError, fmt.Sprintf("Error: %v", err)) diff --git a/artifacts/definitions/Windows/Registry/AppCompatCache.yaml b/artifacts/definitions/Windows/Registry/AppCompatCache.yaml index e2df7e560f6..c6a68eb4645 100644 --- a/artifacts/definitions/Windows/Registry/AppCompatCache.yaml +++ b/artifacts/definitions/Windows/Registry/AppCompatCache.yaml @@ -70,7 +70,27 @@ export: | # The last byte of the Data block is 1 for execution ["Execution", "x=>x.PathSize + 14 + 8 + 4 + x.DataSize - 4", "uint32"] + ]], + + # This is the Win7 parser but we dont use it right now. + ["HeaderWin7x64", 128, [ + ["Signature", 0, "uint32"], + ["Entries", 128, "Array", { + count: 10000, + sentinel: "x=>x.PathSize = 0", + type: EntryWin7x64, + }] + ]], + ["EntryWin7x64", 48, [ + ["PathSize", 0, "uint16"], + ["PathOffset", 8, "uint32"], + ["Path", "x=>x.PathOffset - x.StartOf", "String", { + encoding: "utf16", + length: "x=>x.PathSize", + }], + ["LastMod", 16, "WinFileTime"] ]] + ]''' LET AppCompatCacheWin10(Blob) = parse_binary( diff --git a/artifacts/definitions/Windows/Remediation/ScheduledTasks.yaml b/artifacts/definitions/Windows/Remediation/ScheduledTasks.yaml index 8b9b8226ba8..2eba918e236 100644 --- a/artifacts/definitions/Windows/Remediation/ScheduledTasks.yaml +++ b/artifacts/definitions/Windows/Remediation/ScheduledTasks.yaml @@ -21,6 +21,8 @@ parameters: - name: CommandRegEx default: ThisIsAUniqueName type: regex + - name: PowerShellExe + default: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" - name: ReallyDoIt type: bool default: N @@ -57,7 +59,7 @@ sources: SELECT * FROM if(condition= ReallyDoIt='Y', then={ SELECT FullPath, Name, Command, Arguments, ComHandler, UserId, _XML - FROM execve(argv=["powershell", + FROM execve(argv=[PowerShellExe, "-ExecutionPolicy", "Unrestricted", "-encodedCommand", base64encode(string=utf16_encode( string=format(format=script, args=[Name]))) diff --git a/artifacts/definitions/Windows/System/LocalAdmins.yaml b/artifacts/definitions/Windows/System/LocalAdmins.yaml index 4cc5af0af00..72695a1712a 100644 --- a/artifacts/definitions/Windows/System/LocalAdmins.yaml +++ b/artifacts/definitions/Windows/System/LocalAdmins.yaml @@ -10,6 +10,10 @@ type: CLIENT required_permissions: - EXECVE +parameters: + - name: PowerShellExe + default: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" + sources: - precondition: SELECT OS From info() where OS = 'windows' @@ -18,7 +22,7 @@ sources: LET script <= 'Get-LocalGroupMember -SID S-1-5-32-544 | select -ExpandProperty SID -Property Name, PrincipalSource | select Name, Value, PrincipalSource | ConvertTo-Json' LET out = SELECT parse_json_array(data=Stdout) AS Output - FROM execve(argv=["powershell", + FROM execve(argv=[PowerShellExe, "-ExecutionPolicy", "Unrestricted", "-encodedCommand", base64encode(string=utf16_encode( string=script)) diff --git a/artifacts/definitions/Windows/System/PowerShell.yaml b/artifacts/definitions/Windows/System/PowerShell.yaml index 878a93d5e55..0e5f5db6c7b 100644 --- a/artifacts/definitions/Windows/System/PowerShell.yaml +++ b/artifacts/definitions/Windows/System/PowerShell.yaml @@ -37,10 +37,12 @@ precondition: parameters: - name: Command default: "dir C:/" + - name: PowerShellExe + default: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" sources: - query: | - SELECT * FROM execve(argv=["powershell", + SELECT * FROM execve(argv=[PowerShellExe, "-ExecutionPolicy", "Unrestricted", "-encodedCommand", base64encode(string=utf16_encode(string=Command)) ]) diff --git a/bin/tools.go b/bin/tools.go index dcb1a5cdb3e..508bd3a8b9c 100644 --- a/bin/tools.go +++ b/bin/tools.go @@ -11,7 +11,6 @@ import ( "github.com/Velocidex/yaml/v2" artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" - "www.velocidex.com/golang/velociraptor/file_store" logging "www.velocidex.com/golang/velociraptor/logging" "www.velocidex.com/golang/velociraptor/paths" "www.velocidex.com/golang/velociraptor/services" @@ -177,8 +176,12 @@ func doThirdPartyUpload() error { } else { // Figure out where we need to store the tool. path_manager := paths.NewInventoryPathManager(config_obj, tool) - file_store_factory := file_store.GetFileStore(config_obj) - writer, err := file_store_factory.WriteFile(path_manager.Path()) + pathspec, file_store_factory, err := path_manager.Path() + if err != nil { + return err + } + + writer, err := file_store_factory.WriteFile(pathspec) if err != nil { return fmt.Errorf("Unable to write to filestore: %w ", err) } diff --git a/datastore/datastore_test.go b/datastore/datastore_test.go index fac294983c2..da1c4f562ea 100644 --- a/datastore/datastore_test.go +++ b/datastore/datastore_test.go @@ -1,4 +1,4 @@ -package datastore +package datastore_test import ( "errors" @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/suite" config_proto "www.velocidex.com/golang/velociraptor/config/proto" crypto_proto "www.velocidex.com/golang/velociraptor/crypto/proto" + "www.velocidex.com/golang/velociraptor/datastore" "www.velocidex.com/golang/velociraptor/file_store/api" "www.velocidex.com/golang/velociraptor/file_store/path_specs" "www.velocidex.com/golang/velociraptor/utils" @@ -39,7 +40,7 @@ type BaseTestSuite struct { suite.Suite config_obj *config_proto.Config - datastore DataStore + datastore datastore.DataStore } func (self BaseTestSuite) TestSetGetJSON() { @@ -191,9 +192,9 @@ func (self BaseTestSuite) TestListChildren() { "/a/b/c/3"}, asStrings(children)) visited := []api.DSPathSpec{} - Walk(self.config_obj, self.datastore, + datastore.Walk(self.config_obj, self.datastore, path_specs.NewSafeDatastorePath("a", "b"), - WalkWithoutDirectories, + datastore.WalkWithoutDirectories, func(path_name api.DSPathSpec) error { visited = append(visited, path_name) return nil @@ -233,9 +234,9 @@ func (self BaseTestSuite) TestListChildrenTypes() { "/a/b/c/3:dir"}, asStringsWithTypes(children)) visited := []api.DSPathSpec{} - Walk(self.config_obj, self.datastore, + datastore.Walk(self.config_obj, self.datastore, path_specs.NewSafeDatastorePath("a", "b"), - WalkWithoutDirectories, + datastore.WalkWithoutDirectories, func(path_name api.DSPathSpec) error { visited = append(visited, path_name) return nil @@ -281,9 +282,9 @@ func (self BaseTestSuite) TestUnsafeListChildren() { "/a/b:b/c:b/3"}, asStrings(children)) visited := []api.DSPathSpec{} - Walk(self.config_obj, self.datastore, + datastore.Walk(self.config_obj, self.datastore, root, - WalkWithoutDirectories, + datastore.WalkWithoutDirectories, func(path_name api.DSPathSpec) error { visited = append(visited, path_name) return nil @@ -328,7 +329,7 @@ func (self BaseTestSuite) TestListChildrenSubdirs() { } func benchmarkSearchClient(b *testing.B, - data_store DataStore, + data_store datastore.DataStore, config_obj *config_proto.Config) { } diff --git a/datastore/filebased_benchmark_test.go b/datastore/filebased_benchmark_test.go index f7ab8d41c5a..dc097e71072 100644 --- a/datastore/filebased_benchmark_test.go +++ b/datastore/filebased_benchmark_test.go @@ -1,4 +1,4 @@ -package datastore +package datastore_test import ( "io/ioutil" @@ -7,6 +7,7 @@ import ( actions_proto "www.velocidex.com/golang/velociraptor/actions/proto" "www.velocidex.com/golang/velociraptor/config" + "www.velocidex.com/golang/velociraptor/datastore" "www.velocidex.com/golang/velociraptor/paths" ) @@ -18,7 +19,7 @@ func BenchmarkSetSubject(b *testing.B) { config_obj.Datastore.FilestoreDirectory = dir config_obj.Datastore.Location = dir - db, _ := GetDB(config_obj) + db, _ := datastore.GetDB(config_obj) client_id := "C.1234" client_path_manager := paths.NewClientPathManager(client_id) diff --git a/datastore/filebased_test.go b/datastore/filebased_test.go index 072c5b6dfe4..223a46e5774 100644 --- a/datastore/filebased_test.go +++ b/datastore/filebased_test.go @@ -1,4 +1,4 @@ -package datastore +package datastore_test import ( "fmt" @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "www.velocidex.com/golang/velociraptor/config" + "www.velocidex.com/golang/velociraptor/datastore" ) type FilebasedTestSuite struct { @@ -55,7 +56,7 @@ func (self FilebasedTestSuite) TearDownTest() { func TestFilebasedDatabase(t *testing.T) { suite.Run(t, &FilebasedTestSuite{ BaseTestSuite: BaseTestSuite{ - datastore: &FileBaseDataStore{}, + datastore: &datastore.FileBaseDataStore{}, }, }) } diff --git a/datastore/memcache_file_test.go b/datastore/memcache_file_test.go index f04212d46f9..834cfa7b832 100644 --- a/datastore/memcache_file_test.go +++ b/datastore/memcache_file_test.go @@ -1,4 +1,4 @@ -package datastore +package datastore_test import ( "context" @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/suite" api_proto "www.velocidex.com/golang/velociraptor/api/proto" "www.velocidex.com/golang/velociraptor/config" + "www.velocidex.com/golang/velociraptor/datastore" "www.velocidex.com/golang/velociraptor/file_store/api" "www.velocidex.com/golang/velociraptor/file_store/path_specs" flows_proto "www.velocidex.com/golang/velociraptor/flows/proto" @@ -24,6 +25,10 @@ import ( "www.velocidex.com/golang/velociraptor/vtesting" ) +var ( + file_based_imp = &datastore.FileBaseDataStore{} +) + type MemcacheFileTestSuite struct { BaseTestSuite @@ -49,7 +54,7 @@ func (self *MemcacheFileTestSuite) SetupTest() { self.ctx, self.cancel = context.WithCancel(context.Background()) // Clear the cache between runs - db := NewMemcacheFileDataStore(self.config_obj) + db := datastore.NewMemcacheFileDataStore(self.config_obj) self.datastore = db db.Clear() @@ -63,7 +68,7 @@ func (self *MemcacheFileTestSuite) TearDownTest() { } func (self MemcacheFileTestSuite) TestSetOnFileSystem() { - _, ok := self.datastore.(*MemcacheFileDataStore) + _, ok := self.datastore.(*datastore.MemcacheFileDataStore) assert.True(self.T(), ok) // Setting the data ends up on the filesystem @@ -113,7 +118,7 @@ func (self MemcacheFileTestSuite) TestDirectoryOverflow() { // Expire directories larger than 2 items. self.config_obj.Datastore.MemcacheDatastoreMaxDirSize = 4 - db := NewMemcacheFileDataStore(self.config_obj) + db := datastore.NewMemcacheFileDataStore(self.config_obj) db.StartWriter(self.ctx, &self.wg, self.config_obj) client_record := &api_proto.ClientMetadata{ @@ -171,7 +176,7 @@ func (self MemcacheFileTestSuite) TestDirectoryOverflow() { } func (self MemcacheFileTestSuite) TestListChildren() { - _, ok := self.datastore.(*MemcacheFileDataStore) + _, ok := self.datastore.(*datastore.MemcacheFileDataStore) assert.True(self.T(), ok) // Setting the data ends up on the filesystem @@ -211,7 +216,7 @@ func (self MemcacheFileTestSuite) TestListChildren() { } func (self MemcacheFileTestSuite) TestSetSubjectAndListChildren() { - db, ok := self.datastore.(*MemcacheFileDataStore) + db, ok := self.datastore.(*datastore.MemcacheFileDataStore) assert.True(self.T(), ok) // Setting the data ends up on the filesystem @@ -246,7 +251,7 @@ func (self MemcacheFileTestSuite) TestSetSubjectAndListChildren() { // 2. SetSubject() of /a/e/f/ will implicitly invalidate /a/b/ // 3. ListChildren() of /a will get fresh data. func (self MemcacheFileTestSuite) TestDeepSetSubjectAfterListChildren() { - db, ok := self.datastore.(*MemcacheFileDataStore) + db, ok := self.datastore.(*datastore.MemcacheFileDataStore) assert.True(self.T(), ok) // Setting the data ends up on the filesystem diff --git a/datastore/memcache_test.go b/datastore/memcache_test.go index b7f1ff44a8d..0b8e60137f1 100644 --- a/datastore/memcache_test.go +++ b/datastore/memcache_test.go @@ -1,10 +1,11 @@ -package datastore +package datastore_test import ( "testing" "github.com/stretchr/testify/suite" "www.velocidex.com/golang/velociraptor/config" + "www.velocidex.com/golang/velociraptor/datastore" ) type MemcacheTestSuite struct { @@ -12,7 +13,7 @@ type MemcacheTestSuite struct { } func (self *MemcacheTestSuite) SetupTest() { - self.datastore.(*MemcacheDatastore).Clear() + self.datastore.(*datastore.MemcacheDatastore).Clear() } func TestMemCacheDatastore(t *testing.T) { @@ -20,7 +21,7 @@ func TestMemCacheDatastore(t *testing.T) { config_obj.Datastore.Implementation = "Memcache" suite.Run(t, &MemcacheTestSuite{BaseTestSuite{ - datastore: NewMemcacheDataStore(config_obj), + datastore: datastore.NewMemcacheDataStore(config_obj), config_obj: config_obj, }}) } diff --git a/gui/velociraptor/src/components/artifacts/artifacts-upload.jsx b/gui/velociraptor/src/components/artifacts/artifacts-upload.jsx index 988d6a1365d..c2906f25726 100644 --- a/gui/velociraptor/src/components/artifacts/artifacts-upload.jsx +++ b/gui/velociraptor/src/components/artifacts/artifacts-upload.jsx @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import _ from 'lodash'; import Modal from 'react-bootstrap/Modal'; import Form from 'react-bootstrap/Form'; +import Row from 'react-bootstrap/Row'; +import Col from 'react-bootstrap/Col'; import Button from 'react-bootstrap/Button'; import InputGroup from 'react-bootstrap/InputGroup'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -21,8 +23,13 @@ export default class ArtifactsUpload extends React.Component { state = { pack_file: null, + prefix: "", loading: false, uploaded: [], + filter: "", + + // after upload the server will cache the file here. + vfs_path: [], } componentDidMount() { @@ -33,6 +40,18 @@ export default class ArtifactsUpload extends React.Component { this.source.cancel("unmounted"); } + componentDidUpdate = (prevProps, prevState, rootNode) => { + if(!_.isEqual(prevState.filter, this.state.filter) || + !_.isEqual(prevState.prefix, this.state.prefix) || + !_.isEqual(prevState.vfs_path, this.state.vfs_path)) { + this.updateFile(); + return true; + } + return false; + } + + // The first call uploads the file and records the cached + // filestore path uploadFile = () => { if (!this.state.pack_file) { return; @@ -41,22 +60,74 @@ export default class ArtifactsUpload extends React.Component { var reader = new FileReader(); reader.onload = (event) => { var request = { + prefix: this.state.prefix, + filter: this.state.filter, data: reader.result.split(",")[1], }; this.setState({loading: true}); api.post("v1/LoadArtifactPack", request, this.source.token).then(response => { - let uploaded = _.map(response.data.successful_artifacts, - (x, idx)=>{ - return {name: x, id: idx}; - }); - this.setState({loading:false, uploaded: uploaded}); - }); + if (response.data.cancel) { + return ; + } + + let uploaded = _.map( + response.data.successful_artifacts, + (x, idx)=>{ + return {name: x, id: idx}; + }); + this.setState({loading:false, + vfs_path: response.data.vfs_path, + uploaded: uploaded}); + }); }; reader.readAsDataURL(this.state.pack_file); } + updateFile = () => { + if (this.state.loading) { + return; + } + + var request = { + prefix: this.state.prefix, + filter: this.state.filter, + vfs_path: this.state.vfs_path, + }; + api.post("v1/LoadArtifactPack", request, + this.source.token).then(response => { + if (response.data.cancel) { + return ; + } + let uploaded = _.map( + response.data.successful_artifacts, + (x, idx)=>{ + return {name: x, id: idx}; + }); + + this.setState({loading:false, + vfs_path: response.data.vfs_path, + uploaded: uploaded}); + }); + }; + + importFile = () => { + var request = { + prefix: this.state.prefix, + filter: this.state.filter, + vfs_path: this.state.vfs_path, + really_do_it: true, + }; + api.post("v1/LoadArtifactPack", request, + this.source.token).then(response => { + if (response.data.cancel) { + return ; + } + this.props.onClose(); + }); + }; + render() { let columns = formatColumns([ {dataField: "name", text: T("Artifact Name"), @@ -65,60 +136,96 @@ export default class ArtifactsUpload extends React.Component { return ( <> - + {T("Upload artifacts from a Zip pack")} - { _.isEmpty(this.state.uploaded) ? -
- - - - { this.state.loading ? - : - "Upload" } - - - - { - if (!_.isEmpty(e.currentTarget.files)) { - this.setState({pack_file: e.currentTarget.files[0]}); - } - }} + + + + + + this.uploadFile()}> + { this.state.loading ? + : + T("Upload") } + + + + { + if (!_.isEmpty(e.currentTarget.files)) { + this.setState({pack_file: e.currentTarget.files[0]}); + } + }} + /> + + { this.state.pack_file ? this.state.pack_file.name : + T("Click to upload artifact pack file")} + + + + + + + + { !_.isEmpty(this.state.vfs_path) && +
+ + {T("Prefix")} + + { + this.setState({prefix: e.target.value}); + }} /> - - { this.state.pack_file ? this.state.pack_file.name : - T("Click to upload artifact pack file")} - - - - - - : - - - - } -
- - +
diff --git a/gui/velociraptor/src/components/artifacts/artifacts.jsx b/gui/velociraptor/src/components/artifacts/artifacts.jsx index ff6f9a3ea31..13bb924a4e8 100644 --- a/gui/velociraptor/src/components/artifacts/artifacts.jsx +++ b/gui/velociraptor/src/components/artifacts/artifacts.jsx @@ -93,7 +93,12 @@ class ArtifactInspector extends React.Component { showEditedArtifactDialog: false, showDeleteArtifactDialog: false, showArtifactsUploadDialog: false, - current_filter: "type:CLIENT", + + // The current filter string in the search box. + current_filter: "", + + // The currently selected preset filter. + preset_filter: "type:CLIENT", version: 0, @@ -107,10 +112,14 @@ class ArtifactInspector extends React.Component { this.props.match.params.artifact; if (!artifact_name) { - this.fetchRows("type:CLIENT"); + this.fetchRows("...", this.state.preset_filter); return; } + // If we get here the url contains the artifact name, we + // therefore have to allow all types of artifacts because we + // dont know which type the artifact is this.setState({selectedDescriptor: {name: artifact_name}, + preset_filter: "", current_filter: artifact_name}); this.updateSearch(artifact_name); } @@ -121,10 +130,10 @@ class ArtifactInspector extends React.Component { updateSearch = (value) => { this.setState({current_filter: value}); - this.fetchRows(value); + this.fetchRows(value, this.state.preset_filter); } - fetchRows = (search_term) => { + fetchRows = (search_term, preset_filter) => { this.setState({loading: true}); // Cancel any in flight calls. @@ -133,7 +142,8 @@ class ArtifactInspector extends React.Component { api.post("v1/GetArtifacts", { - search_term: search_term || "...", + search_term: _.trim(preset_filter) + " " + + _.trim(search_term|| "..."), // This might be too many to fetch at once but we // are still fast enough for now. fields: { @@ -240,7 +250,7 @@ class ArtifactInspector extends React.Component { }, this.source.token).then(resp => { if (resp.cancel) return; - this.fetchRows(this.state.current_filter); + this.fetchRows(this.state.current_filter, this.state.preset_filter); this.setState({showDeleteArtifactDialog: false}); }); } @@ -256,10 +266,10 @@ class ArtifactInspector extends React.Component { value={option_value} onChange={x=>{ this.setState({ - current_filter: x.value, + preset_filter: x.value, filter_name: x.label, }); - this.fetchRows(x.value); + this.fetchRows(this.state.current_filter, x.value); }} placeholder={T("Filter artifact")} />; @@ -277,7 +287,8 @@ class ArtifactInspector extends React.Component { onClose={() => { // Re-apply the search in case the user updated // an artifact that should show up. - this.fetchRows(this.state.current_filter); + this.fetchRows(this.state.current_filter, + this.state.preset_filter); this.setState({showNewArtifactDialog: false}); }} /> @@ -289,7 +300,8 @@ class ArtifactInspector extends React.Component { onClose={() => { // Re-apply the search in case the user updated // an artifact that should show up. - this.fetchRows(this.state.current_filter); + this.fetchRows(this.state.current_filter, + this.state.preset_filter); this.getArtifactDescription(selected); this.setState({showEditedArtifactDialog: false}); }} @@ -308,7 +320,8 @@ class ArtifactInspector extends React.Component { onClose={() => { // Re-apply the search in case the user updated // an artifact that should show up. - this.fetchRows(this.state.current_filter); + this.fetchRows(this.state.current_filter, + this.state.preset_filter); this.setState({showArtifactsUploadDialog: false}); }} /> @@ -321,7 +334,7 @@ class ArtifactInspector extends React.Component { onClick={() => this.setState({showNewArtifactDialog: true})} variant="default"> - {T("Add an Artifact")} + {T("Add an Artifact")}
@@ -382,7 +395,8 @@ class ArtifactInspector extends React.Component { { this.searchInput = input; }} value={this.state.current_filter} - onChange={(e) => this.updateSearch(e.currentTarget.value)} + onChange={(e) => this.updateSearch( + e.currentTarget.value)} placeholder={T("Search for artifact")} spellCheck="false" /> diff --git a/gui/velociraptor/src/components/hunts/new-hunt.jsx b/gui/velociraptor/src/components/hunts/new-hunt.jsx index 1461629a332..8d9f43974a2 100644 --- a/gui/velociraptor/src/components/hunts/new-hunt.jsx +++ b/gui/velociraptor/src/components/hunts/new-hunt.jsx @@ -66,7 +66,7 @@ class NewHuntConfigureHunt extends React.Component { - Description + {T("Description")} "Notebook for Collection "+name, + "Import Artifacts": length=><>Import {length} Artifacts, "ArtifactDeletionDialog": (session_id, artifacts, total_bytes, total_rows)=> <> You are about to permanently delete the artifact collection diff --git a/paths/constants.go b/paths/constants.go index 335371400d4..d062e507c55 100644 --- a/paths/constants.go +++ b/paths/constants.go @@ -53,6 +53,9 @@ var ( PUBLIC_ROOT = path_specs.NewUnsafeFilestorePath("public"). SetType(api.PATH_TYPE_FILESTORE_ANY) + TEMP_ROOT = path_specs.NewUnsafeFilestorePath("temp"). + SetType(api.PATH_TYPE_FILESTORE_ANY) + // Timelines TIMELINE_URN = path_specs.NewSafeDatastorePath("timelines"). SetType(api.PATH_TYPE_DATASTORE_JSON) diff --git a/paths/forms.go b/paths/forms.go index 4b196d484a2..b1607be6200 100644 --- a/paths/forms.go +++ b/paths/forms.go @@ -1,43 +1,79 @@ package paths import ( + "errors" "net/url" config_proto "www.velocidex.com/golang/velociraptor/config/proto" + "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/file_store/api" + "www.velocidex.com/golang/velociraptor/services" ) type FormUploadPathManager struct { filename string hash string - config_obj *config_proto.Config + org_config_obj *config_proto.Config } -func (self FormUploadPathManager) Path() api.FSPathSpec { +// NOTE: The FormUploadPathManager must be used with the root org's +// filestore, even though it is instantiated with the org's +// config. This is because form upload files are **always** written to +// the root's public/ directory so they can be exported through the +// web server. + +// In order to enforce this, the prototype of this function is +// different than usual and returns the root filestore as well. +func (self FormUploadPathManager) Path() (api.FSPathSpec, api.FileStore, error) { + // All tools are stored at the global public directory which is + // mapped to a http static handler. The downloaded URL is + // regardless of org - however each org has a different download + // name. We need to write the tool on the root org's public + // directory. + org_manager, err := services.GetOrgManager() + root_org_config, err := org_manager.GetOrgConfig(services.ROOT_ORG_ID) + if err != nil { + return nil, nil, err + } + + file_store_factory := file_store.GetFileStore(root_org_config) + if file_store_factory == nil { + return nil, nil, errors.New("No filestore configured") + } + + return self.path(), file_store_factory, nil +} + +func (self FormUploadPathManager) path() api.FSPathSpec { return PUBLIC_ROOT.AddChild("temp", self.hash, self.filename) } -// Calculate the URL by which the upload will be exported. +// Calculate the URL by which the upload will be exported. Uploads are +// shared by all orgs in the same public directory but their hashes +// prevent collisions. func (self FormUploadPathManager) URL() string { - if self.config_obj.Client == nil || len(self.config_obj.Client.ServerUrls) == 0 { + if self.org_config_obj.Client == nil || len(self.org_config_obj.Client.ServerUrls) == 0 { return "" } - dest_url, err := url.Parse(self.config_obj.Client.ServerUrls[0]) + dest_url, err := url.Parse(self.org_config_obj.Client.ServerUrls[0]) if err != nil { return "" } - dest_url.Path = self.Path().AsClientPath() + dest_url.Path = self.path().AsClientPath() return dest_url.String() } func NewFormUploadPathManager( config_obj *config_proto.Config, filename string) *FormUploadPathManager { + + // The hash is built by using a combination of filename and org + // name to make it globally unique. return &FormUploadPathManager{ - filename: filename, - hash: ObfuscateName(config_obj, filename), - config_obj: config_obj, + filename: filename, + hash: ObfuscateName(config_obj, filename), + org_config_obj: config_obj, } } diff --git a/paths/inventory.go b/paths/inventory.go index 5d9d8380360..f5616bd05ed 100644 --- a/paths/inventory.go +++ b/paths/inventory.go @@ -3,10 +3,13 @@ package paths import ( "crypto/sha256" "encoding/hex" + "errors" artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" config_proto "www.velocidex.com/golang/velociraptor/config/proto" + "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/file_store/api" + "www.velocidex.com/golang/velociraptor/services" ) func ObfuscateName( @@ -25,11 +28,36 @@ func ObfuscateName( } type InventoryPathManager struct { - root api.FSPathSpec + org_config_obj *config_proto.Config + root api.FSPathSpec } -func (self InventoryPathManager) Path() api.FSPathSpec { - return self.root +// NOTE: The InventoryPathManager must be used with the root org's +// filestore, even though it is instantiated with the org's +// config. This is because inventory files are **always** written to +// the root's public/ directory so they can be exported through the +// web server. + +// In order to enforce this, the prototype of this function is +// different than usual and returns the root filestore as well. +func (self InventoryPathManager) Path() (api.FSPathSpec, api.FileStore, error) { + // All tools are stored at the global public directory which is + // mapped to a http static handler. The downloaded URL is + // regardless of org - however each org has a different download + // name. We need to write the tool on the root org's public + // directory. + org_manager, err := services.GetOrgManager() + root_org_config, err := org_manager.GetOrgConfig(services.ROOT_ORG_ID) + if err != nil { + return nil, nil, err + } + + file_store_factory := file_store.GetFileStore(root_org_config) + if file_store_factory == nil { + return nil, nil, errors.New("No filestore configured") + } + + return self.root, file_store_factory, nil } func NewInventoryPathManager(config_obj *config_proto.Config, @@ -39,6 +67,7 @@ func NewInventoryPathManager(config_obj *config_proto.Config, } return &InventoryPathManager{ - root: PUBLIC_ROOT.AddChild(tool.FilestorePath), + org_config_obj: config_obj, + root: PUBLIC_ROOT.AddChild(tool.FilestorePath), } } diff --git a/paths/temp.go b/paths/temp.go new file mode 100644 index 00000000000..76b0b653b3f --- /dev/null +++ b/paths/temp.go @@ -0,0 +1,22 @@ +package paths + +import ( + "github.com/google/uuid" + "www.velocidex.com/golang/velociraptor/file_store/api" +) + +type TempPathManager struct { + filename string +} + +func (self TempPathManager) Path() api.FSPathSpec { + return TEMP_ROOT.AddChild(self.filename) +} + +func NewTempPathManager(filename string) *TempPathManager { + if filename == "" { + filename = uuid.New().String() + } + + return &TempPathManager{filename: filename} +} diff --git a/services/inventory/inventory.go b/services/inventory/inventory.go index 277c7f4e96f..d1b1df933a2 100644 --- a/services/inventory/inventory.go +++ b/services/inventory/inventory.go @@ -50,7 +50,6 @@ import ( artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" config_proto "www.velocidex.com/golang/velociraptor/config/proto" "www.velocidex.com/golang/velociraptor/datastore" - "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/logging" "www.velocidex.com/golang/velociraptor/paths" "www.velocidex.com/golang/velociraptor/services" @@ -244,22 +243,6 @@ func (self *InventoryService) materializeTool( tool.Name) } - // All tools are stored at the global public directory which is - // mapped to a http static handler. The downloaded URL is - // regardless of org - however each org has a different download - // name. We need to write the tool on the root org's public - // directory. - org_manager, err := services.GetOrgManager() - root_org_config, err := org_manager.GetOrgConfig(services.ROOT_ORG_ID) - if err != nil { - return err - } - - file_store_factory := file_store.GetFileStore(root_org_config) - if file_store_factory == nil { - return errors.New("No filestore configured") - } - // All tools are written to the root org's public directory since // this is the only one mapped for external access. File names // should never clash because the names are derived from a hash @@ -267,7 +250,12 @@ func (self *InventoryService) materializeTool( // org. Therefore we use the root orgs file store but get a path // manager specific to each org. path_manager := paths.NewInventoryPathManager(org_config_obj, tool) - fd, err := file_store_factory.WriteFile(path_manager.Path()) + pathspec, file_store_factory, err := path_manager.Path() + if err != nil { + return err + } + + fd, err := file_store_factory.WriteFile(pathspec) if err != nil { return err } diff --git a/vql/golang/trace.go b/vql/golang/trace.go index d205ed53e00..3e68d43083c 100644 --- a/vql/golang/trace.go +++ b/vql/golang/trace.go @@ -21,7 +21,6 @@ import ( "www.velocidex.com/golang/velociraptor/logging" "www.velocidex.com/golang/velociraptor/utils" vql_subsystem "www.velocidex.com/golang/velociraptor/vql" - "www.velocidex.com/golang/velociraptor/vql/networking" "www.velocidex.com/golang/vfilter" ) @@ -83,7 +82,13 @@ func (self *TraceFunction) Call(ctx context.Context, subscope.AppendVars(ordereddict.NewDict(). Set("ZipFile", buf.Bytes())) - return (&networking.UploadFunction{}).Call( + // Allow the uploader to be overriden. + upload_func, ok := scope.GetFunction("upload") + if !ok { + return &vfilter.Null{} + } + + return upload_func.Call( ctx, subscope, ordereddict.NewDict(). Set("accessor", "scope"). Set("file", "ZipFile"). diff --git a/vql/server/flows/create.go b/vql/server/flows/create.go index 75303f2e535..cc589eb202c 100644 --- a/vql/server/flows/create.go +++ b/vql/server/flows/create.go @@ -19,7 +19,6 @@ package flows import ( "context" - "strings" "github.com/Velocidex/ordereddict" "www.velocidex.com/golang/velociraptor/acls" @@ -74,12 +73,18 @@ func (self *ScheduleCollectionFunction) Call(ctx context.Context, return vfilter.Null{} } + client_info_manager, err := services.GetClientInfoManager(config_obj) + if err != nil { + scope.Log("collect_client: %v", err) + return vfilter.Null{} + } + // Scheduling artifacts on the server requires higher // permissions. var permission acls.ACL_PERMISSION if arg.ClientId == "server" { permission = acls.SERVER_ADMIN - } else if strings.HasPrefix(arg.ClientId, "C.") { + } else if client_info_manager.ValidateClientId(arg.ClientId) == nil { permission = acls.COLLECT_CLIENT } else { scope.Log("collect_client: unsupported client id") diff --git a/vql/server/inventory.go b/vql/server/inventory.go index d40a7b893ad..85f4717f50f 100644 --- a/vql/server/inventory.go +++ b/vql/server/inventory.go @@ -10,7 +10,6 @@ import ( "www.velocidex.com/golang/velociraptor/accessors" "www.velocidex.com/golang/velociraptor/acls" artifacts_proto "www.velocidex.com/golang/velociraptor/artifacts/proto" - "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/json" "www.velocidex.com/golang/velociraptor/paths" "www.velocidex.com/golang/velociraptor/services" @@ -79,8 +78,13 @@ func (self *InventoryAddFunction) Call(ctx context.Context, } path_manager := paths.NewInventoryPathManager(config_obj, tool) - file_store_factory := file_store.GetFileStore(config_obj) - writer, err := file_store_factory.WriteFile(path_manager.Path()) + pathspec, file_store_factory, err := path_manager.Path() + if err != nil { + scope.Log("inventory_add: %s", err) + return vfilter.Null{} + } + + writer, err := file_store_factory.WriteFile(pathspec) if err != nil { scope.Log("inventory_add: %s", err) return vfilter.Null{} diff --git a/vql/server/repository.go b/vql/server/repository.go index 37db3cfbc84..c6c8681ddab 100644 --- a/vql/server/repository.go +++ b/vql/server/repository.go @@ -243,6 +243,9 @@ func (self ArtifactsPlugin) Call( } for _, name := range names { artifact, pres := repository.Get(ctx, config_obj, name) + if !pres { + continue + } // Clean up the artifact by removing internal fields. artifact = proto.Clone(artifact).(*artifacts_proto.Artifact) diff --git a/vql/tools/repack.go b/vql/tools/repack.go index 94a9e91293b..4bf143442e7 100644 --- a/vql/tools/repack.go +++ b/vql/tools/repack.go @@ -28,7 +28,6 @@ import ( "www.velocidex.com/golang/velociraptor/acls" "www.velocidex.com/golang/velociraptor/config" config_proto "www.velocidex.com/golang/velociraptor/config/proto" - "www.velocidex.com/golang/velociraptor/file_store" "www.velocidex.com/golang/velociraptor/file_store/csv" "www.velocidex.com/golang/velociraptor/json" "www.velocidex.com/golang/velociraptor/paths" @@ -37,7 +36,6 @@ import ( "www.velocidex.com/golang/velociraptor/utils" "www.velocidex.com/golang/velociraptor/vql" vql_subsystem "www.velocidex.com/golang/velociraptor/vql" - "www.velocidex.com/golang/velociraptor/vql/networking" "www.velocidex.com/golang/vfilter" "www.velocidex.com/golang/vfilter/arg_parser" ) @@ -163,7 +161,12 @@ func (self RepackFunction) Call(ctx context.Context, sub_scope.AppendVars( ordereddict.NewDict().Set("PACKED_Binary", exe_bytes)) - return (&networking.UploadFunction{}).Call( + upload_func, ok := scope.GetFunction("upload") + if !ok { + return vfilter.Null{} + } + + return upload_func.Call( ctx, sub_scope, ordereddict.NewDict(). Set("file", "PACKED_Binary"). Set("name", arg.UploadName). @@ -205,21 +208,15 @@ func readExeFile( return nil, err } - // Find the actual tool from the filestore. NOTE: Tools are stored - // in a central location in the root org that gets served to all - // orgs. - org_manager, err := services.GetOrgManager() - if err != nil { - return nil, err - } - // The path is determined by the org specific inventory manager, // but must be opened using the root orgs filestore. path_manager := paths.NewInventoryPathManager(config_obj, tool) + pathspec, file_store_factory, err := path_manager.Path() + if err != nil { + return nil, err + } - root_config_obj, _ := org_manager.GetOrgConfig("root") - root_file_store_factory := file_store.GetFileStore(root_config_obj) - fd, err := root_file_store_factory.ReadFile(path_manager.Path()) + fd, err := file_store_factory.ReadFile(pathspec) if err != nil { return nil, err } @@ -281,7 +278,12 @@ func RepackMSI( sub_scope.AppendVars( ordereddict.NewDict().Set("PACKED_MSI", data)) - return (&networking.UploadFunction{}).Call( + upload_func, ok := scope.GetFunction("upload") + if !ok { + return vfilter.Null{} + } + + return upload_func.Call( ctx, sub_scope, ordereddict.NewDict(). Set("file", "PACKED_MSI"). Set("name", upload_name). @@ -294,13 +296,6 @@ func AppendBinaries( scope vfilter.Scope, exe_bytes []byte, binaries []string) ([]byte, error) { - org_manager, err := services.GetOrgManager() - if err != nil { - return nil, err - } - - root_config_obj, _ := org_manager.GetOrgConfig("root") - // Build the zip file that contains all the binaries. csv_file := &bytes.Buffer{} csv_writer := csv.GetCSVAppender( @@ -314,7 +309,6 @@ func AppendBinaries( return nil, err } - file_store_factory := file_store.GetFileStore(root_config_obj) for _, name := range binaries { parts := strings.SplitN(name, ":", 2) version := "" @@ -332,7 +326,12 @@ func AppendBinaries( // Try to open the tool directly from the filestore path_manager := paths.NewInventoryPathManager(config_obj, tool) - fd, err := file_store_factory.ReadFile(path_manager.Path()) + pathspec, file_store_factory, err := path_manager.Path() + if err != nil { + return nil, err + } + + fd, err := file_store_factory.ReadFile(pathspec) if err != nil { return nil, err }