fleet/server/mdm/android/android.go
Victor Lyuboslavsky af1e150a2b
Deleting/adding Android certs to host on team transfer (#37616)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #37580 

Resolves unreleased 4.79 bug and needs to be cherry picked. Also
includes fixes from manually going through the test plan at:
[#30876](https://github.com/fleetdm/fleet/issues/30876)

# Checklist for submitter

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually

For unreleased bug fixes in a release candidate, one of:

- [x] Confirmed that the fix is not expected to adversely impact load
test results

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Release Notes

* **New Features**
* Per-template versioning and explicit operation/status fields for host
certificate templates; delivery payloads now include per-template
details.

* **Bug Fixes**
* Removal preparation broadened to also clear failed entries and handle
per-host removals; delivery/transition ordering adjusted to avoid race
conditions.

* **Tests**
* Extensive tests added for team-transfer flows, per-host
removal/preparation, and end-to-end Android certificate template
scenarios.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-01-06 10:20:07 -06:00

83 lines
2.4 KiB
Go

package android
import (
"database/sql"
"time"
)
const DefaultAndroidPolicyID = 1
type SignupDetails struct {
Url string
Name string
}
type Enterprise struct {
ID uint `db:"id"`
EnterpriseID string `db:"enterprise_id"`
}
func (e Enterprise) Name() string {
return "enterprises/" + e.EnterpriseID
}
func (e Enterprise) IsValid() bool {
return e.EnterpriseID != ""
}
func (e Enterprise) AuthzType() string {
return "android_enterprise"
}
type EnterpriseDetails struct {
Enterprise
SignupName string `db:"signup_name"`
SignupToken string `db:"signup_token"`
TopicID string `db:"pubsub_topic_id"`
UserID uint `db:"user_id"`
}
type EnrollmentToken struct {
EnrollmentToken string `json:"android_enrollment_token"`
EnrollmentURL string `json:"android_enrollment_url"`
}
type Device struct {
ID uint `db:"id"`
HostID uint `db:"host_id"`
DeviceID string `db:"device_id"`
EnterpriseSpecificID *string `db:"enterprise_specific_id"`
LastPolicySyncTime *time.Time `db:"last_policy_sync_time"`
AppliedPolicyID *string `db:"applied_policy_id"`
AppliedPolicyVersion *int64 `db:"applied_policy_version"`
}
type AgentManagedConfiguration struct {
ServerURL string `json:"server_url"`
HostUUID string `json:"host_uuid"`
EnrollSecret string `json:"enroll_secret"`
CertificateTemplateIDs []AgentCertificateTemplate `json:"certificate_templates,omitempty"`
}
type AgentCertificateTemplate struct {
ID uint `json:"id"`
Status string `json:"status"`
Operation string `json:"operation"`
UUID string `json:"uuid"`
}
// MDMAndroidPolicyRequest represents a request made to the Android Management
// API (AMAPI) to patch the policy or the device (as made by
// androidsvc.ReconcileProfiles).
type MDMAndroidPolicyRequest struct {
RequestUUID string `db:"request_uuid"`
RequestName string `db:"request_name"`
PolicyID string `db:"policy_id"`
Payload []byte `db:"payload"`
StatusCode int `db:"status_code"`
ErrorDetails sql.Null[string] `db:"error_details"`
AppliedPolicyVersion sql.Null[int64] `db:"applied_policy_version"`
PolicyVersion sql.Null[int64] `db:"policy_version"`
}
const AppStatusAvailable = "AVAILABLE"