Bug 2545849 - Review Request: libdnf5-plugins-rhsm - libdnf5 plugins for Red Hat Subscription Management
Summary: Review Request: libdnf5-plugins-rhsm - libdnf5 plugins for Red Hat Subscripti...
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Fedora
Classification: Fedora
Component: Package Review
Version: rawhide
Hardware: All
OS: Linux
medium
medium
Target Milestone: ---
Assignee: mhorky
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2026-10-05 09:08 UTC by Jiri Hnidek
Modified: 2026-10-26 17:22 UTC (History)
3 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed: 2026-10-26 17:22:11 UTC
Type: ---
Embargoed:
mhorky: fedora-review+


Attachments (Terms of Use)

Description Jiri Hnidek 2026-10-05 09:08:13 UTC
Spec URL: https://download.copr.fedorainfracloud.org/results/jhnidek/rhsm-dnf5-plugins/srpm-builds/11064385/libdnf5-plugins-rhsm.spec

SRPM URL: https://download.copr.fedorainfracloud.org/results/jhnidek/rhsm-dnf5-plugins/srpm-builds/11064385/libdnf5-plugins-rhsm-0.1.2-1.fc44.src.rpm

Description: Package with libdnf5 plugins that will replace dnf4 plugins from subscription-manager RPM. This package contains two plugins ATM. 1) productid plugin for installing product certificate during dnf transaction. 2) rhsm plugin printing warning messages about unregistered system, missing entitlement certificates, etc. The rhsm plugin is going to replace dnf4 plugin called subscription-manager.

Fedora Account System Username: jhnidek

Successful build: https://copr.fedorainfracloud.org/coprs/jhnidek/rhsm-dnf5-plugins/build/11064385/

It is probably my first new package that I try to add to Fedora, but I have created many RPM packages in my life, because I am from Red Hat. I am upstream maintainer of this project. I am also tech lead of subscription-manager.

Note: I am providing link to spec file from the build, because dist-git is returning 500 internal server error: https://copr-dist-git.fedorainfracloud.org/packages/jhnidek/rhsm-dnf5-plugins/libdnf5-plugins-rhsm.git

Comment 1 Chris Snyder 2026-10-13 17:52:00 UTC
# Fedora Package Review: `libdnf5-plugins-rhsm`

**Bugzilla:** https://bugzilla.redhat.com/show_bug.cgi?id=2545849
**COPR Build:** https://copr.fedorainfracloud.org/coprs/jhnidek/rhsm-dnf5-plugins/build/11064385/
**Upstream:** https://github.com/candlepin/rhsm-dnf5-plugins
**Date:** 2026-10-13
**Assessment:** Multiple blockers must be fixed before approval

---

## 1. Package Overview

`libdnf5-plugins-rhsm` provides two libdnf5/DNF5 plugins for Red Hat Subscription
Management (RHSM):

| Plugin | Function |
|--------|----------|
| `rhsm` | Integrates DNF5 with RHSM certificate-based subscription entitlements |
| `productid` | Tracks installed product certificates (product identity) |

The project lives at https://github.com/candlepin/rhsm-dnf5-plugins (Candlepin /
Red Hat upstream). It is at an early but functional stage — version `0.1.2` is the
latest of two published releases; two additional planned plugins (`release`,
`reporefresh`) are listed as TODO in the README.

---

## 2. Artifacts Reviewed

| Artifact | Location | SHA-256 |
|----------|----------|---------|
| SRPM (upstream) | https://github.com/candlepin/rhsm-dnf5-plugins/releases/download/0.1.2/libdnf5-plugins-rhsm-0.1.2-1.fc44.src.rpm | `faa281f9f87b34a4795fc8cfdf002f2c310a504f823f7ba577508b4729969bac` |
| Source tarball (from SRPM) | `libdnf5-plugins-rhsm-0.1.2.tar.gz` | `0ce497d1f3f1d2b696bfc11b881c6b7b91506411be0bf6faa8fa17c1294481c1` |
| Spec file | https://download.copr.fedorainfracloud.org/results/jhnidek/rhsm-dnf5-plugins/srpm-builds/11064385/libdnf5-plugins-rhsm.spec | (within SRPM) |
| fedora-review report (rawhide-x86_64) | https://download.copr.fedorainfracloud.org/results/jhnidek/rhsm-dnf5-plugins/fedora-rawhide-x86_64/11064385-libdnf5-plugins-rhsm/fedora-review/review.txt | — |

