Как сделать rdpy-rdpmitm, чтобы клиент повторно вводил имя пользователя и пароль, когда пароль не является неправильным

Я использую демонстрацию rdpy-rdpmitm rdpy для реализации прокси-сервера rdp, но я хочу проверить пароль перед подключением к цели и позволить клиенту повторно ввести имя пользователя и пароль. Мой код такой: как реализовать метод OnReady?

class ProxyServer(rdp.RDPServerObserver):
  def __init__(self, controller, target, clientSecurityLevel, rssRecorder):
    """
    @param controller: {RDPServerController}
    @param target: {tuple(ip, port)}
    @param rssRecorder: {rss.FileRecorder} use to record session
    """
    rdp.RDPServerObserver.__init__(self, controller)
    self._target = target
    self._client = None
    self._rss = rssRecorder
    self._clientSecurityLevel = clientSecurityLevel


  def onReady(self):
    """
    @summary:  Event use to inform state of server stack
                First time this event is called is when human client is connected
                Second time is after color depth nego, because color depth nego
                restart a connection sequence
    @see: rdp.RDPServerObserver.onReady
    """
    if self._client is None:
      # try a connection
      domain, username, password = self._controller.getCredentials()
      self._rss.credentials(username, password, domain, self._controller.getHostname())

      width, height = self._controller.getScreen()
      self._rss.screen(width, height, self._controller.getColorDepth())


      if checkPassword(username, password): #password ok
          reactor.connectTCP('127.0.0.1', 3389, ProxyClientFactory(self, width, height, domain, username, password,self._clientSecurityLevel))
      else:
        pass
        #how to make client re-input username and password in this place

Ответы

Ответ 1

попробуйте использовать рекурсию:

class ProxyServer(rdp.RDPServerObserver):
  def __init__(self, controller, target, clientSecurityLevel, rssRecorder):
    """
    @param controller: {RDPServerController}
    @param target: {tuple(ip, port)}
    @param rssRecorder: {rss.FileRecorder} use to record session
    """
    rdp.RDPServerObserver.__init__(self, controller)
    self._target = target
    self._client = None
    self._rss = rssRecorder
    self._clientSecurityLevel = clientSecurityLevel


  def onReady(self):
    """
    @summary:  Event use to inform state of server stack
                First time this event is called is when human client is connected
                Second time is after color depth nego, because color depth nego
                restart a connection sequence
    @see: rdp.RDPServerObserver.onReady
    """
    if self._client is None:
      # try a connection
      domain, username, password = self._controller.getCredentials()
      self._rss.credentials(username, password, domain, self._controller.getHostname())

      width, height = self._controller.getScreen()
      self._rss.screen(width, height, self._controller.getColorDepth())


      if checkPassword(username, password): #password ok
          reactor.connectTCP('127.0.0.1', 3389, ProxyClientFactory(self, width, height, domain, username, password,self._clientSecurityLevel))
      else:
          onReady(self)

таким образом он повторяется до тех пор, пока пароль не будет правильно

Ответ 2

Я не знаю, какую библиотеку вы используете, но не можете ли вы просто протестировать ошибку, если соединение терпит неудачу, а затем повторить соединение по вашему предыдущему коду, то есть что-то вроде строк:

Python 2.x

password = raw_input("Please re-enter your password:")

Python 3.x

password = input("Please re-enter your password")