(artifacts []relaychannel.TaskArtifact)
| 146 | } |
| 147 | |
| 148 | func validateProjectedTaskArtifacts(artifacts []relaychannel.TaskArtifact) ([]relaychannel.TaskArtifact, error) { |
| 149 | if len(artifacts) > 64 { |
| 150 | return nil, fmt.Errorf("%w: too many artifacts", errTaskArtifactPlugin) |
| 151 | } |
| 152 | seen := make(map[string]struct{}, len(artifacts)) |
| 153 | for i := range artifacts { |
| 154 | if artifacts[i].Key != strings.TrimSpace(artifacts[i].Key) || |
| 155 | artifacts[i].Type != strings.TrimSpace(artifacts[i].Type) { |
| 156 | return nil, fmt.Errorf("%w: invalid artifact identity", errTaskArtifactPlugin) |
| 157 | } |
| 158 | if !taskArtifactKeyPattern.MatchString(artifacts[i].Key) { |
| 159 | return nil, fmt.Errorf("%w: invalid artifact key", errTaskArtifactPlugin) |
| 160 | } |
| 161 | if _, exists := seen[artifacts[i].Key]; exists { |
| 162 | return nil, fmt.Errorf("%w: duplicate artifact key", errTaskArtifactPlugin) |
| 163 | } |
| 164 | seen[artifacts[i].Key] = struct{}{} |
| 165 | switch artifacts[i].Type { |
| 166 | case "video", "audio", "image", "file": |
| 167 | default: |
| 168 | return nil, fmt.Errorf("%w: invalid artifact type", errTaskArtifactPlugin) |
| 169 | } |
| 170 | if len(artifacts[i].MimeType) > 255 || strings.ContainsAny(artifacts[i].MimeType, "\r\n") { |
| 171 | return nil, fmt.Errorf("%w: invalid artifact mime type", errTaskArtifactPlugin) |
| 172 | } |
| 173 | } |
| 174 | return artifacts, nil |
| 175 | } |
| 176 | |
| 177 | func initTaskArtifactAdaptor(task *model.Task) (relaychannel.TaskAdaptor, error) { |
| 178 | if task == nil || !taskHasPluginExecution(task) { |
no outgoing calls