void LoginDialog::action(const gcn::ActionEvent &event) { if (event.getId() == "login" && canSubmit()) { mLoginData->username = mUserField->getText(); mLoginData->password = mPassField->getText(); mLoginData->remember = mKeepCheck->isSelected(); mLoginData->registerLogin = false; mRegisterButton->setEnabled(false); mServerButton->setEnabled(false); mLoginButton->setEnabled(false); Client::setState(STATE_LOGIN_ATTEMPT); } else if (event.getId() == "server") { Client::setState(STATE_SWITCH_SERVER); } else if (event.getId() == "register") { if (Net::getLoginHandler()->isRegistrationEnabled()) { mLoginData->username = mUserField->getText(); mLoginData->password = mPassField->getText(); Client::setState(STATE_REGISTER_PREP); } else { new OkDialog(_("Registration disabled"), _("You need to use the " "website to register an account for this server.")); } } }
void LoginDialog::postInit() { Window::postInit(); setVisible(Visible_true); const int h = 200; if (mUpdateHostLabel) setContentSize(310, 250); setContentSize(310, h); #ifdef ANDROID setDefaultSize(310, h, ImageRect::UPPER_CENTER, 0, 0); #else setDefaultSize(310, h, ImageRect::CENTER, 0, 0); #endif center(); loadWindowState(); reflowLayout(); if (mUserField->getText().empty()) mUserField->requestFocus(); else mPassField->requestFocus(); mLoginButton->setEnabled(canSubmit()); if (loginHandler) { mRegisterButton->setEnabled(loginHandler->isRegistrationEnabled() || !mLoginData->registerUrl.empty()); } else { mRegisterButton->setEnabled(false); } }
/** * Schedules an Audioscrobbler handshake or submit as required. * Returns true if an immediate submit was possible */ bool ScrobblerSubmitter::schedule( bool failure ) { m_timer.stop(); if ( m_inProgress || !canSubmit() ) return false; uint when, currentTime = QDateTime::currentDateTime( Qt::UTC ).toTime_t(); if ( currentTime - m_prevSubmitTime > m_interval ) when = 0; else when = m_interval - ( currentTime - m_prevSubmitTime ); if ( failure ) { m_backoff = kMin( kMax( m_backoff * 2, unsigned( MIN_BACKOFF ) ), unsigned( MAX_BACKOFF ) ); when = kMax( m_backoff, m_interval ); } else m_backoff = 0; if ( m_needHandshake || m_challenge.isEmpty() ) { m_challenge = QString::null; m_needHandshake = false; if ( when == 0 ) { debug() << "Performing immediate handshake" << endl; performHandshake(); } else { debug() << "Performing handshake in " << when << " seconds" << endl; m_timer.start( when * 1000, true ); } } else if ( !m_submitQueue.isEmpty() || !m_holdFakeQueue && !m_fakeQueue.isEmpty() ) { // if we only have stuff in the fake queue, we need to only schedule for when we can actually do something with it if ( m_submitQueue.isEmpty() && m_lastSubmissionFinishTime + m_fakeQueue.getFirst()->length() > currentTime + when ) when = m_lastSubmissionFinishTime + m_fakeQueue.getFirst()->length() - currentTime; if ( when == 0 ) { debug() << "Performing immediate submit" << endl; performSubmit(); return true; } else { debug() << "Performing submit in " << when << " seconds" << endl; m_timer.start( when * 1000, true ); } } else { debug() << "Nothing to schedule" << endl; } return false; }
void RegisterDialog::postInit() { Window::postInit(); setVisible(Visible_true); mUserField->requestFocus(); mUserField->setCaretPosition(CAST_U32( mUserField->getText().length())); mRegisterButton->setEnabled(canSubmit()); }
void RegisterDialog::keyPressed(KeyEvent &event) { if (event.isConsumed()) { mRegisterButton->setEnabled(canSubmit()); return; } const InputActionT actionId = event.getActionId(); if (actionId == InputAction::GUI_CANCEL) { action(ActionEvent(nullptr, mCancelButton->getActionEventId())); } else if (actionId == InputAction::GUI_SELECT || actionId == InputAction::GUI_SELECT2) { action(ActionEvent(nullptr, mRegisterButton->getActionEventId())); } else { mRegisterButton->setEnabled(canSubmit()); } }
void LoginDialog::keyPressed(KeyEvent &event) { if (event.isConsumed()) { mLoginButton->setEnabled(canSubmit()); return; } const int actionId = event.getActionId(); if (actionId == static_cast<int>(InputAction::GUI_CANCEL)) { action(ActionEvent(nullptr, mServerButton->getActionEventId())); } else if (actionId == static_cast<int>(InputAction::GUI_SELECT) || actionId == static_cast<int>(InputAction::GUI_SELECT2)) { action(ActionEvent(nullptr, mLoginButton->getActionEventId())); } else { mLoginButton->setEnabled(canSubmit()); } }
void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *editorRedoAction, QAction *submitAction, QAction *diffAction) { if (editorUndoAction) { editorUndoAction->setEnabled(d->m_ui.description->document()->isUndoAvailable()); connect(d->m_ui.description, &QTextEdit::undoAvailable, editorUndoAction, &QAction::setEnabled); connect(editorUndoAction, &QAction::triggered, d->m_ui.description, &QTextEdit::undo); } if (editorRedoAction) { editorRedoAction->setEnabled(d->m_ui.description->document()->isRedoAvailable()); connect(d->m_ui.description, &QTextEdit::redoAvailable, editorRedoAction, &QAction::setEnabled); connect(editorRedoAction, &QAction::triggered, d->m_ui.description, &QTextEdit::redo); } if (submitAction) { if (debug) { const SubmitFileModel *model = fileModel(); int count = model ? model->rowCount() : 0; qDebug() << Q_FUNC_INFO << submitAction << count << "items"; } d->m_commitEnabled = !canSubmit(); connect(this, &SubmitEditorWidget::submitActionEnabledChanged, submitAction, &QAction::setEnabled); // Wire setText via QActionSetTextSlotHelper. QActionSetTextSlotHelper *actionSlotHelper = submitAction->findChild<QActionSetTextSlotHelper *>(); if (!actionSlotHelper) actionSlotHelper = new QActionSetTextSlotHelper(submitAction); connect(this, &SubmitEditorWidget::submitActionTextChanged, actionSlotHelper, &QActionSetTextSlotHelper::setText); d->m_submitButton = new QActionPushButton(submitAction); d->m_ui.buttonLayout->addWidget(d->m_submitButton); if (!d->m_submitShortcut) d->m_submitShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return), this); connect(d->m_submitShortcut, &QShortcut::activated, submitAction, &QAction::trigger); } if (diffAction) { if (debug) qDebug() << diffAction << d->m_filesSelected; diffAction->setEnabled(d->m_filesSelected); connect(this, &SubmitEditorWidget::fileSelectionChanged, diffAction, &QAction::setEnabled); connect(diffAction, &QAction::triggered, this, &SubmitEditorWidget::triggerDiffSelected); d->m_ui.buttonLayout->addWidget(new QActionPushButton(diffAction)); } }
void LoginDialog::keyPressed(gcn::KeyEvent &keyEvent) { gcn::Key key = keyEvent.getKey(); if (key.getValue() == Key::ESCAPE) { action(gcn::ActionEvent(NULL, mServerButton->getActionEventId())); } else if (key.getValue() == Key::ENTER) { action(gcn::ActionEvent(NULL, mLoginButton->getActionEventId())); } else { mLoginButton->setEnabled(canSubmit()); } }
void LoginDialog::action(const ActionEvent &event) { const std::string &eventId = event.getId(); if (eventId == "login" && canSubmit()) { prepareUpdate(); mLoginData->registerLogin = false; client->setState(STATE_LOGIN_ATTEMPT); } else if (eventId == "server") { close(); } else if (eventId == "register") { if (loginHandler->isRegistrationEnabled()) { prepareUpdate(); client->setState(STATE_REGISTER_PREP); } else if (!mLoginData->registerUrl.empty()) { const std::string &url = mLoginData->registerUrl; urlListener.url = url; ConfirmDialog *const confirmDlg = CREATEWIDGETR(ConfirmDialog, // TRANSLATORS: question dialog _("Open register url"), url, SOUND_REQUEST, false, Modal_true); confirmDlg->addActionListener(&urlListener); } } else if (eventId == "customhost") { mUpdateHostText->setVisible(fromBool( mCustomUpdateHost->isSelected(), Visible)); } else if (eventId == "updateselect") { mCustomUpdateHost->setSelected(false); mUpdateHostText->setVisible(Visible_false); } }
LoginDialog::LoginDialog(LoginData *loginData): Window(_("Login")), mLoginData(loginData) { gcn::Label *userLabel = new Label(_("Name:")); gcn::Label *passLabel = new Label(_("Password:"******"Remember username"), mLoginData->remember); mRegisterButton = new Button(_("Register"), "register", this); mServerButton = new Button(_("Change Server"), "server", this); mLoginButton = new Button(_("Login"), "login", this); mUserField->setActionEventId("login"); mPassField->setActionEventId("login"); mUserField->addKeyListener(this); mPassField->addKeyListener(this); mUserField->addActionListener(this); mPassField->addActionListener(this); place(0, 0, userLabel); place(0, 1, passLabel); place(1, 0, mUserField, 3).setPadding(1); place(1, 1, mPassField, 3).setPadding(1); place(0, 5, mKeepCheck, 4); place(0, 6, mRegisterButton).setHAlign(LayoutCell::LEFT); place(2, 6, mServerButton); place(3, 6, mLoginButton); reflowLayout(); addKeyListener(this); center(); setVisible(true); if (mUserField->getText().empty()) mUserField->requestFocus(); else mPassField->requestFocus(); mLoginButton->setEnabled(canSubmit()); }
// Enable submit depending on having checked files void SubmitEditorWidget::updateSubmitAction() { const unsigned checkedCount = checkedFilesCount(); const bool newCommitState = canSubmit(); // Emit signal to update action if (m_d->m_commitEnabled != newCommitState) { m_d->m_commitEnabled = newCommitState; emit submitActionEnabledChanged(m_d->m_commitEnabled); } if (m_d->m_ui.fileView && m_d->m_ui.fileView->model()) { // Update button text. const int fileCount = m_d->m_ui.fileView->model()->rowCount(); const QString msg = checkedCount ? tr("Commit %1/%n Files", 0, fileCount).arg(checkedCount) : tr("Commit"); emit submitActionTextChanged(msg); } }
void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *editorRedoAction, QAction *submitAction, QAction *diffAction) { if (editorUndoAction) { editorUndoAction->setEnabled(d->m_ui.description->document()->isUndoAvailable()); connect(d->m_ui.description, SIGNAL(undoAvailable(bool)), editorUndoAction, SLOT(setEnabled(bool))); connect(editorUndoAction, SIGNAL(triggered()), d->m_ui.description, SLOT(undo())); } if (editorRedoAction) { editorRedoAction->setEnabled(d->m_ui.description->document()->isRedoAvailable()); connect(d->m_ui.description, SIGNAL(redoAvailable(bool)), editorRedoAction, SLOT(setEnabled(bool))); connect(editorRedoAction, SIGNAL(triggered()), d->m_ui.description, SLOT(redo())); } if (submitAction) { if (debug) { int count = 0; if (const QAbstractItemModel *model = d->m_ui.fileView->model()) count = model->rowCount(); qDebug() << Q_FUNC_INFO << submitAction << count << "items"; } d->m_commitEnabled = !canSubmit(); connect(this, SIGNAL(submitActionEnabledChanged(bool)), submitAction, SLOT(setEnabled(bool))); // Wire setText via QActionSetTextSlotHelper. QActionSetTextSlotHelper *actionSlotHelper = submitAction->findChild<QActionSetTextSlotHelper *>(); if (!actionSlotHelper) actionSlotHelper = new QActionSetTextSlotHelper(submitAction); connect(this, SIGNAL(submitActionTextChanged(QString)), actionSlotHelper, SLOT(setText(QString))); d->m_ui.buttonLayout->addWidget(new QActionPushButton(submitAction)); if (!d->m_submitShortcut) d->m_submitShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return), this); connect(d->m_submitShortcut, SIGNAL(activated()), submitAction, SLOT(trigger())); } if (diffAction) { if (debug) qDebug() << diffAction << d->m_filesSelected; diffAction->setEnabled(d->m_filesSelected); connect(this, SIGNAL(fileSelectionChanged(bool)), diffAction, SLOT(setEnabled(bool))); connect(diffAction, SIGNAL(triggered()), this, SLOT(triggerDiffSelected())); d->m_ui.buttonLayout->addWidget(new QActionPushButton(diffAction)); } }
// . returns false if blocked, true otherwise // . sets g_errno on error bool sendPageAddUrl ( TcpSocket *s , HttpRequest *r ) { // . get fields from cgi field of the requested url // . get the search query long urlLen = 0; char *url = r->getString ( "u" , &urlLen , NULL /*default*/); // see if they provided a url of a file of urls if they did not // provide a url to add directly //bool isAdmin = g_collectiondb.isAdmin ( r , s ); bool isAdmin = r->getIsLocal(); long ufuLen = 0; char *ufu = NULL; if ( isAdmin ) // get the url of a file of urls (ufu) ufu = r->getString ( "ufu" , &ufuLen , NULL ); // can't be too long, that's obnoxious if ( urlLen > MAX_URL_LEN || ufuLen > MAX_URL_LEN ) { g_errno = EBUFTOOSMALL; g_msg = " (error: url too long)"; return g_httpServer.sendErrorReply(s,500,"url too long"); } // get the collection long collLen = 0; char *coll = r->getString("c",&collLen); if ( ! coll || ! coll[0] ) { //coll = g_conf.m_defaultColl; coll = g_conf.getDefaultColl( r->getHost(), r->getHostLen() ); collLen = gbstrlen(coll); } // get collection rec CollectionRec *cr = g_collectiondb.getRec ( coll ); // bitch if no collection rec found if ( ! cr ) { g_errno = ENOCOLLREC; g_msg = " (error: no collection)"; return g_httpServer.sendErrorReply(s,500,"no coll rec"); } // . make sure the ip is not banned // . we may also have an exclusive list of IPs for private collections if ( ! cr->hasSearchPermission ( s ) ) { g_errno = ENOPERM; g_msg = " (error: permission denied)"; return g_httpServer.sendErrorReply(s,500,mstrerror(g_errno)); } // make a new state State1 *st1 ; try { st1 = new (State1); } catch ( ... ) { g_errno = ENOMEM; log("PageAddUrl: new(%i): %s", sizeof(State1),mstrerror(g_errno)); return g_httpServer.sendErrorReply(s,500,mstrerror(g_errno)); } mnew ( st1 , sizeof(State1) , "PageAddUrl" ); // save socket and isAdmin st1->m_socket = s; st1->m_isAdmin = isAdmin; // assume no url buf yet, set below //st1->m_ubuf = NULL; //st1->m_ubufAlloc = NULL; //st1->m_metaList = NULL; // save the url st1->m_url[0] = '\0'; if ( url ) { // normalize and add www. if it needs it Url uu; uu.set ( url , gbstrlen(url) , true ); // remove >'s i guess and store in st1->m_url[] buffer st1->m_urlLen=cleanInput ( st1->m_url, MAX_URL_LEN, uu.getUrl(), uu.getUrlLen() ); // point to that as the url "buf" to add //st1->m_ubuf = st1->m_url; //st1->m_ubufSize = urlLen; //st1->m_ubufAlloc = NULL; // do not free it! } // save the "ufu" (url of file of urls) st1->m_ufu[0] = '\0'; st1->m_ufuLen = ufuLen; memcpy ( st1->m_ufu , ufu , ufuLen ); st1->m_ufu[ufuLen] = '\0'; st1->m_doTuringTest = cr->m_doTuringTest; char *username = g_users.getUsername(r); if(username) strcpy(st1->m_username,username); //st1->m_user = g_pages.getUserType ( s , r ); st1->m_spiderLinks = true; st1->m_strip = true; //st1->m_raw = r->getLong("raw",0); // init state2 for ( long i = 0; i < 5; i++ ){ st1->m_state2[i].m_buf = NULL; st1->m_state2[i].m_bufLen = 0; st1->m_state2[i].m_bufMaxLen = 0; } // save the collection name in the State1 class if ( collLen > MAX_COLL_LEN ) collLen = MAX_COLL_LEN; strncpy ( st1->m_coll , coll , collLen ); st1->m_coll [ collLen ] = '\0'; // assume they answered turing test correctly st1->m_goodAnswer = true; // if addurl is turned off, just print "disabled" msg if ( ! g_conf.m_addUrlEnabled ) return sendReply ( st1 , false ); // can also be turned off in the collection rec if ( ! cr->m_addUrlEnabled ) return sendReply ( st1 , false ); // or if in read-only mode if ( g_conf.m_readOnlyMode ) return sendReply ( st1 , false ); // cannot add if another Msg10 from here is still in progress if ( s_inprogress ) return sendReply ( st1 , true ); // use now as the spiderTime // get ip of submitter //unsigned long h = ipdom ( s->m_ip ); // . use top 2 bytes now, some isps have large blocks // . if this causes problems, then they can do pay for inclusion unsigned long h = iptop ( s->m_ip ); long codeLen; char* code = r->getString("code", &codeLen); if(g_autoBan.hasCode(code, codeLen, s->m_ip)) { long uipLen = 0; char* uip = r->getString("uip",&uipLen); long hip = 0; //use the uip when we have a raw query to test if //we can submit if(uip) { hip = atoip(uip, uipLen); h = iptop( hip ); } } st1->m_strip = r->getLong("strip",0); // Remember, for cgi, if the box is not checked, then it is not // reported in the request, so set default return value to 0 long spiderLinks = r->getLong("spiderLinks",-1); // also support all lowercase like PageInject.cpp uses if ( spiderLinks == -1 ) spiderLinks = r->getLong("spiderlinks",0); // . should we force it into spiderdb even if already in there // . use to manually update spider times for a url // . however, will not remove old scheduled spider times // . mdw: made force on the default st1->m_forceRespider = r->getLong("force",1); // 0); long now = getTimeGlobal(); // . allow 1 submit every 1 hour // . restrict by submitter domain ip if ( ! st1->m_isAdmin && ! canSubmit ( h , now , cr->m_maxAddUrlsPerIpDomPerDay ) ) { // return error page g_errno = ETOOEARLY; return sendReply ( st1 , true ); } //st1->m_query = r->getString( "qts", &st1->m_queryLen ); // check it, if turing test is enabled for this collection if ( ! st1->m_isAdmin && cr->m_doTuringTest && ! g_turingTest.isHuman(r) ) { // log note so we know it didn't make it g_msg = " (error: bad answer)"; //log("PageAddUrl:: addurl failed for %s : bad answer", // iptoa(s->m_ip)); st1->m_goodAnswer = false; return sendReply ( st1 , true /*addUrl enabled?*/ ); } //if ( st1->m_queryLen > 0 ) // return getPages( st1 ); // if no url given, just print a blank page if ( ! url ) return sendReply ( st1 , true ); // // make a SpiderRequest // SpiderRequest *sreq = &st1->m_sreq; // reset it sreq->reset(); // make the probable docid long long probDocId = g_titledb.getProbableDocId ( st1->m_url ); // make one up, like we do in PageReindex.cpp long firstIp = (probDocId & 0xffffffff); // . now fill it up // . TODO: calculate the other values... lazy!!! (m_isRSSExt, // m_siteNumInlinks,...) sreq->m_isNewOutlink = 1; sreq->m_isAddUrl = 1; sreq->m_addedTime = now; sreq->m_fakeFirstIp = 1; sreq->m_probDocId = probDocId; sreq->m_firstIp = firstIp; sreq->m_hopCount = 0; // its valid if root Url uu; uu.set ( st1->m_url ); if ( uu.isRoot() ) sreq->m_hopCountValid = true; // too big? //long len = st1->m_urlLen; // the url! includes \0 strcpy ( sreq->m_url , st1->m_url ); // call this to set sreq->m_dataSize now sreq->setDataSize(); // make the key dude -- after setting url sreq->setKey ( firstIp , 0LL, false ); // need a fake first ip lest we core! //sreq->m_firstIp = (pdocId & 0xffffffff); // how to set m_firstIp? i guess addurl can be throttled independently // of the other urls??? use the hash of the domain for it! long dlen; char *dom = getDomFast ( st1->m_url , &dlen ); // fake it for this... //sreq->m_firstIp = hash32 ( dom , dlen ); // sanity if ( ! dom ) { g_errno = EBADURL; return sendReply ( st1 , true ); } // shortcut Msg4 *m = &st1->m_msg4; // now add that to spiderdb using msg4 if ( ! m->addMetaList ( (char *)sreq , sreq->getRecSize() , coll , st1 , // state addedStuff , MAX_NICENESS , RDB_SPIDERDB ) ) // we blocked return false; // send back the reply return sendReply ( st1 , true ); }
void RegisterDialog::keyPressed(gcn::KeyEvent &keyEvent) { mRegisterButton->setEnabled(canSubmit()); }
void RegisterDialog::action(const ActionEvent &event) { const std::string &eventId = event.getId(); if (eventId == "cancel") { close(); } else if (eventId == "register" && canSubmit()) { const std::string &user = mUserField->getText(); logger->log("RegisterDialog::register Username is %s", user.c_str()); std::string errorMsg; int error = 0; const unsigned int minUser = loginHandler->getMinUserNameLength(); const unsigned int maxUser = loginHandler->getMaxUserNameLength(); const unsigned int minPass = loginHandler->getMinPasswordLength(); const unsigned int maxPass = loginHandler->getMaxPasswordLength(); if (user.length() < minUser) { // Name too short errorMsg = strprintf // TRANSLATORS: error message (_("The username needs to be at least %u characters long."), minUser); error = 1; } else if (user.length() > maxUser - 1) { // Name too long errorMsg = strprintf // TRANSLATORS: error message (_("The username needs to be less than %u characters long."), maxUser); error = 1; } else if (mPasswordField->getText().length() < minPass) { // Pass too short errorMsg = strprintf // TRANSLATORS: error message (_("The password needs to be at least %u characters long."), minPass); error = 2; } else if (mPasswordField->getText().length() > maxPass) { // Pass too long errorMsg = strprintf // TRANSLATORS: error message (_("The password needs to be less than %u characters long."), maxPass); error = 2; } else if (mPasswordField->getText() != mConfirmField->getText()) { // Password does not match with the confirmation one // TRANSLATORS: error message errorMsg = _("Passwords do not match."); error = 2; } else if (mEmailField && mEmailField->getText().find('@') == std::string::npos) { // TRANSLATORS: error message errorMsg = _("Incorrect email."); error = 1; } else if (mEmailField && mEmailField->getText().size() > 40) { // TRANSLATORS: error message errorMsg = _("Email too long."); error = 1; } if (error > 0) { if (error == 1) { mWrongDataNoticeListener->setTarget(this->mUserField); } else if (error == 2) { // Reset password confirmation mPasswordField->setText(""); mConfirmField->setText(""); mWrongDataNoticeListener->setTarget(this->mPasswordField); } OkDialog *const dlg = CREATEWIDGETR(OkDialog, // TRANSLATORS: error message _("Error"), errorMsg, _("OK"), DialogType::ERROR, Modal_true, ShowCenter_true, nullptr, 260); dlg->addActionListener(mWrongDataNoticeListener); } else { // No errors detected, register the new user. mRegisterButton->setEnabled(false); mLoginData->username = mUserField->getText(); mLoginData->password = mPasswordField->getText(); if (features.getIntValue("forceAccountGender") == -1) { if (mFemaleButton && mFemaleButton->isSelected()) mLoginData->gender = Gender::FEMALE; else if (mOtherButton && mOtherButton->isSelected()) mLoginData->gender = Gender::OTHER; else mLoginData->gender = Gender::MALE; } else { mLoginData->gender = Being::intToGender( CAST_U8(features.getIntValue("forceAccountGender"))); } if (mEmailField) mLoginData->email = mEmailField->getText(); mLoginData->registerLogin = true; client->setState(State::REGISTER_ATTEMPT); } } }
RegisterDialog::RegisterDialog(LoginData *loginData): Window(_("Register")), mEmailField(0), mMaleButton(0), mFemaleButton(0), mWrongDataNoticeListener(new WrongDataNoticeListener), mLoginData(loginData) { int optionalActions = Net::getLoginHandler()->supportedOptionalActions(); gcn::Label *userLabel = new Label(_("Name:")); gcn::Label *passwordLabel = new Label(_("Password:"******"Confirm:")); mUserField = new TextField(loginData->username); mPasswordField = new PasswordField(loginData->password); mConfirmField = new PasswordField; mRegisterButton = new Button(_("Register"), "register", this); mCancelButton = new Button(_("Cancel"), "cancel", this); ContainerPlacer place; place = getPlacer(0, 0); place(0, 0, userLabel); place(0, 1, passwordLabel); place(0, 2, confirmLabel); place(1, 0, mUserField, 3).setPadding(2); place(1, 1, mPasswordField, 3).setPadding(2); place(1, 2, mConfirmField, 3).setPadding(2); int row = 3; if (optionalActions & Net::LoginHandler::SetGenderOnRegister) { mMaleButton = new RadioButton(_("Male"), "sex", true); mFemaleButton = new RadioButton(_("Female"), "sex", false); place(1, row, mMaleButton); place(2, row, mFemaleButton); row++; } if (optionalActions & Net::LoginHandler::SetEmailOnRegister) { gcn::Label *emailLabel = new Label(_("Email:")); mEmailField = new TextField; place(0, row, emailLabel); place(1, row, mEmailField, 3).setPadding(2); row++; } place = getPlacer(0, 2); place(1, 0, mRegisterButton); place(2, 0, mCancelButton); reflowLayout(250, 0); mUserField->addKeyListener(this); mPasswordField->addKeyListener(this); mConfirmField->addKeyListener(this); /* TODO: * This is a quick and dirty way to respond to the ENTER key, regardless of * which text field is selected. There may be a better way now with the new * input system of Guichan 0.6.0. See also the login dialog. */ mUserField->setActionEventId("register"); mPasswordField->setActionEventId("register"); mConfirmField->setActionEventId("register"); mUserField->addActionListener(this); mPasswordField->addActionListener(this); mConfirmField->addActionListener(this); center(); setVisible(true); mUserField->requestFocus(); mUserField->setCaretPosition(mUserField->getText().length()); mRegisterButton->setEnabled(canSubmit()); }
void RegisterDialog::action(const gcn::ActionEvent &event) { if (event.getId() == "cancel") { Client::setState(STATE_LOGIN); } else if (event.getId() == "register" && canSubmit()) { const std::string user = mUserField->getText(); logger->log("RegisterDialog::register Username is %s", user.c_str()); std::string errorMessage; int error = 0; unsigned int minUser = Net::getLoginHandler()->getMinUserNameLength(); unsigned int maxUser = Net::getLoginHandler()->getMaxUserNameLength(); unsigned int minPass = Net::getLoginHandler()->getMinPasswordLength(); unsigned int maxPass = Net::getLoginHandler()->getMaxPasswordLength(); if (user.length() < minUser) { // Name too short errorMessage = strprintf (_("The username needs to be at least %d characters long."), minUser); error = 1; } else if (user.length() > maxUser - 1 ) { // Name too long errorMessage = strprintf (_("The username needs to be less than %d characters long."), maxUser); error = 1; } else if (mPasswordField->getText().length() < minPass) { // Pass too short errorMessage = strprintf (_("The password needs to be at least %d characters long."), minPass); error = 2; } else if (mPasswordField->getText().length() > maxPass - 1 ) { // Pass too long errorMessage = strprintf (_("The password needs to be less than %d characters long."), maxPass); error = 2; } else if (mPasswordField->getText() != mConfirmField->getText()) { // Password does not match with the confirmation one errorMessage = _("Passwords do not match."); error = 2; } // TODO: Check if a valid email address was given if (error > 0) { if (error == 1) { mWrongDataNoticeListener->setTarget(this->mUserField); } else if (error == 2) { // Reset password confirmation mPasswordField->setText(""); mConfirmField->setText(""); mWrongDataNoticeListener->setTarget(this->mPasswordField); } OkDialog *dlg = new OkDialog(_("Error"), errorMessage); dlg->addActionListener(mWrongDataNoticeListener); } else { // No errors detected, register the new user. mRegisterButton->setEnabled(false); mLoginData->username = mUserField->getText(); mLoginData->password = mPasswordField->getText(); if (mFemaleButton) mLoginData->gender = mFemaleButton->isSelected() ? GENDER_FEMALE : GENDER_MALE; if (mEmailField) mLoginData->email = mEmailField->getText(); mLoginData->registerLogin = true; Client::setState(STATE_REGISTER_ATTEMPT); } } }