Пример #1
0
	def _send_file(self, file_path, filename):
		file_path = file_path + '/' + filename
		if not os.path.isfile(file_path):
			print "The file '%s' does not exist" % file_path
			return
		
		file_size = os.path.getsize(file_path) / 1024
		
		print 'Uploading file: %s (%d KB)' % (filename, file_size)
		
		md5_hash = get_file_md5_hash(file_path)
		signature = self.factory.rsa_key.sign(md5_hash, '')
		
		self.transport.write('PUT %s %s %s\n' % (filename, md5_hash, base64.b64encode(pickle.dumps(signature))))
		#self.setRawMode()
		for bytes in read_bytes_from_file(file_path):
			self.transport.write(bytes)
		
		self.transport.write('\r\n')  
		
		self.transport.loseConnection()
		
		#os.unlink(file_path) 
		
		# When the transfer is finished, we go back to the line mode 
		self.setLineMode()
Пример #2
0
	def sendFile(self,file) :
	
		self.transport.write('HASH %s %s\n' % (file, self.factory.files[file][2]))
	
		self.setRawMode()
		for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, file)):
			self.transport.write(bytes)
		self.transport.write('\r\n')	
		self.setLineMode()
Пример #3
0
    def lineReceived(self, data):
        self.files_path = self.factory.get_directory()
        print 'data received ' + data
        print data
        print self.factory.get_directory()
        if (data == "init"):
            self.connected = True
        else:
            files = json.loads(data.strip())
            if 'command' in files and files['command'] == 'put':
                if not os.path.exists(files['local_file_path']):
                    self.factory.command_out = False
                    self.factory.connection.transport.write('\r\n')
                    return
                self.setRawMode()
                for bytes in read_bytes_from_file(files['local_file_path']):
                    self.factory.connection.transport.write(bytes)

                self.factory.connection.transport.write('\r\n')

                # When the transfer is finished, we go back to the line mode
                self.setLineMode()
                return
            elif 'command' in files and files['command'] == 'done uploading':
                self.factory.command_out = False
            elif files['success'] == False:
                print 'Authentication failed with username: '******' and password: '******'directories'].sort()
                directories = []
                for file in files['remove']:
                    path = os.path.join(self.files_path, file)
                    if os.path.isfile(path):
                        os.unlink(path)
                    else:
                        directories.append(path)
                directories.sort(reverse=True)
                for dir in directories:
                    if os.path.isdir(dir):
                        shutil.rmtree(dir)

                for directory in files['directories']:
                    path = os.path.join(self.files_path, directory)
                    if not os.path.exists(path):
                        os.mkdir(path)
                    self.ignore.append(self.clean_file_string(directory))
                # because files need the directories to exist
                # TODO THIS NEEDS TO CHANGE
                for file in files['files']:
                    path = os.path.join(self.files_path, file)
                    q.insert(0, {'command': 'get_file', 'rel_path': file})
                self.factory.command_out = False
            elif files['success'] == True:
                self.factory.command_out = False
