| OLD | NEW |
| 1 # coding: utf-8 | 1 # coding: utf-8 |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 """Defines class Rietveld to easily access a rietveld instance. | 5 """Defines class Rietveld to easily access a rietveld instance. |
| 6 | 6 |
| 7 Security implications: | 7 Security implications: |
| 8 | 8 |
| 9 The following hypothesis are made: | 9 The following hypothesis are made: |
| 10 - Rietveld enforces: | 10 - Rietveld enforces: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 # Appengine replies with 302 when authentication fails (sigh.) | 33 # Appengine replies with 302 when authentication fails (sigh.) |
| 34 oa2client.REFRESH_STATUS_CODES.append(302) | 34 oa2client.REFRESH_STATUS_CODES.append(302) |
| 35 upload.LOGGER.setLevel(logging.WARNING) # pylint: disable=E1103 | 35 upload.LOGGER.setLevel(logging.WARNING) # pylint: disable=E1103 |
| 36 | 36 |
| 37 | 37 |
| 38 class Rietveld(object): | 38 class Rietveld(object): |
| 39 """Accesses rietveld.""" | 39 """Accesses rietveld.""" |
| 40 def __init__(self, url, email, password, extra_headers=None, maxtries=None): | 40 def __init__(self, url, email, password, extra_headers=None, maxtries=None): |
| 41 self.url = url.rstrip('/') | 41 self.url = url.rstrip('/') |
| 42 # Email and password are accessed by commit queue, keep them. | 42 |
| 43 self.email = email | |
| 44 self.password = password | |
| 45 # TODO(maruel): It's not awesome but maybe necessary to retrieve the value. | 43 # TODO(maruel): It's not awesome but maybe necessary to retrieve the value. |
| 46 # It happens when the presubmit check is ran out of process, the cookie | 44 # It happens when the presubmit check is ran out of process, the cookie |
| 47 # needed to be recreated from the credentials. Instead, it should pass the | 45 # needed to be recreated from the credentials. Instead, it should pass the |
| 48 # email and the cookie. | 46 # email and the cookie. |
| 49 if email and password: | 47 if email and password: |
| 50 get_creds = lambda: (email, password) | 48 get_creds = lambda: (email, password) |
| 51 self.rpc_server = upload.HttpRpcServer( | 49 self.rpc_server = upload.HttpRpcServer( |
| 52 self.url, | 50 self.url, |
| 53 get_creds, | 51 get_creds, |
| 54 extra_headers=extra_headers or {}) | 52 extra_headers=extra_headers or {}) |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 # The parent__init__ is not called on purpose. | 570 # The parent__init__ is not called on purpose. |
| 573 # pylint: disable=W0231 | 571 # pylint: disable=W0231 |
| 574 def __init__(self, | 572 def __init__(self, |
| 575 url, | 573 url, |
| 576 client_email, | 574 client_email, |
| 577 client_private_key_file, | 575 client_private_key_file, |
| 578 private_key_password=None, | 576 private_key_password=None, |
| 579 extra_headers=None, | 577 extra_headers=None, |
| 580 maxtries=None): | 578 maxtries=None): |
| 581 | 579 |
| 582 # These attributes are accessed by commit queue. Keep them. | |
| 583 self.email = client_email | |
| 584 self.private_key_file = client_private_key_file | |
| 585 | |
| 586 if private_key_password is None: # '' means 'empty password' | 580 if private_key_password is None: # '' means 'empty password' |
| 587 private_key_password = 'notasecret' | 581 private_key_password = 'notasecret' |
| 588 | 582 |
| 589 self.url = url.rstrip('/') | 583 self.url = url.rstrip('/') |
| 590 bot_url = self.url + '/bots' | 584 bot_url = self.url + '/bots' |
| 591 | 585 |
| 592 with open(client_private_key_file, 'rb') as f: | 586 with open(client_private_key_file, 'rb') as f: |
| 593 client_private_key = f.read() | 587 client_private_key = f.read() |
| 594 logging.info('Using OAuth login: %s' % client_email) | 588 logging.info('Using OAuth login: %s' % client_email) |
| 595 self.rpc_server = OAuthRpcServer(bot_url, | 589 self.rpc_server = OAuthRpcServer(bot_url, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 | 665 |
| 672 @classmethod | 666 @classmethod |
| 673 def _get_local_changes(cls, issue): | 667 def _get_local_changes(cls, issue): |
| 674 """Returns dictionary of local changes for |issue|, if any.""" | 668 """Returns dictionary of local changes for |issue|, if any.""" |
| 675 return cls._local_changes.get(issue, {}) | 669 return cls._local_changes.get(issue, {}) |
| 676 | 670 |
| 677 @property | 671 @property |
| 678 def url(self): | 672 def url(self): |
| 679 return self._rietveld.url | 673 return self._rietveld.url |
| 680 | 674 |
| 681 @property | |
| 682 def email(self): | |
| 683 return self._rietveld.email | |
| 684 | |
| 685 @property | |
| 686 def password(self): | |
| 687 return self._rietveld.password | |
| 688 | |
| 689 def get_pending_issues(self): | 675 def get_pending_issues(self): |
| 690 pending_issues = self._rietveld.get_pending_issues() | 676 pending_issues = self._rietveld.get_pending_issues() |
| 691 | 677 |
| 692 # Filter out issues we've closed or unchecked the commit checkbox. | 678 # Filter out issues we've closed or unchecked the commit checkbox. |
| 693 return [issue for issue in pending_issues | 679 return [issue for issue in pending_issues |
| 694 if not self._get_local_changes(issue).get('closed', False) and | 680 if not self._get_local_changes(issue).get('closed', False) and |
| 695 self._get_local_changes(issue).get('commit', True)] | 681 self._get_local_changes(issue).get('commit', True)] |
| 696 | 682 |
| 697 def close_issue(self, issue): # pylint:disable=R0201 | 683 def close_issue(self, issue): # pylint:disable=R0201 |
| 698 logging.info('ReadOnlyRietveld: closing issue %d' % issue) | 684 logging.info('ReadOnlyRietveld: closing issue %d' % issue) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 729 self, issue, patchset, reason, clobber, revision, builders_and_tests, | 715 self, issue, patchset, reason, clobber, revision, builders_and_tests, |
| 730 master=None, category='cq'): | 716 master=None, category='cq'): |
| 731 logging.info('ReadOnlyRietveld: triggering try jobs %r for issue %d' % | 717 logging.info('ReadOnlyRietveld: triggering try jobs %r for issue %d' % |
| 732 (builders_and_tests, issue)) | 718 (builders_and_tests, issue)) |
| 733 | 719 |
| 734 def trigger_distributed_try_jobs( # pylint:disable=R0201 | 720 def trigger_distributed_try_jobs( # pylint:disable=R0201 |
| 735 self, issue, patchset, reason, clobber, revision, masters, | 721 self, issue, patchset, reason, clobber, revision, masters, |
| 736 category='cq'): | 722 category='cq'): |
| 737 logging.info('ReadOnlyRietveld: triggering try jobs %r for issue %d' % | 723 logging.info('ReadOnlyRietveld: triggering try jobs %r for issue %d' % |
| 738 (masters, issue)) | 724 (masters, issue)) |
| OLD | NEW |