@ -34,23 +34,24 @@ type decisionWaiter struct {
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					type  ruleColumns  struct  { type  ruleColumns  struct  {  
			
		
	
		
		
			
				
					
						nrefs     int 
	nrefs      int 
 
			
				
				
			
		
	
		
		
			
				
					
						Path      string 
	Path       string 
 
			
				
				
			
		
	
		
		
			
				
					
						GUID      string 
	GUID       string 
 
			
				
				
			
		
	
		
		
			
				
					
						Icon      string 
	Icon       string 
 
			
				
				
			
		
	
		
		
			
				
					
						Proto     string 
	Proto      string 
 
			
				
				
			
		
	
		
		
			
				
					
						Pid       int 
	Pid        int 
 
			
				
				
			
		
	
		
		
			
				
					
						Target    string 
	Target     string 
 
			
				
				
			
		
	
		
		
			
				
					
						Hostname  string 
	Hostname   string 
 
			
				
				
			
		
	
		
		
			
				
					
						Port      int 
	Port       int 
 
			
				
				
			
		
	
		
		
			
				
					
						UID       int 
	UID        int 
 
			
				
				
			
		
	
		
		
			
				
					
						GID       int 
	GID        int 
 
			
				
				
			
		
	
		
		
			
				
					
						Uname     string 
	Uname      string 
 
			
				
				
			
		
	
		
		
			
				
					
						Gname     string 
	Gname      string 
 
			
				
				
			
		
	
		
		
			
				
					
						Origin    string 
	Origin     string 
 
			
				
				
			
		
	
		
		
			
				
					
						IsSocks   bool 
	Timestamp  string 
 
			
				
				
			
		
	
		
		
			
				
					
						ForceTLS  bool 
	IsSocks    bool 
 
			
				
				
			
		
	
		
		
			
				
					
						Scope     int 
	ForceTLS   bool 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
						Scope      int 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					var  dbuso  * dbusObject var  dbuso  * dbusObject  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -70,6 +71,7 @@ var btnApprove, btnDeny, btnIgnore *gtk.Button
 
			
		
	
		
		
			
				
					
					var  chkTLS ,  chkUser ,  chkGroup  * gtk . CheckButton var  chkTLS ,  chkUser ,  chkGroup  * gtk . CheckButton  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  dumpDecisions ( )  { func  dumpDecisions ( )  {  
			
		
	
		
		
			
				
					
						return 
 
			
		
	
		
		
			
				
					
						fmt . Println ( "XXX Total of decisions pending: " ,  len ( decisionWaiters ) ) 
	fmt . Println ( "XXX Total of decisions pending: " ,  len ( decisionWaiters ) ) 
 
			
		
	
		
		
			
				
					
						for  i  :=  0 ;  i  <  len ( decisionWaiters ) ;  i ++  { 
	for  i  :=  0 ;  i  <  len ( decisionWaiters ) ;  i ++  { 
 
			
		
	
		
		
			
				
					
							fmt . Printf ( "XXX %d ready = %v, rule = %v\n" ,  i + 1 ,  decisionWaiters [ i ] . Ready ,  decisionWaiters [ i ] . Rule ) 
		fmt . Printf ( "XXX %d ready = %v, rule = %v\n" ,  i + 1 ,  decisionWaiters [ i ] . Ready ,  decisionWaiters [ i ] . Rule ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -77,6 +79,7 @@ func dumpDecisions() {
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  addDecision ( )  * decisionWaiter  { func  addDecision ( )  * decisionWaiter  {  
			
		
	
		
		
			
				
					
						return  nil 
 
			
		
	
		
		
			
				
					
						decision  :=  decisionWaiter { Lock :  & sync . Mutex { } ,  Ready :  false ,  Scope :  int ( sgfw . APPLY_ONCE ) ,  Rule :  "" } 
	decision  :=  decisionWaiter { Lock :  & sync . Mutex { } ,  Ready :  false ,  Scope :  int ( sgfw . APPLY_ONCE ) ,  Rule :  "" } 
 
			
		
	
		
		
			
				
					
						decision . Cond  =  sync . NewCond ( decision . Lock ) 
	decision . Cond  =  sync . NewCond ( decision . Lock ) 
 
			
		
	
		
		
			
				
					
						decisionWaiters  =  append ( decisionWaiters ,  & decision ) 
	decisionWaiters  =  append ( decisionWaiters ,  & decision ) 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -315,7 +318,7 @@ func createColumn(title string, id int) *gtk.TreeViewColumn {
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  createListStore ( general  bool )  * gtk . ListStore  { func  createListStore ( general  bool )  * gtk . ListStore  {  
			
		
	
		
		
			
				
					
						colData  :=  [ ] glib . Type { glib . TYPE_INT ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_INT ,  glib . TYPE_STRING , 
	colData  :=  [ ] glib . Type { glib . TYPE_INT ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_STRING ,  glib . TYPE_INT ,  glib . TYPE_STRING , 
 
			
		
	
		
		
			
				
					
							glib . TYPE_STRING ,  glib . TYPE_INT ,  glib . TYPE_INT ,  glib . TYPE_INT ,  glib . TYPE_STRING ,  glib . TYPE_ INT,  glib . TYPE_STRING ,  glib . TYPE_INT } 
		glib . TYPE_STRING ,  glib . TYPE_INT ,  glib . TYPE_INT ,  glib . TYPE_INT ,  glib . TYPE_STRING ,  glib . TYPE_ STRING,  glib . TYPE_  INT,  glib . TYPE_STRING ,  glib . TYPE_INT } 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						listStore ,  err  :=  gtk . ListStoreNew ( colData ... ) 
	listStore ,  err  :=  gtk . ListStoreNew ( colData ... ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  err  !=  nil  { 
	if  err  !=  nil  { 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -331,7 +334,7 @@ func removeRequest(listStore *gtk.ListStore, guid string) {
 
			
		
	
		
		
			
				
					
						defer  globalPromptLock . Unlock ( ) 
	defer  globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						/* XXX: This is horrible. Figure out how to do this properly. */ 
	/* XXX: This is horrible. Figure out how to do this properly. */ 
 
			
		
	
		
		
			
				
					
						for  ridx  :=  0 ;  ridx  <  2000 ;  ridx ++  { 
	for  ridx  :=  0 ;  ridx  <  globalLS . IterNChildren ( nil ) ;  ridx ++  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							rule ,  _ ,  err  :=  getRuleByIdx ( ridx ) 
		rule ,  _ ,  err  :=  getRuleByIdx ( ridx ) 
 
			
		
	
		
		
			
				
					
							if  err  !=  nil  { 
		if  err  !=  nil  { 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -357,7 +360,7 @@ func addRequestInc(listStore *gtk.ListStore, guid, path, icon, proto string, pid
 
			
		
	
		
		
			
				
					
						globalPromptLock . Lock ( ) 
	globalPromptLock . Lock ( ) 
 
			
		
	
		
		
			
				
					
						defer  globalPromptLock . Unlock ( ) 
	defer  globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						for  ridx  :=  0 ;  ridx  <  2000 ;  ridx ++  { 
	for  ridx  :=  0 ;  ridx  <  globalLS . IterNChildren ( nil ) ;  ridx ++  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							/* XXX: This is horrible. Figure out how to do this properly. */ 
		/* XXX: This is horrible. Figure out how to do this properly. */ 
 
			
		
	
		
		
			
				
					
							rule ,  iter ,  err  :=  getRuleByIdx ( ridx ) 
		rule ,  iter ,  err  :=  getRuleByIdx ( ridx ) 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -385,98 +388,14 @@ func addRequestInc(listStore *gtk.ListStore, guid, path, icon, proto string, pid
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  addRequestAsync ( listStore  * gtk . ListStore ,  guid ,  path ,  icon ,  proto  string ,  pid  int ,  ipaddr ,  hostname  string ,  port ,  uid ,  gid  int , func  addRequestAsync ( listStore  * gtk . ListStore ,  guid ,  path ,  icon ,  proto  string ,  pid  int ,  ipaddr ,  hostname  string ,  port ,  uid ,  gid  int ,  
			
		
	
		
		
			
				
					
						origin  string ,  is_socks  bool ,  optstring  string ,  sandbox  string ,  action  int )  bool  { 
	origin ,  timestamp  string ,  is_socks  bool ,  optstring  string ,  sandbox  string ,  action  int )  bool  { 
 
			
				
				
			
		
	
		
		
			
				
					
						if  listStore  ==  nil  { 
	addRequest ( listStore ,  guid ,  path ,  icon ,  proto ,  pid ,  ipaddr ,  hostname ,  port ,  uid ,  gid ,  origin ,  timestamp ,  is_socks , 
 
			
				
				
			
		
	
		
		
			
				
					
							listStore  =  globalLS 
		optstring ,  sandbox ,  action ) 
 
			
				
				
			
		
	
		
		
			
				
					
							waitTimes  :=  [ ] int { 1 ,  2 ,  5 ,  10 } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  listStore  ==  nil  { 
 
			
		
	
		
		
			
				
					
								log . Println ( "SGFW prompter was not ready to receive firewall request... waiting" ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
								for  _ ,  wtime  :=  range  waitTimes  { 
 
			
		
	
		
		
			
				
					
									time . Sleep ( time . Duration ( wtime )  *  time . Second ) 
 
			
		
	
		
		
			
				
					
									listStore  =  globalLS 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
									if  listStore  !=  nil  { 
 
			
		
	
		
		
			
				
					
										break 
 
			
		
	
		
		
			
				
					
									} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
									log . Println ( "SGFW prompter is still waiting..." ) 
 
			
		
	
		
		
			
				
					
								} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  listStore  ==  nil  { 
 
			
		
	
		
		
			
				
					
							log . Fatal ( "SGFW prompter GUI failed to load for unknown reasons" ) 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  addRequestInc ( listStore ,  guid ,  path ,  icon ,  proto ,  pid ,  ipaddr ,  hostname ,  port ,  uid ,  gid ,  origin ,  is_socks ,  optstring ,  sandbox ,  action )  { 
 
			
		
	
		
		
			
				
					
							fmt . Println ( "REQUEST WAS DUPLICATE" ) 
 
			
		
	
		
		
			
				
					
							return  false 
 
			
		
	
		
		
			
				
					
						}  else  { 
 
			
		
	
		
		
			
				
					
							fmt . Println ( "NOT DUPLICATE" ) 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						globalPromptLock . Lock ( ) 
 
			
		
	
		
		
			
				
					
						iter  :=  listStore . Append ( ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  is_socks  { 
 
			
		
	
		
		
			
				
					
							if  ( optstring  !=  "" )  &&  ( strings . Index ( optstring ,  "SOCKS" )  ==  - 1 )  { 
 
			
		
	
		
		
			
				
					
								optstring  =  "SOCKS5 / "  +  optstring 
 
			
		
	
		
		
			
				
					
							}  else  if  optstring  ==  ""  { 
 
			
		
	
		
		
			
				
					
								optstring  =  "SOCKS5" 
 
			
		
	
		
		
			
				
					
							} 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colVals  :=  make ( [ ] interface { } ,  15 ) 
 
			
		
	
		
		
			
				
					
						colVals [ 0 ]  =  1 
 
			
		
	
		
		
			
				
					
						colVals [ 1 ]  =  guid 
 
			
		
	
		
		
			
				
					
						colVals [ 2 ]  =  path 
 
			
		
	
		
		
			
				
					
						colVals [ 3 ]  =  icon 
 
			
		
	
		
		
			
				
					
						colVals [ 4 ]  =  proto 
 
			
		
	
		
		
			
				
					
						colVals [ 5 ]  =  pid 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  ipaddr  ==  ""  { 
 
			
		
	
		
		
			
				
					
							colVals [ 6 ]  =  "---" 
 
			
		
	
		
		
			
				
					
						}  else  { 
 
			
		
	
		
		
			
				
					
							colVals [ 6 ]  =  ipaddr 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colVals [ 7 ]  =  hostname 
 
			
		
	
		
		
			
				
					
						colVals [ 8 ]  =  port 
 
			
		
	
		
		
			
				
					
						colVals [ 9 ]  =  uid 
 
			
		
	
		
		
			
				
					
						colVals [ 10 ]  =  gid 
 
			
		
	
		
		
			
				
					
						colVals [ 11 ]  =  origin 
 
			
		
	
		
		
			
				
					
						colVals [ 12 ]  =  0 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  is_socks  { 
 
			
		
	
		
		
			
				
					
							colVals [ 12 ]  =  1 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colVals [ 13 ]  =  optstring 
 
			
		
	
		
		
			
				
					
						colVals [ 14 ]  =  action 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colNums  :=  make ( [ ] int ,  len ( colVals ) ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						for  n  :=  0 ;  n  <  len ( colVals ) ;  n ++  { 
 
			
		
	
		
		
			
				
					
							colNums [ n ]  =  n 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						err  :=  listStore . Set ( iter ,  colNums ,  colVals ) 
 
			
		
	
		
		
			
				
					
						globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							log . Fatal ( "Unable to add row:" ,  err ) 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						toggleHover ( ) 
 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
						return  true 
	return  true 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  addRequest ( listStore  * gtk . ListStore ,  guid ,  path ,  icon ,  proto  string ,  pid  int ,  ipaddr ,  hostname  string ,  port ,  uid ,  gid  int , func  addRequest ( listStore  * gtk . ListStore ,  guid ,  path ,  icon ,  proto  string ,  pid  int ,  ipaddr ,  hostname  string ,  port ,  uid ,  gid  int ,  
			
		
	
		
		
			
				
					
						origin  string ,  is_socks  bool ,  optstring  string ,  sandbox  string ,  action  int )  * decisionWaiter  { 
	origin ,  timestamp  string ,  is_socks  bool ,  optstring  string ,  sandbox  string ,  action  int )  * decisionWaiter  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						if  listStore  ==  nil  { 
	if  listStore  ==  nil  { 
 
			
		
	
		
		
			
				
					
							listStore  =  globalLS 
		listStore  =  globalLS 
 
			
		
	
		
		
			
				
					
							waitTimes  :=  [ ] int { 1 ,  2 ,  5 ,  10 } 
		waitTimes  :=  [ ] int { 1 ,  2 ,  5 ,  10 } 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -506,7 +425,9 @@ func addRequest(listStore *gtk.ListStore, guid, path, icon, proto string, pid in
 
			
		
	
		
		
			
				
					
						if  addRequestInc ( listStore ,  guid ,  path ,  icon ,  proto ,  pid ,  ipaddr ,  hostname ,  port ,  uid ,  gid ,  origin ,  is_socks ,  optstring ,  sandbox ,  action )  { 
	if  addRequestInc ( listStore ,  guid ,  path ,  icon ,  proto ,  pid ,  ipaddr ,  hostname ,  port ,  uid ,  gid ,  origin ,  is_socks ,  optstring ,  sandbox ,  action )  { 
 
			
		
	
		
		
			
				
					
							fmt . Println ( "REQUEST WAS DUPLICATE" ) 
		fmt . Println ( "REQUEST WAS DUPLICATE" ) 
 
			
		
	
		
		
			
				
					
							decision  :=  addDecision ( ) 
		decision  :=  addDecision ( ) 
 
			
		
	
		
		
			
				
					
							globalPromptLock . Lock ( ) 
 
			
		
	
		
		
			
				
					
							toggleHover ( ) 
		toggleHover ( ) 
 
			
		
	
		
		
			
				
					
							globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
							return  decision 
		return  decision 
 
			
		
	
		
		
			
				
					
						}  else  { 
	}  else  { 
 
			
		
	
		
		
			
				
					
							fmt . Println ( "NOT DUPLICATE" ) 
		fmt . Println ( "NOT DUPLICATE" ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -523,7 +444,7 @@ func addRequest(listStore *gtk.ListStore, guid, path, icon, proto string, pid in
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colVals  :=  make ( [ ] interface { } ,  1 5 ) 
	colVals  :=  make ( [ ] interface { } ,  1 6 ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						colVals [ 0 ]  =  1 
	colVals [ 0 ]  =  1 
 
			
		
	
		
		
			
				
					
						colVals [ 1 ]  =  guid 
	colVals [ 1 ]  =  guid 
 
			
		
	
		
		
			
				
					
						colVals [ 2 ]  =  path 
	colVals [ 2 ]  =  path 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -542,14 +463,15 @@ func addRequest(listStore *gtk.ListStore, guid, path, icon, proto string, pid in
 
			
		
	
		
		
			
				
					
						colVals [ 9 ]  =  uid 
	colVals [ 9 ]  =  uid 
 
			
		
	
		
		
			
				
					
						colVals [ 10 ]  =  gid 
	colVals [ 10 ]  =  gid 
 
			
		
	
		
		
			
				
					
						colVals [ 11 ]  =  origin 
	colVals [ 11 ]  =  origin 
 
			
		
	
		
		
			
				
					
						colVals [ 12 ]  =  0 
	colVals [ 12 ]  =  timestamp 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						colVals [ 13 ]  =  0 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  is_socks  { 
	if  is_socks  { 
 
			
		
	
		
		
			
				
					
							colVals [ 1 2 ]  =  1 
		colVals [ 1 3 ]  =  1 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colVals [ 1 3 ]  =  optstring 
	colVals [ 1 4 ]  =  optstring 
 
			
				
				
			
		
	
		
		
			
				
					
						colVals [ 1 4 ]  =  action 
	colVals [ 1 5 ]  =  action 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						colNums  :=  make ( [ ] int ,  len ( colVals ) ) 
	colNums  :=  make ( [ ] int ,  len ( colVals ) ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -558,7 +480,6 @@ func addRequest(listStore *gtk.ListStore, guid, path, icon, proto string, pid in
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						err  :=  listStore . Set ( iter ,  colNums ,  colVals ) 
	err  :=  listStore . Set ( iter ,  colNums ,  colVals ) 
 
			
		
	
		
		
			
				
					
						globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  err  !=  nil  { 
	if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							log . Fatal ( "Unable to add row:" ,  err ) 
		log . Fatal ( "Unable to add row:" ,  err ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -567,6 +488,7 @@ func addRequest(listStore *gtk.ListStore, guid, path, icon, proto string, pid in
 
			
		
	
		
		
			
				
					
						decision  :=  addDecision ( ) 
	decision  :=  addDecision ( ) 
 
			
		
	
		
		
			
				
					
						dumpDecisions ( ) 
	dumpDecisions ( ) 
 
			
		
	
		
		
			
				
					
						toggleHover ( ) 
	toggleHover ( ) 
 
			
		
	
		
		
			
				
					
						globalPromptLock . Unlock ( ) 
 
			
		
	
		
		
			
				
					
						return  decision 
	return  decision 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -682,14 +604,17 @@ func makeDecision(idx int, rule string, scope int) error {
 
			
		
	
		
		
			
				
					
						return  nil 
	return  nil 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					/* Do we need to hold the lock while this is called? Stay safe... */  
			
		
	
		
		
			
				
					
					func  toggleHover ( )  { func  toggleHover ( )  {  
			
		
	
		
		
			
				
					
						mainWin . SetKeepAbove ( len ( decisionWaiters )  >  0 ) 
	nitems  :=  globalLS . IterNChildren ( nil ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						mainWin . SetKeepAbove ( nitems  >  0 ) 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  toggleValidRuleState ( )  { func  toggleValidRuleState ( )  {  
			
		
	
		
		
			
				
					
						ok  :=  true 
	ok  :=  true 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						// Unfortunately, this can cause deadlock since it's a part of i  the item removal cascade
	// Unfortunately, this can cause deadlock since it's a part of  the item removal cascade
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						//	globalPromptLock.Lock()
 
	//	globalPromptLock.Lock()
 
 
			
		
	
		
		
			
				
					
						//	defer globalPromptLock.Unlock()
 
	//	defer globalPromptLock.Unlock()
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -912,8 +837,13 @@ func getRuleByIdx(idx int) (ruleColumns, *gtk.TreeIter, error) {
 
			
		
	
		
		
			
				
					
							return  rule ,  nil ,  err 
		return  rule ,  nil ,  err 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						rule . Timestamp ,  err  =  lsGetStr ( globalLS ,  iter ,  12 ) 
 
			
		
	
		
		
			
				
					
						if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							return  rule ,  nil ,  err 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						rule . IsSocks  =  false 
	rule . IsSocks  =  false 
 
			
		
	
		
		
			
				
					
						is_socks ,  err  :=  lsGetInt ( globalLS ,  iter ,  12 ) 
	is_socks ,  err  :=  lsGetInt ( globalLS ,  iter ,  1 3 ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						if  err  !=  nil  { 
	if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							return  rule ,  nil ,  err 
		return  rule ,  nil ,  err 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -922,7 +852,7 @@ func getRuleByIdx(idx int) (ruleColumns, *gtk.TreeIter, error) {
 
			
		
	
		
		
			
				
					
							rule . IsSocks  =  true 
		rule . IsSocks  =  true 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						rule . Scope ,  err  =  lsGetInt ( globalLS ,  iter ,  1 4 ) 
	rule . Scope ,  err  =  lsGetInt ( globalLS ,  iter ,  1 5 ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						if  err  !=  nil  { 
	if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							return  rule ,  nil ,  err 
		return  rule ,  nil ,  err 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -965,7 +895,7 @@ func addPendingPrompts(rules []string) {
 
			
		
	
		
		
			
				
					
						for  _ ,  rule  :=  range  rules  { 
	for  _ ,  rule  :=  range  rules  { 
 
			
		
	
		
		
			
				
					
							fields  :=  strings . Split ( rule ,  "|" ) 
		fields  :=  strings . Split ( rule ,  "|" ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  len ( fields )  !=  1 8  { 
		if  len ( fields )  !=  1 9  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
								log . Printf ( "Got saved prompt message with strange data: \"%s\"" ,  rule ) 
			log . Printf ( "Got saved prompt message with strange data: \"%s\"" ,  rule ) 
 
			
		
	
		
		
			
				
					
								continue 
			continue 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1011,15 +941,16 @@ func addPendingPrompts(rules []string) {
 
			
		
	
		
		
			
				
					
								continue 
			continue 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							optstring  :=  fields [ 16 ] 
		timestamp  :=  fields [ 16 ] 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
							optstring  :=  fields [ 17 ] 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							action ,  err  :=  strconv . Atoi ( fields [ 1 7 ] ) 
		action ,  err  :=  strconv . Atoi ( fields [ 1 8 ] ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
							if  err  !=  nil  { 
		if  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
								log . Println ( "Error converting action in pending prompt message to integer:" ,  err ) 
			log . Println ( "Error converting action in pending prompt message to integer:" ,  err ) 
 
			
		
	
		
		
			
				
					
								continue 
			continue 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							addRequestAsync ( nil ,  guid ,  path ,  icon ,  proto ,  int ( pid ) ,  ip ,  address ,  int ( port ) ,  int ( uid ) ,  int ( gid ) ,  origin ,  ,  optstring ,  sandbox ,  action ) 
		addRequestAsync ( nil ,  guid ,  path ,  icon ,  proto ,  int ( pid ) ,  ip ,  address ,  int ( port ) ,  int ( uid ) ,  int ( gid ) ,  origin ,  timestamp,   is_socks,  optstring ,  sandbox ,  action ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1255,14 +1186,15 @@ func main() {
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( createColumn ( "UID" ,  9 ) ) 
	tv . AppendColumn ( createColumn ( "UID" ,  9 ) ) 
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( createColumn ( "GID" ,  10 ) ) 
	tv . AppendColumn ( createColumn ( "GID" ,  10 ) ) 
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( createColumn ( "Origin" ,  11 ) ) 
	tv . AppendColumn ( createColumn ( "Origin" ,  11 ) ) 
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( createColumn ( "Timestamp" ,  12 ) ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						scol  :=  createColumn ( "Is SOCKS" ,  1 2 ) 
	scol  :=  createColumn ( "Is SOCKS" ,  1 3 ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						scol . SetVisible ( false ) 
	scol . SetVisible ( false ) 
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( scol ) 
	tv . AppendColumn ( scol ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( createColumn ( "Details" ,  1 3 ) ) 
	tv . AppendColumn ( createColumn ( "Details" ,  1 4 ) ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						acol  :=  createColumn ( "Scope" ,  1 4 ) 
	acol  :=  createColumn ( "Scope" ,  1 5 ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
						acol . SetVisible ( false ) 
	acol . SetVisible ( false ) 
 
			
		
	
		
		
			
				
					
						tv . AppendColumn ( acol ) 
	tv . AppendColumn ( acol )