Пример #4
0
    def _sendCommand(self, line):
        """ Sends a command to the server. """

        data = clean_and_split_input(line)
        if len(data) == 0 or data == '':
            return

        command = data[0].lower()
        if not command in COMMANDS:
            self._display_message('Invalid command')
            return

        if command == 'list' or command == 'help' or command == 'quit':
            self.connection.transport.write('%s\n' % (command))
        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return

            self.connection.transport.write('%s %s\n' % (command, filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message(
                    'Missing local file path or remote file name')
                return

            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024

            print 'Uploading file: %s (%d KB)' % (filename, file_size)

            self.connection.transport.write(
                'PUT %s %s\n' % (filename, get_file_md5_hash(file_path)))
            self.setRawMode()

            for bytes in read_bytes_from_file(file_path):
                self.connection.transport.write(bytes)

            self.connection.transport.write('\r\n')

            # When the transfer is finished, we go back to the line mode
            self.setLineMode()
        else:
            self.connection.transport.write('%s %s\n' % (command, data[1]))

        self.factory.deferred.addCallback(self._display_response)
    def _sendCommand(self, line):
        """ Sends a command to the server. """
        
        data = clean_and_split_input(line) 
        if len(data) == 0 or data == '':
            return 

        command = data[0].lower()
        if not command in COMMANDS:
            self._display_message('Invalid command')
            return
        
        if command == 'list' or command == 'help' or command == 'quit':
            self.connection.transport.write('%s\n' % (command))
        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return
            
            self.connection.transport.write('%s %s\n' % (command, filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message('Missing local file path or remote file name')
                return
            
            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024
            
            print 'Uploading file: %s (%d KB)' % (filename, file_size)
            
            self.connection.transport.write('PUT %s %s\n' % (filename, get_file_md5_hash(file_path)))
            self.setRawMode()
            
            for bytes in read_bytes_from_file(file_path):
                self.connection.transport.write(bytes)
            
            self.connection.transport.write('\r\n')   
            
            # When the transfer is finished, we go back to the line mode 
            self.setLineMode()
        else:
            self.connection.transport.write('%s %s\n' % (command, data[1]))

        self.factory.deferred.addCallback(self._display_response)
Пример #6
0
    def dataReceived(self, data):
        "As soon as any data is received, write it back."
##        data = self._cleanAndSplitInput(data)
##        if data is None:
##            return
        
        if data is None or len(data) == 0 or data == '':
	    return
        data = data.strip()
##        if data=='.':
##            print '.'
##            return
        
##        print data
        if data.endswith('auth'):
            dt = data.split('\n')
            dt = dt[0].split(' ')
            print '%s %s %s %s %s' % (dt[0],dt[1],dt[2],dt[3],dt[4])
            print "sending authentification..."
            self.transport.write('auth %s %s %s %d\n' % (self.factory.user,self.factory.psw,self.factory.ipaddr,self.factory.staid))
        elif data.endswith('file'):
            try:
                file_path = self.factory.filename
                filename = self.factory.filename
            except IndexError:
                print 'Missing local file path or remote file name'
                return
            
            if not os.path.isfile(file_path):
                print 'This file does not exist'
                return

            file_size = os.path.getsize(file_path) / 1024
            
            print 'Uploading file: %s (%d KB)' % (filename, file_size)
            
            self.transport.write('PUT %s %s\n' % (os.path.basename(filename), get_file_md5_hash(file_path)))
            self.setRawMode()
            
            for bytes in read_bytes_from_file(file_path):
                self.transport.write(bytes)
            
            self.transport.write('\r\n')   
            
            # When the transfer is finished, we go back to the line mode 
            self.setLineMode()
        elif data.endswith('put-ok'):
            print "successfully transfered..."
            self.isTransferOK = True
        elif data.endswith('put-fail'):
            print "File transfer is fail..."
Пример #7
0
    def __upload_file(self, line):
        """ Download a file from the server. """
        data = clean_and_split_input(line)
        if len(data) == 0 or data == '' or self.transport == None:
            return False
        command = data[0].lower()
        if command == 'upload':
            try:
                file_path = data[1]
                filename = data[2]
                cmdid = data[3]
                result = data[4]
            except IndexError:
                self._display_message(
                    'Missing local file path or remote file name')
                return False

            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return False

            file_size = os.path.getsize(file_path) / 1024
            self.prv_logger.trace('Uploading file: %s (%d KB)' %
                                  (filename, file_size))
            self.transport.write(
                'upload %s %s %s %s\n' %
                (filename, get_file_md5_hash(self.prv_logger,
                                             file_path), cmdid, result))
            self.setRawMode()

            for bytes in read_bytes_from_file(file_path):
                self.transport.write(bytes)

            self.transport.write('\r\r\r\r\n')

            # When the transfer is finished, we go back to the line mode
            self.setLineMode()
            return True
        else:
            self.prv_logger.error("invalid cmd:%s" % command)
            return False
Пример #8
0
    def lineReceived(self, line):
        global clients
        display_message('Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line))
        logMessage = 'Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line)
        self.log(logMessage)

        data = self._cleanAndSplitInput(line)
        if len(data) == 0 or data == '':
            return

        user = data.pop()
        print "in lineReceived: ", data
        command = data[0].lower()
        if not command in COMMANDS:
            self.transport.write('Invalid command\n')
            self.transport.write('ENDMSG\n')
            return

        '''TLAST
        if command != 'login' and command != 'quit' and user not in clients:
            self.transport.write('You must be logged in\n')
            self.transport.write('ENDMSG\n')
            return
        '''
  
        if command == 'list':
            self._send_list_of_files()

        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self.transport.write('Missing filename\n')
                self.transport.write('ENDMSG\n')
                return

            if not self.factory.files:
                self.factory.files = self._get_file_list()

            if not filename in self.factory.files:
                self.transport.write('File with filename %s does not exist\n' % (filename))
                self.transport.write('ENDMSG\n')
                return

            display_message('Sending file: %s (%d KB)' % (filename, self.factory.files[filename][1] / 1024))

            self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))
            self.setRawMode()

            for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):
                self.transport.write(bytes)

            self.transport.write('\r\n')
            self.setLineMode()
        elif command == 'put':

            try:
                filename = data[1]
                file_hash = data[2]
                #replace the '|' back with ' '
                filename = filename.replace('|', ' ')
                file_hash = file_hash.replace('|', ' ')

            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            self.file_data = (filename, file_hash)

            # Switch to the raw mode (for receiving binary data)
            print 'Receiving file: %s' % (filename)
            self.setRawMode()
        ##################################################################



        elif command == 'putdir':

            try:
                filename = data[1]
                #replace the '|' back with ' '
                filename = filename.replace('|', ' ')

            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            os.mkdir(filename)

            # Switch to the raw mode (for receiving binary data)
            print 'Creating directory: %s' % (filename)

        elif command == 'delete':
            print "in delete"
            try:
                filename = data[1]
                #replace the '|' back with ' '
                filename = filename.replace('|', ' ')

            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            #delete the file
            if os.path.isdir(filename):
                try:
                    shutil.rmtree(filename)
                except OSError, e:
                    print e
                except shutil.Error, e:
                    print e
Пример #9
0
    def _sendCommand(self, line):
        """ Sends a command to the server. """
        
       
        data = clean_and_split_input(line) 
        if len(data) == 0 or data == '':
            return 

        command = data[0].lower()
        
        
		
        if not ((command in COMMANDS ) or(command in RESPONSE ) ):
            self._display_message('Invalid command')
            return
        
        if command == 'list' or command == 'help' or command == "people" or command == 'quit':
            
            self.connection.transport.write('%s\n' % (command))
        
        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return
            
            self.connection.transport.write('%s %s\n' % (command, filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message('Missing local file path or remote file name')
                return
            
            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024
            
            print 'Uploading file: %s (%d KB)' % (filename, file_size)
            
            self.connection.transport.write('PUT %s %s\n' % (filename, get_file_md5_hash(file_path)))
            self.setRawMode()
            
            for bytes in read_bytes_from_file(file_path):
                self.connection.transport.write(bytes)
            
            self.connection.transport.write('\r\n')   
            
            # When the transfer is finished, we go back to the line mode 
            self.setLineMode()
        
		
        elif command == 'sync' :
            files = []
            files = [ f for f in os.listdir(self.files_path) if os.path.isfile(os.path.join(self.files_path,f)) ]
            file_list = '#'.join(files)
            self.connection.transport.write('sync %s\n' % (file_list))
        
        elif command == 'nick' :
            try:
                subcommand = data[1]
                nick = data[2]
                passw = data[3]
            except IndexError:
                self._display_message('Missing subcommand {and\or} nick {and\or} password')
                return
				
            self.connection.transport.write('nick %s %s %s\n' % (subcommand, nick,passw))
			
        elif command == 'recv' :
            self.connection.transport.write('%s %s\n' % (command , data[1]))
        
        else:
            self.connection.transport.write('%s %s\n' % (command, data[1]))

        self.factory.deferred.addCallback(self._display_response)
        self.factory.deferred1.addCallback(self._display_response)
Пример #10
0
	def lineReceived(self, line):

		display_message('Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line))

		

		data = self._cleanAndSplitInput(line)

		if len(data) == 0 or data == '':

			return 

		

		command = data[0].lower()

		if not command in COMMANDS:

			self.transport.write('Invalid command\n')

			self.transport.write('ENDMSG\n')

			return

		if command == 'list':

			self._send_list_of_files()

		elif command == 'get':

			try:

				filename = data[1]

			except IndexError:

				self.transport.write('Missing filename\n')

				self.transport.write('ENDMSG\n')

				return

			

			if not self.factory.files:

				self.factory.files = self._get_file_list()

				

			if not filename in self.factory.files:

				self.transport.write('File with filename %s does not exist\n' % (filename))

				self.transport.write('ENDMSG\n')

				return

			

			display_message('Sending file: %s (%d KB)' % (filename, self.factory.files[filename][1] / 1024))

			

			self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))

			self.setRawMode()

			

			for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):

				self.transport.write(bytes)

			

			self.transport.write('\r\n')	

			self.setLineMode()

		elif command == 'put':

			try:

				filename = data[1]

				file_hash = data[2]

			except IndexError:

				self.transport.write('Missing filename or file MD5 hash\n')

				self.transport.write('ENDMSG\n')

				return



			self.file_data = (filename, file_hash)

			

			# Switch to the raw mode (for receiving binary data)

			print 'Receiving file: %s' % (filename)

			self.setRawMode()

		elif command == 'help':

			self.transport.write('Available commands:\n\n')

			

			for key, value in COMMANDS.iteritems():

				self.transport.write('%s - %s\n' % (value[0], value[1]))

			

			self.transport.write('ENDMSG\n')				

		elif command == 'quit':

			self.transport.loseConnection()
Пример #11
0
    def sendNotification(self):
        global fileActivity, path, dest,username, synchronized, setSynchronize, client_username
        fileList = []
        if setSynchronize and (not synchronized):
            print("Start synchronization")
            #clear the previous file activity detected by watchdog
            fileActivity = []
            #deleting the old oneDir and creating new oneDir
            print("Deleting previously stored oneDir on server")

            src = dest + username + '/OneDir'

            #have to replace ' ' with '|' to prevent ' ' error
            src_new = src.replace(' ','|')

            (self.server)[0].transport.write('DELETE %s %s %s\n' % (src_new, 0, client_username))

            #for directory
            (self.server)[0].transport.write('PUTDIR %s %s %s\n' % (src_new, 0, client_username))


            # When the transfer is finished, we go back to the line mode
            (self.server)[0].setLineMode()


            #upload onedir
            for root, subFolders, files in os.walk(path):
                for f in subFolders:
                    fileList.append(os.path.join(root,f))
                for file in files:
                    fileList.append(os.path.join(root,file))
            print fileList

            #upload the files
            for f in fileList:
                fileActivity.append("Upload" + "|" + (trimPath(f))[1])

            #start synchronize
            synchronized = True

        if (not setSynchronize) and synchronized:
            print("Stop synchronization")
            synchronized = False
        if synchronized:
            if(len(fileActivity) != 0):
                # (self.server)[0].transport.write(fileActivity[0]+"\n")

                #manage fileActivity
                f1 = fileActivity[0].strip().split("|")
                if(f1[0] == "Delete"):
                    print("Deleting " + f1[1])

                    src = dest + username + '/OneDir/' + f1[1]

                    #have to replace ' ' with '|' to prevent ' ' error
                    src_new = src.replace(' ','|')

                    (self.server)[0].transport.write('DELETE %s %s %s\n' % (src_new, 0, client_username))

                    # When the transfer is finished, we go back to the line mode
                    (self.server)[0].setLineMode()

                elif(f1[0] == "Upload"):
                    #uploading
                    print("Uploading " + path + f1[1])
                    file_path = path + f1[1]
                    filename = dest + username + '/OneDir/' +f1[1]
                    isDir = 0
                    ############# testing #############
                    print("current filename is " + filename)
                    print("file to append is : " + f1[1])
                    if os.path.isdir(file_path):
                        isDir = 1
                    elif os.path.isfile(file_path):
                        isDir = 0
                    else:
                        print "%s does not exist" % file_path
                        return

                    #calculate file size
                    file_size = os.path.getsize(file_path) / 1024

                    #have to replace ' ' with '|' to prevent ' ' error
                    filename_new = filename.replace(' ','|')

                    if( not isDir):
                        (self.server)[0].transport.write('PUT %s %s %s\n' % (filename_new, get_file_md5_hash(file_path), client_username))
                        (self.server)[0].setRawMode()

                        for bytes in read_bytes_from_file(file_path):
                            (self.server)[0].transport.write(bytes)


                        (self.server)[0].transport.write('\r\n') #the end of raw input
                    else:
                        #for directory
                        (self.server)[0].transport.write('PUTDIR %s %s %s\n' % (filename_new, 0, client_username))

                    # When the transfer is finished, we go back to the line mode
                    (self.server)[0].setLineMode()

                #remove activity from the queue
                del fileActivity[0]
Пример #12
0
    def lineReceived(self, line):
	global clients
        display_message('Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line))

        data = self._cleanAndSplitInput(line)
        if len(data) == 0 or data == '':
            return
	
	user = data.pop()

        command = data[0].lower()
        if not command in COMMANDS:
            self.transport.write('Invalid command\n')
            self.transport.write('ENDMSG\n')
            return

	if command != 'login' and command != 'quit' and user not in clients:
		self.transport.write('You must be logged in\n')
		self.transport.write('ENDMSG\n')
		return

        if command == 'list':
            self._send_list_of_files()

        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self.transport.write('Missing filename\n')
                self.transport.write('ENDMSG\n')
                return

            if not self.factory.files:
                self.factory.files = self._get_file_list()

            if not filename in self.factory.files:
                self.transport.write('File with filename %s does not exist\n' % (filename))
                self.transport.write('ENDMSG\n')
                return

            display_message('Sending file: %s (%d KB)' % (filename, self.factory.files[filename][1] / 1024))

            self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))
            self.setRawMode()

            for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):
                self.transport.write(bytes)

            self.transport.write('\r\n')
            self.setLineMode()
        elif command == 'put':

            try:
                filename = data[1]
                file_hash = data[2]
                #replace the '|' back with ' '
                filename = filename.replace('|',' ')
                file_hash = file_hash.replace('|',' ')

            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            self.file_data = (filename, file_hash)

            # Switch to the raw mode (for receiving binary data)
            print 'Receiving file: %s' % (filename)
            self.setRawMode()
        elif command == 'help':
            self.transport.write('Available commands:\n\n')

            for key, value in COMMANDS.iteritems():
                self.transport.write('%s - %s\n' % (value[0], value[1]))

            self.transport.write('ENDMSG\n')

	elif command == 'registry':
		registry = login_demo.retrieve_login_info()
		self.transport.write('username\t\tpassword\n')
		for key, value in registry.iteritems():
			self.transport.write('%s\t\t\t%s\n' % (key, value[0]))
		
		self.transport.write('ENDMSG\n')			

        elif command == 'register':
            username = data[1]
            password = data[2]
            answer = login_demo.register_user(username, password)
            print answer
            self.transport.write('%s\n' % answer)
            self.transport.write('ENDMSG\n')

        elif command == 'login':
	    global clients
	    if user in clients:
		self.transport.write('%s is already logged in.\n' % user)
                self.transport.write('ENDMSG\n')
	    else: 
                username = data[1]
                password = data[2]
                answer = login_demo.login(username, password)
       	        if answer == "Logged In":
         	    display_message(username)
		    clients.append(username)
                print answer
	    	print clients
                self.transport.write('%s %s\n' % (answer, username))
                self.transport.write('ENDMSG\n')

	elif command == 'logout':
	    global clients
	    clients.remove(user)
	    self.transport.write('%s logged out of system\n' % user)				
	    self.transport.write('ENDMSG\n')				
			
        elif command == 'quit':
            self.transport.loseConnection()
