Example #1
0
    Status doSaslStep(const ClientBasic* client,
                      SaslAuthenticationSession* session,
                      const BSONObj& cmdObj,
                      BSONObjBuilder* result) {

        std::string payload;
        BSONType type = EOO;
        Status status = saslExtractPayload(cmdObj, &payload, &type);
        if (!status.isOK())
            return status;

        std::string responsePayload;
        // Passing in a payload and extracting a responsePayload
        status = session->step(payload, &responsePayload);

        if (!status.isOK()) {
            const SockAddr clientAddr = client->port()->localAddr();
            log() << session->getMechanism() << " authentication failed for " <<
                session->getPrincipalId() << " on " <<
                session->getAuthenticationDatabase() << " from client "  << clientAddr.getAddr() <<
                " ; " << status.toString() << std::endl;
            // All the client needs to know is that authentication has failed.
            return Status(ErrorCodes::AuthenticationFailed, "Authentication failed.");
        }

        status = buildResponse(session, responsePayload, type, result);
        if (!status.isOK())
            return status;

        if (session->isDone()) {
            UserName userName(session->getPrincipalId(), session->getAuthenticationDatabase());
            status = session->getAuthorizationSession()->addAndAuthorizeUser(
                                                            session->getOpCtxt(), userName);
            if (!status.isOK()) {
                return status;
            }

            if (!serverGlobalParams.quiet) {
                log() << "Successfully authenticated as principal " << session->getPrincipalId()
                      << " on " << session->getAuthenticationDatabase();
            }
        }
        return Status::OK();
    }
Example #2
0
bool UdpConnector::open(const SockAddr& sockaddr, boost::shared_ptr<Handler>* spout, ErrorCode* ec)
{
    if (!sp_creator_stg_.get())
        RETURN_ERROR_WITH(ec, E_NET_CREATE_NEW_HANDLER_FAILED, "addr=" << sockaddr, false);

    struct sockaddr_in address;
    bzero(&address,sizeof(address));
    address.sin_family=AF_INET;
    address.sin_addr.s_addr=inet_addr(sockaddr.getAddr().data());
    unsigned short port = sockaddr.getPort();
    address.sin_port=htons(port);

    int fd = ::socket(sockaddr.getType(), SOCK_DGRAM, 0);
    if (-1 == fd)
        RETURN_NET_ERROR_WITH(ec, errno, "addr=" << sockaddr, false);

    ScopedFD spfd(fd);

    SocketHelper::setNonBlocking(fd, ec);
    SocketHelper::setReusable(fd, ec);

    boost::shared_ptr<Handler> spnewhandler;
    sp_creator_stg_->create(fd, sockaddr, sp_reactor_impl_, spnewhandler);
    if (!spnewhandler)
        RETURN_ERROR_WITH(ec, E_NET_CREATE_NEW_HANDLER_FAILED, "addr=" << sockaddr, false);

    HandlerScoper<Handler> handler_scoper(spnewhandler);
    spfd.release();

    if (sp_filter_stg_.get())
    	spnewhandler->setFilter(auto_ptr<Filter>(sp_filter_stg_->create(true, spnewhandler.get())));

    if (!sp_reactor_impl_->registerHandler(spnewhandler, MASK_CONNECT|MASK_READ|MASK_WRITE, ec))
        RETURN_IF_ERROR_WITH(ec, false);

    handler_scoper.release();
    if (spout)
        *spout = spnewhandler;
    return true;
}
Example #3
0
MessagingPort::MessagingPort(std::shared_ptr<Socket> sock)
    : _x509SubjectName(), _connectionId(), _tag(), _psock(std::move(sock)) {
    SockAddr sa = _psock->remoteAddr();
    _remoteParsed = HostAndPort(sa.getAddr(), sa.getPort());
}