File: fetch.go

package info (click to toggle)
cfrpki 1.4.4-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 2,960 kB
  • sloc: makefile: 73; sh: 34
file content (101 lines) | stat: -rw-r--r-- 2,015 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package cfrpki

import (
	"context"
	"fmt"
	"io/ioutil"
	"strings"

	librpki "github.com/cloudflare/cfrpki/validator/lib"
	"github.com/cloudflare/cfrpki/validator/pki"
)

type APIFetch struct {
	Client RPKIAPIClient
	Ctx    context.Context
}

func FetchFile(client RPKIAPIClient, ctx context.Context, path string) ([]byte, error) {
	resource, err := client.GetResource(ctx, &ResourceQuery{
		Path: path,
	})

	if err != nil {
		return nil, err
	}
	data, err := librpki.BER2DER(resource.Data)
	if err != nil {
		return resource.Data, err
	}
	return data, err
}

func (s *APIFetch) GetFile(file *pki.PKIFile) (*pki.SeekFile, error) {
	if file.Type == pki.TYPE_TAL {
		data, err := ioutil.ReadFile(file.Path)
		if err != nil {
			return nil, fmt.Errorf("Unable to read file %q: %v", file.Path, err)
		}

		return &pki.SeekFile{
			File: file.Path,
			Data: data,
		}, nil
	}

	path := file.ComputePath()

	data, err := FetchFile(s.Client, s.Ctx, path)
	if err != nil {
		return nil, fmt.Errorf("FetchFile failed: %v", err)
	}

	return &pki.SeekFile{
		File: path,
		Data: data,
	}, nil
}

func (s *APIFetch) GetRepository(file *pki.PKIFile, callback pki.CallbackExplore) error {
	resources, err := s.Client.GetRepository(s.Ctx, &ResourceQuery{
		Path: file.Repo,
	})
	if err != nil {
		return err
	}

	resource, err := resources.Recv()
	for resource != nil && err == nil {
		fullnameSplit := strings.Split(resource.Path, ".")
		extension := pki.TYPE_UNKNOWN
		if len(fullnameSplit) > 0 {
			switch fullnameSplit[len(fullnameSplit)-1] {
			case "crl":
				extension = pki.TYPE_CRL
			case "cer":
				extension = pki.TYPE_CER
			case "mft":
				extension = pki.TYPE_MFT
			case "roa":
				extension = pki.TYPE_ROA
			}
		}

		data, _ := librpki.BER2DER(resource.Data)

		callback(
			&pki.PKIFile{
				Parent: file,
				Type:   extension,
				Repo:   file.Repo,
				Path:   resource.Path,
			},
			&pki.SeekFile{
				File: resource.Path,
				Data: data,
			}, false)

		resource, err = resources.Recv()
	}
	return nil
}