Пример #13
0
                filename = dest + f1[1]

                if not os.path.isfile(file_path):
                    print('ERROR: path does not exist')
                    return

                #calculate file size
                file_size = os.path.getsize(file_path) / 1024

                #have to replace ' ' with '|' to prevent ' ' error
                filename_new = filename.replace(' ','|')

                (self.server)[0].transport.write('PUT %s %s\n' % (filename_new, get_file_md5_hash(file_path)))
                (self.server)[0].setRawMode()

                for bytes in read_bytes_from_file(file_path):
                    (self.server)[0].transport.write(bytes)


                (self.server)[0].transport.write('\r\n')

                # When the transfer is finished, we go back to the line mode
                (self.server)[0].setLineMode()

            del fileActivity[0]

    def serverConnectionMade(self, server):
        self.server.append(server)

    def serverConnectionLost(self, server):
        self.server.remove(server)
Пример #14
0
    def _sendCommand(self, line):
        """ Sends a command to the server. """

        data = clean_and_split_input(line)
        if len(data) == 0 or data == '':
            return

        command = data[0].lower()

        if not ((command in COMMANDS) or (command in RESPONSE)):
            self._display_message('Invalid command')
            return

        if command == 'list' or command == 'help' or command == "people" or command == 'quit':

            self.sender.transport.write('%s\n' % (command))

        if command == 'finger':
            try:
                nickname = data[1]
            except IndexError:
                self._display_message('Missing nickname')
                return

            self.sender.transport.write('%s %s\n' % (command, nickname))

        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return

            self.sender.transport.write('%s %s\n' % (command, filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message(
                    'Missing local file path or remote file name')
                return

            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024

            print('Uploading file: %s (%d KB)' % (filename, file_size))

            self.sender.transport.write(
                'PUT %s %s\n' % (filename, get_file_md5_hash(file_path)))
            self.sender.setRawMode()

            for bytes in read_bytes_from_file(file_path):
                self.sender.transport.write(bytes)

            self.sender.transport.write('\r\n')

            # When the transfer is finished, we go back to the line mode
            self.sender.setLineMode()

        elif command == 'sync':
            files = []
            files = [
                f for f in os.listdir(self.sender.factory.files_path)
                if os.path.isfile(
                    os.path.join(self.sender.factory.files_path, f))
            ]
            file_list = '#'.join(files)
            self.sender.transport.write('sync %s\n' % (file_list))

        elif command == 'search':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return

            if os.path.exists(
                    os.path.join(self.sender.factory.files_path, filename)):
                self._display_message(
                    'File already exists on your local folder')
                return

            self.sender.transport.write('search %s\n' % (filename))

        elif command == 'nick':
            try:
                subcommand = data[1]
                nick = data[2]
                passw = data[3]
            except IndexError:
                self._display_message(
                    'Missing subcommand {and\or} nick {and\or} password')
                return

            self.sender.transport.write('nick %s %s %s\n' %
                                        (subcommand, nick, passw))

        elif command == 'recv':
            self.sender.transport.write('%s %s\n' % (command, data[1]))
Пример #15
0
	def lineReceived(self, line):
		
		data = self._cleanAndSplitInput(line)
		if len(data) == 0 or data == '':
			return 
		
		command = data[0].lower()
		display_message('Received the following command from the client %s ,[%s]: %s' % (self.nick,self.ip, command))
		log_message('Received the following command from the client %s ,[%s]: %s' % (self.nick,self.ip, command),self.factory.log)
		
		if not ((command in COMMANDS) or (command in RESPONSE)) :
			self.transport.write('Invalid command\n')
			self.transport.write('ENDMSG\n')
			return
		
		if command == 'list':
			self._send_list_of_files()
			
		if command == 'finger':
			if not self.authenticated :
				self.transport.write('Please authenitcate using "nick identify" before using file transfer \n')
				self.transport.write('ENDMSG\n')
				return 
				
			try:
				nickname = data[1]
			except IndexError:
				self.transport.write('Missing nickname\n')
				self.transport.write('ENDMSG\n')
				return
				
			for user in self.factory.onlineClients :
				if user.nick == nickname :
					self.transport.write('-- INFORMATION --  \n')
					self.transport.write('Nickname : %s \n'%(nickname))
					self.transport.write('IP : %s \n'%(user.ip))
					self.transport.write('PORT : %d \n'%(user.port))
					self.transport.write('OS : %s \n'%(user.osType.split('#')[0]))
					self.transport.write('Platform : %s \n'%(user.osType.split('#')[1]))
					self.transport.write('ENDMSG\n')
					
					return 
				
			self.transport.write('Nickname not found\n')
			self.transport.write('ENDMSG\n')	
			
		
		elif command =='platform':
			print data[1]
			self.osType = data[1]
		
		elif command == 'get':
			if not self.authenticated :
				self.transport.write('Please authenitcate using "nick identify" before using file transfer \n')
				self.transport.write('ENDMSG\n')
				return 
				
			try:
				filename = data[1]
			except IndexError:
				self.transport.write('Missing filename\n')
				self.transport.write('ENDMSG\n')
				return
			
			if not self.factory.files:
				self.factory.files = self._get_file_list()
				
			if not filename in self.factory.files:
				self.transport.write('File with filename %s does not exist\n' % (filename))
				self.transport.write('ENDMSG\n')
				return
			
			display_message('%s : Sending file: %s (%d KB)' % (self.nick,filename, self.factory.files[filename][1] / 1024))
			log_message('%s : Sending file: %s (%d KB)' % (self.nick,filename, self.factory.files[filename][1] / 1024),self.factory.log)
			
			self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))
			self.setRawMode()
			
			for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):
				self.transport.write(bytes)
			
			self.transport.write('\r\n')	
			self.setLineMode()
		
		elif command == 'put':
			if not self.authenticated :
				self.transport.write('Please authenitcate using "nick identify" before using file transfer \n')
				self.transport.write('ENDMSG\n')
				return
			
			try:
				filename = data[1]
				file_hash = data[2]
			except IndexError:
				self.transport.write('Missing filename or file MD5 hash\n')
				self.transport.write('ENDMSG\n')
				return

			self.file_data = (filename, file_hash)
			
			# Switch to the raw mode (for receiving binary data)
			print 'Receiving file: %s' % (filename)
			self.setRawMode()
		
		elif command == "people" :
			self._send_online_clients()
		
		elif command == "sync" :
			
			self.factory.files = self._get_file_list()
			self.sync = 1 			
			
				
			if not self.authenticated :
				self.transport.write('Please authenitcate using "nick identify" before using sync \n')
				self.transport.write('ENDMSG\n')
				return
			
			now = datetime.datetime.now()
			
			self.transport.write('Initiating sync \n')
			self.transport.write('ENDMSG\n')
			display_message('initiating sync with %s(%s) : %s ' % (self.nick,self.ip,now.strftime("%Y-%m-%d %H:%M")))
			log_message('initiating sync with %s(%s) : %s ' % (self.nick,self.ip,now.strftime("%Y-%m-%d %H:%M")),self.factory.log)
			
			#self.transport.write('Initiating sync\n')
			#self.transport.write('ENDMSG\n')
			try:
				cfiles = data[1].split('#')
				
			except IndexError:
				cfiles = []
				
			sfiles = [ f for f in os.listdir(self.factory.files_path) if os.path.isfile(os.path.join(self.factory.files_path,f)) ]
			file_outbox = []
			
			for file in sfiles :
				if file not in cfiles :
					self.file_outbox.append(file)
			
			no_of_files = len(self.file_outbox)
			self.transport.write('Sending %d files\n'%(no_of_files))
			self.transport.write('ENDMSG\n')
				
			if no_of_files == 0 :
				self.sync = 0
				self.transport.write('Folders are in sync \n')
				self.transport.write('ENDMSG\n')
				return
			
			file = self.file_outbox.pop()
			#self.sendFile(file)
			
			display_message('%s : Sending file: %s (%d KB)' % (self.nick,file, self.factory.files[file][1] / 1024))
			log_message('%s : Sending file: %s (%d KB)' % (self.nick,file, self.factory.files[file][1] / 1024),self.factory.log)
			
			self.transport.write('HASH %s %s\n' % (file, self.factory.files[file][2]))
			self.setRawMode()
			
			for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, file)):
				self.transport.write(bytes)
			
			self.transport.write('\r\n')	
			self.setLineMode()
				
				
			'''
			@defer.inlineCallbacks
			def _sync():
				
				for file in file_outbox :
					display_message('%s : Sending file: %s (%d KB)' % (self.nick,file, self.factory.files[file][1] / 1024))
					log_message('%s : Sending file: %s (%d KB)' % (self.nick,file, self.factory.files[file][1] / 1024),self.factory.log)
					yield sendFile(file)
						
		    _sync()	
			'''
				
				#self.transport.write('ENDMSG\n')
				
			
					
		
		elif command == 'nick':
			subcommand = data[1]
			if not (subcommand and data[2] and data[3]) :
				self.transport.write('Missing nickname and/or password\n')
				self.transport.write('ENDMSG\n')
			else :
				if data[1] == "reg" :
					self._register(data[2],data[3])
					
				elif data[1] == "identify" :
					self._identify(data[2],data[3])
					
				else :
					self.transport.write('unknown subcommand %s to nick\n' % (data[1]))
					self.transport.write('ENDMSG\n')
						 
			
		
		
		elif command == 'recv' :
			now = datetime.datetime.now()
			display_message('%s : File recieved - %s' % (self.nick,data[1]))
			log_message('%s : File recieved - %s' % (self.nick,data[1]),self.factory.log)
			
			if self.sync == 1 :
				no_of_files = len(self.file_outbox)
				
				if no_of_files != 0 :
					file = self.file_outbox.pop()
					
					
					
					self.transport.write('HASH %s %s\n' % (file, self.factory.files[file][2]))
					self.setRawMode()
			
					for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, file)):
						self.transport.write(bytes)
			
					self.transport.write('\r\n')	
					self.setLineMode()
					
					
				
					
					#self.sendFile(file)
					
					
				else :
					display_message('terminating sync with %s(%s) : %s ' % (self.nick,self.ip,now.strftime("%Y-%m-%d %H:%M")))
					log_message(' sync with %s(%s) : %s ' % (self.nick,self.ip,now.strftime("%Y-%m-%d %H:%M")),self.factory.log)
					#self.transport.write('Terminating sync\n')
					self.setLineMode()
					self.transport.write('Sync complete\n')
					self.transport.write('ENDMSG\n')
					#self.transport.write('ENDMSG\n')
					self.sync = 0
					
				
		
		elif command == 'search':
			
			self.factory.search_request = 1
			self.factory.responses = 0 
			self.factory.requester = self
			for user in self.factory.onlineClients :
				if user.nick != self.nick :
					user.transport.write('SEARCH-REQUEST %s\n'%(data[1]))
				else :
					user.transport.write('ENDMSG\n')
					
                    
		elif command == 'sresponse':
			
			
			if self.factory.search_request == 1 :
				self.factory.responses+=1
				found = data[1]
				print data
				if found == 'true' :
					tupple = (self.nick,self.ip)
					self.factory.search_dump.append(tupple)
				if self.factory.responses >= len(self.factory.onlineClients) - 1:
					self.factory.requester.setLineMode()
					
					if len(self.factory.search_dump) == 0 :
						self.factory.requester.transport.write('File not found \n')
						self.factory.requester.transport.write('ENDMSG\n')
					else :
						self.factory.requester.transport.write('File found in following clients \n')
						for user in self.factory.search_dump : 
							self.factory.requester.transport.write('%s - %s\n'%(user[0],user[1]))
						self.factory.requester.transport.write('ENDMSG\n')
                            
					self.factory.search_request = 0
					self.factory.requester = None
                        
                
		
		
		elif command == 'help':
			self.transport.write('Available commands:\n\n')
			
			for key, value in COMMANDS.iteritems():
				self.transport.write('%s - %s\n' % (value[0], value[1]))
			
			self.transport.write('ENDMSG\n')				
		elif command == 'quit':
			self.transport.loseConnection()
