Пример #1
0
        virtual bool run(OperationContext* txn,
                         const string&,
                         BSONObj& cmdObj,
                         int,
                         string& errmsg,
                         BSONObjBuilder& result) {

            string fromhost = cmdObj.getStringField("fromhost");
            if ( fromhost.empty() ) {
                /* copy from self */
                stringstream ss;
                ss << "localhost:" << serverGlobalParams.port;
                fromhost = ss.str();
            }

            const ConnectionString cs(uassertStatusOK(ConnectionString::parse(fromhost)));

            authConn_.reset(cs.connect(errmsg));
            if (!authConn_.get()) {
                return false;
            }

            BSONObj ret;

            if( !authConn_->runCommand( "admin", BSON( "getnonce" << 1 ), ret ) ) {
                errmsg = "couldn't get nonce " + ret.toString();
                return false;
            }

            result.appendElements( ret );
            return true;
        }
Пример #2
0
 virtual bool run(const string& dbname, BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
     string fromhost = cmdObj.getStringField("fromhost");
     if ( fromhost.empty() ) {
         /* copy from self */
         stringstream ss;
         ss << "localhost:" << cmdLine.port;
         fromhost = ss.str();
     }
     string fromdb = cmdObj.getStringField("fromdb");
     string todb = cmdObj.getStringField("todb");
     if ( fromhost.empty() || todb.empty() || fromdb.empty() ) {
         errmsg = "parms missing - {copydb: 1, fromhost: <hostname>, fromdb: <db>, todb: <db>}";
         return false;
     }
     Cloner c;
     string username = cmdObj.getStringField( "username" );
     string nonce = cmdObj.getStringField( "nonce" );
     string key = cmdObj.getStringField( "key" );
     if ( !username.empty() && !nonce.empty() && !key.empty() ) {
         uassert( 13008, "must call copydbgetnonce first", authConn_.get() );
         BSONObj ret;
         {
             dbtemprelease t;
             if ( !authConn_->runCommand( fromdb, BSON( "authenticate" << 1 << "user" << username << "nonce" << nonce << "key" << key ), ret ) ) {
                 errmsg = "unable to login " + string( ret );
                 return false;
             }
         }
         c.setConnection( authConn_.release() );
     }
     Client::Context ctx(todb);
     bool res = c.go(fromhost.c_str(), errmsg, fromdb, /*logForReplication=*/!fromRepl, /*slaveok*/false, /*replauth*/false, /*snapshot*/true);
     return res;
 }
Пример #3
0
        virtual bool run(OperationContext* txn,
                         const string&,
                         BSONObj& cmdObj,
                         int,
                         string& errmsg,
                         BSONObjBuilder& result) {

            const string fromDb = cmdObj.getStringField("fromdb");

            string fromHost = cmdObj.getStringField("fromhost");
            if ( fromHost.empty() ) {
                /* copy from self */
                stringstream ss;
                ss << "localhost:" << serverGlobalParams.port;
                fromHost = ss.str();
            }

            const ConnectionString cs(uassertStatusOK(ConnectionString::parse(fromHost)));

            BSONElement mechanismElement;
            Status status = bsonExtractField(cmdObj,
                                             saslCommandMechanismFieldName,
                                             &mechanismElement);
            if (!status.isOK()) {
                return appendCommandStatus(result, status);
            }

            BSONElement payloadElement;
            status = bsonExtractField(cmdObj, saslCommandPayloadFieldName, &payloadElement);
            if (!status.isOK()) {
                log() << "Failed to extract payload: " << status;
                return false;
            }

            authConn_.reset(cs.connect(errmsg));
            if (!authConn_.get()) {
                return false;
            }

            BSONObj ret;
            if( !authConn_->runCommand( fromDb,
                                        BSON( "saslStart" << 1 <<
                                              mechanismElement <<
                                              payloadElement),
                                        ret ) ) {
                return appendCommandStatus(result,
                                           Command::getStatusFromCommandResult(ret));

            }

            result.appendElements( ret );
            return true;
        }
Пример #4
0
 virtual bool run(const string& , BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
     string fromhost = cmdObj.getStringField("fromhost");
     if ( fromhost.empty() ) {
         /* copy from self */
         stringstream ss;
         ss << "localhost:" << cmdLine.port;
         fromhost = ss.str();
     }
     authConn_.reset( new DBClientConnection() );
     BSONObj ret;
     {
         dbtemprelease t;
         if ( !authConn_->connect( fromhost, errmsg ) )
             return false;
         if( !authConn_->runCommand( "admin", BSON( "getnonce" << 1 ), ret ) ) {
             errmsg = "couldn't get nonce " + string( ret );
             return false;
         }
     }
     result.appendElements( ret );
     return true;
 }