0

ユーザーがプリンターを選択できるウィンドウを表示する Linux および Mac 用のプリンター ドライバー バックエンドを作成しています。プロセスの一部は、ユーザーが認証のためにユーザー名とパスワードを入力することです。Linuxではすべてうまく機能します。しかし、奇妙な問題があります。通常のユーザーとして OSX Mountain Lion でスクリプトを実行すると、正常に動作します。ただし、CUPS バックエンドを介して (ユーザー _lp として) 実行すると、選択されているにもかかわらず、ユーザー名とパスワードのボックスが突然テキストを受信しなくなります。これの一部は、アプリケーションがすべてのウィンドウの上に生成されないことです。

Mac が .app バンドルを必要とする方法について検索して読みましたが、それを試しても問題は解決しませんでした。ここに私のLoginWindowクラスがあります:

class LoginDialog(wx.Dialog):
  def __init__(self, parent, id=-1, title="Login",
        pos=wx.DefaultPosition,
        size=wx.Size(350, 150),
        style=wx.STAY_ON_TOP | wx.DEFAULT_FRAME_STYLE ):
    wx.Dialog.__init__(self, parent, id, title, pos, size, style)
    wx.StaticText(self, -1, 'Please enter your CAEDM username and password.',
        wx.Point(15,5))
    wx.StaticText(self, -1, 'Username:', wx.Point(20, 32))
    wx.StaticText(self, -1, 'Password: ', wx.Point(25, 57))
    self.nameBox = wx.TextCtrl(self, 1, 'password', wx.Point(100, 30),
        wx.Size(170, -1))
    self.passwordBox = wx.TextCtrl(self, 2, '', wx.Point(100, 55),
        wx.Size(170, -1), style=wx.TE_PASSWORD)
    self.btnOK = wx.Button(self, wx.ID_OK, ' OK ', wx.Point(60, 90),
        wx.DefaultSize)
    self.btnOK.SetDefault()
    self.btnCancel = wx.Button(self, wx.ID_CANCEL, ' Cancel ', wx.Point(160, 90),
        wx.DefaultSize)
    self.https_user = []


def https_bind(self):
    val = self.ShowModal()
    self.SetFocus()
    if val == wx.ID_OK:
        u = self.nameBox.GetValue()
        p = self.passwordBox.GetValue()
        #since the username passed by CUPS is trash, we have to re-invent it (authenticate against HTTPS) 


        try:
            os.environ['REQUESTS_CA_BUNDLE'] = RESOURCE_DIR + '/cacert.pem'
            cert = requests.get("https://lp.et.byu.edu/pa/submit.php", auth=(u, p) )
            print cert.status_code
            if ( cert.status_code == 200 ):
                self.https_user.append(u)
                self.https_user.append(p)
            else:
                d = ErrorDialog(self)
                d.SetTitleText("Server Error")
                d.SetLabelText("         Username or password incorrect.")
                d.ShowModal()
                self.https_bind()

        except:
            d = ErrorDialog(self)
            d.SetTitleText("Server Error")
            d.SetLabelText("         Username or password incorrect.")
            d.ShowModal()
            self.https_bind()

    if val == wx.ID_CANCEL:
        os._exit(0)

**編集: アプリケーション全体が重要なイベントをキャプチャしていないため、これは python 全体のエラーのようです。ただし、マウスは問題なくキャプチャされます。

4

1 に答える 1

0

.app バンドルが必要なだけでなく、ディスプレイにログインしているのと同じユーザーとして実行する必要があると思います。これは、デスクトップでのフィッシングに相当するものを防止するためのセキュリティ対策です。一時的にそのユーザーになるか、プロセスが別のユーザーのディスプレイに完全にアクセスできるようにするシステムセキュリティ API を使用するなど、それを回避する方法があるかもしれませんが、詳細はわかりません。うまくいけば、それはあなたに検索する何かを与えるでしょう.

もう 1 つの可能性は、UI を別のプロセスに分割し、ドライバーからの信号でユーザー空間で起動することです。その後、資格情報を取得してドライバーに送り返すことができます。

于 2013-05-02T23:28:58.257 に答える