@ -24,7 +24,7 @@ var _interpreters = []string{
"bash" ,
"bash" ,
}
}
type sandboxRule struct {
/ * type sandboxRule struct {
SrcIf net . IP
SrcIf net . IP
DstIP net . IP
DstIP net . IP
DstPort uint16
DstPort uint16
@ -33,7 +33,7 @@ type sandboxRule struct {
var sandboxRules = [ ] sandboxRule {
var sandboxRules = [ ] sandboxRule {
// { net.IP{172,16,1,42}, net.IP{140,211,166,134}, 21, false },
// { net.IP{172,16,1,42}, net.IP{140,211,166,134}, 21, false },
}
} * /
type pendingConnection interface {
type pendingConnection interface {
policy ( ) * Policy
policy ( ) * Policy
@ -47,6 +47,8 @@ type pendingConnection interface {
dstPort ( ) uint16
dstPort ( ) uint16
accept ( )
accept ( )
drop ( )
drop ( )
setPrompting ( bool )
getPrompting ( ) bool
print ( ) string
print ( ) string
}
}
@ -56,6 +58,7 @@ type pendingPkt struct {
pkt * nfqueue . NFQPacket
pkt * nfqueue . NFQPacket
pinfo * procsnitch . Info
pinfo * procsnitch . Info
optstring string
optstring string
prompting bool
}
}
func getEmptyPInfo ( ) * procsnitch . Info {
func getEmptyPInfo ( ) * procsnitch . Info {
@ -152,6 +155,14 @@ func (pp *pendingPkt) drop() {
pp . pkt . Accept ( )
pp . pkt . Accept ( )
}
}
func ( pp * pendingPkt ) getPrompting ( ) bool {
return pp . prompting
}
func ( pp * pendingPkt ) setPrompting ( val bool ) {
pp . prompting = val
}
func ( pp * pendingPkt ) print ( ) string {
func ( pp * pendingPkt ) print ( ) string {
return printPacket ( pp . pkt , pp . name , pp . pinfo )
return printPacket ( pp . pkt , pp . name , pp . pinfo )
}
}
@ -216,7 +227,7 @@ func (p *Policy) processPacket(pkt *nfqueue.NFQPacket, pinfo *procsnitch.Info, o
case FILTER_ALLOW :
case FILTER_ALLOW :
pkt . Accept ( )
pkt . Accept ( )
case FILTER_PROMPT :
case FILTER_PROMPT :
p . processPromptResult ( & pendingPkt { pol : p , name : name , pkt : pkt , pinfo : pinfo , optstring : optstr })
p . processPromptResult ( & pendingPkt { pol : p , name : name , pkt : pkt , pinfo : pinfo , optstring : optstr , prompting : false })
default :
default :
log . Warningf ( "Unexpected filter result: %d" , result )
log . Warningf ( "Unexpected filter result: %d" , result )
}
}
@ -224,19 +235,41 @@ func (p *Policy) processPacket(pkt *nfqueue.NFQPacket, pinfo *procsnitch.Info, o
func ( p * Policy ) processPromptResult ( pc pendingConnection ) {
func ( p * Policy ) processPromptResult ( pc pendingConnection ) {
p . pendingQueue = append ( p . pendingQueue , pc )
p . pendingQueue = append ( p . pendingQueue , pc )
if ! p . promptInProgress {
fmt . Println ( "processPromptResult(): p.promptInProgress = " , p . promptInProgress )
if DoMultiPrompt || ( ! DoMultiPrompt && ! p . promptInProgress ) {
p . promptInProgress = true
p . promptInProgress = true
go p . fw . dbus . prompt ( p )
go p . fw . dbus . prompt ( p )
}
}
}
}
func ( p * Policy ) nextPending ( ) pendingConnection {
func ( p * Policy ) nextPending ( ) ( pendingConnection , bool ) {
p . lock . Lock ( )
p . lock . Lock ( )
fmt . Println ( "nextPending(): len = " , len ( p . pendingQueue ) )
defer p . lock . Unlock ( )
defer p . lock . Unlock ( )
if ! DoMultiPrompt {
if len ( p . pendingQueue ) == 0 {
return nil , true
}
return p . pendingQueue [ 0 ] , false
}
if len ( p . pendingQueue ) == 0 {
if len ( p . pendingQueue ) == 0 {
return nil
return nil , true
}
}
return p . pendingQueue [ 0 ]
// for len(p.pendingQueue) != 0 {
fmt . Println ( "nextPending() loop: len = " , len ( p . pendingQueue ) )
for i := 0 ; i < len ( p . pendingQueue ) ; i ++ {
fmt . Printf ( "pendingqueue %v: %v\n" , i , p . pendingQueue [ i ] . getPrompting ( ) )
if ! p . pendingQueue [ i ] . getPrompting ( ) {
return p . pendingQueue [ i ] , false
}
}
// }
fmt . Println ( "nextPending() returning" )
return nil , false
}
}
func ( p * Policy ) removePending ( pc pendingConnection ) {
func ( p * Policy ) removePending ( pc pendingConnection ) {