---

## 3. Spec File (as reviewed)

```spec
Name:           libdnf5-plugins-rhsm
Version:        0.1.2
Epoch:          1
Release:        %autorelease
Summary:        Libdnf5 plugins for Red Hat Subscription Management
License:        GPL-3.0-only
URL:            https://github.com/candlepin/rhsm-dnf5-plugins
Source0:        %{name}-%{version}.tar.gz

%bcond_with     clang
%bcond_without  tests
%bcond_without  productid_libdnf5_plugin
%bcond_without  rhsm_libdnf5_plugin

%if %{with clang}
BuildRequires:  clang
%else
BuildRequires:  gcc-c++ >= 10.1
%endif
BuildRequires:  cmake >= 3.21
BuildRequires:  pkgconfig(libcrypto)
BuildRequires:  libdnf5-devel
BuildRequires:  jsoncpp-devel
%if %{with tests}
BuildRequires:  gtest-devel
%endif

%description
This package provides libdnf5 plugins to interact with repositories
and subscriptions from the Red Hat entitlement platform; contains
rhsm and product-id plugins.

%files

%{_libdir}/libdnf5/plugins/productid.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/productid.conf

%{_libdir}/libdnf5/plugins/rhsm.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/rhsm.conf

%prep
%autosetup -p1

%build
%cmake \
    -DWITH_TESTS=%{?with_tests:ON}%{!?with_tests:OFF} \
    -DWITH_PLUGIN_PRODUCTID=%{?with_productid_libdnf5_plugin:ON}%{!?with_productid_libdnf5_plugin:OFF} \
    -DWITH_PLUGIN_RHSM=%{?with_rhsm_libdnf5_plugin:ON}%{!?with_rhsm_libdnf5_plugin:OFF}
%cmake_build

%check
%if %{with tests}
    %ctest
%endif

%install
%cmake_install

%changelog
%autochangelog
```

---

## 4. rpmlint Output

rpmlint 2.8.0 run on the SRPM and spec file locally:

```
libdnf5-plugins-rhsm.spec: W: invalid-url Source0: libdnf5-plugins-rhsm-0.1.2.tar.gz
1 packages and 0 specfiles checked; 0 errors, 1 warnings, 4 filtered, 0 badness
```

rpmlint from COPR fedora-review (rawhide-x86_64), run against SRPM + binary RPM:

```
libdnf5-plugins-rhsm.spec: W: invalid-url Source0: libdnf5-plugins-rhsm-0.1.2.tar.gz
2 packages and 0 specfiles checked; 0 errors, 1 warnings, 8 filtered, 0 badness
```

**Result:** 0 errors, 1 warning. The single warning (`invalid-url Source0`) is directly caused
by Issue #2 below and is addressed there.

---

## 5. Build Results (COPR Build #11064385)

All 12 chroots built successfully:

| Chroot | Status | Build Time |
|--------|--------|-----------|
| fedora-44-x86_64 | ✅ succeeded | 15 min |
| fedora-44-aarch64 | ✅ succeeded | 14 min |
| fedora-44-ppc64le | ✅ succeeded | 11 min |
| fedora-44-s390x | ✅ succeeded | 28 min |
| fedora-45-x86_64 | ✅ succeeded | 13 min |
| fedora-45-aarch64 | ✅ succeeded | 13 min |
| fedora-45-ppc64le | ✅ succeeded | 9 min |
| fedora-45-s390x | ✅ succeeded | 24 min |
| fedora-rawhide-x86_64 | ✅ succeeded | 13 min |
| fedora-rawhide-aarch64 | ✅ succeeded | 13 min |
| fedora-rawhide-ppc64le | ✅ succeeded | 12 min |
| fedora-rawhide-s390x | ✅ succeeded | 26 min |

The package builds cleanly on all four Fedora primary architectures across Fedora 44,
45, and Rawhide.

---

## 6. Review Findings

### 🔴 BLOCKER #1 — `%license` directive is missing

