Exemplo n.º 1
0
  void Session_Service::onTransportSocketResult(qi::Future<TransportSocketPtr> value, long requestId) {
    qiLogDebug() << "Got transport socket for service";
    {
      boost::recursive_mutex::scoped_lock sl(_requestsMutex);
      ServiceRequest *sr = serviceRequest(requestId);
      if (!sr)
        return;

      if (value.hasError()) {
        sr->promise.setError(value.error());
        removeRequest(requestId);
        return;
      }
    }
    TransportSocketPtr socket = value.value();

    // If true, this socket came from the socket cache and has already been identified.
    // This typically happens when two services are behind the same endpoint.
    // We forge a message that just shows we've authenticated successfully.
    if (socket->hasReceivedRemoteCapabilities())
    {
      Message dummy;
      CapabilityMap cm;
      cm[AuthProvider::State_Key] = AnyValue::from(AuthProvider::State_Done);
      dummy.setType(Message::Type_Reply);
      dummy.setFunction(qi::Message::ServerFunction_Authenticate);
      dummy.setValue(AnyValue::from(cm), typeOf<CapabilityMap>()->signature());
      onAuthentication(TransportSocket::SocketEventData(dummy), requestId, socket, ClientAuthenticatorPtr(new NullClientAuthenticator), SignalSubscriberPtr());
      return;
    }
    ClientAuthenticatorPtr authenticator = _authFactory->newAuthenticator();
    CapabilityMap authCaps;
    {
      CapabilityMap tmp = authenticator->initialAuthData();
      for (CapabilityMap::iterator it = tmp.begin(), end = tmp.end(); it != end; ++it)
        authCaps[AuthProvider::UserAuthPrefix + it->first] = it->second;
    }
    SignalSubscriberPtr protSubscriber(new SignalSubscriber);
    *protSubscriber = socket->socketEvent.connect(&Session_Service::onAuthentication, this, _1, requestId, socket, authenticator, protSubscriber);


    Message msgCapabilities;
    msgCapabilities.setFunction(Message::ServerFunction_Authenticate);
    msgCapabilities.setService(Message::Service_Server);
    msgCapabilities.setType(Message::Type_Call);

    TransportSocketPtr sdSocket = _sdClient->socket();
    CapabilityMap socketCaps;
    if (sdSocket)
    {
      socketCaps = sdSocket->localCapabilities();
      socket->advertiseCapabilities(socketCaps);
    }
    socketCaps.insert(authCaps.begin(), authCaps.end());
    msgCapabilities.setValue(socketCaps, typeOf<CapabilityMap>()->signature());
    socket->send(msgCapabilities);
  }
Exemplo n.º 2
0
static CapabilityMap prepareAuthCaps(const CapabilityMap& data)
{
    CapabilityMap result;

    for (CapabilityMap::const_iterator it = data.begin(), end = data.end(); it != end; ++it)
    {
        if (boost::algorithm::starts_with(it->first, QiAuthPrefix))
            result[it->first] = it->second;
        else
            result[AuthProvider::UserAuthPrefix + it->first] = it->second;
    }
    return result;
}
Exemplo n.º 3
0
static CapabilityMap extractAuthData(const CapabilityMap& cmap)
{
    CapabilityMap authData;
    // Extract all capabilities related to authentication
    for (CapabilityMap::const_iterator it = cmap.begin(), end = cmap.end(); it != end; ++it)
    {
        const std::string& key = it->first;
        if (boost::algorithm::starts_with(key, QiAuthPrefix))
            authData[key] = it->second;
        else if (boost::algorithm::starts_with(key, AuthProvider::UserAuthPrefix))
            authData[key.substr(AuthProvider::UserAuthPrefix.length(), std::string::npos)] = it->second;
    }
    return authData;
}