Adding github actions secrets (#1681)

* Fixed pre-commit issues

* Fixed mypy linting error

* Fix flake8 error

* Update PublicKey.py

* Update PublicKey.py

* Update setup.py

* Update setup.py

* Update requirements.txt

Co-authored-by: Liuyang Wan <tsfdye@gmail.com>

Co-authored-by: Liuyang Wan <tsfdye@gmail.com>
This commit is contained in:
Chris Keating
2021-03-07 05:40:52 +08:00
committed by GitHub
co-authored by Liuyang Wan
parent 7db1b0c924
commit c90c050ef1
11 changed files with 244 additions and 2 deletions
+84
View File
@@ -0,0 +1,84 @@
############################ Copyrights and license ############################
# #
# Copyright 2012 Vincent Jacques <vincent@vincent-jacques.net> #
# Copyright 2012 Zearin <zearin@gonk.net> #
# Copyright 2013 AKFish <akfish@gmail.com> #
# Copyright 2013 Vincent Jacques <vincent@vincent-jacques.net> #
# Copyright 2014 Vincent Jacques <vincent@vincent-jacques.net> #
# Copyright 2016 Jannis Gebauer <ja.geb@me.com> #
# Copyright 2016 Peter Buckley <dx-pbuckley@users.noreply.github.com> #
# Copyright 2018 Wan Liuyang <tsfdye@gmail.com> #
# Copyright 2018 sfdye <tsfdye@gmail.com> #
# #
# This file is part of PyGithub. #
# http://pygithub.readthedocs.io/ #
# #
# PyGithub is free software: you can redistribute it and/or modify it under #
# the terms of the GNU Lesser General Public License as published by the Free #
# Software Foundation, either version 3 of the License, or (at your option) #
# any later version. #
# #
# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY #
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
# details. #
# #
# You should have received a copy of the GNU Lesser General Public License #
# along with PyGithub. If not, see <http://www.gnu.org/licenses/>. #
# #
################################################################################
# https://docs.github.com/en/rest/reference/actions#example-encrypting-a-secret-using-python
from base64 import b64encode
from nacl import encoding, public
import github.GithubObject
def encrypt(public_key: str, secret_value: str) -> str:
"""Encrypt a Unicode string using the public key."""
public_key = public.PublicKey(public_key.encode("utf-8"), encoding.Base64Encoder())
sealed_box = public.SealedBox(public_key)
encrypted = sealed_box.encrypt(secret_value.encode("utf-8"))
return b64encode(encrypted).decode("utf-8")
class PublicKey(github.GithubObject.CompletableGithubObject):
"""
This class represents either an organization public key or a repository public key.
The reference can be found here https://docs.github.com/en/rest/reference/actions#get-an-organization-public-key
or here https://docs.github.com/en/rest/reference/actions#get-a-repository-public-key
"""
def __repr__(self):
return self.get__repr__({"key_id": self._key_id.value, "key": self._key.value})
@property
def key(self):
"""
:type: string
"""
self._completeIfNotSet(self._key)
return self._key.value
@property
def key_id(self):
"""
:type: string
"""
self._completeIfNotSet(self._key_id)
return self._key_id.value
def _initAttributes(self):
self._key = github.GithubObject.NotSet
self._key_id = github.GithubObject.NotSet
def _useAttributes(self, attributes):
if "key" in attributes: # pragma no branch
self._key = self._makeStringAttribute(attributes["key"])
if "key_id" in attributes: # pragma no branch
self._key_id = self._makeStringAttribute(attributes["key_id"])
def encrypt(self, unencrypted_value):
return encrypt(self._key.value, unencrypted_value)
+13
View File
@@ -0,0 +1,13 @@
from typing import Any, Dict
from github.GithubObject import CompletableGithubObject
class PublicKey(CompletableGithubObject):
def __repr__(self) -> str: ...
def _initAttributes(self) -> None: ...
def _useAttributes(self, attributes: Dict[str, Any]) -> None: ...
@property
def key_id(self) -> str: ...
@property
def key(self) -> str: ...
def encrypt(self, unencrypted_value: str) -> str: ...
+33
View File
@@ -122,6 +122,7 @@ import github.PaginatedList
import github.Path
import github.Permissions
import github.Project
import github.PublicKey
import github.PullRequest
import github.Referrer
import github.Repository
@@ -1416,6 +1417,26 @@ class Repository(github.GithubObject.CompletableGithubObject):
)
return status == 204
def create_secret(self, secret_name, unencrypted_value):
"""
:calls: `PUT /repos/:owner/:repo/actions/secrets/:secret_name <https://docs.github.com/en/rest/reference/actions#get-a-repository-secret>`_
:param secret_name: string
:param unencrypted_value: string
:rtype: bool
"""
assert isinstance(secret_name, str), secret_name
assert isinstance(unencrypted_value, str), unencrypted_value
public_key = self.get_public_key()
payload = public_key.encrypt(unencrypted_value)
put_parameters = {
"key_id": public_key.key_id,
"encrypted_value": payload,
}
status, headers, data = self._requester.requestJson(
"PUT", self.url + "/actions/secrets/" + secret_name, input=put_parameters
)
return status == 201
def create_source_import(
self,
vcs,
@@ -2691,6 +2712,18 @@ class Repository(github.GithubObject.CompletableGithubObject):
None,
)
def get_public_key(self):
"""
:calls: `GET /repos/:owner/:repo/actions/secrets/public-key <https://docs.github.com/en/rest/reference/actions#get-a-repository-public-key>`_
:rtype: :class:`github.PublicKey.PublicKey`
"""
headers, data = self._requester.requestJsonAndCheck(
"GET", self.url + "/actions/secrets/public-key"
)
return github.PublicKey.PublicKey(
self._requester, headers, data, completed=True
)
def get_pull(self, number):
"""
:calls: `GET /repos/:owner/:repo/pulls/:number <http://developer.github.com/v3/pulls>`_
+3
View File
@@ -37,6 +37,7 @@ from github.PaginatedList import PaginatedList
from github.Path import Path
from github.Permissions import Permissions
from github.Project import Project
from github.PublicKey import PublicKey
from github.PullRequest import PullRequest
from github.PullRequestComment import PullRequestComment
from github.Referrer import Referrer
@@ -237,6 +238,7 @@ class Repository(CompletableGithubObject):
def create_repository_dispatch(
self, event_type: str, client_payload: Dict[str, Any]
) -> bool: ...
def create_secret(self, secret_name: str, unencrypted_value: str) -> bool: ...
def create_source_import(
self,
vcs: str,
@@ -409,6 +411,7 @@ class Repository(CompletableGithubObject):
def get_projects(
self, state: Union[str, _NotSetType] = ...
) -> PaginatedList[Project]: ...
def get_public_key(self) -> PublicKey: ...
def get_pull(self, number: int) -> PullRequest: ...
def get_pulls(
self,