**Guideline (MUST):** *"If (and only if) the source package includes the text of the
license(s) in its own file, then that file must be included in `%license`."*

**Evidence:** The source tarball (`libdnf5-plugins-rhsm-0.1.2.tar.gz`) contains a
`LICENSE` file at the top level of the project tree:

```
libdnf5-plugins-rhsm-0.1.2/LICENSE     ← full GPL-3.0 license text, confirmed present
```

This was confirmed by listing the tarball contents:

```
tar -tzf libdnf5-plugins-rhsm-0.1.2.tar.gz | grep -i license
libdnf5-plugins-rhsm-0.1.2/LICENSE
```

The `LICENSE` file contains the complete, unmodified GNU General Public License v3
text (GPLv3, dated 29 June 2007, Free Software Foundation).

**Problem:** The `%files` section contains **no `%license` line whatsoever**. The
license text will not be installed into the built binary package. This is a MUST
requirement failure (see https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/#_license_text)

**Required fix:**

```spec
%files
%license LICENSE          ← ADD THIS LINE
%{_libdir}/libdnf5/plugins/productid.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/productid.conf
%{_libdir}/libdnf5/plugins/rhsm.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/rhsm.conf
```

---

### 🔴 BLOCKER #2 — `Source0:` contains no upstream URL

**Guideline (MUST):** *"The sources used to build the package must match the upstream
source, as provided in the spec URL. Reviewers should use sha256sum for this task."*
The [Source URL Guidelines](https://docs.fedoraproject.org/en-US/packaging-guidelines/SourceURL/)
additionally require that `Source0` contain a working URL to the upstream source so
that reviewers and the Fedora build system can verify the tarball's provenance.

**Evidence:**

```spec
Source0:        %{name}-%{version}.tar.gz      ← bare filename, NO URL
```

This is what triggers the rpmlint warning:

```
W: invalid-url Source0: libdnf5-plugins-rhsm-0.1.2.tar.gz
```

The upstream release at https://github.com/candlepin/rhsm-dnf5-plugins/releases/tag/0.1.2
provides a source tarball as a release asset. While the SRPM itself is hosted at
`https://github.com/candlepin/rhsm-dnf5-plugins/releases/download/0.1.2/libdnf5-plugins-rhsm-0.1.2-1.fc44.src.rpm`,
the source tarball **inside** the SRPM (`libdnf5-plugins-rhsm-0.1.2.tar.gz`) does not
appear to have a separate canonical URL distinct from a git archive.

**Required fix:** Use a proper upstream URL. If the tarball is generated from a git
archive, this must be documented in a spec comment. Candidate options:

```spec
# Option A — GitHub auto-generated tagged archive:
Source0: https://github.com/candlepin/rhsm-dnf5-plugins/archive/%{version}/%{name}-%{version}.tar.gz

# Option B — if upstream publishes a named release tarball asset directly:
Source0: https://github.com/candlepin/rhsm-dnf5-plugins/releases/download/%{version}/%{name}-%{version}.tar.gz
```

> ⚠️ **Option A requires additional spec changes and is not a drop-in fix.** GitHub's
> `/archive/<tag>/` endpoint ignores the filename component of the URL and always
> serves its auto-generated archive, named after the *repository* rather than the RPM
> package. Verified via HTTP inspection: the URL above resolves successfully but the
> `Content-Disposition` header of the response reveals the actual archive served is
> `rhsm-dnf5-plugins-0.1.2.tar.gz`, whose top-level directory is
> `rhsm-dnf5-plugins-0.1.2/` — not `libdnf5-plugins-rhsm-0.1.2/` as `%autosetup`
> would expect. Using Option A therefore requires two additional changes:
> 1. `%autosetup -p1` must gain a `-n rhsm-dnf5-plugins-%{version}` argument to match
>    the actual unpacked directory name.
> 2. The SHA-256 of the resulting tarball will differ from the current SRPM tarball
>    (`0ce497d1f3f1d2b696bfc11b881c6b7b91506411be0bf6faa8fa17c1294481c1`); the packager
>    must re-verify against the new artifact. Note that GitHub publishes no SHA-256 for
>    `/archive/` tarballs — only an ETag — so provenance verification depends on the
>    packager computing and documenting the digest independently.
>
> Option B (a named release asset URL) avoids the naming mismatch entirely but requires
> that upstream publish a separately named tarball as a GitHub release asset — which
> they do not currently do for version 0.1.2. If neither option is workable as-is, the
> packager should coordinate with upstream to publish a canonically named tarball asset,
> or document the tarball provenance in a spec comment as the minimum acceptable
> workaround per the Source URL guidelines.

---

### 🔴 BLOCKER #3 — `Epoch: 1` on a new package has no justification

**Guideline (MUST):** Packages must meet Packaging Guidelines. The Fedora Packaging
Guidelines ("Use of Epochs") state: *"[Epoch] should only be used in Fedora as a last
resort to resolve upgrade ordering of a package, and should be avoided wherever
possible."* Once set, an Epoch can never be removed from a package. The reviewer
additionally recommends that, if Epoch is retained, a spec comment document the reason.

**Evidence:**

```spec
Epoch:          1
```

`libdnf5-plugins-rhsm` is a **brand-new package** being submitted to Fedora for the
first time. A new package with no prior Fedora history should start at Epoch 0 (the
default when `Epoch:` is omitted). Setting `Epoch: 1` artificially inflates the
package's version epoch for all future releases.

The COPR build record confirms the effective EVR as `1:0.1.2-1`, meaning every future
version comparison for this package begins at epoch 1.

No justification comment exists in the spec file and none is provided in the BZ ticket.
Possible reasons for this epoch include:

- A prior COPR build used a higher release version (e.g., `0.1.2-2`) that needed to
  be superseded — but this should not affect the Fedora package.
- A different package previously occupied this name — no evidence of this was found.
- The epoch was added by mistake and should simply be removed.

**Required fix:** Either:
1. Remove `Epoch: 1` entirely (preferred for a new package), **or**
2. Add a spec comment explaining why Epoch 1 is necessary:
   ```spec
   # Epoch 1 required because <REASON>
   Epoch:          1
   ```

---

### 🟡 ISSUE #4 — Spec file section ordering harms legibility (SHOULD)

**Guideline (SHOULD):** The [Spec Legibility Guidelines](https://docs.fedoraproject.org/en-US/packaging-guidelines/#_spec_legibility)
state only that *"All spec files MUST be legible and maintained in such a way that the
community of packagers is able to understand and work with them."* No specific section
ordering is mandated — the conventional sequence appears only in example spec files
throughout the guidelines, not as a normative MUST or SHOULD requirement. Reordering
is therefore a strong courtesy recommendation, not a blocker.

**Evidence:** The spec file has `%files` placed **before** `%prep`, `%build`, `%check`,
and `%install`. Additionally, `%check` appears **before** `%install`, which is also
non-standard. The conventional order is:

```
Preamble (Name, Version, BuildRequires, etc.)
%description
%prep
%build
%install
%check
%files
%changelog
```

The current spec order is:

```
Preamble → %description → %files → %prep → %build → %check → %install → %changelog
```

While RPM processes spec sections correctly regardless of their textual order, this
layout makes the spec significantly harder to read and review — the `%files` section,
which lists what gets installed, appears before the sections that actually build and
install the software. The `%check`/`%install` inversion is also unusual.

**Recommended fix:** Reorder sections to follow the conventional order.

---

### 🟡 ISSUE #5 — Unversioned `.so` plugin files (NOTE — acceptable in context)

**Evidence** (from fedora-review):

```
Unversioned so-files
--------------------
libdnf5-plugins-rhsm: /usr/lib64/libdnf5/plugins/productid.so
libdnf5-plugins-rhsm: /usr/lib64/libdnf5/plugins/rhsm.so
```

The `%files` glob `%{_libdir}/libdnf5/plugins/productid.*` captures these files.

**Assessment:** These `.so` files are CMake MODULE libraries — they are plugin
binaries loaded at runtime via `dlopen()`, not shared libraries for linking. They are
installed in a **private** subdirectory (`/usr/lib64/libdnf5/plugins/`) that is **not**
in the standard dynamic linker search path (`/etc/ld.so.conf.d/`). Unversioned `.so`
files in private plugin directories are **acceptable** per Fedora guidelines.

No change is required here, but the reviewer documents this for completeness.

---

### 🟡 ISSUE #6 — `/usr/lib64/libdnf5/plugins` directory ownership (RESOLVED)

The `fedora-review` tool flagged this directory as having "unknown owners" in its
build environment. Manual investigation confirms:

```
$ rpm -ql libdnf5 | grep plugins
/usr/lib64/libdnf5/plugins

$ rpm -ql dnf5 | grep libdnf5
/usr/lib64/libdnf5/plugins
```

The directory `/usr/lib64/libdnf5/plugins` is owned by the `libdnf5` package (also
shared with `dnf5`). Since the spec auto-generates a `Requires: libdnf5.so.2` from the
binary dependency, the directory will always be present when this package is installed.

**Assessment:** ✅ No issue — the directory ownership concern raised by `fedora-review`
is a false alarm. The directory is owned by `libdnf5`, which is auto-required.

---

### 🟡 ISSUE #7 — No GPG signature verification in `%prep` (SHOULD)

**Guideline (SHOULD):** *"Sources are verified with gpgverify first in `%prep` if
upstream publishes signatures."*

**Evidence:** Both release tags `0.1.1` and `0.1.2` are **GPG-signed** by the committer
(`@jirihnidek`) with a verified GitHub signature. The `%prep` section does not use
`%{gpgverify}`.

**Assessment:** This is a SHOULD recommendation, not a blocker. The packager should
consider adding GPG verification if a detached signature or keyring can be published
alongside the release assets.

---

### 🟡 ISSUE #8 — Source tarball provenance undocumented (SHOULD)

The `fedora-review` tool notes: *"Package contains tarball without URL, check
comments."* There is no comment in the spec explaining whether the tarball is a raw
git archive, a generated release asset, or something else. This is directly related
to Blocker #2 (Source0 URL) and will be resolved when that is fixed.

---

## 7. Items That Pass

| # | Check | Guideline | Result |
|---|-------|-----------|--------|
| 1 | Package name `libdnf5-plugins-rhsm` uses allowed ASCII, follows naming conventions | MUST | ✅ PASS |
| 2 | Spec filename matches `%{name}` (`libdnf5-plugins-rhsm.spec`) | MUST | ✅ PASS |
| 3 | License field `GPL-3.0-only` is a valid SPDX expression | MUST | ✅ PASS |
| 4 | Upstream `LICENSE` file is full GPL-3.0 text — matches spec `License:` field | MUST | ✅ PASS |
| 5 | Package builds successfully on all four primary architectures (x86_64, aarch64, ppc64le, s390x) | MUST | ✅ PASS |
| 6 | Package builds on F44, F45, and Rawhide | MUST | ✅ PASS |
| 7 | rpmlint: 0 errors, 1 warning (Source0 URL — addressed in Issue #2) | MUST | ✅ PASS |
| 8 | No `.la` libtool archives | MUST | ✅ PASS |
| 9 | No static executables | MUST | ✅ PASS |
| 10 | No rpath issues (plugins use module-style linking, no rpath) | MUST | ✅ PASS |
| 11 | `%config(noreplace)` used for both `.conf` files | MUST | ✅ PASS |
| 12 | `BuildRequires: gcc-c++ >= 10.1` listed (C++20 requirement satisfied) | MUST | ✅ PASS |
| 13 | All runtime build dependencies listed: `cmake`, `pkgconfig(libcrypto)`, `libdnf5-devel`, `jsoncpp-devel`, `gtest-devel` (conditional) | MUST | ✅ PASS |
| 14 | CMake macros used correctly (`%cmake`, `%cmake_build`, `%cmake_install`, `%ctest`) | MUST | ✅ PASS |
| 15 | `%autorelease` and `%autochangelog` used | MUST | ✅ PASS |
| 16 | `%autosetup -p1` used in `%prep` | MUST | ✅ PASS |
| 17 | Package is not relocatable | MUST | ✅ PASS |
| 18 | No duplicate files in `%files` | MUST | ✅ PASS |
| 19 | No files in `/srv`, `/opt`, or `/usr/local` | MUST | ✅ PASS |
| 20 | No `%config` files under `/usr` | MUST | ✅ PASS |
| 21 | Package does not own files or directories owned by other packages | MUST | ✅ PASS |
| 22 | `/usr/lib64/libdnf5/plugins` directory owned by `libdnf5`; auto-required via `libdnf5.so.2` | MUST | ✅ PASS |
| 23 | No deprecated package dependencies | MUST | ✅ PASS |
| 24 | Not a GUI application — no `.desktop` file needed | MUST | ✅ PASS (N/A) |
| 25 | No static libraries | MUST | ✅ PASS |
| 26 | No bundled libraries | MUST | ✅ PASS |
| 27 | Spec Summary and `%description` written in American English | MUST | ✅ PASS |
| 28 | Package contains real compiled code (C++ plugins) | MUST | ✅ PASS |
| 29 | `%check` section present (`%ctest` when tests enabled) | SHOULD | ✅ PASS |
| 30 | Latest version packaged (0.1.2 is the most recent of 2 published releases) | SHOULD | ✅ PASS |
| 31 | No `%clean` section with `rm -rf %{buildroot}` | SHOULD | ✅ PASS |
| 32 | No `Packager`, `Vendor`, `PreReq`, or `Copyright` tags | SHOULD | ✅ PASS |
| 33 | No `%define` macros (uses `%global`/`%bcond`) | SHOULD | ✅ PASS |
| 34 | Dist tag present in Release | MUST | ✅ PASS |
| 35 | Install paths use CMake `FULL_LIBDIR`/`FULL_SYSCONFDIR` — no hardcoded paths | MUST | ✅ PASS |

---

## 8. Runtime Dependencies Analysis

Auto-generated `Requires` from the binary RPM (fedora-44-x86_64):

```
libdnf5-plugins-rhsm (rpmlib, GLIBC filtered):
    config(libdnf5-plugins-rhsm)
    libc.so.6()(64bit)
    libcrypto.so.3()(64bit)
    libcrypto.so.3(OPENSSL_3.0.0)(64bit)
    libdnf5.so.2()(64bit)
    libgcc_s.so.1()(64bit)
    libgcc_s.so.1(GCC_3.0)(64bit)
    libgcc_s.so.1(GCC_3.3.1)(64bit)
    libjsoncpp.so.26()(64bit)
    libstdc++.so.6()(64bit)
    libstdc++.so.6(CXXABI_1.3)(64bit)
    libstdc++.so.6(CXXABI_1.3.9)(64bit)
    rtld(GNU_HASH)
```

All runtime dependencies are auto-detected from the binary and are correct:
- `libdnf5.so.2` — the DNF5 library (loads and calls the plugins)
- `libcrypto.so.3` / OpenSSL — used for certificate handling in both plugins
- `libjsoncpp.so.26` — used by the `productid` plugin for product JSON parsing
- `libgcc_s`, `libstdc++` — C++ runtime, expected for a C++20 binary

No extraneous or missing runtime dependencies are apparent. Note that
`subscription-manager` (the RHSM client) is NOT a hard dependency — the plugin
reads RHSM configuration and certificate files directly, so the plugin can be
installed independently.

---

## 9. Licensing Summary

| Item | Detail | Status |
|------|--------|--------|
| Spec `License:` field | `GPL-3.0-only` (valid SPDX) | ✅ |
| Upstream `LICENSE` file | Full GPLv3 text (29 June 2007, FSF) | ✅ |
| GitHub detected license | GPL-3.0 | ✅ |
| License in tarball | `libdnf5-plugins-rhsm-0.1.2/LICENSE` — GPLv3 full text | ✅ |
| `%license` directive in spec | **MISSING** — blocker #1 | ❌ |
| `licensecheck` result (from COPR) | "GNU General Public License, Version 3" + 42–43 files "Unknown or generated" | ⚠️ |

The 42–43 "Unknown or generated" files identified by `licensecheck` are test data
(`.pem` certificate files, `.gz` product ID files, CMake-generated files, and CI
configuration). These are not separately licensed works and do not require their own
license entries. The core source files (`.cpp`, `.hpp`) are GPL-3.0 consistent with
the `LICENSE` file.

---

## 10. Source Verification

The SRPM was downloaded from the upstream GitHub release page and its SHA-256 verified:

```
$ sha256sum libdnf5-plugins-rhsm-0.1.2-1.fc44.src.rpm
faa281f9f87b34a4795fc8cfdf002f2c310a504f823f7ba577508b4729969bac
```

The source tarball extracted from the SRPM:

```
$ sha256sum libdnf5-plugins-rhsm-0.1.2.tar.gz
0ce497d1f3f1d2b696bfc11b881c6b7b91506411be0bf6faa8fa17c1294481c1
```

The SRPM was published at the GitHub `0.1.2` release tag, which is also GPG-signed
by the committer (`@jirihnidek`). The tarball inside the SRPM is consistent with
the project at tag `0.1.2`. Source URL verification cannot be fully automated because
`Source0` has no URL (Blocker #2), but the SRPM itself originates from the correct
upstream release.

---

## 11. Summary of Required Changes

### Must Fix Before Approval (Blockers)

| # | Issue | Fix Required |
|---|-------|-------------|
| B1 | **Missing `%license` directive** | Add `%license LICENSE` to `%files` section |
| B2 | **`Source0:` has no upstream URL** | Set `Source0:` to a proper `https://github.com/...` URL (see Blocker #2 for caveats on Option A) |
| B3 | **`Epoch: 1` unjustified** | Remove `Epoch: 1` or add a spec comment with justification |

### Should Fix (Recommendations)

| # | Issue | Recommendation |
|---|-------|---------------|
| R1 | No GPG verification in `%prep` | Add `%{gpgverify}` if upstream publishes detached signatures |
| R2 | Tarball provenance undocumented | Resolved by fixing B2 (add Source0 URL) |
| R3 | Non-standard spec section ordering | Reorder: `%prep` → `%build` → `%install` → `%check` → `%files` → `%changelog` (convention, aids legibility) |

### No Action Required

| # | Issue | Reason |
|---|-------|--------|
| N1 | Unversioned `.so` files | These are private MODULE plugins, not in ld path — acceptable |
| N2 | `/usr/lib64/libdnf5/plugins` directory ownership | Owned by `libdnf5`, auto-required — no issue |
| N3 | 42–43 files flagged "unknown" by `licensecheck` | Test data / generated files — not separately licensed |

---

## 12. Corrected Spec File (Illustrative)

The following shows the spec file with all blockers fixed. **`Source0` is shown as a
placeholder** — see the note below and Blocker #2 for the reasons why the URL cannot
be filled in mechanically.

```spec
Name:           libdnf5-plugins-rhsm
Version:        0.1.2
# Epoch removed — new package, no prior Fedora history requiring epoch override
Release:        %autorelease
Summary:        Libdnf5 plugins for Red Hat Subscription Management
License:        GPL-3.0-only
URL:            https://github.com/candlepin/rhsm-dnf5-plugins
# TODO (packager): Supply a verified upstream URL for Source0.
# Option A (GitHub auto-archive) requires additional changes — see Blocker #2 note.
# Option B requires upstream to publish a named tarball release asset.
Source0:        %{name}-%{version}.tar.gz

%bcond_with     clang
%bcond_without  tests
%bcond_without  productid_libdnf5_plugin
%bcond_without  rhsm_libdnf5_plugin

%if %{with clang}
BuildRequires:  clang
%else
BuildRequires:  gcc-c++ >= 10.1
%endif
BuildRequires:  cmake >= 3.21
BuildRequires:  pkgconfig(libcrypto)
BuildRequires:  libdnf5-devel
BuildRequires:  jsoncpp-devel
%if %{with tests}
BuildRequires:  gtest-devel
%endif

%description
This package provides libdnf5 plugins to interact with repositories
and subscriptions from the Red Hat entitlement platform; contains
rhsm and product-id plugins.

%prep
%autosetup -p1

%build
%cmake \
    -DWITH_TESTS=%{?with_tests:ON}%{!?with_tests:OFF} \
    -DWITH_PLUGIN_PRODUCTID=%{?with_productid_libdnf5_plugin:ON}%{!?with_productid_libdnf5_plugin:OFF} \
    -DWITH_PLUGIN_RHSM=%{?with_rhsm_libdnf5_plugin:ON}%{!?with_rhsm_libdnf5_plugin:OFF}
%cmake_build

%install
%cmake_install

%check
%if %{with tests}
    %ctest
%endif

%files
%license LICENSE
%{_libdir}/libdnf5/plugins/productid.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/productid.conf
%{_libdir}/libdnf5/plugins/rhsm.*
%config(noreplace) %{_sysconfdir}/dnf/libdnf5-plugins/rhsm.conf

%changelog
%autochangelog
```

> **Note on `Source0`:** No single URL can be filled in here without packager action.
> GitHub's `/archive/<tag>/` URL (Option A in Blocker #2) resolves successfully but
> serves a tarball whose top-level directory is `rhsm-dnf5-plugins-0.1.2/` — not
> `libdnf5-plugins-rhsm-0.1.2/` — causing `%autosetup` to fail without a `-n` override.
> It would also produce a different SHA-256 than the current tarball in the SRPM
> (`0ce497d1f3f1d2b696bfc11b881c6b7b91506411be0bf6faa8fa17c1294481c1`), and GitHub
> publishes no canonical digest for auto-generated archives. The packager must resolve
> the Source0 URL in coordination with upstream before this spec can be submitted.

---

## 13. Final Assessment

**Decision: ⚠️ NEEDS WORK**

The package is technically sound — it builds cleanly across all primary Fedora
architectures and all supported releases, the license is correct and Fedora-approved
(GPL-3.0-only), the build system usage is idiomatic, runtime dependencies are
auto-detected correctly, and rpmlint is clean of errors.

However, three MUST-level issues prevent approval:

1. The license file present in the tarball is not being installed via `%license` — a
   mandatory requirement when license text is shipped upstream.
2. `Source0` contains no URL, preventing automated source verification. Resolving this
   requires coordination with upstream to determine the correct URL and its implications
   for the tarball's name and SHA-256 (see Blocker #2 for details).
3. `Epoch: 1` is set without explanation on a new Fedora package.

Additionally, the non-standard spec section ordering (Issue #4) is a legibility
concern that should be addressed, though it is not a guideline-mandated blocker.

All required changes are confined to the spec file. Once fixed and a rebuilt SRPM
is provided, the package should be in good shape for approval.

---

*Review conducted using: rpmlint 2.8.0, fedora-review 0.12.0 (COPR-provided),
manual inspection of spec, tarball, upstream GitHub repository, and COPR build logs.*

Comment 2 Jiri Hnidek 2026-10-26 13:02:52 UTC
Hi,
I created a new build: https://copr.fedorainfracloud.org/coprs/jhnidek/rhsm-dnf5-plugins/build/11208494/ ... only two tests failed due to infrastructure issues

I also created another build last week with the same source code, but using srpm: https://copr.fedorainfracloud.org/coprs/jhnidek/rhsm-dnf5-plugins/build/11196645/ and you can see that all tests passed.

Comment 3 Jiri Hnidek 2026-10-26 13:58:08 UTC
I triggered an new build with the same spec file: https://copr.fedorainfracloud.org/coprs/jhnidek/rhsm-dnf5-plugins/build/11209718/ and everything is green now.

Comment 4 Fedora Admin user for bugzilla script actions 2026-10-26 15:52:22 UTC
The Pagure repository was created at https://src.fedoraproject.org/rpms/libdnf5-plugins-rhsm
Monitoring:
Wasn't able to create project in Anitya. You can create it manually on: `https://release-monitoring.org`

Comment 5 Fedora Update System 2026-10-26 17:16:27 UTC
FEDORA-2026-0c58724879 (libdnf5-plugins-rhsm-0.1.3-1.fc46) has been submitted as an update to Fedora 46.
https://bodhi.fedoraproject.org/updates/FEDORA-2026-0c58724879

Comment 6 Fedora Update System 2026-10-26 17:22:11 UTC
FEDORA-2026-0c58724879 (libdnf5-plugins-rhsm-0.1.3-1.fc46) has been pushed to the Fedora 46 stable repository.
If problem still persists, please make note of it in this bug report.


Note You need to log in before you can comment on or make changes to this bug.