Example #1
0
//! \brief
void IncomingUdp::onExecute()
{
    char buffer[ max_packet_size ];     // TODO: Member variable? Allow max_packet_size to be defined by configuration

    // Memory allocation comes from round-robin memory buffer(s) to remove
    // the necessity for new/delete blocks

    while ( isActive() )
    {
        const int dataLength = m_socket.recv( buffer, max_packet_size );
        if ( dataLength < 0 )
        {
            if ( isActive() )
            {
                processSocketError( dataLength );
            }
        }
        else if ( dataLength > 0 )  // TODO: Simpler if the message queue handles this?
        {
            m_queue->push( buffer, dataLength );
            
            // TODO: Should validate packet then pass it into message queue, we shouldn't know about UserInfo at this level.
            // TODO: Decrypt packet content
            UserInfo *user = findUser( packetInfo.publicKey );
            if ( user && user->ipAddress == packetInfo.ipAddress )
            {
                user->queueMessage( buffer, dataLength );
            }
            else
            {
                m_log->Error( kModuleName, "Received unexpected UDP packet.\n" );
            }
        }
    }
}
Example #2
0
NetworkServer::AutoPacket NetworkServer::receive()
{
	assert(isConnected());

	for (;;) {
		if (_queuedUser) {
			removeUser(_queuedUser);
			_queuedUser = 0;
		}

		Packet* raw = _peer->Receive();
		if (!raw) {
			return AutoPacket();
		}
		AutoDepacketer depacketer(*_peer, raw);

		AutoPacket packet(processPacket(*raw));
		if (packet.get()) {
			User *user = findUser(raw->systemAddress);
			if (!user) {
				packetHeader(std::cout, *raw);
				std::cout << "Packet from unknown user: " << int(packet->kind()) << std::endl;
				continue;
			}
			packet->read(raw, user);
			return packet;
		}
	}
}
Example #3
0
// add USER
int CFtpd::addUser(char *login_, char *passwd_, int simConn_, int timeOut_) {
    CUser *u;
    int i;

    // It's forbidden to create blank logins
    if (lstrcmp(login_, "") == 0) return -1;

    /*
    if (rootDir_[strlen(rootDir_)-1]!='\\') {
        strcat(rootDir_, "\\\0");
    }
    */
    i = findUser(login_);
    if (i>=0) {
        // edit user
        // m_Users[i]->set(login_, passwd_, simConn_, timeOut_);
    }
    else {
        // add User
        u = (CUser*)new CUser();
        u->set(login_, passwd_, simConn_, timeOut_);
        m_Users[nbUsers] = u;
        i = nbUsers;
        nbUsers++;
    }
    
    return i;
}
Example #4
0
void handle_WHOIS(char** params, int socket)
{
  char msgbuf[512];
  char *nick = params[1];
  char user[500];
  char realname[500];
  struct ClientData * vip = findUser(nick,&clientList); //the VIP who everyone wants to know about, for whom they keep walking around town asking WHOIS in all caps and demanding a reply
  struct ClientData * looker = (struct ClientData *)list_seek(&clientList, &socket);
  char lookernick[10];
  strcpy(lookernick, looker->nick);

  //check if the nick exists
  if(vip == NULL){
    sprintf(msgbuf, ":%s 401 %s %s :No such nick/channel\r\n", host, lookernick, nick);
    sendMessage(msgbuf, socket);
    return;
  }
  strcpy(user, vip->user);
  strcpy(realname, vip->real);

  //send the info
  sprintf(msgbuf, ":%s 311 %s %s %s %s * :%s\r\n", host, lookernick, nick, user, host, realname);
  sendMessage(msgbuf, socket);
  sprintf(msgbuf, ":%s 312 %s %s %s :The best server ever\r\n", host, lookernick, nick, host);
  sendMessage(msgbuf, socket);
  sprintf(msgbuf, ":%s 318 %s %s :End of WHOIS list\r\n", host, lookernick, nick);
  sendMessage(msgbuf, socket);
  
  return;
}
Example #5
0
const QString EvaSetting::getProxyUsername(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return userList.at(index)->proxyUserName;
	}
	return "";	
}
Example #6
0
bool
ObjectCache::findUser(Id user_id, User& user)
{
    User* object = findUser(user_id);
    if (object == NULL) return false;
    user = *object;
    return true;
}
Example #7
0
const QCString EvaSetting::getProxyParam(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return userList.at(index)->base64param.stripWhiteSpace();
	}
	return "";
}
Example #8
0
const short EvaSetting::getPort(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return userList.at(index)->port;
	}
	return 0;
}
Example #9
0
const int EvaSetting::getServer(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return userList.at(index)->proxy;
	}
	return 0;	
}
Example #10
0
const char *EvaSetting::getPassword(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return (char*)(userList.at(index)->md5Pwd);
	}
	return "";
}
Example #11
0
const bool EvaSetting::isHiddenChecked(const int id)
{
	int index = findUser(id);
	if(index!=-1){
		return (userList.at(index)->flag & 0x02);
	}
	return false;
}
Example #12
0
// better user update. Take slots out of the picture altogether. Find empty slot and add
// or if tag is there, change mask
// or report: no empty slots, sorry charlie
boolean EEPROM_UserDB::upsertUser(byte userMask, unsigned long tagNumber) {
   int offset;// = EEPROM_FIRSTUSER; 
   byte EEPROM_buffer[5] ={0,0,0,0,0};  
   boolean foundEmpty = false;
   byte byteVal = 0;
   
   if (tagNumber > 0xffffffff || tagNumber < 0) {
      Serial.println("Tag Number must be between 0 and 0xFFFFFFFF. Ignored.");
      return false;
   }
   
   offset = findUser(tagNumber);
   
   if (offset >= 0) {
     Serial.print("Tag: ");
     Serial.print(tagNumber,HEX);
     EEPROM.write(offset+4, userMask);
     Serial.print(" found and updated to mask:");  
     Serial.println(userMask,DEC);
     return true;
   }
   // TODO, prob in following section
   // right place to start searching  
   offset = EEPROM_FIRSTUSER;

   while (!foundEmpty & (offset < EEPROM_LASTUSER)) {
      for (int i = 0; i < 5; i++) {
         if (EEPROM.read(offset + i) == 0xFF) {
           byteVal++;
         }
      } 

      if (byteVal == 5) {
        foundEmpty = true;
      } else {
        offset += 5;
        byteVal = 0; // reset
      }
   }
   
   if (offset < EEPROM_LASTUSER) {
        EEPROM_buffer[0] = byte(tagNumber &  0xFFF);   // Fill the buffer with the values to write to bytes 0..4 
        EEPROM_buffer[1] = byte(tagNumber >> 8);
        EEPROM_buffer[2] = byte(tagNumber >> 16);
        EEPROM_buffer[3] = byte(tagNumber >> 24);
        EEPROM_buffer[4] = byte(userMask);
        for(int i=0; i<5; i++){
          EEPROM.write((offset+i), (EEPROM_buffer[i])); // Store the resulting value in 5 bytes of EEPROM.
        }
        
        Serial.print("Tag: ");
        Serial.print(tagNumber,HEX);
        Serial.print(" successfully added with mask:");
        Serial.println(userMask,DEC);
        
     } else {
Example #13
0
/*Function to handle a NICK message to our client by updating the user struct associated with the socket # it's coming from to have the right nickname */
void handle_NICK(char** params, int socket)
{
  char msgbuf[512];
  char *nick;
  char *user;

  //read the nick we got in the command
  nick = params[1];

  //check if the nick is already taken
  struct ClientData * ifused = findUser(nick,&clientList);
  if(ifused != NULL){
    printf("nick was taken\n");
    sprintf(msgbuf, ":%s 433 * %s :Nickname is already in use\r\n", host, nick);
    sendMessage(msgbuf, socket);
    return;
  }

  //look in the list of users for the matching socket number
  pthread_mutex_lock(&listLock);
  struct ClientData * ourCli = (struct ClientData *)list_seek(&clientList, &socket);
  if(ourCli == NULL) {
    printf("Failing on list seek.\n"); 
  }
  //add in their nick
  strcpy(ourCli->nick, nick);
  user = ourCli->user;
  pthread_mutex_unlock(&listLock);

  //list_dump_file(&clientList, "oneuserlist.txt", NULL);

  //logging!
  printf("Client # %d now has nickname %s.\n", ourCli->ourSocket, nick);
  printf("Client # %d also has username %s.\n", ourCli->ourSocket, user);

  //check if they have registered both a nick and a user
  if(nick[0] != '\0' && user[0] != '\0'){
    ourCli->registered = 1; //yay
    sprintf(msgbuf,":%s 001 %s :Welcome to the Internet Relay Network %s!%[email protected]\r\n", host, nick, nick, user);
    //welcome them
    sendMessage(msgbuf, ourCli->ourSocket);
    sprintf(msgbuf, ":%s 002 %s :Your host is %s, running version chirc-0.1\r\n", host, nick, host);
    sendMessage(msgbuf, ourCli->ourSocket);
    sprintf(msgbuf, ":%s 003 %s :This server was created 2012-01-02 13:30:04\r\n", host, nick);
    sendMessage(msgbuf, ourCli->ourSocket);
    sprintf(msgbuf, ":%s 004 %s %s chirc-0.1 ao mtov\r\n", host, nick, host);
    sendMessage(msgbuf, ourCli->ourSocket);
    handle_LUSERS(NULL, socket);
    handle_MOTD(NULL, socket);
  }

  return;
}
Example #14
0
void handle_NOTICE(char** params, int socket)
{
  char msgbuf[512];
  int destsocket;
  channel *chan;
  struct ClientData *srcUser;
  
  //get the destination and message from the command
  char *dest = params[1];
  char *msg = params[10];

  srcUser = (struct ClientData *)list_seek(&clientList, &socket);
  
  if(dest[0] == '#'){//channel

    chan = (channel *) findChannel(dest);
    if(chan == NULL){
      //sprintf(msgbuf, ":%s 401 %s %s :No such nick/channel\r\n", host, srcUser->nick, dest);
      //sendMessage(msgbuf, socket);
      return;
    }

    //check if the user is in the channel
    if(isUserInChannel(socket, chan) == -1){
      //sprintf(msgbuf, ":%s 404 %s %s :Cannot send to channel\r\n", host, srcUser->user, dest);
      //sendMessage(msgbuf, socket);
      return;
    }

    sprintf(msgbuf, ":%s!%s@hostname NOTICE %s :%s\r\n", srcUser->nick, srcUser->user, dest, msg);
    printf("message was: %s\n", msgbuf);
    messageAllUsers(msgbuf, chan, socket);

  } else {    //user
  
    //find the information of the destination
    struct ClientData * destUser = findUser(dest, &clientList);
    if(destUser == NULL){
      return;
    }
    destsocket = destUser->ourSocket;
    
    //find the nick of the source
    struct ClientData *srcUser = (struct ClientData *)list_seek(&clientList, &socket);
    
    //send the message
    sprintf(msgbuf, ":%s!%s@sentuser NOTICE %s :%s\r\n", srcUser->nick, srcUser->user, dest, msg);
    sendMessage(msgbuf, destsocket);
    return;

  }
}
UserData* UserController :: checkIn(std::string ID, std::string passwd)
{
    Logging log("UserController :: checkIn",true);
    UserData* toReturn = findUser(ID);
    if(toReturn)
    {
        if(toReturn->Password() == passwd)
            return toReturn;
        else
            throw PasswordNotCorrectException((std::string)"password wrong!");
    }
    else throw ItemNotFoundException((std::string)"user not exist!");
}
Example #16
0
Wt::Auth::IssuedToken OidcUserDatabase::idpTokenAdd(const std::string& value,
                                                    const Wt::WDateTime& expirationTime,
                                                    const std::string& purpose,
                                                    const std::string& scope,
                                                    const std::string& redirectUri,
                                                    const Wt::Auth::User& user,
                                                    const Wt::Auth::OAuthClient& authClient)
{
  WithUser findUser(*this, user);
  WithOAuthClient findOAuthClient(*this, authClient);
  IssuedToken *token = new IssuedToken(value, expirationTime, purpose, scope, redirectUri, user_->user(), authClient_);
  issuedToken_ = session_.add(token);
  return Wt::Auth::IssuedToken(boost::lexical_cast<std::string>(issuedToken_.id()), *this);
}
Example #17
0
static PSPAMResult_t handleOpenRequest(char *msgBuf)
{
    char user[USERNAME_LEN], rhost[HOSTNAME_LEN];
    pid_t pid, sid;
    struct passwd *spasswd;
    User_t *pamUser;
    PSPAMResult_t res = PSPAM_RES_DENY;
    char *ptr = msgBuf;

    /* ensure we use the same byteorder as the PAM module */
    bool byteOrder = setByteOrder(true);

    /* get ssh pid */
    getPid(&ptr, &pid);
    /* get ssh sid */
    getPid(&ptr, &sid);
    /* get pam username */
    getString(&ptr, user, sizeof(user));
    /* get pam rhost */
    getString(&ptr, rhost, sizeof(rhost));

    /* reset psserial's byteorder */
    setByteOrder(byteOrder);

    mdbg(PSPAM_LOG_DEBUG, "%s: got pam request user: '******' pid: %i sid: %i"
	 " rhost: '%s'\n", __func__, user, pid, sid, rhost);

    errno = 0;
    spasswd = getpwnam(user);
    if (!spasswd && errno) mwarn(errno, "%s: getpwnam(%s)", __func__, user);

    pamUser = findUser(user, NULL);

    /* Determine user's allowance */
    if (spasswd && isPSAdminUser(spasswd->pw_uid, spasswd->pw_gid)) {
	res = PSPAM_RES_ADMIN_USER;
    } else if (pamUser) {
	if (pamUser->state == PSPAM_STATE_PROLOGUE) {
	    res = PSPAM_RES_PROLOG;
	} else {
	    res = PSPAM_RES_BATCH;
	    addSession(user, rhost, pid, sid);
	}
    }

    mdbg(PSPAM_LOG_DEBUG, "%s: reply to user '%s' rhost '%s': %i\n", __func__,
	 user, rhost, res);

    return res;
}
Example #18
0
void find(char* input) {

    if (begins(input, "snack ")) {
		debug("exec find snack cmd");
		findSnack(input + 6);
    } else if (begins(input, "user ")) {
    	debug("exec find user cmd");
    	findUser(input + 5);
    } else {
		debug("no match found in find");
		debug("try snack");
		findSnack(input);
    }
}
Example #19
0
const int EvaSetting::getConnectType(const int id) // 0: udp, 1: tcp,  2: http proxy
{
	int index = findUser(id);
	int type = 0;
	if(index!=-1){
		Q_UINT8 flag = userList.at(index)->flag;
		if(flag & 0x10)
			type = 0;
		else if(flag & 0x08)
			type = 1;
		else if(flag & 0x04)
			type = 2;
	}
	return type;
}
Example #20
0
/*!
    \details An user as changed a nick
    \param s is the string from Irc server
*/
void IrcChannel::userNickChange(QString s)
{
    // :[email protected] NICK :dddtre
    QRegExp r (":([^!]+).*\\sNICK\\s:(.*)");
    if(r.exactMatch(s)) 
    {
        QStringList l = r.capturedTexts();
        QListWidgetItem *it = findUser(l.at(1));
        if(it)
        {
            it->setText( hasPrivilege(it->text()) + l.at(2));
            mTextEdit->appendHtml("<font color=\"#ff0000\">User " + l.at(1) + " is now know as " + l.at(2) + "</font>");
        }
    }
}
Example #21
0
bool ListUsers::DeleteUser(string l)
{
	User* victim = findUser(l);
	if (victim != NULL)
	{
		if (victim->next != NULL) victim->next->previous = victim->previous;
		if (victim->previous != NULL) victim->previous->next = victim->next;
		delete victim;
		return 1;
	}
	else
	{
		return 0;
	}
}
Example #22
0
/*!
    \details An user quit Irc server
    \param l is the string from Irc server
*/
void IrcChannel::userQuit(QString l)
{
    //:ThomasGHenry!n=tghenry@nat/ibm/x-e360141219a099ca QUIT :"Leaving."
    QRegExp r (":([^!]+).*\\sQUIT\\s:(.*)");
    if(r.exactMatch(l))
    {
        QStringList t = r.capturedTexts();
        QListWidgetItem *it = findUser(t.at(1));
        if( it )
        {
            mMemberList->removeItemWidget( it );
            delete it;
            mTextEdit->appendHtml("<font color=\"#0000ff\">* " + t.at(1) + " has quit " + name() + " " + t.at(2) + "</font>");
        }
    }
}
Example #23
0
bool ListUsers::AddUser(string l, string p, int a)
{
	if (findUser(l) == NULL) {
		User* tempLast = last;
		last = new User(l, p, a, tempLast);
		if (tempLast == NULL)
		{
			first = last;
		}
		else
		{
			last->previous = tempLast;
			tempLast->next = last;
		}
		return 1;
	}
	else return 0;
}
Example #24
0
/*!
    \details An user quit this channel
    \param l is the string from Irc server
*/
void IrcChannel::userPart(QString l)
{
    // :[email protected] PART #testmonkeystudio :quit message
    QRegExp r (":([^!]+).*\\sPART\\s([^ ]+)\\s:(.*)");
    if(r.exactMatch(l))
    {
        QStringList t = r.capturedTexts();
        if(t.at(2).toLower() == name())
        {
            QListWidgetItem *it = findUser(t.at(1));
            if( it )
            {   
                mMemberList->removeItemWidget( it ); 
                delete it;
                mTextEdit->appendHtml("<font color=\"#0000ff\">* " + t.at(1) + " has left " + name() + " " + t.at(3) + "</font>");
            }
        }
    }
}
Example #25
0
HintedUser ClientManager::findLegacyUser(const string& nick) const noexcept {
	if(nick.empty())
		return HintedUser();

	Lock l(cs);

	for(auto i: clients) {
		auto nmdc = dynamic_cast<NmdcHub*>(i);
		if(nmdc) {
			/** @todo run the search directly on non-UTF-8 nicks when we store them. */
			auto ou = nmdc->findUser(nmdc->toUtf8(nick));
			if(ou) {
				return HintedUser(*ou);
			}
		}
	}

	return HintedUser();
}
void serverMessage(std::string command, std::string option, std::string data, IClientSocket *socket)
{
	//	Server command: client attempts a connection
	if(command == "newClient"){
		std::string idcode = idstring(socket);
		
		if(findUser(data) == true){
			remoteMessage("/error,userFound",socket);
		}else{
			//	Inform the client connection is accepted on server
			remoteMessage("/accepted,"+idcode,socket);
			//	Inform all clients to show user as connected
			broadcastMessage("/userConnect,"+data+":"+idcode, socket);
			
			//	Now send a list of current users to the client you just accepted
			std::string token,userlist = getUserlist();

			for(size_t pos = userlist.find(";");pos != std::string::npos;pos = userlist.find(";")){
				token = userlist.substr(0,pos);
				userlist = userlist.substr(pos+1);
				
				size_t sep = token.find(",");
				std::string user = token.substr(0,sep);
				std::string id = token.substr(sep+1);
				
				remoteMessage("/userConnect,"+user+":"+id,socket);
			}
		}
	}
	
	if(command == "info")
	{
		if(data == "listening")		data = "Listening for clients";
		if(data == "serverStart")	data = "Server started";
		if(data == "serverStop")	data = "Server stopped, all clients disconnected";
		if(data == "newClient")		data = "incoming connection from client";
		
		
		insertMessage("info",data);
	}
}
Example #27
0
void IRCSession::processCommandQuit(shared_ptr<IRCCommandQuit> command)
{
	OS_ASSERT(command != nullptr);

	shared_ptr<IRCUser> user = findUser(command->getNick());
	if(user == nullptr)
	{
		OS_ASSERTFALSE();
		return;
	}

	{
		OS_LOCK(m_dataCS);	

		for(Rooms::const_iterator i = m_rooms.begin(); i != m_rooms.end(); ++i)
		{
			i->second->removeUser(user);
		}
	}

	updateAllRooms(false);
}
std::pair<std::string,std::string> UserController :: getDefaultUser()
{
    Logging log("UserController :: getDefaultUser",true);
    std::ifstream input(__defaultUserFile);
    std::string ID,passwd;
    int rem;
    if(input)
    {
        input >> ID >> rem;
        UserData* defaultUser = findUser(ID);
        if(defaultUser)
        {
            log << "INFO now default user " << defaultUser->Name() << std::endl;
            if(rem)
            {
                log << "INFO remember password." << std::endl;
                passwd = defaultUser->Password();
            }
        }
        else ID="";
    }
    return std::make_pair(ID,passwd);
}
Example #29
0
/*!
    \details Modify the current privilege for one user in this channel.
    \param s is the string from Irc server
*/
void IrcChannel::setUserPrivilege(QString s)
{
    // :[email protected] MODE #testmonkeystudio +o xiantia
    // * after sets mode: +o xiantia
    QRegExp r (":([^!]+).*\\sMODE\\s([^ ]+)\\s([^ ]+)\\s([^ ]+).*");
    if(r.exactMatch(s))
    {
        QStringList t = r.capturedTexts();
        if(t.at(2).toLower() == name())
        {
            QListWidgetItem *it = findUser(t.at(4));
            if(it)
            {
                mTextEdit->appendHtml("<font color=\"#00ff00\">* " + t.at(1) + " sets mode : " + t.at(3) + " " + t.at(4) + "</font>");
                QString n = userPrefix.value(t.at(3)); // get the corresponding tag og privilege
                QString u = it->text();
                if(hasPrivilege(u).isEmpty()) // user haven't privilege, add this 
                    it->setText( n + u);
                else 
                    it->setText( u.replace(0,1, n) ); // user have privilege, modify this
            }
        }
    }
}
Example #30
0
DataObject*
ObjectCache::find(Id object_id, bool cacheOnly)
{
    if (object_id == INVALID_ID)
	return NULL;

    if (_objects.find(object_id) != _objects.end())
	return _objects[object_id];

    if (cacheOnly)
	return NULL;

    DataObject object;
    if (!_db->lookup(object_id, object))
	return NULL;

    switch (object.dataType()) {
    case DataObject::ACCOUNT:		return findAccount(object_id);
    case DataObject::ADJUST_REASON:	return findAdjustReason(object_id);
    case DataObject::CARD_ADJUST:	return findCardAdjust(object_id);
    case DataObject::CHARGE:		return findCharge(object_id);
    case DataObject::CHEQUE:		return findCheque(object_id);
    case DataObject::CLAIM:		return findReceive(object_id);
    case DataObject::COMPANY:		return findCompany(object_id);
    case DataObject::COUNT:		return findCount(object_id);
    case DataObject::CUSTOMER:		return findCustomer(object_id);
    case DataObject::CUST_TYPE:		return findCustomerType(object_id);
    case DataObject::DEPT:		return findDept(object_id);
    case DataObject::DISCOUNT:		return findDiscount(object_id);
    case DataObject::EMPLOYEE:		return findEmployee(object_id);
    case DataObject::EXPENSE:		return findExpense(object_id);
    case DataObject::EXTRA:		return findExtra(object_id);
    case DataObject::GENERAL:		return findGeneral(object_id);
    case DataObject::GROUP:		return findGroup(object_id);
    case DataObject::INVOICE:		return findInvoice(object_id);
    case DataObject::ITEM:		return findItem(object_id);
    case DataObject::ITEM_ADJUST:	return findItemAdjust(object_id);
    case DataObject::ITEM_PRICE:	return findItemPrice(object_id);
    case DataObject::LABEL_BATCH:	return findLabelBatch(object_id);
    case DataObject::LOCATION:		return findLocation(object_id);
    case DataObject::NOSALE:		return findNosale(object_id);
    case DataObject::ORDER:		return findOrder(object_id);
    case DataObject::PO_TEMPLATE:	return findOrderTemplate(object_id);
    case DataObject::PAT_GROUP:		return findPatGroup(object_id);
    case DataObject::PAT_WS:		return findPatWorksheet(object_id);
    case DataObject::PAYOUT:		return findPayout(object_id);
    case DataObject::PERSONAL:		return findPersonal(object_id);
    case DataObject::PLU:		assert("Invalid data type: PLU");
    case DataObject::PRICE_BATCH:	return findPriceBatch(object_id);
    case DataObject::PROMO_BATCH:	return findPromoBatch(object_id);
    case DataObject::QUOTE:		return findQuote(object_id);
    case DataObject::RECEIPT:		return findReceipt(object_id);
    case DataObject::RECEIVE:		return findReceive(object_id);
    case DataObject::RECONCILE:		return findReconcile(object_id);
    case DataObject::RECURRING:		return findRecurring(object_id);
    case DataObject::REPORT:		assert("Invalid data type: REPORT");
    case DataObject::RETURN:		return findInvoice(object_id);
    case DataObject::SECURITY_TYPE:	return findSecurityType(object_id);
    case DataObject::SHIFT:		return findShift(object_id);
    case DataObject::SLIP:		return findSlip(object_id);
    case DataObject::STATION:		return findStation(object_id);
    case DataObject::STORE:		return findStore(object_id);
    case DataObject::SUBDEPT:		return findSubdept(object_id);
    case DataObject::TAX:		return findTax(object_id);
    case DataObject::TENDER:		return findTender(object_id);
    case DataObject::TEND_COUNT:	return findTenderCount(object_id);
    case DataObject::TEND_ADJUST:	return findTenderAdjust(object_id);
    case DataObject::TERM:		return findTerm(object_id);
    case DataObject::TODO:		return findTodo(object_id);
    case DataObject::USER:		return findUser(object_id);
    case DataObject::VENDOR:		return findVendor(object_id);
    case DataObject::WITHDRAW:		return findWithdraw(object_id);
    }

    qWarning("Unknown object type: " + object.dataTypeName());
    return NULL;
}