1
2
3
4
5
6 package github
7
8 import (
9 "context"
10 "encoding/json"
11 "fmt"
12 "strconv"
13 )
14
15
16 type PublicKey struct {
17 KeyID *string `json:"key_id"`
18 Key *string `json:"key"`
19 }
20
21
22
23
24 func (p *PublicKey) UnmarshalJSON(data []byte) error {
25 var pk struct {
26 KeyID interface{} `json:"key_id,string"`
27 Key *string `json:"key"`
28 }
29
30 if err := json.Unmarshal(data, &pk); err != nil {
31 return err
32 }
33
34 p.Key = pk.Key
35
36 switch v := pk.KeyID.(type) {
37 case nil:
38 return nil
39 case string:
40 p.KeyID = &v
41 case float64:
42 p.KeyID = String(strconv.FormatFloat(v, 'f', -1, 64))
43 default:
44 return fmt.Errorf("unable to unmarshal %T as a string", v)
45 }
46
47 return nil
48 }
49
50 func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) {
51 req, err := s.client.NewRequest("GET", url, nil)
52 if err != nil {
53 return nil, nil, err
54 }
55
56 pubKey := new(PublicKey)
57 resp, err := s.client.Do(ctx, req, pubKey)
58 if err != nil {
59 return nil, resp, err
60 }
61
62 return pubKey, resp, nil
63 }
64
65
66
67
68 func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) {
69 url := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo)
70 return s.getPublicKey(ctx, url)
71 }
72
73
74
75
76 func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) {
77 url := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org)
78 return s.getPublicKey(ctx, url)
79 }
80
81
82
83
84 func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) {
85 url := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env)
86 return s.getPublicKey(ctx, url)
87 }
88
89
90 type Secret struct {
91 Name string `json:"name"`
92 CreatedAt Timestamp `json:"created_at"`
93 UpdatedAt Timestamp `json:"updated_at"`
94 Visibility string `json:"visibility,omitempty"`
95 SelectedRepositoriesURL string `json:"selected_repositories_url,omitempty"`
96 }
97
98
99 type Secrets struct {
100 TotalCount int `json:"total_count"`
101 Secrets []*Secret `json:"secrets"`
102 }
103
104 func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) {
105 u, err := addOptions(url, opts)
106 if err != nil {
107 return nil, nil, err
108 }
109
110 req, err := s.client.NewRequest("GET", u, nil)
111 if err != nil {
112 return nil, nil, err
113 }
114
115 secrets := new(Secrets)
116 resp, err := s.client.Do(ctx, req, &secrets)
117 if err != nil {
118 return nil, resp, err
119 }
120
121 return secrets, resp, nil
122 }
123
124
125
126
127
128 func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) {
129 url := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo)
130 return s.listSecrets(ctx, url, opts)
131 }
132
133
134
135
136
137 func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) {
138 url := fmt.Sprintf("orgs/%v/actions/secrets", org)
139 return s.listSecrets(ctx, url, opts)
140 }
141
142
143
144
145 func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) {
146 url := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env)
147 return s.listSecrets(ctx, url, opts)
148 }
149
150 func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) {
151 req, err := s.client.NewRequest("GET", url, nil)
152 if err != nil {
153 return nil, nil, err
154 }
155
156 secret := new(Secret)
157 resp, err := s.client.Do(ctx, req, secret)
158 if err != nil {
159 return nil, resp, err
160 }
161
162 return secret, resp, nil
163 }
164
165
166
167
168 func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) {
169 url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name)
170 return s.getSecret(ctx, url)
171 }
172
173
174
175
176 func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) {
177 url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name)
178 return s.getSecret(ctx, url)
179 }
180
181
182
183
184 func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) {
185 url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName)
186 return s.getSecret(ctx, url)
187 }
188
189
190 type SelectedRepoIDs []int64
191
192
193
194
195
196
197 type EncryptedSecret struct {
198 Name string `json:"-"`
199 KeyID string `json:"key_id"`
200 EncryptedValue string `json:"encrypted_value"`
201 Visibility string `json:"visibility,omitempty"`
202 SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"`
203 }
204
205 func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) {
206 req, err := s.client.NewRequest("PUT", url, eSecret)
207 if err != nil {
208 return nil, err
209 }
210
211 return s.client.Do(ctx, req, nil)
212 }
213
214
215
216
217 func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) {
218 url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name)
219 return s.putSecret(ctx, url, eSecret)
220 }
221
222
223
224
225 func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) {
226 url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name)
227 return s.putSecret(ctx, url, eSecret)
228 }
229
230
231
232
233 func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) {
234 url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name)
235 return s.putSecret(ctx, url, eSecret)
236 }
237
238 func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Response, error) {
239 req, err := s.client.NewRequest("DELETE", url, nil)
240 if err != nil {
241 return nil, err
242 }
243
244 return s.client.Do(ctx, req, nil)
245 }
246
247
248
249
250 func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) {
251 url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name)
252 return s.deleteSecret(ctx, url)
253 }
254
255
256
257
258 func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) {
259 url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name)
260 return s.deleteSecret(ctx, url)
261 }
262
263
264
265
266 func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) {
267 url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName)
268 return s.deleteSecret(ctx, url)
269 }
270
271
272 type SelectedReposList struct {
273 TotalCount *int `json:"total_count,omitempty"`
274 Repositories []*Repository `json:"repositories,omitempty"`
275 }
276
277 func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) {
278 u, err := addOptions(url, opts)
279 if err != nil {
280 return nil, nil, err
281 }
282
283 req, err := s.client.NewRequest("GET", u, nil)
284 if err != nil {
285 return nil, nil, err
286 }
287
288 result := new(SelectedReposList)
289 resp, err := s.client.Do(ctx, req, result)
290 if err != nil {
291 return nil, resp, err
292 }
293
294 return result, resp, nil
295 }
296
297
298
299
300 func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) {
301 url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name)
302 return s.listSelectedReposForSecret(ctx, url, opts)
303 }
304
305 func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) {
306 type repoIDs struct {
307 SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"`
308 }
309
310 req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids})
311 if err != nil {
312 return nil, err
313 }
314
315 return s.client.Do(ctx, req, nil)
316 }
317
318
319
320
321 func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) {
322 url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name)
323 return s.setSelectedReposForSecret(ctx, url, ids)
324 }
325
326 func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) {
327 req, err := s.client.NewRequest("PUT", url, nil)
328 if err != nil {
329 return nil, err
330 }
331
332 return s.client.Do(ctx, req, nil)
333 }
334
335
336
337
338 func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) {
339 url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID)
340 return s.addSelectedRepoToSecret(ctx, url)
341 }
342
343 func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) {
344 req, err := s.client.NewRequest("DELETE", url, nil)
345 if err != nil {
346 return nil, err
347 }
348
349 return s.client.Do(ctx, req, nil)
350 }
351
352
353
354
355 func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) {
356 url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID)
357 return s.removeSelectedRepoFromSecret(ctx, url)
358 }
359
View as plain text