2014-01-23 12:25:04 +01:00
< ? php
App :: uses ( 'AppModel' , 'Model' );
2018-07-19 11:48:22 +02:00
class Tag extends AppModel
{
public $useTable = 'tags' ;
2014-01-23 12:25:04 +01:00
2018-07-19 11:48:22 +02:00
public $displayField = 'name' ;
2014-01-23 12:25:04 +01:00
2018-07-19 11:48:22 +02:00
public $actsAs = array (
2019-02-10 13:08:12 +01:00
'SysLogLogable.SysLogLogable' => array ( // TODO Audit, logable
2018-07-19 11:48:22 +02:00
'roleModel' => 'Tag' ,
'roleKey' => 'tag_id' ,
'change' => 'full'
),
'Containable'
);
2016-08-25 11:38:37 +02:00
2018-07-19 11:48:22 +02:00
public $validate = array (
'name' => array (
'required' => array (
'rule' => array ( 'notBlank' , 'name' ),
'message' => 'This field is required.'
),
'valueNotEmpty' => array (
'rule' => array ( 'valueNotEmpty' , 'name' ),
),
'unique' => array (
'rule' => 'isUnique' ,
'message' => 'A similar name already exists.' ,
),
),
'colour' => array (
'valueNotEmpty' => array (
'rule' => array ( 'valueNotEmpty' , 'colour' ),
),
'userdefined' => array (
'rule' => 'validateColour' ,
'message' => 'Colour has to be in the RGB format (#FFFFFF)' ,
),
),
);
2016-06-04 01:08:16 +02:00
2018-07-19 11:48:22 +02:00
public $hasMany = array (
'EventTag' => array (
'className' => 'EventTag' ,
'dependent' => true
),
'TemplateTag' ,
'FavouriteTag' => array (
'dependent' => true
),
'AttributeTag' => array (
'dependent' => true
2018-12-28 12:54:51 +01:00
),
'TagCollectionTag' => array (
'dependent' => true
2018-07-19 11:48:22 +02:00
)
);
2016-06-04 01:08:16 +02:00
2018-07-19 11:48:22 +02:00
public $belongsTo = array (
'Organisation' => array (
'className' => 'Organisation' ,
'foreignKey' => 'org_id' ,
),
'User' => array (
'className' => 'User' ,
'foreignKey' => 'user_id' ,
)
);
2016-08-22 02:52:51 +02:00
2020-06-02 09:05:40 +02:00
private $tagOverrides = false ;
2018-07-19 11:48:22 +02:00
public function beforeValidate ( $options = array ())
{
parent :: beforeValidate ();
if ( ! isset ( $this -> data [ 'Tag' ][ 'org_id' ])) {
$this -> data [ 'Tag' ][ 'org_id' ] = 0 ;
}
if ( ! isset ( $this -> data [ 'Tag' ][ 'user_id' ])) {
$this -> data [ 'Tag' ][ 'user_id' ] = 0 ;
}
if ( ! isset ( $this -> data [ 'Tag' ][ 'hide_tag' ])) {
$this -> data [ 'Tag' ][ 'hide_tag' ] = Configure :: read ( 'MISP.incoming_tags_disabled_by_default' ) ? 1 : 0 ;
}
if ( ! isset ( $this -> data [ 'Tag' ][ 'exportable' ])) {
$this -> data [ 'Tag' ][ 'exportable' ] = 1 ;
}
return true ;
}
2016-12-16 15:44:10 +01:00
2018-07-19 11:48:22 +02:00
public function afterSave ( $created , $options = array ())
{
parent :: afterSave ( $created , $options );
2019-03-05 12:24:56 +01:00
$pubToZmq = Configure :: read ( 'Plugin.ZeroMQ_enable' ) && Configure :: read ( 'Plugin.ZeroMQ_tag_notifications_enable' );
$kafkaTopic = Configure :: read ( 'Plugin.Kafka_tag_notifications_topic' );
$pubToKafka = Configure :: read ( 'Plugin.Kafka_enable' ) && Configure :: read ( 'Plugin.Kafka_tag_notifications_enable' ) && ! empty ( $kafkaTopic );
if ( $pubToZmq || $pubToKafka ) {
2018-07-19 11:48:22 +02:00
$tag = $this -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => array ( 'Tag.id' => $this -> id )
));
$action = $created ? 'add' : 'edit' ;
2019-03-05 12:24:56 +01:00
if ( $pubToZmq ) {
$pubSubTool = $this -> getPubSubTool ();
$pubSubTool -> tag_save ( $tag , $action );
}
if ( $pubToKafka ) {
$kafkaPubTool = $this -> getKafkaPubTool ();
$kafkaPubTool -> publishJson ( $kafkaTopic , $tag , $action );
}
2018-07-19 11:48:22 +02:00
}
}
2016-06-04 01:08:16 +02:00
2018-07-19 11:48:22 +02:00
public function beforeDelete ( $cascade = true )
{
2019-03-05 12:24:56 +01:00
$pubToZmq = Configure :: read ( 'Plugin.ZeroMQ_enable' ) && Configure :: read ( 'Plugin.ZeroMQ_tag_notifications_enable' );
$kafkaTopic = Configure :: read ( 'Plugin.Kafka_tag_notifications_topic' );
$pubToKafka = Configure :: read ( 'Plugin.Kafka_enable' ) && Configure :: read ( 'Plugin.Kafka_tag_notifications_enable' ) && ! empty ( $kafkaTopic );
if ( $pubToZmq || $pubToKafka ) {
2018-07-19 11:48:22 +02:00
if ( ! empty ( $this -> id )) {
$tag = $this -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => array ( 'Tag.id' => $this -> id )
));
2019-03-05 12:24:56 +01:00
if ( $pubToZmq ) {
$pubSubTool = $this -> getPubSubTool ();
$pubSubTool -> tag_save ( $tag , 'delete' );
}
if ( $pubToKafka ) {
$kafkaPubTool = $this -> getKafkaPubTool ();
$kafkaPubTool -> publishJson ( $kafkaTopic , $tag , 'delete' );
}
2018-07-19 11:48:22 +02:00
}
}
}
2018-01-26 19:27:27 +01:00
2020-06-02 09:05:40 +02:00
public function afterFind ( $results , $primary = false )
{
$results = $this -> checkForOverride ( $results );
return $results ;
}
2018-07-19 11:48:22 +02:00
public function validateColour ( $fields )
{
if ( ! preg_match ( '/^#[0-9a-f]{6}$/i' , $fields [ 'colour' ])) {
return false ;
}
return true ;
}
2018-01-26 19:27:27 +01:00
2018-07-19 11:48:22 +02:00
public function lookupTagIdFromName ( $tagName )
{
$tagId = $this -> find ( 'first' , array (
'conditions' => array ( 'LOWER(Tag.name)' => strtolower ( $tagName )),
'recursive' => - 1 ,
'fields' => array ( 'Tag.id' )
));
if ( empty ( $tagId )) {
return - 1 ;
} else {
return $tagId [ 'Tag' ][ 'id' ];
}
}
2016-06-04 01:08:16 +02:00
2020-08-05 22:39:17 +02:00
public function fetchUsableTags ( array $user )
2020-07-28 10:58:05 +02:00
{
$conditions = array ();
if ( ! $user [ 'Role' ][ 'perm_site_admin' ]) {
2020-08-05 22:39:17 +02:00
$conditions [ 'Tag.org_id' ] = array ( 0 , $user [ 'User' ][ 'org_id' ]);
$conditions [ 'Tag.user_id' ] = array ( 0 , $user [ 'User' ][ 'id' ]);
2020-07-28 10:58:05 +02:00
$conditions [ 'Tag.hide_tag' ] = 0 ;
}
2020-08-05 22:39:17 +02:00
return $this -> find ( 'all' , array ( 'conditions' => $conditions , 'recursive' => - 1 ));
2020-07-28 10:58:05 +02:00
}
2018-07-19 11:48:22 +02:00
// find all of the tag ids that belong to the accepted tag names and the rejected tag names
public function fetchTagIdsFromFilter ( $accept = array (), $reject = array ())
{
$results = array ( 0 => array (), 1 => array ());
if ( ! empty ( $accept )) {
foreach ( $accept as $tag ) {
$temp = $this -> lookupTagIdFromName ( $tag );
if ( ! in_array ( $temp , $results [ 0 ])) {
$results [ 0 ][] = $temp ;
}
}
}
if ( ! empty ( $reject )) {
foreach ( $reject as $tag ) {
$temp = $this -> lookupTagIdFromName ( $tag );
if ( ! in_array ( $temp , $results [ 1 ])) {
$results [ 1 ][] = $temp ;
}
}
}
return $results ;
}
2017-11-19 21:21:32 +01:00
2018-07-19 11:48:22 +02:00
// find all of the event Ids that belong to the accepted tags and the rejected tags
public function fetchEventTagIds ( $accept = array (), $reject = array ())
{
$acceptIds = array ();
$rejectIds = array ();
if ( ! empty ( $accept )) {
$acceptIds = $this -> findEventIdsByTagNames ( $accept );
if ( empty ( $acceptIds )) {
$acceptIds [] = - 1 ;
}
}
if ( ! empty ( $reject )) {
$rejectIds = $this -> findEventIdsByTagNames ( $reject );
}
return array ( $acceptIds , $rejectIds );
}
2017-11-19 21:21:32 +01:00
2019-05-23 11:25:29 +02:00
// find all of the tag Ids that belong to the accepted tags and the rejected tags
public function fetchTagIdsSimple ( $tags = array ())
{
$results = array ();
if ( ! empty ( $tags )) {
$results = $this -> findTagIdsByTagNames ( $tags );
if ( empty ( $results )) {
$results [] = - 1 ;
}
}
return $results ;
}
2018-08-01 17:00:14 +02:00
// find all of the tag Ids that belong to the accepted tags and the rejected tags
public function fetchTagIds ( $accept = array (), $reject = array ())
{
$acceptIds = array ();
$rejectIds = array ();
if ( ! empty ( $accept )) {
$acceptIds = $this -> findTagIdsByTagNames ( $accept );
if ( empty ( $acceptIds )) {
$acceptIds [] = - 1 ;
}
}
if ( ! empty ( $reject )) {
$rejectIds = $this -> findTagIdsByTagNames ( $reject );
}
return array ( $acceptIds , $rejectIds );
}
// pass a list of tag names to receive a list of matched tag IDs
public function findTagIdsByTagNames ( $array )
{
$ids = array ();
2018-08-09 15:11:57 +02:00
$tag_ids = array ();
2018-08-21 16:05:36 +02:00
if ( ! is_array ( $array )) {
2018-11-23 14:11:33 +01:00
$array = array ( $array );
2018-08-21 16:05:36 +02:00
}
2018-08-09 15:11:57 +02:00
foreach ( $array as $k => $tag ) {
if ( is_numeric ( $tag )) {
$tag_ids [] = $tag ;
unset ( $array [ $k ]);
}
2018-08-01 17:00:14 +02:00
}
2018-08-09 15:11:57 +02:00
$array = array_values ( $array );
if ( ! empty ( $array )) {
foreach ( $array as $a ) {
new: [related tags] View the related tags of attributes on the event view (via a toggle)
,,.,,+zznzzzzzzzzzzzzzzzzzzzzzzzzzzxMMMMMMMMMMMMMMMMMMMMMxMxMMWMMMWMMz*ii****iiiiiiiii**iiii,....
,,.,,#zzzzzzzzzzzzzzzzzzzzzzzznxMMMMMWMMMMMMMMMMMMMMMMMMxMxMMMWWWWWWWWx+*iii*iiiiiiiii*iiiii,,,..
,,,,,#zzzzzzzzzzzzzzzzzzzzzzznMWWMMMMMMMMMMMMMMMMMMMMMMMWWMxnnzxxMWWWWMn*iiiiiiiiiiiiiiiiiii..,..
,,,,,#znzzzzzzzzzzzzzzzzzzzznMMMMMMWWWWMMMMMMMMMMMMMMMMWWWMMMxnxxxxMMMMW#*iiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzzzznMMMMMMMMMWMMMMMMMMMMMMMMMMMMMMWxMMMMMMxxxxnxxz*iiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzzzzxMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWMWWWWMWMMMxxxni*iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzzznMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWMMWWMWMMWWWMMMni*iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzzzxWMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMWMMMMMMWMWWMMMMMz*iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznzzznMMMMMMMMMMMWMMMMMMMMMMMMMMMMMMMMMMMMWWWWMMMMMMMMMWn*iiiiiiiiiiii*i,.,.,
,,.,,#zzzzzzzzzzzzzzznzzzxMMMMMMMMMMMWMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWMMMMMWWM+*iiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzznzzznzznMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMWWWWWWWWWWWWWMMWWn*iiiiiiiiii*i,.,.,
,,.,,#zzzzzzzzzzznzzzznzxMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMMWWWWMMWWWWWMMMM**iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzznMMMMMMMMMMMMMWMMMMMWMMMMMMMMMMMMMMWWWWWMMMMMMMMWWWWWMWM#iiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzxMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWMMMMMMMWWWWMzi*iiiiiiii*i,.,.,
,,.,,#zzzzzzzzzzzzzzzzzMMMMMMMMMMMMMMMWMnzxMMMMMMMMMMMMMWWWWWWWWWWWWMMMMMMMWWWWni*iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzWMMMMMMMMMMMMMMMnnzznxMWMMMMMMMMMMWWWWWWWWWWWWWWWWWMMWWMn**iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzMMMMMMMMMMMWMMMMzz#+#znxMWMMMMMMMMMMMMMWWWWWWWWWWWWWMWWMn**iiiiiiii*i,.,,,
,,.,,#zzzzzzzzzzzzzzzzzxMMMMMMMMMMMMMMxz#*i**+zznMMMMMMMMMMMMMMMWWWWWWWMWWWWWWWx**iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzxMMMMMMMMMMWWMMn#*iii*i*+znxMWMMMMMMMMMMMMWWWWWMMMMMMMMMM+*iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzznMWMMMMMMMMMMMMn#*iiii*i*i+#znMMWWMMMMMWMWMMWWWMMMMMMMMWWx+iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzMMMMMMMMMMMMMx#i*iii**iiii*#znxMWMMMMMMMMMMMWWMMMMWWWWWWniiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznzMMMMMMMMMMMMxn+ii**i**iiii*i*zznMMMMMMMMMMMMMMMMMxMWWWMMx*iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznnMMMMMMMMMMMMxz*ii*iiiiiiiii:;*+znMWMMMMMMMMMMMMMMMMMWWWMx**iiiiiiii*i,.,,.
,,.,,#zzzzzzzzzzzzzzzznMMMMMMMMMMMMMn+ii*iiiii**;;:.:i*zznxMMMMMMMMMMMMMMWWWWWWni*ii**iiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzxMMMMMMMMMMMMMn*ii*iii*i;:,.,..,.,;+znxxMMMMMMMMMMMMMMWWWziiii**iiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznxMMMMMMMMMMMMxzi*ii*ii*;,,,,,,,,,,,,:i*i#znnnxMWWMMMMMMMWn*iii*iiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznxMMMMMMMMMMMMz*i*i*i*;:,.,,,,,,,,,,,,.,,,;i*#zznxMMMMMMWWM+iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznMMMWMMMMMMMMx#iii*i*i:.,.,,,.,.,,,,,,,,,,,,,,;i#znxMMMMMWM+iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznMMMWMMMMMMMMx#iiiiii:.,,.,,.......,,,,..,,,,,,,,iznxMMMMWM*iiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznMMMMMMMMMMMMx#ii*ii:.,,,,,,..........,.....,,,,,,:*#MMMMWxi*iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzMMMMMMMMMMMMn+i*i;:,.,,,......,.............,....,,;xMMMWniiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznzzMMMMMMMMMWMn+iiii;,,,,,,.,..........,....,.,...,,,,.zMMMMxiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznznMMMMMMMMMMnz*iiii:,,,,,,,,,,,,................,,,...zMMMMzi*iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznznMMMMMMMMMxzz**ii;..,,,.,,,,,,.................,,,...nMMMM#**iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznzzMMMMMMMWxzzz+iii:.,,,,.,,,,,....,............,,,,..,nMMWx*iiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznznMMMMMMMWnzzzn+i*,...,,..,,,.,..,.,...,........,,,.,;MWMM+iiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznMMMMMMMWnzzzzzzii*++++z+;,,,.,,,,,,,,,...,.....,...;MWMxii**iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznMMMMMMMWnzzznzzzzznnnzzzn#i,,,.,...................,MWM#iii*iiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzxMMMMMMMMzz+#znzznznMWWMMWMx#i:,,,,,,,,,,,,,,.,,..,,:MMx*iiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzxMMMMMMMxzz**#znMMnnxxxxxMWWWMnz;,,,,,.,.,,,,,,,,,,,,MMziiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzMMMMxMMMnzz*ii#nWWWWMWWnMMMWWWWWn*,,;i;i;**+#zzz+i,,,Mx*iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzMMMMMMMxzzzi*;,+xWWMnxMnx+xMWWMWWn,.,znMMMxxMMMMxni:*Mziiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzznxnxMMMMxznziii.,:+nxiinn*.iMMMWMM+,,.*WWWWWWM#:,:#z##M*iiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzznzznxzMWMMMxznziii,..,+#n:,:,,,izzMM#;,,,+WWWWWzxn+i,:zzzMi**iiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzznzznnzxMMMMxzz#ii;,,,,:**++i::,:::zx;,,,,#MM#zxxMznWx#+izxiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzxnzMWMMMnzzz*i:.,,,,,,,i;i;,,.,*n,,,,,+#+::#n*,#xni,,zniiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzxnzMMMMWnzzz**;..,,,.,..,;,,,,,;n,.,,:*;,:::,,,:*,.,,n#i*iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzznxzMWMMMnzzz**i,..,,.,,,,,,,,,,+#,...,i,.,;**++*:.,,:x***iiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzznzznnxWWMxnzzzz+*i,,,,,.,,,,,,,,,:z;,,..,:..,,,,::.,..,;xi*iiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzznxxxzzzzzz+ii,...,.,,,,,,.,,+zi.,,.,,.,,.,,..,,,,,++iiiiiiiiiiiiiiii*i,.,,.
,,.,,#zzzzzzzzzzzzzzzzzznMzzzznz#ii:.,.,..,,,,,,,izn:,..,.,,..,...,,.,,,#*iiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzznxzzzzzz#ii;.,.,..,,,,.,:zzz,,..,,,,.,...,,,,,,:+*iiiiiiiiiiiiiiii*i,.,,.
,,.,,#zzzzzzzzzzzzzzzznzxxzzzznzz*i;..,,,.,,,,..;zz*..,.,,,,........,.,**iiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzznzxMnzzznzz*ii,.,,,,,,,,,,ii:,,,,,,,,,,,,,,.,,.,;+*iiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzxMzzzzzzz**i,,.,..,,,,,;*:*,,,.,,...,,,,,,.,,,**iiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzzzzzMMnnzzzzz*ii:.,,,,,,..,#nnn#+,,,,,..,,....,.,i+i*iiiiiiiiiiiiiiiii*i,.,,.
,,.,,#zzzzzzzzzzzznzznnzMMnxzzzzz**i;.,,,,.,,.,zxWWWxi,,,:*,,,..,.,,,#**iiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzzznM+WMxxzzzzz***;..,,,,,,..;xWWWWn+**#;,,,,.,,,.i#*iiiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzznW#zWMxnnzzzz*iii,.,,,,,,,,,+nWMWWWMx+,,,,,.,,,,++i*iiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzznMM,zWMMnnzzz#*ii*;.,,,,,,::iznxMMWWWWn#;,,.,,,,*#**iiiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzzzzMWz,zMMMxxznn#*ii*i::;i++#zznxWxxxWWWxxxzi,.,,,,#+iiiiiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzznMWW#,#MMMMMnznz*ii**izzzzzzxMMWWnxM@WMMMMzzi,.,,+*+iiiiiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzznMWWW#,*xMMMMnznz*iiii+MnnnnnxMWWWxxMxMxMxxxnz*,,,*+*iiii**iiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzzzMWWWW#;;zMMMMMnnz#*i*#MWxxxxxMWMxMMxMxMWWWWxMzn;.i:#*iiii**iiiiiiiiiiiiiii*i,.,..
,,,,,#zzzzzznnzxWWWWW#:;+MMMMMxzzz#*zzxWMWMWxMWWMMWWMMWWWWMxxMn:,*:#iiiiiiiiiiiiiiiiiiiiii*i,.,..
,,.,,#zzzzzzzzxWWWWWWz::inMMMMMxznzzzzznxMMMxxxMMxxxzxMWWWMMWWx:ii+*iiiiiiiiiiiiiiiiiiiiii*i,.,..
....,#zzzzzzznWWWWWWWz;,;+MMMMMMxzzzzzzzzznz#**i;::,,:;#nxxWMM+;*;+*iiiiiiiiiiiiiiiiiiiiii*i,.,..
...,,#zzzzzznMWWWWWWWni,,*nWMMMMMxnzzzzzzzz#i*i,,,,:,,,,:+#z##i#+#*iiiiiiiiiiiiiiiiiiiiiii*i,.,..
...,,#zzznnnxWWWWWWWWx*,.i+MMMMMMMMxxnzz#+****i,i**#z+;,:*iiii*zz+*iiiiiiiiiiiiiiiiiiiiiii*i,.,..
,,,,,#nzzzxMMWWWWWWWWW*;.:*#WMMMMMMMMxz+**iiiii;*++####:;i****zz#*iiiiiiiiiiiiiiiiiiiiiiii*i,.,,.
,,,,,#zznMWxWWWWWWWWWWz;,.;*nWMMMMMMMMnz#ii:.....,,,,,,,,ii*+zzz*ii**iiiiiiiiiiiiiiiiiiiii*i,.,..
,,,,,#nxWWMxWWWWWWWWWWW;:,,*+xMMMMMMMMMxnz*:.,,,,,..,,,,,,i#nnx+i*i*iiiiiiiiiiiiiiiiiiiiii*i,.,..
,,,,,zWWWWMxWWWWWWWWWWW*;,.,*+MMMMMMWMMWMx#*:,,,,....,,,,:#nMM#+*ii*iiiiiiiiiiiiiiiiiiiiii*i,.,..
,,,,,xWWWWxWWWWWWWWWWWWx::,,:;+MMMMMMWMWMMnz+:....,,.,,,,+MWMM*#z+*iiiiiiii**iiiiiiiiiiiii*i,.,..
,,,,,xWWWMxWWWWWWWWWWWWW+:,,,;:+MMMMMMMMMMMxnz*;,,:,,,i+#xM++W#+nz#iii*iiiiiiiiiiiiiiiiiii*i,.,..
,,,,,xWWWMMWWWWWWWWWWWWWx,,..,;,*xWMMMMMMMWMWxnn####+##nxx#,+Wx*nznz:i**iiiiiiiiiiiiiiiiii*i,.,..
,,.,,xWWWxMWWWWWWWWWWWWWWi.,,,,:,*#MMMMMMMMMMWMMxxxxxxxMnn,.zWM#;zzMn;*i*iiiiiiiiiiiiiiiii*i,.,..
,..,,xWWWxWWWWWWWWWWWWWWWx,,,,,,:,;+MMWMMMMWWWWWWWMMMMMxn:..nWWni+nzMn#niii**iiiiiiiiiiiii*i,.,..
,..,,xWWMxWWWWWWWWWWWWWWWWi,,,,.,:,,;xWMMMMMMMMMMMMMMxnni...xMWxz;znnMxxM#;i*i**iiiiiiiiii*i,.,..
,..,,xWWMMWWWWWWWWWWWWWWWWz.,,...::,,;zWMMMMMMMMMMMMnzzi,,,,MMMMx*innxMxxWx+iiii**iiiiiiii*i,.,..
,..,,xWWMMWWWWWWWWWWWWWWWWM:,,...,:,,,,+xWMMMMMMMMxnnzi,.,,,MMMMMzinxMxMxxMMM#;i**iiiiiiii*i,.,..
,..,,xWWxWWWWWWWWWWWWWWWWWW*.,.,.,,:,,.,i+xWWMMMMxnnni,,,,,.WMMMMMz#nMMxMMMMMWxi;i*iiii*ii*i,,,..
,..,,xWWxWWWWWWWWWWWWWWWWWWz.,,,,.,,:,,,,::#@WMMxnnn;..,,.,:WMWMMMMznxWxxWMMMMMM#;iiiiiiii*i,,,..
,..,.nWMMWWWWWWWWWWWWWWWWWWM,.,,,...,,..,.,.iMWMxnz:.,.,,.,;WMWMMMMnzxMMxMMMMMMWMxi;i*iii*ii..,..
,..,,nWWMMWWWWWWWWWWWWWWWWWWi,,,....,.,,.,,,,:nxxz:,.,,,...iWMWMMMWMznMMMxMMMMMMMMMzi;i**iii..,.,
,..,,xWWWMMWWWWWWWWWWWWWWWWW#:.....,....,.,,..:#+,..,,,....:WWMMMMMMxnnMMMxWMMMMMMMWM#;;*i*i,.,..
,..,,xWWWWWMMWWWWWWWWWWWWWWWxi:..,.......,,,,..;;,...,,...,,@WMMMMMMMxzxMMxxMMWMMMMMMWx+;iii,,,..
,..,,xWWWWWWMMMWWWWWWWWWWWWWM*i,,,,......,,,,,;MWx+,..,,,..,@WMMMMMMMMnzxxnMMMMMMMMMMMWWx+ii,,,,.
,..,,xWWWWWWWMxWWWWWWWWWWWWWW+*;,,,,.....,,.,,xWWW@n:.,,,,.,WWMMMMMMMMMnnnMMMMMMMMMMMMWMWMxz,,,..
,..,,xWWWWWWWWMxWWWWWWWWWWWWWzi*;,,,,.....,,,nWMMMWWM:.,,,..MWMMMWMMMMMMnMMMMMMMMMMMMMMMMMMx,.,.,
,..,,xWWWWWWWWMxWWWWWWWWWWWWWMiii;,,.,,...,.zWWWWWWWWn,.....zWMMMMMMMMMMMxMMMMMMMMMMMMMMMMMx,,,..
,..,,xWWWWWWWWMWWWWWWWWWWWWWWWiii*;,,,,,,.,z@WWWWWWWWW*,..,,zWMMMMMMMMMMMMnMMMMMMMMMMMMMMMMx,,,..
,..,,xWWWWWWWMWWWWWWWWWWWWWWW@+,;ii:,,.,,,zWWWWWWWWWWWM:.,,,#WMMMMMMMMMMMMxnMMWMMMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWz,.;i*:...,ixWWWWWWWWWMMW+,,,.+WMMMMMMMMMMMMMxxMWWMMMMMMMMMMMx,,,..
,..,.xWWWWWWWWWWWWWWWWWWWWWWWWM,,,iii,,,;i+WWWWWWWWW#+xx;,,.+WWMMMMMMMMMMMWMxxMMMMMMMMMMMMMx,,,,,
,..,.xWWWMWWWWWWWWWWWWWWWWWWWWW;.,:iii,:ii*xWWWWWWWW+i*Mz,.,*WWMMMMMMMMMMMMWMxnMMMMMMMMMMMMx,,,..
,..,.xWWWMWWWWWWWWWWWWWWWWWWWWWz.,.;i*iiiiinWWWWWWWW*i*+z*.,iWWMMMMMMMMMMMMMMMxxMMMMMMMMMMMx,,,..
,..,.xWWWMMWWWWWWWWWWWWWWWWWWWWx,,,.i***;:i#WWWWWWWMi*ii*zi,;WWMMMMMMMMMMMMMMMMxMMMMMMMMMMMx,,,,.
,..,,xWWWWMMWWWWWWWWWWWWWWWWWWWW;,,.:*ii,,i+WWWWWWWM::iiiizi:WWMMMMMMMMMMMMMMMMMMMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWW+,,,.,i,,,;*WWWWWWWx:.:iii*z*MWMMMMMMMMMMMMMMMMMWMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWWn,,,,...,,:*MWWWWWWn:..;ii**xWWMMMMMMMMMMMMMMMMWWMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWWW:.,.,,,.,,iMWWWWWWz,.,,i*i*nWWMMMMMMMMMMMMMMMWWMMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWW@*..,,,..,,ixWWWWWWz..,.,i*inWWMMMMMMMMMMMMMMMWWMMMMMMMMMMMx,,,,.
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWWWn,.,,,,,,,;n@WWWWWn..,,,:*izWWMMMMMMMMMMMMMMWWWWMMMMMMMMMMx,,,..
,..,,xWWWWWWWWWWWWWWWWWWWWWWWWWWWM:.,,,....:xWWWWWWM,,,,,.:izMWMMMMMMMMMMMMMMMWWMMMMMMMMMMMx,,,..
,..,,nMWWWWWWWWWWWWWWWWWWWWWMWWWWM#*********MWWWWWWW+*******nMWMMMMMMMMMMMMMMMMMMMMMMMMMMMMx,,,..
,..,,nMWWMMMMMMMMMMMMMMMMWWMMMMMWMMMWWMMMWWMMMMMMMMMMMMWWMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx,,,..
2018-10-11 17:37:58 +02:00
$conditions [ 'OR' ][] = array ( 'Tag.name like' => $a );
2018-08-09 15:11:57 +02:00
}
$params = array (
'recursive' => 1 ,
'conditions' => $conditions ,
'fields' => array ( 'Tag.id' , 'Tag.id' )
);
$result = $this -> find ( 'list' , $params );
$tag_ids = array_merge ( $result , $tag_ids );
}
return array_values ( $tag_ids );
2018-08-01 17:00:14 +02:00
}
2018-07-19 11:48:22 +02:00
public function findEventIdsByTagNames ( $array )
{
$ids = array ();
foreach ( $array as $a ) {
2018-08-09 15:11:57 +02:00
if ( is_numeric ( $a )) {
2018-08-20 10:50:09 +02:00
$conditions [ 'OR' ][] = array ( 'id' => $a );
2018-08-09 15:11:57 +02:00
} else {
$conditions [ 'OR' ][] = array ( 'LOWER(name) like' => strtolower ( $a ));
}
2018-07-19 11:48:22 +02:00
}
$params = array (
'recursive' => 1 ,
'contain' => 'EventTag' ,
'conditions' => $conditions
);
$result = $this -> find ( 'all' , $params );
foreach ( $result as $tag ) {
foreach ( $tag [ 'EventTag' ] as $eventTag ) {
$ids [] = $eventTag [ 'event_id' ];
}
}
return $ids ;
}
2016-06-04 01:08:16 +02:00
2018-07-19 11:48:22 +02:00
public function findAttributeIdsByAttributeTagNames ( $array )
{
$ids = array ();
foreach ( $array as $a ) {
$conditions [ 'OR' ][] = array ( 'LOWER(name) LIKE' => strtolower ( $a ));
}
$params = array (
'recursive' => 1 ,
'contain' => 'AttributeTag' ,
'conditions' => $conditions
);
$result = $this -> find ( 'all' , $params );
foreach ( $result as $tag ) {
foreach ( $tag [ 'AttributeTag' ] as $attributeTag ) {
$ids [] = $attributeTag [ 'attribute_id' ];
}
}
return $ids ;
}
2016-06-04 01:08:16 +02:00
2020-02-18 20:11:54 +01:00
public function captureTag ( $tag , $user , $force = false )
2018-07-19 11:48:22 +02:00
{
$existingTag = $this -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => array ( 'LOWER(name)' => strtolower ( $tag [ 'name' ]))
));
if ( empty ( $existingTag )) {
2020-02-18 20:11:54 +01:00
if ( $force || $user [ 'Role' ][ 'perm_tag_editor' ]) {
2018-07-19 11:48:22 +02:00
$this -> create ();
if ( ! isset ( $tag [ 'colour' ]) || empty ( $tag [ 'colour' ])) {
$tag [ 'colour' ] = $this -> random_color ();
}
$tag = array (
'name' => $tag [ 'name' ],
'colour' => $tag [ 'colour' ],
'exportable' => isset ( $tag [ 'exportable' ]) ? $tag [ 'exportable' ] : 1 ,
'org_id' => 0 ,
'user_id' => 0 ,
'hide_tag' => Configure :: read ( 'MISP.incoming_tags_disabled_by_default' ) ? 1 : 0
);
$this -> save ( $tag );
return $this -> id ;
} else {
return false ;
}
} else {
if (
! $user [ 'Role' ][ 'perm_site_admin' ] &&
2019-11-06 21:17:53 +01:00
(
(
$existingTag [ 'Tag' ][ 'org_id' ] != 0 &&
$existingTag [ 'Tag' ][ 'org_id' ] != $user [ 'org_id' ]
) ||
(
$existingTag [ 'Tag' ][ 'user_id' ] != 0 &&
$existingTag [ 'Tag' ][ 'user_id' ] != $user [ 'id' ]
)
)
2018-07-19 11:48:22 +02:00
) {
return false ;
}
}
return $existingTag [ 'Tag' ][ 'id' ];
}
2016-09-29 16:52:40 +02:00
2018-07-19 11:48:22 +02:00
// find all tags that belong to a given eventId
public function findEventTags ( $eventId )
{
$tags = array ();
$params = array (
'recursive' => 1 ,
'contain' => 'EventTag' ,
);
$result = $this -> find ( 'all' , $params );
foreach ( $result as $tag ) {
foreach ( $tag [ 'EventTag' ] as $eventTag ) {
if ( $eventTag [ 'event_id' ] == $eventId ) {
$tags [] = $tag [ 'Tag' ];
}
}
}
return $tags ;
}
2015-08-31 12:55:42 +02:00
2018-07-19 11:48:22 +02:00
public function random_color ()
{
$colour = '#' ;
for ( $i = 0 ; $i < 3 ; $i ++ ) {
$colour .= str_pad ( dechex ( mt_rand ( 0 , 255 )), 2 , '0' , STR_PAD_LEFT );
}
return $colour ;
}
2016-06-04 01:08:16 +02:00
2019-08-23 11:30:27 +02:00
public function quickAdd ( $name , $colour = false , $numerical_value = null )
2018-07-19 11:48:22 +02:00
{
$this -> create ();
if ( $colour === false ) {
$colour = $this -> random_color ();
}
$data = array (
'name' => $name ,
'colour' => $colour ,
'exportable' => 1
);
2019-08-23 11:30:27 +02:00
if ( ! is_null ( $numerical_value )) {
$data [ 'numerical_value' ] = $numerical_value ;
}
2018-07-19 11:48:22 +02:00
return ( $this -> save ( $data ));
}
2016-06-04 01:08:16 +02:00
2019-08-23 11:30:27 +02:00
public function quickEdit ( $tag , $name , $colour , $hide = false , $numerical_value = null )
2018-07-19 11:48:22 +02:00
{
2019-08-23 11:30:27 +02:00
if ( $tag [ 'Tag' ][ 'colour' ] !== $colour || $tag [ 'Tag' ][ 'name' ] !== $name || $hide !== false || $tag [ 'Tag' ][ 'numerical_value' ] !== $numerical_value ) {
2018-07-19 11:48:22 +02:00
$tag [ 'Tag' ][ 'name' ] = $name ;
$tag [ 'Tag' ][ 'colour' ] = $colour ;
if ( $hide !== false ) {
$tag [ 'Tag' ][ 'hide_tag' ] = $hide ;
}
2019-08-23 11:30:27 +02:00
if ( ! is_null ( $numerical_value )) {
$tag [ 'Tag' ][ 'numerical_value' ] = $numerical_value ;
}
2018-07-19 11:48:22 +02:00
return ( $this -> save ( $tag [ 'Tag' ]));
}
return true ;
}
2016-06-04 01:08:16 +02:00
2018-07-19 11:48:22 +02:00
public function disableTags ( $tags )
{
foreach ( $tags as $k => $v ) {
$tags [ $k ][ 'Tag' ][ 'hide_tag' ] = 1 ;
}
return ( $this -> saveAll ( $tags ));
}
2016-06-04 01:08:16 +02:00
2020-06-02 09:05:40 +02:00
/**
* Recover user_id from the session and override numerical_values from userSetting
*/
public function checkForOverride ( $tags )
{
2020-06-04 13:30:28 +02:00
$userId = Configure :: read ( 'CurrentUserId' );
2020-06-02 09:05:40 +02:00
if ( $this -> tagOverrides === false && $userId > 0 ) {
2020-07-28 16:10:31 +02:00
$this -> UserSetting = ClassRegistry :: init ( 'UserSetting' );
2020-06-02 09:05:40 +02:00
$this -> tagOverrides = $this -> UserSetting -> getTagNumericalValueOverride ( $userId );
}
foreach ( $tags as $k => $tag ) {
if ( isset ( $tag [ 'Tag' ][ 'name' ])) {
$tagName = $tag [ 'Tag' ][ 'name' ];
if ( isset ( $this -> tagOverrides [ $tagName ]) && is_numeric ( $this -> tagOverrides [ $tagName ])) {
2020-06-29 10:14:44 +02:00
$tags [ $k ][ 'Tag' ][ 'original_numerical_value' ] = isset ( $tags [ $k ][ 'Tag' ][ 'numerical_value' ]) ? $tags [ $k ][ 'Tag' ][ 'numerical_value' ] : '' ;
2020-06-02 09:05:40 +02:00
$tags [ $k ][ 'Tag' ][ 'numerical_value' ] = $this -> tagOverrides [ $tagName ];
}
}
}
return $tags ;
}
2019-12-12 10:07:50 +01:00
public function getTagsByName ( $tag_names , $containTagConnectors = true )
{
$contain = array ( 'EventTag' , 'AttributeTag' );
$tag_params = array (
'recursive' => - 1 ,
'conditions' => array ( 'name' => $tag_names )
);
if ( $containTagConnectors ) {
$tag_params [ 'contain' ] = $contain ;
}
$tags_temp = $this -> find ( 'all' , $tag_params );
$tags = array ();
foreach ( $tags_temp as $temp ) {
$tags [ strtoupper ( $temp [ 'Tag' ][ 'name' ])] = $temp ;
}
return $tags ;
}
2019-02-25 22:53:31 +01:00
public function getTagsForNamespace ( $namespace , $containTagConnectors = true )
2018-07-19 11:48:22 +02:00
{
2019-02-25 22:53:31 +01:00
2019-12-12 10:07:50 +01:00
$contain = array ( 'EventTag' , 'AttributeTag' );
2019-02-25 22:53:31 +01:00
$tag_params = array (
2018-07-19 11:48:22 +02:00
'recursive' => - 1 ,
'conditions' => array ( 'UPPER(name) LIKE' => strtoupper ( $namespace ) . '%' ),
2019-02-25 22:53:31 +01:00
);
if ( $containTagConnectors ) {
$tag_params [ 'contain' ] = $contain ;
}
$tags_temp = $this -> find ( 'all' , $tag_params );
2018-07-19 11:48:22 +02:00
$tags = array ();
foreach ( $tags_temp as $temp ) {
$tags [ strtoupper ( $temp [ 'Tag' ][ 'name' ])] = $temp ;
}
return $tags ;
}
2017-04-14 17:10:47 +02:00
2018-07-19 11:48:22 +02:00
public function fetchSimpleEventsForTag ( $id , $user , $useTagName = false )
{
if ( $useTagName ) {
$tag = $this -> find ( 'first' , array (
'recursive' => - 1 ,
'fields' => array ( 'Tag.id' ),
'conditions' => array ( 'Tag.name' => $id )
));
if ( empty ( $tag )) {
return array ();
}
$id = $tag [ 'Tag' ][ 'id' ];
}
$event_ids = $this -> EventTag -> find ( 'list' , array (
'recursive' => - 1 ,
'conditions' => array ( 'EventTag.tag_id' => $id ),
'fields' => array ( 'EventTag.event_id' , 'EventTag.event_id' ),
'order' => array ( 'EventTag.event_id' )
));
$params = array ( 'conditions' => array ( 'Event.id' => array_values ( $event_ids )));
$events = $this -> EventTag -> Event -> fetchSimpleEvents ( $user , $params , true );
foreach ( $events as $k => $event ) {
$event [ 'Event' ][ 'Orgc' ] = $event [ 'Orgc' ];
$events [ $k ] = $event [ 'Event' ];
}
return $events ;
}
2019-01-31 10:54:11 +01:00
public function fixMitreTags ( $user )
{
$full_print_buffer = '' ;
$this -> GalaxyCluster = Classregistry :: init ( 'GalaxyCluster' );
// first find all tags that are the bad tags:
// - the enterprise-, pre- and mobile-attack
// - the old version of the MITRE tag (without Txx, Pxx, ...)
$mitre_categories = array ( 'attack-pattern' , 'course-of-action' , 'intrusion-set' , 'malware' , 'mitre-tool' );
$mitre_stages = array ( 'enterprise-attack' , 'pre-attack' , 'mobile-attack' );
2019-02-25 22:53:31 +01:00
$cluster_names = $this -> GalaxyCluster -> find ( 'list' ,
array ( 'fields' => array ( 'GalaxyCluster.tag_name' ),
2019-01-31 10:54:11 +01:00
'group' => array ( 'GalaxyCluster.id' , 'GalaxyCluster.tag_name' ),
'conditions' => array ( 'GalaxyCluster.tag_name LIKE' => 'misp-galaxy:mitre-%' )
));
// this is a mapping to keep track of what old tag we need to change (key) to what new tag(value)
// key = old_tag_id, value = new_tag_name
$mappings = array ();
// First find all tags which are the old format, but who's string needs to be updated
2019-02-25 22:53:31 +01:00
// Example: mitre-malware="XAgentOSX" => mitre-malware="XAgentOSX - S0161"
2019-01-31 10:54:11 +01:00
// Once found we will add these to a mapping
foreach ( $mitre_categories as $category ) {
$tag_start = 'misp-galaxy:mitre-' . $category ;
// print("<h2>### Searching for $category</h2>");
$tags = $this -> find ( 'all' , array (
'conditions' => array ( 'Tag.name LIKE' => $tag_start . '=%' ),
'recursive' => - 1 ));
// print_r($tags);
foreach ( $tags as $tag ) {
$old_tag_name = $tag [ 'Tag' ][ 'name' ];
$old_tag_id = $tag [ 'Tag' ][ 'id' ];
$old_tag_name_without_quote = rtrim ( $old_tag_name , '"' ) . ' -' ;
foreach ( $cluster_names as $cluster_name ) {
// print("Searching for $old_tag_name in $cluster_name<br>");
if ( strstr ( $cluster_name , $old_tag_name_without_quote )) {
// print("FOUND - $old_tag_name - $cluster_name<br/>");
$mappings [ $old_tag_id ] = $cluster_name ;
break ;
}
}
}
}
// Now find all tags that are from the enterprise, pre-attack and mobile-attack galaxies
foreach ( $mitre_stages as $stage ) {
foreach ( $mitre_categories as $category ) {
$tag_start = 'misp-galaxy:mitre-' . $stage . '-' . $category ;
// print("<h2>### Searching for $stage-$category</h2>");
$tags = $this -> find ( 'all' , array (
'conditions' => array ( 'Tag.name LIKE' => $tag_start . '=%' ),
'recursive' => - 1 ));
// print_r($tags);
foreach ( $tags as $tag ) {
$old_tag_name = $tag [ 'Tag' ][ 'name' ];
$old_tag_id = $tag [ 'Tag' ][ 'id' ];
$new_tag_name = str_replace ( $stage . '-' , '' , $old_tag_name );
// print("Changing $old_tag_name to $new_tag_name<br/>");
if ( in_array ( $new_tag_name , $cluster_names )) {
// valid tag as it exists in the galaxies, add to mapping
$mappings [ $old_tag_id ] = $new_tag_name ;
} else {
// invalid tag, do some more magic
// print("Invalid new tag ! $old_tag_name to $new_tag_name<br/>");
$old_tag_name_without_quote = rtrim ( $new_tag_name , '"' );
$found = false ;
foreach ( $cluster_names as $cluster_name ) {
// print("Searching for $old_tag_name in $cluster_name<br>");
if ( strstr ( $cluster_name , $old_tag_name_without_quote )) {
// print("-> FOUND - $old_tag_name - $cluster_name<br/>");
$mappings [ $old_tag_id ] = $cluster_name ;
$found = true ;
break ;
}
}
if ( ! $found ) {
print ( " Issue with tag, could not find a substitution, skipping: $old_tag_name <br/> " );
}
}
}
}
}
$full_print_buffer .= " <h2>Mappings</h2> " ;
$full_print_buffer .= " <pre> " . print_r ( $mappings , true ) . " </pre> " ;
// now we know which tags (they keys of the mapping) need to be changed
// find all events and attributes using these tags and update them with the new version
$this -> EventTag = Classregistry :: init ( 'EventTag' );
$this -> AttributeTag = Classregistry :: init ( 'AttributeTag' );
$this -> Event = Classregistry :: init ( 'Event' );
$this -> Attribute = Classregistry :: init ( 'Attribute' );
$full_print_buffer .= " <h2>Conversion</h2> " ;
foreach ( $mappings as $old_tag_id => $new_tag_name ) {
$print_buffer = " " ;
$print_buffer .= " $old_tag_id => $new_tag_name <br/> " ;
$changed = False ;
$new_tag = array (
'name' => $new_tag_name ,
'colour' => '#0088cc' );
$new_tag_id = $this -> captureTag ( $new_tag , $user );
$print_buffer .= " New tag id $new_tag_id <br> " ;
//
// Events
//
$ets = $this -> EventTag -> find ( 'all' , array (
'recursive' => - 1 ,
'conditions' => array ( 'tag_id' => $old_tag_id ),
'contain' => array ( 'Event' )
));
foreach ( $ets as $et ) {
$event = $et [ 'Event' ];
// skip events that are not from this instance or are locked (coming form another MISP)
if ( $event [ 'locked' ] || $event [ 'org_id' ] != $event [ 'orgc_id' ]) {
$print_buffer .= " Skipping event " . $event [ 'id' ] . " ... not from here<br> " ;
continue ;
}
$changed = True ;
// remove the old EventTag
$print_buffer .= " Deleting event_tag " . $et [ 'EventTag' ][ 'id' ] . " for event " . $event [ 'id' ] . " <br> " ;
$this -> EventTag -> softDelete ( $et [ 'EventTag' ][ 'id' ]);
// add the new Tag to the event
$new_et = array ( 'EventTag' => array (
'event_id' => $event [ 'id' ],
'tag_id' => $new_tag_id
));
// check if the tag is already attached to the event - WARNING if data structures change this might break
$exists = $this -> EventTag -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => $new_et [ 'EventTag' ]));
if ( empty ( $exists )) {
// tag not yet associated with event
$print_buffer .= " Saving new tag association: event_id= " . $event [ 'id' ] . " tag_id= " . $new_tag_id . " <br> " ;
$this -> EventTag -> save ( $new_et );
// increment the Event timestamp and save the event
$print_buffer .= " Saving the event with incremented timestamp<br> " ;
$event [ 'timestamp' ] += 1 ;
$this -> Event -> save ( $event );
} else {
$print_buffer .= " Not adding new tag as it's already associated to the event: event_id= " . $event [ 'id' ] . " tag_id= " . $new_tag_id . " <br> " ;
}
}
//
// Attributes with tags
//
// find all AttributeTags for this specific tag. We do not load the attribute immediately as it's faster/better to only do this additional lookup when needed. (data we need to change)
$ats = $this -> AttributeTag -> find ( 'all' , array (
'recursive' => - 1 ,
'conditions' => array ( 'tag_id' => $old_tag_id ),
));
foreach ( $ats as $at ) {
// $print_buffer .= " ".print_r($at, true)."<br>";
$event = $this -> Event -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => array ( 'id' => $at [ 'AttributeTag' ][ 'event_id' ])
))[ 'Event' ];
// $print_buffer .= "<pre>".print_r($event, true)."</pre>";
// skip events that are not from this instance or are locked (coming form another MISP)
if ( $event [ 'locked' ] || $event [ 'org_id' ] != $event [ 'orgc_id' ]) {
$print_buffer .= " Skipping attribute for event " . $event [ 'id' ] . " ... not from here<br> " ;
continue ;
}
$attribute = $this -> Attribute -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => array ( 'id' => $at [ 'AttributeTag' ][ 'attribute_id' ])
))[ 'Attribute' ];
$changed = True ;
// remove the old AttributeTag
$print_buffer .= " Deleting attribute_tag " . $at [ 'AttributeTag' ][ 'id' ] . " for attribute " . $attribute [ 'id' ] . " for event " . $event [ 'id' ] . " <br> " ;
$this -> AttributeTag -> softDelete ( $at [ 'AttributeTag' ][ 'id' ]);
// add the new Tag to the event
$new_at = array ( 'AttributeTag' => array (
'event_id' => $event [ 'id' ],
'attribute_id' => $attribute [ 'id' ],
'tag_id' => $new_tag_id
));
// check if the tag is already attached to the event - WARNING if data structures change this might break
$exists = $this -> AttributeTag -> find ( 'first' , array (
'recursive' => - 1 ,
'conditions' => $new_at [ 'AttributeTag' ]));
if ( empty ( $exists )) {
// tag not yet associated with attribute
$print_buffer .= " Saving new tag association: attribute_id= " . $attribute [ 'id' ] . " event_id= " . $event [ 'id' ] . " tag_id= " . $new_tag_id . " <br> " ;
$this -> AttributeTag -> save ( $new_at );
// increment the Attribute/Event timestamp and save them
$print_buffer .= " Saving the attribute/event with incremented timestamp<br> " ;
$attribute [ 'timestamp' ] += 1 ;
$this -> Attribute -> save ( $attribute );
$event [ 'timestamp' ] += 1 ;
$this -> Event -> save ( $event );
} else {
$print_buffer .= " Not adding new tag as it's already associated to the attribute: attribute_id= " . $attribute [ 'id' ] . " event_id= " . $event [ 'id' ] . " tag_id= " . $new_tag_id . " <br> " ;
}
}
if ( $changed ) {
$full_print_buffer .= $print_buffer ;
} else {
// print("Tag has no 'unlocked' events or attributes: $old_tag_id => $new_tag_name<br/>");
// $full_print_buffer .= $print_buffer;
}
}
return $full_print_buffer ;
}
2015-08-31 12:55:42 +02:00
}