Пример #16
0
    def _sendCommand(self, line):
        """ Sends a command to the server. """
        
        data = clean_and_split_input(line) 
        if len(data) == 0 or data == '':
            return 

        command = data[0].lower()
        if not command in COMMANDS:
            self._display_message('Invalid command')
            return
        
        if command == 'list' or command == 'help' or command == 'quit':
            self.connection.transport.write('%s\n' % (command))

	elif command == 'register':
	    try:
		username = data[1]
		password = data[2]
	    except IndexError:
                self._display_message('Missing username or password')
		return
            self.connection.transport.write('%s %s %s\n' % (command, username, password))

	elif command == 'login':
	    try:
		username = data[1]
		password = data[2]
	    except IndexError:
                self._display_message('Missing username or password')
		return
            self.connection.transport.write('%s %s %s\n' % (command, username, password))

        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return
            
            self.connection.transport.write('%s %s\n' % (command, filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message('Missing local file path or remote file name')
                return
            
            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024
            
            print 'Uploading file: %s (%d KB)' % (filename, file_size)
            
            self.connection.transport.write('PUT %s %s\n' % (filename, get_file_md5_hash(file_path)))
            self.setRawMode()
            
            for bytes in read_bytes_from_file(file_path):
                self.connection.transport.write(bytes)
            
            self.connection.transport.write('\r\n')   
            
            # When the transfer is finished, we go back to the line mode 
            self.setLineMode()
        elif command == 'rename':
            """renames file or directory src to dst and returns True if successful"""
            src = '';
            dst = '';
            input = clean_and_split_input(line)
            if len(input) == 3:
                src = input[1];
                dst = input[2];
            if os.path.isfile(src) or os.path.isdir(src):
                try:
                    os.renames(src,dst)
                    return True
		except OSError, e:
                    print e
                    return False
            else: 
		print "%s does not exist" % src
		return False
Пример #17
0
    def lineReceived(self, line):
        display_message(
            self.prv_logger,
            'Received the following line from the client [%s]: %s' %
            (self.transport.getPeer().host, line))

        data = self._cleanAndSplitInput(line)
        if len(data) == 0 or data == '':
            return

        command = data[0].lower()
        if not command in COMMANDS:
            self.transport.write('Invalid command:%s\n' % command)
            self.transport.write('ENDMSG\n')
            return
        if command == 'list':
            self._send_list_of_files()
        elif command == 'get':
            try:
                src_filename = data[1]
                dst_filename = data[2]
            except IndexError:
                self.transport.write('Missing filename\n')
                self.transport.write('ENDMSG\n')
                return
            abs_file_path = os.path.join(self.factory.files_path, src_filename)
            if not os.path.isfile(abs_file_path):
                self.transport.write('File with filename %s does not exist\n' %
                                     (src_filename))
                self.transport.write('ENDMSG\n')
                return
            file_size = os.path.getsize(abs_file_path)
            md5_hash = get_file_md5_hash(abs_file_path)

            display_message(
                self.prv_logger, 'Sending file to (%s:%s): %s (%d KB)' %
                (str(self.transport.getPeer().host),
                 str(self.transport.getPeer().port), src_filename,
                 file_size / 1024))

            self.transport.write('HASH %s %s\n' % (dst_filename, md5_hash))
            self.setRawMode()

            for bytes in read_bytes_from_file(abs_file_path):
                self.transport.write(bytes)

            self.transport.write('\r\r\r\r\n')
            self.setLineMode()
        elif command == 'put' or command == 'upload':
            try:
                filename = data[1]
                file_hash = data[2]
            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return
            if command == 'upload':
                try:
                    id = data[3]
                    result = data[4]
                except IndexError:
                    self.transport.write('Missing id or result when upload\n')
                    self.transport.write('ENDMSG\n')
                    return
                timeStamp = time.strftime("%Y-%m-%d %H:%M:%S",
                                          time.localtime())
                if not update_special_cmd(self.mysql_hdlr, id, {
                        'status': 'finished',
                        'end_time': timeStamp,
                        'result': result
                }):
                    self.prv_logger.error(
                        "update mysql failed; status: running->finished")
                self.file_data["%s:%s" %
                               (str(self.transport.getPeer().host),
                                str(self.transport.getPeer().port))] = {
                                    'filename': filename,
                                    'file_hash': file_hash,
                                    'id': id
                                }
            else:
                self.file_data["%s:%s" %
                               (str(self.transport.getPeer().host),
                                str(self.transport.getPeer().port))] = {
                                    'filename': filename,
                                    'file_hash': file_hash
                                }

            # Switch to the raw mode (for receiving binary data)
            print 'Receiving file: %s' % (filename)
            self.setRawMode()
        elif command == 'case_finished':
            id = data[1]
            result = data[2]
            timeStamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            self.prv_logger.trace("update mysql, case id:%s, result:%s" %
                                  (id, result))
            if len(data) > 3:
                if not update_special_cmd(
                        self.mysql_hdlr, id, {
                            'status': 'finished',
                            'end_time': timeStamp,
                            'result': result,
                            'reserved': ' '.join(data[3:])
                        }):
                    self.prv_logger.error(
                        "update mysql failed; status: running->finished")
            elif not update_special_cmd(self.mysql_hdlr, id, {
                    'status': 'finished',
                    'end_time': timeStamp,
                    'result': result
            }):
                self.prv_logger.error(
                    "update mysql failed; status: running->finished")
            self.transport.write('ENDMSG\n')
        elif command == 'help':
            self.transport.write('Available commands:\n\n')

            for key, value in COMMANDS.iteritems():
                self.transport.write('%s - %s\n' % (value[0], value[1]))

            self.transport.write('ENDMSG\n')
        elif command == 'hb':
            try:
                owner = data[1]
                hostname = data[2].lower()
                macaddr = data[3].lower()
                duttype = data[4]
                dutip = data[5]
                swversion = data[6]
                status = data[7]
                taskid = data[8]
                timeStamp = time.strftime("%Y-%m-%d %H:%M:%S",
                                          time.localtime())
                update_connection_cmd(
                    self.mysql_hdlr, {
                        'end_time': timeStamp,
                        'status': 'offline',
                        'client_pcname': hostname
                    }, {'mac_addr': macaddr},
                    where_str_addtional='client_conn_port != %s' %
                    str(self.transport.getPeer().port))
                update_connection_cmd(
                    self.mysql_hdlr, {
                        'mac_addr': macaddr,
                        'owner': owner,
                        'dut_type': duttype,
                        'dut_ip': dutip,
                        'sw_version': swversion,
                        'status': status,
                        'client_pcname': hostname
                    }, {
                        'client_conn_port': str(self.transport.getPeer().port),
                        'client_ip': str(self.transport.getPeer().host)
                    },
                    where_str_addtional='order by id desc limit 1')
                update_connection_id(self.mysql_hdlr, {'mac_addr': macaddr})
                conn_info = get_connection_info(
                    self.mysql_hdlr, {
                        'client_conn_port': str(self.transport.getPeer().port),
                        'client_ip': str(self.transport.getPeer().host)
                    })
                if conn_info != None:
                    client_id = conn_info['client_id']
                else:
                    client_id = 0
                #hardcode
                self.prv_logger.trace("current connection id:%d" % client_id)
                private_cmd = get_private_cmd(self.mysql_hdlr, owner, duttype,
                                              client_id, swversion)
                neighbour_cmd = get_neighbour_cmd(self.mysql_hdlr, owner,
                                                  duttype, client_id,
                                                  swversion)
                if status == 'idle':
                    self.busy_cnt = 0
                    #self.transport.write('start_testcase %s\n'%os.path.join("BG2CDP", "Chromecast_HBOGO.tar.gz"))
                    if private_cmd != None: cmd_list = private_cmd
                    elif neighbour_cmd != None: cmd_list = neighbour_cmd
                    else:
                        self.prv_logger.trace(
                            "could not get any command from mysql")
                        cmd_list = None

                    if cmd_list != None:
                        case_info = get_case_info(self.mysql_hdlr,
                                                  {'id': cmd_list['case_id']})
                        if case_info != None:
                            start_case_cmd = case_info['path']
                        else:
                            start_case_cmd
                    else:
                        start_case_cmd = None
                    if start_case_cmd != None:
                        self.transport.write(
                            'start_testcase %s %s %s %s\n' %
                            (start_case_cmd,
                             os.path.join("TestCase", "Config",
                                          str(cmd_list['id']), 'config.py'),
                             cmd_list['id'], cmd_list['case_parametar']))
                        timeStamp = time.strftime("%Y-%m-%d %H:%M:%S",
                                                  time.localtime())
                        if not update_special_cmd(
                                self.mysql_hdlr, cmd_list['id'], {
                                    'status': 'running',
                                    'exc_client_id': client_id,
                                    'start_time': timeStamp,
                                    'sw_version': swversion
                                }):
                            self.prv_logger.error(
                                "update mysql failed;status:not run->running")
                    #self.transport.write('ENDMSG\n')
                elif status == 'busy':
                    #update_special_cmd(self.mysql_hdlr, taskid, {'status':'running', 'sw_version':swversion})
                    self.prv_logger.trace("dut is busy(id:%s)" % taskid)
                    res = get_special_cmd(self.mysql_hdlr, taskid)
                    if res != None:
                        if res['status'] == 'running':
                            self.prv_logger.trace('got it(id:%s)' % taskid)
                            if res['cmd_owner'] != owner and private_cmd != None:
                                self.prv_logger.trace(
                                    'case(id:%s; case_id:%s; owner:%s) will be canceled;'
                                    % (res['id'], res['case_id'],
                                       res['cmd_owner']))
                                self.prv_logger.trace(
                                    'case(id:%s; case_id:%s; owner:%s) will be run;'
                                    %
                                    (private_cmd['id'], private_cmd['case_id'],
                                     private_cmd['cmd_owner']))
                                if not update_special_cmd(
                                        self.mysql_hdlr, taskid,
                                    {'status': 'not run'}):
                                    self.prv_logger.error(
                                        "update mysql failed;status:not running->not run"
                                    )
                                self.transport.write('cancel_testcase\n')
                                update_special_cmd(self.mysql_hdlr, taskid, {
                                    'status': 'not run',
                                    'sw_version': swversion
                                })
                        elif res['status'] == 'stopped':
                            self.transport.write('stop_testcase\n')
                            update_special_cmd(
                                self.mysql_hdlr, taskid, {
                                    'status': 'finished',
                                    'result': 'stopped',
                                    'reserved': 'manually stopped',
                                    'sw_version': swversion
                                })
                        elif res['status'] == 'restart':
                            self.transport.write('cancel_testcase\n')
                            update_special_cmd(
                                self.mysql_hdlr, taskid, {
                                    'status': 'not run',
                                    'reserved': 'manually canceled',
                                    'sw_version': swversion
                                })
                        else:
                            update_special_cmd(self.mysql_hdlr, taskid, {
                                'status': 'running',
                                'sw_version': swversion
                            })
                            self.prv_logger.trace('invalid status:%s (id:%s)' %
                                                  (res['status'], taskid))
                    else:
                        self.prv_logger.error('could not get(id:%s) in db' %
                                              taskid)

                else:
                    """
                                    should be hang or other unhandle status,
                                    need notify administrator and client owner
                                    """
                self.transport.write('ENDMSG\n')
                print "owner:%s hostname:%s macaddr:%s duttype:%s dutip:%s swversion:%s status:%s" % (
                    owner, hostname, macaddr, duttype, dutip, swversion,
                    status)
            except IndexError:
                self.transport.write(
                    'Missing hostname, macaddr, duttype or swversion\n')
                self.transport.write('ENDMSG\n')
                self.prv_logger.trace(
                    'Missing hostname, macaddr, duttype or swversion\n')
                return

#except Exception, e:
#        self.prv_logger.trace('Capture exception:%s'%str(e))
#except:
#        self.prv_logger.trace('Capture unknown exception')
        elif command == 'quit':
            self.transport.loseConnection()
Пример #18
0
    def lineReceived(self, line):
	global clients
        display_message('Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line))

        data = self._cleanAndSplitInput(line)
        if len(data) == 0 or data == '':
            return
	
	user = data.pop()

        command = data[0].lower()
        if not command in COMMANDS:
            self.transport.write('Invalid command\n')
            self.transport.write('ENDMSG\n')
            return

	if command != 'login' and command != 'quit' and user not in clients:
		self.transport.write('You must be logged in\n')
		self.transport.write('ENDMSG\n')
		return


	print data

        if command == 'list':
            self._send_list_of_files()

        elif command == 'get':
            try:
                filename = data[1]
            except IndexError:
                self.transport.write('Missing filename\n')
                self.transport.write('ENDMSG\n')
                return

            if not self.factory.files:
                self.factory.files = self._get_file_list()

            if not filename in self.factory.files:
                self.transport.write('File with filename %s does not exist\n' % (filename))
                self.transport.write('ENDMSG\n')
                return

            display_message('Sending file: %s (%d KB)' % (filename, self.factory.files[filename][1] / 1024))

            self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))
            self.setRawMode()

            for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):
                self.transport.write(bytes)

            self.transport.write('\r\n')
            self.setLineMode()
        elif command == 'put':

            try:
                filename = data[1]
                file_hash = data[2]
                #replace the '|' back with ' '
                filename = filename.replace('|',' ')
                file_hash = file_hash.replace('|',' ')

            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            self.file_data = (filename, file_hash)

            # Switch to the raw mode (for receiving binary data)
            print 'Receiving file: %s' % (filename)
            self.setRawMode()
        elif command == 'help':
            self.transport.write('Available commands:\n\n')

            for key, value in COMMANDS.iteritems():
                self.transport.write('%s - %s\n' % (value[0], value[1]))

            self.transport.write('ENDMSG\n')

	elif command == 'registry':
	    global admin
	    if user not in admin:
		self.transport.write('%s does not have administrative rights.\n' % user)
                self.transport.write('ENDMSG\n')
	    else:
		
	    # TODO; check if user is in admin list first
		registry = login_demo.retrieve_login_info()
		self.transport.write('username\t\tpassword\t\trole\n')
		for key, value in registry.iteritems():
			self.transport.write('%s\t\t\t%s\t\t\t%s\n' % (key, value[0],  value[1]))
		
		self.transport.write('ENDMSG\n')			

        elif command == 'register':
	    global admin
	    if user not in admin:
		self.transport.write('%s does not have administrative rights.\n' % user)
                self.transport.write('ENDMSG\n')
	    # TODO; check if user is in admin list first
            username = data[1]
            password = data[2]
	    role = data [3]
            answer = login_demo.register_user(username, password, role)
            print answer

	    created = "user %s has been created" % username
	    if answer == created:
		user_path = DIRECTORY + "/%s/OneDir" % username
		if not os.path.exists(user_path):
		    try:	
			os.makedirs(user_path)
		    except OSError, e: 
			print e
	    else:
		print "%s already exists" % path
		return False

		
            self.transport.write('%s\n' % answer)
            self.transport.write('ENDMSG\n')
