File: 0001-personal-access-token.patch

package info (click to toggle)
python-certbot-dns-gandi 1.4.3-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 152 kB
  • sloc: python: 183; sh: 8; makefile: 3
file content (150 lines) | stat: -rw-r--r-- 5,814 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
From af81daf60c64f01611a1f6a34ef141dc1cf020d0 Mon Sep 17 00:00:00 2001
From: Corentin Forler <10946971+cogk@users.noreply.github.com>
Date: Wed, 20 Sep 2023 11:01:23 +0200
Subject: [PATCH 1/2] feat: Add authentication with Personal Access Token

---
 certbot_plugin_gandi/gandi_api.py | 12 ++++++++----
 certbot_plugin_gandi/main.py      | 24 ++++++++++++++++++------
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/certbot_plugin_gandi/gandi_api.py b/certbot_plugin_gandi/gandi_api.py
index 3e1ef84..67c9908 100644
--- a/certbot_plugin_gandi/gandi_api.py
+++ b/certbot_plugin_gandi/gandi_api.py
@@ -4,11 +4,11 @@
 from collections import namedtuple
 from certbot.plugins import dns_common
 
-_GandiConfig = namedtuple('_GandiConfig', ('api_key', 'sharing_id',))
+_GandiConfig = namedtuple('_GandiConfig', ('api_key', 'sharing_id', 'personal_access_token',))
 _BaseDomain = namedtuple('_BaseDomain', ('fqdn'))
 
-def get_config(api_key, sharing_id):
-    return _GandiConfig(api_key=api_key, sharing_id=sharing_id)
+def get_config(api_key, sharing_id, personal_access_token=None):
+    return _GandiConfig(api_key=api_key, sharing_id=sharing_id, personal_access_token=personal_access_token)
 
 
 def _get_json(response):
@@ -24,9 +24,13 @@ def _get_response_message(response, default='<No reason given>'):
 
 
 def _headers(cfg):
+    if cfg.personal_access_token:
+        auth = 'Bearer ' + cfg.personal_access_token
+    else:
+        auth = 'Apikey ' + cfg.api_key
     return {
         'Content-Type': 'application/json',
-        'Authorization': 'Apikey ' + cfg.api_key
+        'Authorization': auth,
     }
 
 
diff --git a/certbot_plugin_gandi/main.py b/certbot_plugin_gandi/main.py
index c547d1a..6930f0c 100644
--- a/certbot_plugin_gandi/main.py
+++ b/certbot_plugin_gandi/main.py
@@ -15,7 +15,7 @@ def register_authenticator(cls):
         import zope.interface
         zope.interface.implementer(interfaces.IAuthenticator)(cls)
         zope.interface.provider(interfaces.IPluginFactory)(cls)
-    return cls 
+    return cls
 
 @register_authenticator
 class Authenticator(dns_common.DNSAuthenticator):
@@ -47,14 +47,22 @@ def _validate_sharing_id(self, credentials):
             except ValueError:
                 raise errors.PluginError("Invalid sharing_id: {0}.".format(sharing_id))
 
+    def _validate(self, credentials):
+        self._validate_sharing_id(credentials)
+
+        # Either api-key or token must be set
+        if not credentials.conf('api-key') and not credentials.conf('token'):
+            raise errors.PluginError(
+                'Missing property in credentials configuration file {0}: {1}'.format(
+                    credentials.confobj.filename, 'dns_gandi_api_key or dns_gandi_token must be set')
+                )
+
     def _setup_credentials(self):
         self.credentials = self._configure_credentials(
             'credentials',
             'Gandi credentials INI file',
-            {
-                'api-key': 'API key for Gandi account',
-            },
-            self._validate_sharing_id
+            {},
+            self._validate
         )
 
 
@@ -71,4 +79,8 @@ def _cleanup(self, domain, validation_name, validation):
 
 
     def _get_gandi_config(self):
-        return gandi_api.get_config(api_key = self.credentials.conf('api-key'), sharing_id = self.credentials.conf('sharing-id'))
+        return gandi_api.get_config(
+            api_key = self.credentials.conf('api-key'),
+            sharing_id = self.credentials.conf('sharing-id'),
+            personal_access_token = self.credentials.conf('token'),
+        )

From da164a8360a6cceeb5fc9b45000d37d75682fb45 Mon Sep 17 00:00:00 2001
From: Corentin Forler <10946971+cogk@users.noreply.github.com>
Date: Wed, 20 Sep 2023 11:08:02 +0200
Subject: [PATCH 2/2] doc: Update readme to showcase personal access token

---
 README.md | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index ede080d..68f982e 100644
--- a/README.md
+++ b/README.md
@@ -13,15 +13,12 @@ customers to prove control of a domain name.
 2. Install the plugin using `pip install certbot-plugin-gandi`
 
 3. Create a `gandi.ini` config file with the following contents and apply `chmod 600 gandi.ini` on it:
+   ```conf
+   # Gandi personal access token
+   dns_gandi_token=PERSONAL_ACCESS_TOKEN
    ```
-   # live dns v5 api key
-   dns_gandi_api_key=APIKEY
-
-   # optional organization id, remove it if not used
-   dns_gandi_sharing_id=SHARINGID
-   ```
-   Replace `APIKEY` with your Gandi API key and ensure permissions are set
-   to disallow access to other users.
+   Replace `PERSONAL_ACCESS_TOKEN` with your Gandi personal access token and ensure permissions are set
+   to disallow access to other users. You can also use a Gandi LiveDNS API Key instead, see FAQ below.
 
 4. Run `certbot` and direct it to use the plugin for authentication and to use
    the config file previously created:
@@ -70,6 +67,20 @@ You can setup automatic renewal using `crontab` with the following job for weekl
 
 ## FAQ
 
+> I don't have a personal access token, only a Gandi LiveDNS API Key
+
+Use the following configuration in your `gandi.ini` file instead:
+
+```conf
+# live dns v5 api key
+dns_gandi_api_key=APIKEY
+
+# optional organization id, remove it if not used
+dns_gandi_sharing_id=SHARINGID
+```
+Replace `APIKEY` with your Gandi API key and ensure permissions are set
+to disallow access to other users.
+
 > I have a warning telling me `Plugin legacy name certbot-plugin-gandi:dns may be removed in a future version. Please use dns instead.`
 
 Certbot had moved to remove 3rd party plugins prefixes since v1.7.0. Please switch to the new configuration format and remove any used prefix-based configuration.