in ospatch/updates_windows.go [73:181]
func checkFilters(ctx context.Context, updt *packages.IUpdate, kbExcludes, classFilter, exclusive_patches []string) (ok bool, err error) {
title, err := updt.GetProperty("Title")
if err != nil {
return false, fmt.Errorf(`updt.GetProperty("Title"): %v`, err)
}
defer title.Clear()
defer func() {
if ok == true {
clog.Debugf(ctx, "Update %q not excluded by any filters.", title.ToString())
}
}()
kbArticleIDsRaw, err := updt.GetProperty("KBArticleIDs")
if err != nil {
return false, fmt.Errorf(`updt.GetProperty("KBArticleIDs"): %v`, err)
}
defer kbArticleIDsRaw.Clear()
kbArticleIDs := kbArticleIDsRaw.ToIDispatch()
defer kbArticleIDs.Release()
kbArticleIDsCount, err := packages.GetCount(kbArticleIDs)
if err != nil {
return false, err
}
if len(exclusive_patches) > 0 {
for i := 0; i < int(kbArticleIDsCount); i++ {
kbRaw, err := kbArticleIDs.GetProperty("Item", i)
if err != nil {
return false, err
}
defer kbRaw.Clear()
for _, e := range exclusive_patches {
if e == kbRaw.ToString() {
// until now we have only seen at most 1 kbarticles
// in a patch update. So, if we get a match, we just
// install the update
return true, nil
}
}
}
// since there are exclusive_patches to be installed,
// other fields like excludes, classfilter are void
return false, nil
}
if len(kbExcludes) > 0 {
for i := 0; i < int(kbArticleIDsCount); i++ {
kbRaw, err := kbArticleIDs.GetProperty("Item", i)
if err != nil {
return false, err
}
defer kbRaw.Clear()
for _, e := range kbExcludes {
// kbArticleIDs is just the IDs, but users are used to using the KB prefix.
if strings.TrimLeft(e, "KkBb") == kbRaw.ToString() {
clog.Debugf(ctx, "Update %q (%s) matched exclude filter", title.ToString(), kbRaw.ToString())
return false, nil
}
}
}
}
if len(classFilter) == 0 {
return true, nil
}
categoriesRaw, err := updt.GetProperty("Categories")
if err != nil {
return false, fmt.Errorf(`updt.GetProperty("Categories"): %v`, err)
}
defer categoriesRaw.Clear()
categories := categoriesRaw.ToIDispatch()
defer categories.Release()
categoriesCount, err := packages.GetCount(categories)
if err != nil {
return false, err
}
for i := 0; i < int(categoriesCount); i++ {
catRaw, err := categories.GetProperty("Item", i)
if err != nil {
return false, fmt.Errorf(`categories.GetProperty("Item", i): %v`, err)
}
defer catRaw.Clear()
cat := catRaw.ToIDispatch()
defer cat.Release()
catIdRaw, err := cat.GetProperty("CategoryID")
if err != nil {
return false, fmt.Errorf(`cat.GetProperty("CategoryID"): %v`, err)
}
defer catIdRaw.Clear()
for _, c := range classFilter {
if c == catIdRaw.ToString() {
return true, nil
}
}
}
clog.Debugf(ctx, "Update %q not found in classification filter", title.ToString())
return false, nil
}