Пример #19
0
    def _sendCommand(self, line):
	global setSynchronize, synchronized
        """ Sends a command to the server. """

        data = clean_and_split_input(line)
        if len(data) == 0 or data == '':
            return
	
	command = data[0].lower()

        if not command in COMMANDS:
            self._display_message('Invalid command')
            return

        '''TLast
        if command == 'list' or command == 'help' or command == 'quit':
            self.connection.transport.write('%s %s\n' % (command, self.username))
        '''

	if command == 'help':
	    if self.logged_in == False:
		self._display_message('Type login [username] [password] to login OR type register [username] [password] [user/admin] to register')
		return
            self.connection.transport.write('%s %s\n' % (command, self.username))

	elif command == 'list':
	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
            self.connection.transport.write('%s %s\n' % (command, self.username))
	
	elif command == 'registry':
	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
            self.connection.transport.write('%s %s\n' % (command, self.username))

	elif command == 'register':
	    if self.logged_in == True:
		self._display_message('You must log out to register a new user')
		return
	    try:
		username = data[1]
		password = data[2]
		role = data[3]
		
	    except IndexError:
                self._display_message('Missing username or password')
		return

            self.connection.transport.write('%s %s %s %s %s\n' % (command, username, password, role, self.username))
	
	elif command == 'change_password':
	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
	    try:
	        username = data[1]
  		password = data[2]

	    except IndexError:
                self._display_message('Missing username or password')
		return
            self.connection.transport.write('%s %s %s %s\n' % (command, username, password, self.username))

	elif command == 'remove_user':
	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
	    try:
	        username = data[1]
	    except IndexError:
                self._display_message('Missing username')
		return
            self.connection.transport.write('%s %s %s\n' % (command, username, self.username))

	elif command == 'login':
	    if self.logged_in != False:
		self._display_message('You are already logged in. Log out to change users.')
		return
	    try:
		username = data[1]
		password = data[2]
	    except IndexError:
                self._display_message('Missing username or password')
		return
            self.connection.transport.write('%s %s %s %s\n' % (command, username, password, self.username))

	elif command == 'logout':
	    if self.logged_in != True:
		self._display_message('You are not logged into any account.')
		return
            self.connection.transport.write('%s %s\n' % (command, self.username))

