Changeset e2d14a5 in Renga


Ignore:
Timestamp:
Sep 27, 2019, 10:34:47 PM (5 years ago)
Author:
Adrien Destugues <pulkomandy@…>
Branches:
main
Children:
8e01949
Parents:
38ed07d
git-author:
Adrien Destugues <pulkomandy@…> (27/09/2019 21:27:39)
git-committer:
Adrien Destugues <pulkomandy@…> (27/09/2019 22:34:47)
Message:

[WIP] XEP-0077 In-Band Registration

Also includes several cleanups, refactoring, etc

TODO:

  • Send back dataform to the server
  • Handle OOB data
  • Handle legacy fields again
  • Better error handling
  • Complete BOB and Media handling for captchas
  • Finish support for previous/next navigation in registration wizard (cleanup already added views, etc)

Future considerations:

Files:
11 added
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    r38ed07d re2d14a5  
    77add_definitions('-Wall' '-Wextra' '-Werror' '-Wno-multichar')
    88#add_definitions('-std=c++11')
    9 
    10 include_directories(shared/split-pane)
    119
    1210add_executable(Renga
     
    5553         jabber/XMLEntity.cpp
    5654         jabber/XMLReader.cpp
     55
     56        network/bob.cpp
     57        network/media.cpp
     58        network/GlooxHandler.cpp
     59
     60        ui/RegisterAccountWindow.cpp
    5761)
    5862
     
    6468        COMMAND rc -o Resource.rsrc ${CMAKE_SOURCE_DIR}/jabber/Resource.rdef
    6569        COMMAND xres -o ${CMAKE_BINARY_DIR}/Renga Resource.rsrc
    66                 -a PiNG:1:jabber-title ${CMAKE_SOURCE_DIR}/resources/graphics/jabber-title.png
    6770                -a PiNG:2:bulb-normal  ${CMAKE_SOURCE_DIR}/resources/graphics/bulb-normal.png
    6871                -a PiNG:3:bulb-big     ${CMAKE_SOURCE_DIR}/resources/graphics/bulb-big.png
     
    8083
    8184install(TARGETS Renga RUNTIME DESTINATION apps/)
     85
     86# Testing support
     87
     88#add_executable(Test
     89#       tests/Test.cpp
     90#)
     91
     92#target_link_libraries(Test be)
     93
     94# YouCompleteMe support
     95
     96set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
     97
     98if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json")
     99        EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different
     100                ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json
     101                ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
     102        )
     103endif()
  • doap.xml

    r38ed07d re2d14a5  
    6363    <implements>
    6464        <xmpp:SupportedXep>
     65            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
     66            <xmpp:status>partial</xmpp:status>
     67            <xmpp:version>2.9</xmpp:version>
     68            <xmpp:version>1.22.0</xmpp:version>
     69                        <xmpp:note>only for in-band registration</xmpp:note>
     70        </xmpp:SupportedXep>
     71    </implements>
     72    <implements>
     73        <xmpp:SupportedXep>
    6574            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
    6675            <xmpp:status>complete</xmpp:status>
     
    95104    <implements>
    96105        <xmpp:SupportedXep>
     106            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0077.html"/>
     107            <xmpp:status>partial</xmpp:status>
     108            <xmpp:version>2.4</xmpp:version>
     109            <xmpp:since>1.22.0</xmpp:since>
     110                        <xmpp:note>dataforms only, legacy fixed fields not handled</xmpp:note>
     111        </xmpp:SupportedXep>
     112    </implements>
     113    <implements>
     114        <xmpp:SupportedXep>
    97115            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0092.html"/>
    98116            <xmpp:status>complete</xmpp:status>
    99117            <xmpp:version>1.1</xmpp:version>
    100118            <xmpp:since>1.22.0</xmpp:since>
     119        </xmpp:SupportedXep>
     120    </implements>
     121    <implements>
     122        <xmpp:SupportedXep>
     123            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
     124            <xmpp:status>partial</xmpp:status>
     125            <xmpp:version>1.0</xmpp:version>
     126            <xmpp:version>1.22.0</xmpp:version>
     127                        <xmpp:note>only for in-band registration</xmpp:note>
     128        </xmpp:SupportedXep>
     129    </implements>
     130    <implements>
     131        <xmpp:SupportedXep>
     132            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0221.html"/>
     133            <xmpp:status>partial</xmpp:status>
     134            <xmpp:version>1.22.0</xmpp:version>
     135                        <xmpp:note>only images, only for in-band registration</xmpp:note>
     136        </xmpp:SupportedXep>
     137    </implements>
     138    <implements>
     139        <xmpp:SupportedXep>
     140            <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
     141            <xmpp:status>partial</xmpp:status>
     142            <xmpp:version>1.0</xmpp:version>
     143            <xmpp:version>1.22.0</xmpp:version>
     144                        <xmpp:note>only for in-band registration</xmpp:note>
    101145        </xmpp:SupportedXep>
    102146    </implements>
     
    114158            <revision>1.2h</revision>
    115159            <created>2008-03-15</created>
    116             <file-release rdf:resource="https://lab.louiz.org/poezio/poezio/-/archive/v0.12/poezio-v0.12.tar.gz"/>
    117160        </Version>
    118161    </release>
     
    121164            <revision>1.2.1</revision>
    122165            <created>2009-12-13</created>
     166                        <file-release rdf:resource="https://eu.hpkg.haiku-os.org/haikuports/master/x86_64/current/packages/jabber4haiku-1.2.1-6-x86_64.hpkg"/>
    123167        </Version>
    124168    </release>
  • jabber/BlabberMainWindow.cpp

    r38ed07d re2d14a5  
    44
    55#include "BlabberMainWindow.h"
     6
     7#include "../ui/RegisterAccountWindow.h"
    68
    79#include <InterfaceKit.h>
     
    4345
    4446
     47enum {
     48        kCreateAccount = 'crea'
     49};
     50
     51
    4552BlabberMainWindow *BlabberMainWindow::_instance = NULL;
    4653
     
    8996void BlabberMainWindow::MessageReceived(BMessage *msg) {
    9097        switch (msg->what) {
     98                case kCreateAccount:
     99                {
     100                        (new RegisterAccountWindow(this))->Show();
     101                        break;
     102                }
    91103                // channels
    92104                case JAB_A_CHANNEL: {
     
    119131
    120132                        // connect with current username or register new account
    121                         JabberSpeak::Instance()->SendConnect(_login_username->Text(), _login_password->Text(), _login_realname->Text(), _login_new_account->Value());
     133                        JabberSpeak::Instance()->SendConnect(_login_username->Text(), _login_password->Text(), _login_realname->Text());
    122134
    123135                        break;
     
    142154                case JAB_CONNECT: {
    143155                        _status_view->SetMessage("connecting");
    144                         JabberSpeak::Instance()->SendConnect("", "", "", false, true);
     156                        JabberSpeak::Instance()->SendConnect("", "", "", true);
    145157
    146158                        break;
     
    635647
    636648BlabberMainWindow::BlabberMainWindow(BRect frame)
    637         : BWindow(frame, "Renga", B_DOCUMENT_WINDOW, 0) {
     649        : BWindow(frame, "Renga", B_DOCUMENT_WINDOW, B_AUTO_UPDATE_SIZE_LIMITS) {
    638650
    639651        // editing filter for taksing
     
    803815
    804816        // graphics
    805         _login_bulb = new PictureView("jabber-title");
     817        _login_bulb = new PictureView("bulb-normal");
    806818
    807819        // username/password controls
     
    813825        _login_password->TextView()->HideTyping(true);
    814826       
    815         _login_new_account = new BCheckBox(NULL, "Create this account!", NULL);
     827        BMessage* createAccount = new BMessage(kCreateAccount);
     828        _login_new_account = new BButton("create", "Create a new account",
     829                createAccount);
    816830
    817831        _login_auto_login = new BCheckBox(NULL, "Auto-login", NULL);
     
    822836        _login_login->SetTarget(this);
    823837
    824         // new user notes
    825         rgb_color note = ui_color(B_PANEL_TEXT_COLOR);
    826         BFont black_9(be_plain_font);
    827         black_9.SetSize(std::min(black_9.Size() * 0.75f, 9.0f));
    828 
    829         BTextView *enter_note = new BetterTextView(NULL, &black_9, &note, B_WILL_DRAW);
    830         enter_note->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
    831         enter_note->MakeEditable(false);
    832         enter_note->MakeSelectable(false);
    833         enter_note->SetAlignment(B_ALIGN_CENTER);
    834         enter_note->SetWordWrap(true);
    835         enter_note->SetText("Note: Jabber ID's are of the form username@server.\n"
    836                 "Pick a fun username! If you don't know any servers, jabber.org is recommended.");
    837        
     838        BStringView* appName = new BStringView("app name", "Renga");
     839        BFont bigfont(be_plain_font);
     840        bigfont.SetSize(bigfont.Size() * 3);
     841        appName->SetFont(&bigfont);
     842
    838843        BLayoutBuilder::Group<>(_login_full_view, B_VERTICAL)
    839844                .SetInsets(B_USE_DEFAULT_SPACING)
    840                 .Add(_login_bulb)
     845                .AddGrid()
     846                        .Add(_login_bulb, 0, 0, 1, 4)
     847                        .Add(appName, 1, 1)
     848                        .Add(new BStringView("", "XMPP client for Haiku"), 1, 2)
     849                .End()
     850                .Add(_login_new_account)
     851                .AddGlue()
    841852                .AddGrid()
    842853                        .AddTextControl(_login_realname, 0, 0)
     
    845856                .End()
    846857                .AddGroup(B_HORIZONTAL)
    847                         .Add(_login_new_account)
    848858                        .Add(_login_auto_login)
     859                        .AddGlue()
     860                        .Add(_login_login)
    849861                .End()
    850                 .Add(_login_login)
    851                 .Add(enter_note)
     862                .AddGlue()
    852863        .End();
    853864       
     
    899910
    900911        if (username.WhyNotValidJabberHandle().size()) {
    901                 char buffer[1024];
    902                
    903                 if (_login_new_account->Value())
    904                         sprintf(buffer, "The Jabber ID you specified is not legal for the following reason:\n\n%s\n\nYou must specify a legal Jabber ID before you may create a new account.", username.WhyNotValidJabberHandle().c_str());
    905                 else
    906                         sprintf(buffer, "The Jabber ID you specified must not be yours because it's invalid for the following reason:\n\n%s\n\nIf you can't remember it, it's OK to create a new one by checking the \"Create a new Jabber Account!\" box.", username.WhyNotValidJabberHandle().c_str());
     912                BString buffer;
     913                buffer.SetToFormat("The Jabber ID you specified must not be yours because it's invalid for the following reason:\n\n%s\n\nIf you can't remember it, it's OK to create a new one by checking the \"Create a new Jabber Account!\" box.", username.WhyNotValidJabberHandle().c_str());
    907914
    908915                ModalAlertFactory::Alert(buffer, "OK", NULL, NULL, B_WIDTH_FROM_LABEL, B_STOP_ALERT);
     
    924931        if (!strcmp(_login_password->Text(), "")) {
    925932                char buffer[1024];
    926 
    927                 if (_login_new_account->Value())
    928                         sprintf(buffer, "To create a new account, you must specify a password to protect it, %s.", username.Handle().c_str());
    929                 else
    930                         sprintf(buffer, "You must specify a password so I can make sure it's you, %s.", username.Handle().c_str());
     933                sprintf(buffer, "You must specify a password so I can make sure it's you, %s.", username.Handle().c_str());
    931934
    932935                ModalAlertFactory::Alert(buffer, "Sorry!", NULL, NULL, B_WIDTH_FROM_LABEL, B_STOP_ALERT);
  • jabber/BlabberMainWindow.h

    r38ed07d re2d14a5  
    7777        BTextControl             *_login_password;
    7878
    79         BCheckBox                *_login_new_account;
     79        BButton                  *_login_new_account;
    8080        BCheckBox                *_login_auto_login;
    8181       
  • jabber/JabberSpeak.cpp

    r38ed07d re2d14a5  
    44
    55#include <gloox/jid.h>
     6#include <gloox/dataformitem.h>
    67#include <gloox/disco.h>
    78#include <gloox/registration.h>
     
    3940//////////////////////////////////////////////////
    4041
     42// FIXME use the GlooxHandler instead for all XMPP things
     43
    4144JabberSpeak *JabberSpeak::Instance() {
    4245        if (_instance == NULL) {
     
    5255        , fBookmarks(NULL)
    5356{
    54         _registering_new_account = false;
    55        
    5657        // grab a handle to the settings now for convenience later
    5758        _blabber_settings = BlabberSettings::Instance();
     
    9091        _password                = "";
    9192        _am_logged_in            = false;
    92         _registering_new_account = false;
    9393        _reconnecting            = false;
    9494        _got_some_agent_info     = false;
     
    140140
    141141        static int seen_streams = 0;
    142 
    143         // handle connection
    144         if (!entity->IsCompleted() && !strcasecmp(entity->Name(), "stream:stream")) {
    145                 if (_registering_new_account) {
    146                         // create account
    147                         _SendUserRegistration(UserID(_curr_login).JabberUsername(), _password, UserID(_curr_login).JabberResource());
    148                 }
    149         }
    150142
    151143        // handle disconnection
     
    403395//////////////////////////////////////////////////
    404396
    405 void JabberSpeak::SendConnect(string username, string password, string realname, bool is_new_account, bool suppress_auto_connect) {
    406         _registering_new_account = is_new_account;
     397void JabberSpeak::SendConnect(string username, string password, string realname, bool suppress_auto_connect) {
    407398
    408399        // if there's another application instance running, suppress auto-login
     
    470461        gloox::JID jid(_curr_login);
    471462        fClient = new gloox::Client(jid, _password);
     463
     464        fClient->rosterManager()->registerRosterListener(this);
    472465        fClient->logInstance().registerLogHandler(gloox::LogLevelDebug,
    473466                gloox::LogAreaXmlOutgoing, new LogHandler);
    474467        fClient->registerConnectionListener(this);
    475         fClient->rosterManager()->registerRosterListener(this);
    476468        fClient->registerMessageHandler(TalkManager::Instance());
    477469        _ProcessVersionRequest();
     470
    478471        fClient->connect();
    479472}
     
    571564        gloox::Presence presence(gloox::Presence::Unavailable, gloox::JID(group_presence));
    572565        fClient->send(presence);
    573 }
    574 
    575 void JabberSpeak::_SendUserRegistration(string username, string password, string resource __attribute__((unused))) {
    576         gloox::Registration registration(fClient);
    577         gloox::RegistrationFields fields;
    578         fields.username = username;
    579         fields.password = password;
    580         // TODO this can return an error
    581         registration.createAccount(
    582                 gloox::Registration::FieldUsername | gloox::Registration::FieldPassword,
    583                 fields);
    584566}
    585567
     
    691673JabberSpeak::onConnect()
    692674{
     675        fprintf(stderr, "Logged in!\n");
    693676        MessageRepeater::Instance()->PostMessage(JAB_LOGGED_IN);
    694         _reconnecting = false;
    695677        //SendLastPresence();   
    696        
     678
    697679        // Request for bookmarks
    698680        fBookmarks = new gloox::BookmarkStorage(fClient);
    699681        fBookmarks->registerBookmarkHandler(this);
    700682        fBookmarks->requestBookmarks();
    701 }
    702 
    703 void
    704 JabberSpeak::onDisconnect(__attribute__((unused)) gloox::ConnectionError e)
    705 {
    706         puts("onDisconnect");
     683        _reconnecting = false;
     684}
     685
     686
     687void
     688JabberSpeak::onDisconnect(gloox::ConnectionError e)
     689{
     690        fprintf(stderr, "%s(%d)\n", __PRETTY_FUNCTION__, e);
     691
     692        if (e == gloox::ConnAuthenticationFailed) {
     693                // FIXME back to login screen
     694                fprintf(stderr, " > auth error %d\n", fClient->authError());
     695        }
    707696       
    708697        // reset XMLReader
  • jabber/JabberSpeak.h

    r38ed07d re2d14a5  
    1212#include <gloox/connectionlistener.h>
    1313#include <gloox/presence.h>
     14#include <gloox/registration.h>
    1415#include <gloox/rosterlistener.h>
    1516#include <gloox/softwareversion.h>
     
    4849        void                     DestroyAttributeMemory(char **atts, int num_items);
    4950        static string            GenerateUniqueID();
    50         void                     SendConnect(string username = "", string password = "", string realname = "", bool is_new_account = false, bool suppress_auto_connect = false);
     51        void                     SendConnect(string username = "", string password = "", string realname = "", bool suppress_auto_connect = false);
    5152        void                     SendDisconnect();
    5253        void                     SendSubscriptionRequest(string username);
     
    9798        void                                    handleBookmarks(const gloox::BookmarkList& bList,
    9899                                                                                    const gloox::ConferenceList& cList) final;
     100
    99101        gloox::Client*                  GlooxClient() { return fClient; }
    100102
     
    125127       
    126128        bool                    _am_logged_in;
    127         bool                    _registering_new_account;
    128129        bool                    _reconnecting;
    129130
     
    142143        gloox::Client*                  fClient;
    143144        gloox::BookmarkStorage* fBookmarks;
     145        gloox::Registration*    fRegistration;
    144146};
    145147
  • support/BeDC.h

    r38ed07d re2d14a5  
    7676               
    7777                //Send a format string - parameters
    78                 void SendFormat(const char *text, ...){
    79                         char buffer[1024];
    80                         va_list args; 
    81    
    82                         va_start(args, text); 
    83                         vsprintf(buffer, text, args);
    84                         va_end(args); 
    85                         SendMessage(buffer, DC_MESSAGE);       
     78                void SendFormat(const char *text, ...) {
     79                        BString buffer;
     80                        va_list args;
     81
     82                        va_start(args, text);
     83                        buffer.SetToFormatVarArgs(text, args);
     84                        va_end(args);
     85                        SendMessage(buffer, DC_MESSAGE);
    8686                }
    8787               
    88                 void SendFormatT(const char *text, int8 type, ...){
    89                         char buffer[1024];
     88                void SendFormatT(const char *text, int8 type, ...) {
     89                        BString buffer;
    9090                        va_list args;
    9191 
    92                         va_start(args, type); 
    93                         vsprintf(buffer, text, args);
    94                         va_end(args); 
    95                         SendMessage(buffer, type); 
     92                        va_start(args, type);
     93                        buffer.SetToFormatVarArgs(text, args);
     94                        va_end(args);
     95                        SendMessage(buffer, type);
    9696                }
    9797                //---------------
  • support/LogHandler.h

    r38ed07d re2d14a5  
    1414        public:
    1515        LogHandler()
    16                 : fDebugContext("Renga")
     16                : fDebugContext("Renga"),
     17                fWarningContext("Renga", DC_YELLOW),
     18                fErrorContext("Renga", DC_RED)
    1719        {
    1820        }
     
    2022        private:
    2123        void handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string &message) override {
    22                 fDebugContext.SendFormat("%d %d %s", level, area, message.c_str());
     24                switch(level) {
     25                        case gloox::LogLevelDebug:
     26                        default:
     27                                fDebugContext.SendFormat("%d %s", area, message.c_str());
     28                                break;
     29                        case gloox::LogLevelWarning:
     30                                fWarningContext.SendFormat("%d %s", area, message.c_str());
     31                                break;
     32                        case gloox::LogLevelError:
     33                                fErrorContext.SendFormat("%d %s", area, message.c_str());
     34                                break;
     35                }
    2336        }
    2437
    2538        BeDC fDebugContext;
     39        BeDC fWarningContext;
     40        BeDC fErrorContext;
    2641};
Note: See TracChangeset for help on using the changeset viewer.