Title: [289687] trunk/Tools
Revision
289687
Author
[email protected]
Date
2022-02-11 18:04:19 -0800 (Fri, 11 Feb 2022)

Log Message

git-webkit setup should allow changing the credentials
https://bugs.webkit.org/show_bug.cgi?id=235297
<rdar://problem/87988794>

Reviewed by Dewei Zhu.

* Tools/Scripts/libraries/webkitbugspy/setup.py: Bump version.
* Tools/Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitbugspy/webkitbugspy/bugzilla.py:
(Tracker.credentials): Pass validater into webkitscmpy.credentials if caller requests validation.
* Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py:
(Tracker.credentials): Pass validater into webkitscmpy.credentials if caller requests validation.
* Tools/Scripts/libraries/webkitcorepy/setup.py: Bump version.
* Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py:
(credentials): Allow caller to provide a callback which will validate credentials to ensure
they work, re-prompt user if credentials fail validation.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py:
(Setup.git): Request validation of GitHub credentials.
* Tools/Scripts/libraries/webkitscmpy/setup.py: Bump version.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
(GitHub.credentials): Pass validation flag.

Canonical link: https://commits.webkit.org/247173@main

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (289686 => 289687)


--- trunk/Tools/ChangeLog	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/ChangeLog	2022-02-12 02:04:19 UTC (rev 289687)
@@ -1,3 +1,29 @@
+2022-02-08  Jonathan Bedard  <[email protected]>
+
+        git-webkit setup should allow changing the credentials
+        https://bugs.webkit.org/show_bug.cgi?id=235297
+        <rdar://problem/87988794>
+
+        Reviewed by Dewei Zhu.
+
+        * Scripts/libraries/webkitbugspy/setup.py: Bump version.
+        * Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py: Ditto.
+        * Scripts/libraries/webkitbugspy/webkitbugspy/bugzilla.py:
+        (Tracker.credentials): Pass validater into webkitscmpy.credentials if caller requests validation.
+        * Scripts/libraries/webkitbugspy/webkitbugspy/github.py:
+        (Tracker.credentials): Pass validater into webkitscmpy.credentials if caller requests validation.
+        * Scripts/libraries/webkitcorepy/setup.py: Bump version.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py: Ditto.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py:
+        (credentials): Allow caller to provide a callback which will validate credentials to ensure
+        they work, re-prompt user if credentials fail validation.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py:
+        (Setup.git): Request validation of GitHub credentials.
+        * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
+        (GitHub.credentials): Pass validation flag.
+
 2022-02-09  Jonathan Bedard  <[email protected]>
 
         [git-webkit] Link issue to pull requests