#############################
        elif command == 'get':
	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
            try:
                filename = data[1]
            except IndexError:
                self._display_message('Missing filename')
                return
            
            self.connection.transport.write('%s %s %s\n' % (command, filename, self.username))

#############################
        elif command == 'put':

	    if self.logged_in == False:
		self._display_message('You must be logged in')
		return
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message('Missing local file path or remote file name')
                return
            
            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024
            
            print 'Uploading file: %s (%d KB)' % (filename, file_size)
            
            self.connection.transport.write('PUT %s %s %s\n' % (filename, get_file_md5_hash(file_path), self.username))
            self.setRawMode()
            
            for bytes in read_bytes_from_file(file_path):
                self.connection.transport.write(bytes)
            
            self.connection.transport.write('\r\n')   
            
            # When the transfer is finished, we go back to the line mode 
            self.setLineMode()

#####################################
        elif command == 'rename':
            """renames file or directory src to dst and returns True if successful"""
	    if self.logged_in == False:
		self._display_message('You must be logged in.')
	        self._prompt()
            else:
                src = '';
                dst = '';
                input = clean_and_split_input(line)
                if len(input) == 3:
                    src = input[1];
                    dst = input[2];
                if os.path.isfile(src) or os.path.isdir(src):
                    try:
                        os.renames(src, dst)
                        print '%s renamed to %s' % (src, dst)
                        self._prompt()
                    except OSError, e:
                        print e
                        self._prompt()
                else:
                    print "%s does not exist" % src
                    self._prompt()
