source: filezilla/trunk/fuentes/src/interface/loginmanager.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 4.4 KB
Line 
1#include <filezilla.h>
2#include "loginmanager.h"
3
4#include "dialogex.h"
5#include "filezillaapp.h"
6
7#include <algorithm>
8
9CLoginManager CLoginManager::m_theLoginManager;
10
11std::list<CLoginManager::t_passwordcache>::iterator CLoginManager::FindItem(CServer const& server, wxString const& challenge)
12{
13        return std::find_if(m_passwordCache.begin(), m_passwordCache.end(), [&](t_passwordcache const& item)
14                {
15                        return item.host == server.GetHost() && item.port == server.GetPort() && item.user == server.GetUser() && item.challenge == challenge;
16                }
17        );
18}
19
20bool CLoginManager::GetPassword(CServer &server, bool silent, wxString const& name, wxString const& challenge, bool canRemember)
21{
22        wxASSERT(server.GetLogonType() != ANONYMOUS);
23
24        if (canRemember) {
25                auto it = FindItem(server, challenge);
26                if (it != m_passwordCache.end()) {
27                        server.SetUser(server.GetUser(), it->password);
28                        return true;
29                }
30        }
31        if (silent)
32                return false;
33
34        return DisplayDialog(server, name, challenge, canRemember);
35}
36
37bool CLoginManager::DisplayDialog(CServer &server, wxString const& name, wxString challenge, bool canRemember)
38{
39        wxDialogEx pwdDlg;
40        if (!pwdDlg.Load(wxGetApp().GetTopWindow(), _T("ID_ENTERPASSWORD"))) {
41                return false;
42        }
43
44        if (name.empty()) {
45                pwdDlg.GetSizer()->Show(XRCCTRL(pwdDlg, "ID_NAMELABEL", wxStaticText), false, true);
46                pwdDlg.GetSizer()->Show(XRCCTRL(pwdDlg, "ID_NAME", wxStaticText), false, true);
47        }
48        else
49                XRCCTRL(pwdDlg, "ID_NAME", wxStaticText)->SetLabel(name);
50        if (challenge.empty()) {
51                pwdDlg.GetSizer()->Show(XRCCTRL(pwdDlg, "ID_CHALLENGELABEL", wxStaticText), false, true);
52                pwdDlg.GetSizer()->Show(XRCCTRL(pwdDlg, "ID_CHALLENGE", wxTextCtrl), false, true);
53        }
54        else {
55#ifdef __WXMSW__
56                challenge.Replace(_T("\n"), _T("\r\n"));
57#endif
58                XRCCTRL(pwdDlg, "ID_CHALLENGE", wxTextCtrl)->ChangeValue(challenge);
59                pwdDlg.GetSizer()->Show(XRCCTRL(pwdDlg, "ID_REMEMBER", wxCheckBox), canRemember, true);
60                XRCCTRL(pwdDlg, "ID_CHALLENGE", wxTextCtrl)->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
61        }
62        XRCCTRL(pwdDlg, "ID_HOST", wxStaticText)->SetLabel(server.FormatHost());
63
64        if (server.GetUser().empty()) {
65                pwdDlg.SetTitle(_("Enter username and password"));
66                XRCCTRL(pwdDlg, "ID_OLD_USER_LABEL", wxStaticText)->Hide();
67                XRCCTRL(pwdDlg, "ID_OLD_USER", wxStaticText)->Hide();
68
69                XRCCTRL(pwdDlg, "ID_HEADER_PASS", wxStaticText)->Hide();
70                if (server.GetLogonType() == INTERACTIVE) {
71                        XRCCTRL(pwdDlg, "ID_PASSWORD_LABEL", wxStaticText)->Hide();
72                        XRCCTRL(pwdDlg, "ID_PASSWORD", wxTextCtrl)->Hide();
73                        XRCCTRL(pwdDlg, "ID_REMEMBER", wxCheckBox)->Hide();
74                        XRCCTRL(pwdDlg, "ID_HEADER_BOTH", wxStaticText)->Hide();
75                }
76                else
77                        XRCCTRL(pwdDlg, "ID_HEADER_USER", wxStaticText)->Hide();
78
79                XRCCTRL(pwdDlg, "ID_NEW_USER", wxTextCtrl)->SetFocus();
80        }
81        else {
82                XRCCTRL(pwdDlg, "ID_OLD_USER", wxStaticText)->SetLabel(server.GetUser());
83                XRCCTRL(pwdDlg, "ID_NEW_USER_LABEL", wxStaticText)->Hide();
84                XRCCTRL(pwdDlg, "ID_NEW_USER", wxTextCtrl)->Hide();
85                XRCCTRL(pwdDlg, "ID_HEADER_USER", wxStaticText)->Hide();
86                XRCCTRL(pwdDlg, "ID_HEADER_BOTH", wxStaticText)->Hide();
87        }
88        XRCCTRL(pwdDlg, "wxID_OK", wxButton)->SetId(wxID_OK);
89        XRCCTRL(pwdDlg, "wxID_CANCEL", wxButton)->SetId(wxID_CANCEL);
90        pwdDlg.GetSizer()->Fit(&pwdDlg);
91        pwdDlg.GetSizer()->SetSizeHints(&pwdDlg);
92
93        wxString user;
94        while (user.empty()) {
95                if (pwdDlg.ShowModal() != wxID_OK)
96                        return false;
97
98                if (server.GetUser().empty()) {
99                        user = XRCCTRL(pwdDlg, "ID_NEW_USER", wxTextCtrl)->GetValue();
100                        if (user.empty()) {
101                                wxMessageBoxEx(_("No username given."), _("Invalid input"), wxICON_EXCLAMATION);
102                                continue;
103                        }
104                }
105                else
106                        user = server.GetUser();
107        }
108
109        server.SetUser(user, XRCCTRL(pwdDlg, "ID_PASSWORD", wxTextCtrl)->GetValue());
110
111        if (canRemember) {
112                RememberPassword(server, challenge);
113        }
114
115        return true;
116}
117
118void CLoginManager::CachedPasswordFailed(const CServer& server, wxString const& challenge)
119{
120        auto it = FindItem(server, challenge);
121        if (it != m_passwordCache.end()) {
122                m_passwordCache.erase(it);
123        }
124}
125
126void CLoginManager::RememberPassword(CServer & server, wxString const& challenge)
127{
128        if (server.GetLogonType() == ANONYMOUS) {
129                return;
130        }
131
132        auto it = FindItem(server, challenge);
133        if (it != m_passwordCache.end()) {
134                it->password = server.GetPass();
135        }
136        else {
137                t_passwordcache entry;
138                entry.host = server.GetHost();
139                entry.port = server.GetPort();
140                entry.user = server.GetUser();
141                entry.password = server.GetPass();
142                entry.challenge = challenge;
143                m_passwordCache.push_back(entry);
144        }
145}
Note: See TracBrowser for help on using the repository browser.