Modified: trunk/Tools/Scripts/libraries/webkitbugspy/setup.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitbugspy/setup.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitbugspy/setup.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -30,7 +30,7 @@
 
 setup(
     name='webkitbugspy',
-    version='0.3.2',
+    version='0.3.3',
     description='Library containing a shared API for various bug trackers.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -46,7 +46,7 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(0, 3, 2)
+version = Version(0, 3, 3)
 
 from .user import User
 from .issue import Issue

Modified: trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/bugzilla.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/bugzilla.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/bugzilla.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -110,11 +110,19 @@
                 return self.issue(int(match.group('id')))
         return None
 
-    def credentials(self, required=True):
+    def credentials(self, required=True, validate=False):
+        def validater(username, password):
+            response = requests.get('{}/rest/user/{}?login={}&password={}'.format(self.url, username, username, password))
+            if response.status_code == 200:
+                return True
+            sys.stderr.write('Login to {} for {} failed\n'.format(self.url, username))
+            return False
+
         return webkitcorepy.credentials(
             url=""
             required=required,
             prompt=self.url.split('//')[-1],
+            validater=validater if validate else None,
         )
 
     def _login_arguments(self, required=False, query=None):

Modified: trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -86,9 +86,23 @@
                 return self.issue(int(match.group('id')))
         return None
 
-    def credentials(self, required=True):
+    def credentials(self, required=True, validate=False):
+        def validater(username, access_token):
+            if '@' in username:
+                sys.stderr.write("Provided username contains an '@' symbol. Please make sure to enter your GitHub username, not an email associated with the account\n")
+                return False
+            response = requests.get(
+                '{}/user'.format(self.api_url),
+                headers=dict(Accept='application/vnd.github.v3+json'),
+                auth=HTTPBasicAuth(username, access_token),
+            )
+            if response.status_code == 200 and response.json().get('login') == username:
+                return True
+            sys.stderr.write('Login to {} for {} failed\n'.format(self.api_url, username))
+            return False
+
         hostname = self.url.split('/')[2]
-        args = dict(
+        return webkitcorepy.credentials(
             url=""
             required=required,
             name=self.url.split('/')[2].replace('.', '_').upper(),
@@ -96,17 +110,9 @@
 Please go to https://{host}/settings/tokens/new and generate a new 'Personal access token' via 'Developer settings'
 with 'repo' and 'workflow' access and appropriate 'Expiration' for your {host} user'''.format(host=hostname),
             key_name='token',
+            validater=validater if validate else None,
         )
 
-        username, token = webkitcorepy.credentials(**args)
-        if username and '@' in username:
-            sys.stderr.write("Provided username contains an '@' symbol. Please make sure to enter your GitHub username, not an email associated with the account\n")
-            webkitcorepy.delete_credentials(url="" name=args['name'])
-            username, token = webkitcorepy.credentials(**args)
-        if username and '@' in username:
-            raise ValueError("GitHub usernames cannot have '@' in them")
-        return username, token
-
     def request(self, path=None, params=None, headers=None, authenticated=None, paginate=True):
         headers = {key: value for key, value in headers.items()} if headers else dict()
         headers['Accept'] = headers.get('Accept', 'application/vnd.github.v3+json')

Modified: trunk/Tools/Scripts/libraries/webkitcorepy/setup.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitcorepy/setup.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/setup.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -30,7 +30,7 @@
 
 setup(
     name='webkitcorepy',
-    version='0.12.9',
+    version='0.13.0',
     description='Library containing various Python support classes and functions.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -44,7 +44,7 @@
 from webkitcorepy.editor import Editor
 from webkitcorepy.file_lock import FileLock
 
-version = Version(0, 12, 10)
+version = Version(0, 13, 0)
 
 from webkitcorepy.autoinstall import Package, AutoInstall
 if sys.version_info > (3, 0):

Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -24,12 +24,12 @@
 import sys
 
 from subprocess import CalledProcessError
-from webkitcorepy import Environment, OutputCapture, Terminal
+from webkitcorepy import Environment, OutputCapture, Terminal, string_utils
 
 _cache = dict()
 
 
-def credentials(url, required=True, name=None, prompt=None, key_name='password'):
+def credentials(url, required=True, name=None, prompt=None, key_name='password', validater=None, retry=3):
     global _cache
 
     name = name or url.split('/')[2].replace('.', '_')
@@ -51,37 +51,50 @@
 
     username_prompted = False
     key_prompted = False
-    if not username:
-        try:
-            if keyring:
-                username = keyring.get_password(url, 'username')
-        except (RuntimeError, AttributeError):
-            pass
 
-        if not username and required:
-            if not sys.stderr.isatty() or not sys.stdin.isatty():
-                raise OSError('No tty to prompt user for username')
-            sys.stderr.write("Authentication required to use {}\n".format(prompt or name))
-            sys.stderr.write('Username: ')
-            username = Terminal.input()
-            username_prompted = True
+    for attempt in range(retry):
+        if attempt:
+            sys.stderr.write('Ignoring keychain values and re-prompting user\n')
+        if not username:
+            try:
+                if keyring and not attempt:
+                    username = keyring.get_password(url, 'username')
+            except (RuntimeError, AttributeError):
+                pass
 
-    if not key:
-        try:
-            if keyring:
-                key = keyring.get_password(url, username)
-        except (RuntimeError, AttributeError):
-            pass
+            if not username and required:
+                if not sys.stderr.isatty() or not sys.stdin.isatty():
+                    raise OSError('No tty to prompt user for username')
+                sys.stderr.write("Authentication required to use {}\n".format(prompt or name))
+                sys.stderr.write('Username: ')
+                username = Terminal.input()
+                username_prompted = True
 
-        if not key and required:
-            if not sys.stderr.isatty() or not sys.stdin.isatty():
-                raise OSError('No tty to prompt user for username')
-            key = getpass.getpass('{}: '.format(key_name.capitalize()))
-            key_prompted = True
+        if not key:
+            try:
+                if keyring and not attempt:
+                    key = keyring.get_password(url, username)
+            except (RuntimeError, AttributeError):
+                pass
 
-    if username and key:
-        _cache[name] = (username, key)
+            if not key and required:
+                if not sys.stderr.isatty() or not sys.stdin.isatty():
+                    raise OSError('No tty to prompt user for username')
+                key = getpass.getpass('{}: '.format(key_name.capitalize()))
+                key_prompted = True
 
+        if username and key and (not validater or validater(username, key)):
+            _cache[name] = (username, key)
+            break
+
+        username = None
+        key = None
+        sys.stderr.write("Failed to validate credentials for '{}' ({} attempt)\n".format(url, string_utils.ordinal(attempt + 1)))
+
+    if not username or not key:
+        sys.stderr.write("Exhausted attempts to prompt user for '{}' credentials\n".format(url))
+        sys.exit(1)
+
     if keyring and (username_prompted or key_prompted):
         if Terminal.choose(
             'Store username and {} in system keyring for {}?'.format(key_name, url),

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -29,7 +29,7 @@
 
 setup(
     name='webkitscmpy',
-    version='4.1.3',
+    version='4.1.4',
     description='Library designed to interact with git and svn repositories.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -46,7 +46,7 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(4, 1, 3)
+version = Version(4, 1, 4)
 
 AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
 AutoInstall.register(Package('jinja2', Version(2, 11, 3)))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -251,7 +251,7 @@
         if code:
             return result
 
-        username, _ = rmt.credentials(required=True)
+        username, _ = rmt.credentials(required=True, validate=True)
         log.info("Adding forked remote as '{}' and 'fork'...".format(username))
         url = ""
 

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py (289686 => 289687)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py	2022-02-12 01:52:57 UTC (rev 289686)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py	2022-02-12 02:04:19 UTC (rev 289687)
@@ -272,8 +272,8 @@
                 users.create(contributor.name, contributor.github, contributor.emails)
         self.tracker = Tracker(url, users=users)
 
-    def credentials(self, required=True):
-        return self.tracker.credentials(required=required)
+    def credentials(self, required=True, validate=False):
+        return self.tracker.credentials(required=required, validate=validate)
 
     @property
     def is_git(self):
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to