Пример #20
0
    def _sendCommand(self, line):
        """ Sends a command to the server. """

        data = clean_and_split_input(line)
        if len(data) == 0 or data == '' or self.transport == None:
            return

        command = data[0].lower()
        if not command in COMMANDS:
            self._display_message('Invalid command:%s' % command)
            return

        if command == 'list' or command == 'help' or command == 'quit':
            self.transport.write('%s\n' % (command))
        elif command == 'get':
            try:
                src_filename = data[1]
                dst_filename = data[2]
            except IndexError:
                self._display_message('Missing filename')
                return

            self.transport.write('%s %s %s\n' %
                                 (command, src_filename, dst_filename))
        elif command == 'put':
            try:
                file_path = data[1]
                filename = data[2]
            except IndexError:
                self._display_message(
                    'Missing local file path or remote file name')
                return

            if not os.path.isfile(file_path):
                self._display_message('This file does not exist')
                return

            file_size = os.path.getsize(file_path) / 1024

            self.prv_logger.trace('Uploading file: %s (%d KB)' %
                                  (filename, file_size))

            self.transport.write(
                'PUT %s %s\n' %
                (filename, get_file_md5_hash(self.prv_logger, file_path)))
            self.setRawMode()

            for bytes in read_bytes_from_file(file_path):
                self.transport.write(bytes)

            self.transport.write('\r\r\r\r\n')

            # When the transfer is finished, we go back to the line mode
            self.setLineMode()
        elif command == 'download':
            try:
                src_filename = data[1]
                dst_filename = data[2]
            except IndexError:
                self._display_message('Missing filename')
                return
            self.prv_logger.trace('%s %s %s\n' %
                                  ("get", src_filename, dst_filename))
            self.transport.write('%s %s %s\n' %
                                 ("get", src_filename, dst_filename))
            self.prv_logger.trace('%s %s %s done\n' %
                                  ("get", src_filename, dst_filename))
        elif command == 'hb':
            self.transport.write('%s %s\n' % (command, ' '.join(data[1:])))
        else:
            self.transport.write('%s %s\n' % (command, data[1]))
