ilibjingle с сервером Openfire - не удается войти - PullRequest
1 голос
/ 29 июля 2011

Я только что установил сервер openfire в свой экземпляр Suse-Linux EC2 и настроил сервер openfire, создав одного пользователя с именем 'balaji' в дополнение к администратору.

Затем я установил код ilibjingle дляплатформа iOS, и я смог ее построить.Я запустил его в симуляторе, и он отлично работал для моего gmail-id.Он вошел в систему, затем вывел пользователей из списка.

Затем я изменил код так, чтобы он указывал на IP-адрес моего сервера openfire, и дал имя пользователя как «balaji» (то, которое я создал в openfire) исоответствующий пароль.У меня также есть самозаверяющий сертификат SSL на сервере openfire.Когда я запустил этот код, он смог подключиться, но не смог войти (я считаю).Код ilibjingle должен перейти из Connect to Login в LoggedIn в список реестра.Когда я работал с моим сервером openfire, он перешел с Connect на Login, но ничего кроме этого.

Что могло пойти не так?Должен ли я что-то изменить на своем сервере openfire, чтобы это работало?Вот мой код iPhone.

В rootviewcontroller.mm у меня есть следующий фрагмент.

-(void) _mainGtalkThread:(id)sender
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //you need to setup name and passwd manuelly here
    char *name = "balaji";
    char *password = "mypasswd";
    [self gtalk_main:(char*)name userpassword:(char*)password];
    [pool release];
}


-(int) gtalk_main:(char*)un userpassword:(char*)password 
{
// This app has three threads. The main thread will run the XMPP client,
// which will print to the screen in its own thread. A second thread
// will get input from the console, parse it, and pass the appropriate
// message back to the XMPP client's thread. A third thread is used
// by MediaSessionClient as its worker thread.

buzz::Jid jid;
talk_base::InsecureCryptStringImpl pass;

std::string username = un;
if (username.find('@') == std::string::npos) {
    username.append("@localhost");
}
jid = buzz::Jid(username);
if (!jid.IsValid() || jid.node() == "") {
    printf("Invalid JID. JIDs should be in the form user@domain\n");
    return 1;
}
pass.password() = password;

buzz::XmppClientSettings xcs;

xcs.set_user(jid.node());
//xcs.set_resource("call");
xcs.set_host(jid.domain());
xcs.set_pass(talk_base::CryptString(pass));
xcs.set_use_tls(false);
xcs.set_allow_plain(true);

xcs.set_server(talk_base::SocketAddress("50.37.185.206", DEFAULT_PORT));
printf("Logging in as %s with user as %s\n", jid.Str().c_str(), jid.node().c_str());

talk_base::InitializeSSL();

talk_base::Thread athread;
talk_base::ThreadManager::SetCurrent(&athread);

talk_base::Thread* main_thread = talk_base::Thread::Current();
assert(main_thread!=NULL);

XmppPump pump;
//CallClient *client = new CallClient(pump.client());
gtalkClient_ = new gtalkClient(pump.client(), self);

pump.DoLogin(xcs, new XmppSocket(true), NULL);
main_thread->Run();

return 0;
}

и в другом файле 'gtalkclient.mm' у меня есть следующее:

gtalkClient::gtalkClient(buzz::XmppClient* xmpp_client, void * controller) :
xmpp_client_(xmpp_client), controller_(controller), media_engine_(NULL),
media_client_(NULL), call_(NULL), incoming_call_(false), auto_accept_(false),
pmuc_domain_("conference.localhost"), local_renderer_(NULL), remote_renderer_(NULL),
roster_(new RosterMap), portallocator_flags_(0)
{
    xmpp_client_->SignalStateChange.connect(this, &gtalkClient::OnStateChange);
}


void gtalkClient::OnStateChange(buzz::XmppEngine::State state) 
{         
    RootViewController * tvc = (RootViewController*)controller_;
    switch (state) {
      case buzz::XmppEngine::STATE_START:
        printf("connecting...");
      [tvc.roster_ removeAllObjects];
      [tvc.roster_ addObject:@"connecting..."];
      [tvc reloadTableViewData];
        break;

      case buzz::XmppEngine::STATE_OPENING:
        printf("logging in...");
      [tvc.roster_ removeAllObjects];
      [tvc.roster_ addObject:@"logging in..."];
      [tvc reloadTableViewData];
        break;

      case buzz::XmppEngine::STATE_OPEN:
        printf("logged in...");
      [tvc.roster_ removeAllObjects];
      [tvc.roster_ addObject:@"logged in..."];
      [tvc reloadTableViewData];
        InitPhone();
        InitPresence();
      // prepare to add roster
      [tvc.roster_ removeAllObjects];
        break;

      case buzz::XmppEngine::STATE_CLOSED:
        buzz::XmppEngine::Error error = xmpp_client_->GetError(NULL);
        printf("logged out...%s", strerror(error).c_str());
      [tvc.roster_ removeAllObjects];
      [tvc.roster_ addObject:@"logged out..."];
      [tvc reloadTableViewData];
    Quit();
      }
    }

1 Ответ

4 голосов
/ 22 декабря 2011

У меня также была такая же проблема, когда я запускаю libjingle образец программы с моим openfire сервером. Это потому, что более новая версия libjingle не поддерживала сертификаты неизвестных органов.

Так что вам нужно отменить изменения, сделанные на xmppsocket.cc на rev65 (когда libjingle было обновлено до версии 0.5.6):
Эта ссылка поможет вам увидеть разницу между двумя версиями http://code.google.com/p/libjingle/source/diff?spec=svn95&r=65&format=side&path=/trunk/talk/examples/login/xmppsocket.cc&old_path=/trunk/talk/examples/login/xmppsocket.cc&old=30

В этом коммите они удалили две строки, которые разрешали сертификаты неизвестных центров сертификации.

Я решил проблему, следуя приведенным выше инструкциям. Или вы можете перейти по ссылке нижечтобы получить полную идею.http://code.google.com/p/libjingle/issues/detail?id=250.

...