func checkFilters()

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
}