/ src / bitmessageqt / support.py
support.py
  1  """Composing support request message functions."""
  2  # pylint: disable=no-member
  3  
  4  import ctypes
  5  import ssl
  6  import sys
  7  import time
  8  
  9  from PyQt4 import QtCore
 10  
 11  from . import account
 12  import defaults
 13  import network.stats
 14  import paths
 15  import proofofwork
 16  import queues
 17  import state
 18  from bmconfigparser import config
 19  from .foldertree import AccountMixin
 20  from helper_sql import sqlExecute, sqlQuery
 21  from l10n import getTranslationLanguage
 22  from openclpow import openclEnabled
 23  from pyelliptic.openssl import OpenSSL
 24  from .settings import getSOCKSProxyType
 25  from version import softwareVersion
 26  from tr import _translate
 27  
 28  
 29  # this is BM support address going to Peter Surda
 30  OLD_SUPPORT_ADDRESS = 'BM-2cTkCtMYkrSPwFTpgcBrMrf5d8oZwvMZWK'
 31  SUPPORT_ADDRESS = 'BM-2cUdgkDDAahwPAU6oD2A7DnjqZz3hgY832'
 32  SUPPORT_LABEL = _translate("Support", "PyBitmessage support")
 33  SUPPORT_MY_LABEL = _translate("Support", "My new address")
 34  SUPPORT_SUBJECT = 'Support request'
 35  SUPPORT_MESSAGE = _translate("Support", '''
 36  You can use this message to send a report to one of the PyBitmessage core \
 37  developers regarding PyBitmessage or the mailchuck.com email service. \
 38  If you are using PyBitmessage involuntarily, for example because \
 39  your computer was infected with ransomware, this is not an appropriate venue \
 40  for resolving such issues.
 41  
 42  Please describe what you are trying to do:
 43  
 44  Please describe what you expect to happen:
 45  
 46  Please describe what happens instead:
 47  
 48  
 49  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 50  Please write above this line and if possible, keep the information about your \
 51  environment below intact.
 52  
 53  PyBitmessage version: {}
 54  Operating system: {}
 55  Architecture: {}bit
 56  Python Version: {}
 57  OpenSSL Version: {}
 58  Frozen: {}
 59  Portable mode: {}
 60  C PoW: {}
 61  OpenCL PoW: {}
 62  Locale: {}
 63  SOCKS: {}
 64  UPnP: {}
 65  Connected hosts: {}
 66  ''')
 67  
 68  
 69  def checkAddressBook(myapp):
 70      sqlExecute('DELETE from addressbook WHERE address=?', OLD_SUPPORT_ADDRESS)
 71      queryreturn = sqlQuery('SELECT * FROM addressbook WHERE address=?', SUPPORT_ADDRESS)
 72      if queryreturn == []:
 73          sqlExecute(
 74              'INSERT INTO addressbook VALUES (?,?)',
 75              SUPPORT_LABEL.toUtf8(), SUPPORT_ADDRESS)
 76          myapp.rerenderAddressBook()
 77  
 78  
 79  def checkHasNormalAddress():
 80      for address in config.addresses():
 81          acct = account.accountClass(address)
 82          if acct.type == AccountMixin.NORMAL and config.safeGetBoolean(address, 'enabled'):
 83              return address
 84      return False
 85  
 86  
 87  def createAddressIfNeeded(myapp):
 88      if not checkHasNormalAddress():
 89          queues.addressGeneratorQueue.put((
 90              'createRandomAddress', 4, 1,
 91              str(SUPPORT_MY_LABEL.toUtf8()),
 92              1, "", False,
 93              defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
 94              defaults.networkDefaultPayloadLengthExtraBytes
 95          ))
 96      while state.shutdown == 0 and not checkHasNormalAddress():
 97          time.sleep(.2)
 98      myapp.rerenderComboBoxSendFrom()
 99      return checkHasNormalAddress()
100  
101  
102  def createSupportMessage(myapp):
103      checkAddressBook(myapp)
104      address = createAddressIfNeeded(myapp)
105      if state.shutdown:
106          return
107  
108      myapp.ui.lineEditSubject.setText(SUPPORT_SUBJECT)
109      addrIndex = myapp.ui.comboBoxSendFrom.findData(
110          address, QtCore.Qt.UserRole,
111          QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)
112      if addrIndex == -1:  # something is very wrong
113          return
114      myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex)
115      myapp.ui.lineEditTo.setText(SUPPORT_ADDRESS)
116  
117      version = softwareVersion
118      commit = paths.lastCommit().get('commit')
119      if commit:
120          version += " GIT " + commit
121  
122      os = sys.platform
123      if os == "win32":
124          windowsversion = sys.getwindowsversion()
125          os = "Windows " + str(windowsversion[0]) + "." + str(windowsversion[1])
126      else:
127          try:
128              from os import uname
129              unixversion = uname()
130              os = unixversion[0] + " " + unixversion[2]
131          except:
132              pass
133      architecture = "32" if ctypes.sizeof(ctypes.c_voidp) == 4 else "64"
134      pythonversion = sys.version
135  
136      opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (
137          ssl.OPENSSL_VERSION, OpenSSL._version)
138  
139      frozen = "N/A"
140      if paths.frozen:
141          frozen = paths.frozen
142      portablemode = "True" if state.appdata == paths.lookupExeFolder() else "False"
143      cpow = "True" if proofofwork.bmpow else "False"
144      openclpow = str(
145          config.safeGet('bitmessagesettings', 'opencl')
146      ) if openclEnabled() else "None"
147      locale = getTranslationLanguage()
148      socks = getSOCKSProxyType(config) or "N/A"
149      upnp = config.safeGet('bitmessagesettings', 'upnp', "N/A")
150      connectedhosts = len(network.stats.connectedHostsList())
151  
152      myapp.ui.textEditMessage.setText(str(SUPPORT_MESSAGE, 'utf-8').format(
153          version, os, architecture, pythonversion, opensslversion, frozen,
154          portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts))
155  
156      # single msg tab
157      myapp.ui.tabWidgetSend.setCurrentIndex(
158          myapp.ui.tabWidgetSend.indexOf(myapp.ui.sendDirect)
159      )
160      # send tab
161      myapp.ui.tabWidget.setCurrentIndex(
162          myapp.ui.tabWidget.indexOf(myapp.ui.send)
163      )