|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2003 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog mixin class providing common callback methods for |
|
8 the pysvn client. |
|
9 """ |
|
10 |
|
11 from PyQt5.QtWidgets import QApplication, QDialog, QWidget |
|
12 |
|
13 from E5Gui.E5OverrideCursor import E5OverridenCursor |
|
14 |
|
15 |
|
16 class SvnDialogMixin: |
|
17 """ |
|
18 Class implementing a dialog mixin providing common callback methods for |
|
19 the pysvn client. |
|
20 """ |
|
21 def __init__(self, log=""): |
|
22 """ |
|
23 Constructor |
|
24 |
|
25 @param log optional log message (string) |
|
26 """ |
|
27 self.shouldCancel = False |
|
28 self.logMessage = log |
|
29 |
|
30 def _cancel(self): |
|
31 """ |
|
32 Protected method to request a cancellation of the current action. |
|
33 """ |
|
34 self.shouldCancel = True |
|
35 |
|
36 def _reset(self): |
|
37 """ |
|
38 Protected method to reset the internal state of the dialog. |
|
39 """ |
|
40 self.shouldCancel = False |
|
41 |
|
42 def _clientCancelCallback(self): |
|
43 """ |
|
44 Protected method called by the client to check for cancellation. |
|
45 |
|
46 @return flag indicating a cancellation |
|
47 """ |
|
48 QApplication.processEvents() |
|
49 return self.shouldCancel |
|
50 |
|
51 def _clientLoginCallback(self, realm, username, may_save): |
|
52 """ |
|
53 Protected method called by the client to get login information. |
|
54 |
|
55 @param realm name of the realm of the requested credentials (string) |
|
56 @param username username as supplied by subversion (string) |
|
57 @param may_save flag indicating, that subversion is willing to save |
|
58 the answers returned (boolean) |
|
59 @return tuple of four values (retcode, username, password, save). |
|
60 Retcode should be True, if username and password should be used |
|
61 by subversion, username and password contain the relevant data |
|
62 as strings and save is a flag indicating, that username and |
|
63 password should be saved. |
|
64 """ |
|
65 from .SvnLoginDialog import SvnLoginDialog |
|
66 |
|
67 with E5OverridenCursor(): |
|
68 parent = isinstance(self, QWidget) and self or None |
|
69 dlg = SvnLoginDialog(realm, username, may_save, parent) |
|
70 res = dlg.exec() |
|
71 |
|
72 if res == QDialog.DialogCode.Accepted: |
|
73 loginData = dlg.getData() |
|
74 return (True, loginData[0], loginData[1], loginData[2]) |
|
75 else: |
|
76 return (False, "", "", False) |
|
77 |
|
78 def _clientSslServerTrustPromptCallback(self, trust_dict): |
|
79 """ |
|
80 Protected method called by the client to request acceptance for a |
|
81 ssl server certificate. |
|
82 |
|
83 @param trust_dict dictionary containing the trust data |
|
84 @return tuple of three values (retcode, acceptedFailures, save). |
|
85 Retcode should be true, if the certificate should be accepted, |
|
86 acceptedFailures should indicate the accepted certificate failures |
|
87 and save should be True, if subversion should save the certificate. |
|
88 """ |
|
89 from E5Gui import E5MessageBox |
|
90 |
|
91 with E5OverridenCursor(): |
|
92 parent = isinstance(self, QWidget) and self or None |
|
93 msgBox = E5MessageBox.E5MessageBox( |
|
94 E5MessageBox.Question, |
|
95 self.tr("Subversion SSL Server Certificate"), |
|
96 self.tr("""<p>Accept the following SSL certificate?</p>""" |
|
97 """<table>""" |
|
98 """<tr><td>Realm:</td><td>{0}</td></tr>""" |
|
99 """<tr><td>Hostname:</td><td>{1}</td></tr>""" |
|
100 """<tr><td>Fingerprint:</td><td>{2}</td></tr>""" |
|
101 """<tr><td>Valid from:</td><td>{3}</td></tr>""" |
|
102 """<tr><td>Valid until:</td><td>{4}</td></tr>""" |
|
103 """<tr><td>Issuer name:</td><td>{5}</td></tr>""" |
|
104 """</table>""") |
|
105 .format(trust_dict["realm"], |
|
106 trust_dict["hostname"], |
|
107 trust_dict["finger_print"], |
|
108 trust_dict["valid_from"], |
|
109 trust_dict["valid_until"], |
|
110 trust_dict["issuer_dname"]), |
|
111 modal=True, parent=parent) |
|
112 permButton = msgBox.addButton(self.tr("&Permanent accept"), |
|
113 E5MessageBox.AcceptRole) |
|
114 tempButton = msgBox.addButton(self.tr("&Temporary accept"), |
|
115 E5MessageBox.AcceptRole) |
|
116 msgBox.addButton(self.tr("&Reject"), E5MessageBox.RejectRole) |
|
117 msgBox.exec() |
|
118 |
|
119 if msgBox.clickedButton() == permButton: |
|
120 return (True, trust_dict["failures"], True) |
|
121 elif msgBox.clickedButton() == tempButton: |
|
122 return (True, trust_dict["failures"], False) |
|
123 else: |
|
124 return (False, 0, False) |
|
125 |
|
126 def _clientLogCallback(self): |
|
127 """ |
|
128 Protected method called by the client to request a log message. |
|
129 |
|
130 @return a flag indicating success and the log message (string) |
|
131 """ |
|
132 from .SvnCommitDialog import SvnCommitDialog |
|
133 if self.logMessage: |
|
134 return True, self.logMessage |
|
135 else: |
|
136 # call CommitDialog and get message from there |
|
137 dlg = SvnCommitDialog(self) |
|
138 if dlg.exec() == QDialog.DialogCode.Accepted: |
|
139 msg = dlg.logMessage() |
|
140 if msg: |
|
141 return True, msg |
|
142 else: |
|
143 return True, "***" # always supply a valid log message |
|
144 else: |
|
145 return False, "" |