Пример #21
0
	def lineReceived(self, line):
		display_message('Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line))
		logMessage = 'Received the following line from the client [%s]: %s' % (self.transport.getPeer().host, line)
		self.log(logMessage)

		data = self._cleanAndSplitInput(line)
		if len(data) == 0 or data == '':
			return 
		
		command = data[0].lower()
		if not command in COMMANDS:
			self.transport.write('Invalid command\n')
			self.transport.write('ENDMSG\n')
			return
		if command == 'list':
			self._send_list_of_files()
		elif command == 'get':
			try:
				filename = data[1]
			except IndexError:
				self.transport.write('Missing filename\n')
				self.transport.write('ENDMSG\n')
				return
			
			if not self.factory.files:
				self.factory.files = self._get_file_list()
				
			if not filename in self.factory.files:
				self.transport.write('File with filename %s does not exist\n' % (filename))
				self.transport.write('ENDMSG\n')
				return
			
			display_message('Sending file: %s (%d KB)' % (filename, self.factory.files[filename][1] / 1024))
			
			self.transport.write('HASH %s %s\n' % (filename, self.factory.files[filename][2]))
			self.setRawMode()
			
			for bytes in read_bytes_from_file(os.path.join(self.factory.files_path, filename)):
				self.transport.write(bytes)
			
			self.transport.write('\r\n')	
			self.setLineMode()
		elif command == 'put':
			try:
				filename = data[1]
				file_hash = data[2]
			except IndexError:
				self.transport.write('Missing filename or file MD5 hash\n')
				self.transport.write('ENDMSG\n')
				return

			self.file_data = (filename, file_hash)
			
			# Switch to the raw mode (for receiving binary data)
			print 'Receiving file: %s' % (filename)
			self.setRawMode()
		elif command == 'help':
			self.transport.write('Available commands:\n\n')
			
			for key, value in COMMANDS.iteritems():
				self.transport.write('%s - %s\n' % (value[0], value[1]))
			
			self.transport.write('ENDMSG\n')		

		elif command == 'register':
			username = data[1]
			password = data[2]
			answer = login_demo.register_user(username, password)
			print answer
			self.transport.write('%s\n' % answer)	
			self.transport.write('ENDMSG\n')
			
		elif command == 'login':
			username = data[1]
			password = data[2]
			answer = login_demo.login(username, password)
			print answer
			self.transport.write('%s\n' % answer)	
			self.transport.write('ENDMSG\n')				
		
		elif command == 'quit':
			self.transport.loseConnection()
Пример #22
0
    def lineReceived(self, line):
        data = json.loads(line)
        command = data["command"]
        retVal = {"done": True, 'success': True}

        print line
        # client interface messages come in here
        if command in ['register', 'authenticate', 'change password']:
            if command == 'register':
                success = self.factory.register(data['username'], data['password'])
                self.sendLine(json.dumps({'type': 'register', 'success': success}))
            elif command == 'authenticate':
                print 'AUTHENTICATION RECEIVED'
                success = self.factory.auth(data['username'], data['password'])
                reason = ''
                if not success:
                    user_exists = self.factory.userExists(data['username'])
                    reason = 'incorrect password'
                    if not user_exists:
                        reason = 'user does not exist'
                self.sendLine(json.dumps({'type': 'authenticate', 'success': success, 'reason': reason}))
            elif command == 'change password':
                success = self.factory.auth(data['username'], data['old_password'])
                reason = ''
                if not success:
                    user_exists = self.factory.userExists(data['username'])
                    reason = 'incorrect password'
                    if not user_exists:
                        reason = 'user does not exist'
                if success:
                    print 'here'
                    success = self.factory.updatePassword(data['username'], data['new_password'])
                print {'type': 'change password', 'success': success, 'reason': reason}
                self.sendLine(json.dumps({'type': 'change password', 'success': success, 'reason': reason}))
            return

        # client daemon messages come in here
        if (not self.factory.auth(data['username'], data['password'])) and not command in self.c_interface_commands:
            retVal['success'] = False
            self.sendLine(json.dumps(retVal))
            return
        if not os.path.exists(os.path.join(self.factory.files_path, data['username'])):
                os.mkdir(os.path.join(self.factory.files_path, data['username']))
        if not command in COMMANDS:
            self.sendLine(json.dumps(retVal))
            return
        if command == 'move':
            print "Receiving move from " + data['src'] + " to " + data['dest']
            self.factory.db.recordTrans(data['username'], "move", 0, data['src'] + " to " + data['dest'])
            src_path = os.path.join(self.factory.files_path, data["username"], self.clean_file_string(data['src']))
            dest_path = os.path.join(self.factory.files_path, data["username"], self.clean_file_string(data['dest']))
            if os.path.exists(src_path):
                os.renames(src_path, dest_path)
            self.sendLine(json.dumps(retVal))
        elif command == 'register':
            print 'Receiving register for username ' + data['username']
            success = self.factory.db.createUser(data['username'], data['password'])
            self.sendLine(json.dumps({'success': success}))
            return
        elif command == 'authenticate':
            retVal['success'] = self.factory.auth(data['username'], data['password'])
            self.sendLine(json.dumps(retVal))
            return
        elif command == "delete":
            print "Receiving delete of " + data["what"] + " " + data['file']
            self.factory.db.recordTrans(data['username'], "delete", 0, data["what"] + " " + data['file'])
            path = os.path.join(self.factory.files_path, self.clean_file_string(data['username']), self.clean_file_string(data["file"]))
            if (os.path.exists(path)):
                if (data["what"] == "file"):
                    os.unlink(path)
                elif data["what"] == "directory":
                    shutil.rmtree(path)
            self.sendLine(json.dumps(retVal))
        elif command == 'create':
            print "Receiving create for " + data['file']
            if data['what'] == 'directory':
                path = os.path.join(self.factory.files_path, data["username"], self.clean_file_string(data['file']))
                if not os.path.exists(path):
                    os.mkdir(path)
            else:
                path = os.path.join(self.factory.files_path, data["username"], self.clean_file_string(data['file']))
                if not os.path.exists(path):
                    os.mknod(path)
            self.sendLine(json.dumps(retVal))
        elif command == 'get':
            #TODO GET DOESNT WORK FOR DIRECTORIES
            self.factory.db.recordTrans(data['username'], "get", 0, "/")
            if not os.path.exists(os.path.join(self.factory.files_path, data['username'])):
                os.mkdir(os.path.join(self.factory.files_path, data['username']))
            timestamps = get_timestamps(os.path.join(self.factory.files_path, data['username']))
            retVal = dict(retVal.items() + {'files': [], 'directories': [], "remove": []}.items())
            for file, stamp in timestamps.iteritems():
                if (not file in data['timestamps'] or stamp > data['timestamps'][file]):
                    path = os.path.join(self.factory.files_path, data['username'], self.clean_file_string(file))
                    if os.path.isdir(path):
                        retVal['directories'].append(file)
                    elif os.path.isfile(path):
                        retVal['files'].append(file)
            for file, stamp in data['timestamps'].iteritems():
                if not file in timestamps:
                    retVal['remove'].append(file)
            #print retVal
            self.sendLine(json.dumps(retVal))
        elif command == 'get_file':
            file_path = os.path.join(self.factory.files_path, data['username'], self.clean_file_string(data['rel_path']))
            if os.path.exists(file_path):
                self.setRawMode()
                for bytes in read_bytes_from_file(file_path):
                    self.transport.write(bytes)

                self.transport.write('\r\n')

                # When the transfer is finished, we go back to the line mode
                self.setLineMode()
            else:
                self.sendLine("FILEDOESNOTEXISTFAIL2389")
        elif command == 'put':
            try:
                filename = self.clean_file_string(data["relative_path"])
            except IndexError:
                self.transport.write('Missing filename or file MD5 hash\n')
                self.transport.write('ENDMSG\n')
                return

            file_path = os.path.join(self.factory.files_path, data['username'], filename)
            # Switch to the raw mode (for receiving binary data)
            self.factory.db.recordTrans(data['username'], "put", 0, file_path)
            print 'Receiving file: %s' % (filename)
            retVal['command'] = 'put'
            retVal['local_file_path'] = data['local_file_path']
            self.sendLine(json.dumps(retVal))
            self.file_to_update = file_path
            self.setRawMode()

        elif command == 'help':
            self.sendLine(json.dumps(retVal))
        elif command == 'quit':
            self.transport.loseConnection()
        else:
            self.sendLine(json.dumps(retVal))