Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion autocodesign/autocodesign.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import (

"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-utils/v2/retry"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/bitrise-io/go-xcode/v2/devportalservice"
"github.com/bitrise-io/go-xcode/v2/profileutil"
"github.com/bitrise-io/go-xcode/xcodeproject/serialized"
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/autocodesign_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (

"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-utils/v2/retry"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
devportaltime "github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/time"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/certdownloader/certdownloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import (
"github.com/bitrise-io/go-utils/v2/fileutil"
"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-utils/v2/pathutil"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

// CertificateAndPassphrase contains a p12 file URL and passphrase
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/certdownloader/certdownloader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"time"

"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/stretchr/testify/assert"
)

Expand Down
2 changes: 1 addition & 1 deletion autocodesign/certificates.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"strings"

"github.com/bitrise-io/go-utils/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

func selectCertificatesAndDistributionTypes(certificateSource DevPortalClient, typeToLocalCerts LocalCertificates, distribution DistributionType, signUITestTargets bool, verboseLog bool) (map[appstoreconnect.CertificateType][]Certificate, []DistributionType, error) {
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/certificates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (
"time"

"github.com/bitrise-io/go-utils/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/codesignasset/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import (

"github.com/bitrise-io/go-utils/log"
"github.com/bitrise-io/go-utils/pathutil"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/autocodesign/keychain"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

const (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (
"math/big"

"github.com/bitrise-io/go-utils/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

// CertificateSource ...
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/devportalclient/spaceship/certificates.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import (
"fmt"
"math/big"

"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

// CertificateSource ...
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/keychain/keychain.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/bitrise-io/go-utils/fileutil"
"github.com/bitrise-io/go-utils/pathutil"
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/hashicorp/go-version"
)

Expand Down
2 changes: 1 addition & 1 deletion autocodesign/keychain/keychain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/bitrise-io/go-steputils/v2/stepconf"
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-utils/v2/env"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
)

func TestCreateKeychain(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/localcodesignasset/localcodesignasset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import (

devportaltime "github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/time"

"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/exportoptions"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/autocodesign/localcodesignasset/mocks"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/bitrise-io/go-xcode/v2/profileutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/localcodesignasset/profilelookup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package localcodesignasset
import (
"testing"

"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/exportoptions"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/bitrise-io/go-xcode/v2/profileutil"
"github.com/stretchr/testify/assert"
)
Expand Down
2 changes: 1 addition & 1 deletion autocodesign/mock_AssetWriter.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion autocodesign/mock_CertificateProvider.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion autocodesign/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package autocodesign
import (
"testing"

"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/time"
"github.com/bitrise-io/go-xcode/v2/certificateutil"
"github.com/stretchr/testify/assert"
)

Expand Down
58 changes: 58 additions & 0 deletions certificateutil/filter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package certificateutil

import "sort"

// FilterCertificateInfoModelsByFilterFunc ...
func FilterCertificateInfoModelsByFilterFunc(certificates []CertificateInfoModel, filterFunc func(certificate CertificateInfoModel) bool) []CertificateInfoModel {
filteredCertificates := []CertificateInfoModel{}

for _, certificate := range certificates {
if filterFunc(certificate) {
filteredCertificates = append(filteredCertificates, certificate)
}
}

return filteredCertificates
}

// ValidCertificateInfo contains the certificate infos filtered as valid, invalid and duplicated common name certificates
type ValidCertificateInfo struct {
ValidCertificates,
InvalidCertificates,
DuplicatedCertificates []CertificateInfoModel
}

// FilterValidCertificateInfos filters out invalid and duplicated common name certificaates
func FilterValidCertificateInfos(certificateInfos []CertificateInfoModel) ValidCertificateInfo {
var invalidCertificates []CertificateInfoModel
nameToCerts := map[string][]CertificateInfoModel{}
for _, certificateInfo := range certificateInfos {
if certificateInfo.CheckValidity() != nil {
invalidCertificates = append(invalidCertificates, certificateInfo)
continue
}

nameToCerts[certificateInfo.CommonName] = append(nameToCerts[certificateInfo.CommonName], certificateInfo)
}

var validCertificates, duplicatedCertificates []CertificateInfoModel
for _, certs := range nameToCerts {
if len(certs) == 0 {
continue
}

sort.Slice(certs, func(i, j int) bool {
return certs[i].EndDate.After(certs[j].EndDate)
})
validCertificates = append(validCertificates, certs[0])
if len(certs) > 1 {
duplicatedCertificates = append(duplicatedCertificates, certs[1:]...)
}
}

return ValidCertificateInfo{
ValidCertificates: validCertificates,
InvalidCertificates: invalidCertificates,
DuplicatedCertificates: duplicatedCertificates,
}
}
113 changes: 113 additions & 0 deletions certificateutil/filter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package certificateutil

import (
"reflect"
"strings"
"testing"
"time"

"github.com/stretchr/testify/require"
)

func TestFilterCertificateInfoModelsByFilterFunc(t *testing.T) {
filterableCerts := []CertificateInfoModel{
CertificateInfoModel{TeamID: "my-team-id"},
CertificateInfoModel{TeamID: "find-this-team-id"},
CertificateInfoModel{TeamID: "my--another-team-id"},
CertificateInfoModel{TeamID: "test-team-id", CommonName: "test common name"},
CertificateInfoModel{TeamID: "test-team-id2", CommonName: "find this common name"},
}
expectedCertsByTeamID := []CertificateInfoModel{
CertificateInfoModel{TeamID: "find-this-team-id"},
}

foundCerts := FilterCertificateInfoModelsByFilterFunc(filterableCerts, func(cert CertificateInfoModel) bool { return cert.TeamID == "find-this-team-id" })
require.Equal(t, expectedCertsByTeamID, foundCerts)

expectedCertsByCommonNameExact := []CertificateInfoModel{
CertificateInfoModel{TeamID: "test-team-id2", CommonName: "find this common name"},
}

foundCerts = FilterCertificateInfoModelsByFilterFunc(filterableCerts, func(cert CertificateInfoModel) bool { return cert.CommonName == "find this common name" })
require.Equal(t, expectedCertsByCommonNameExact, foundCerts)

expectedCertsByCommonNameMatch := []CertificateInfoModel{
CertificateInfoModel{TeamID: "test-team-id", CommonName: "test common name"},
CertificateInfoModel{TeamID: "test-team-id2", CommonName: "find this common name"},
}

foundCerts = FilterCertificateInfoModelsByFilterFunc(filterableCerts, func(cert CertificateInfoModel) bool { return strings.Contains(cert.CommonName, "common name") })
require.Equal(t, expectedCertsByCommonNameMatch, foundCerts)
}

func TestFilterValidCertificateInfos(t *testing.T) {
const serial = int64(1234)
const teamID = "MYTEAMID"
const teamName = "BITFALL FEJLESZTO KORLATOLT FELELOSSEGU TARSASAG"
const commonName = "Apple Developer: test"
validExpiry := time.Now().AddDate(1, 0, 0)
earlierValidExpiry := time.Now().AddDate(0, 1, 0)
invalidExpiry := time.Now().AddDate(-1, 0, 0)

latestValidCert, privateKey, err := GenerateTestCertificate(serial, teamID, teamName, commonName, validExpiry)
if err != nil {
t.Errorf("init: failed to generate certificate, error: %s", err)
}
latestValidCertInfo := NewCertificateInfo(*latestValidCert, privateKey)
t.Logf("Test certificate generated: %s", latestValidCertInfo)

earlierValidCert, privateKey, err := GenerateTestCertificate(serial, teamID, teamName, commonName, earlierValidExpiry)
if err != nil {
t.Errorf("init: failed to generate certificate, error: %s", err)
}
earlierValidCertInfo := NewCertificateInfo(*earlierValidCert, privateKey)
t.Logf("Test certificate generated: %s", earlierValidCertInfo)

invalidCert, privateKey, err := GenerateTestCertificate(serial, teamID, teamName, commonName, invalidExpiry)
if err != nil {
t.Errorf("init: failed to generate certificate, error: %s", err)
}
invalidCertInfo := NewCertificateInfo(*invalidCert, privateKey)
t.Logf("Test certificate generated: %s", invalidCertInfo)

tests := []struct {
name string
certificateInfos []CertificateInfoModel
want ValidCertificateInfo
}{
{
name: "one valid cert",
certificateInfos: []CertificateInfoModel{latestValidCertInfo},
want: ValidCertificateInfo{
ValidCertificates: []CertificateInfoModel{latestValidCertInfo},
InvalidCertificates: nil,
DuplicatedCertificates: nil,
},
},
{
name: "one valid, one invalid cert with same name",
certificateInfos: []CertificateInfoModel{latestValidCertInfo, invalidCertInfo},
want: ValidCertificateInfo{
ValidCertificates: []CertificateInfoModel{latestValidCertInfo},
InvalidCertificates: []CertificateInfoModel{invalidCertInfo},
DuplicatedCertificates: nil,
},
},
{
name: "2 valid, duplicated certs",
certificateInfos: []CertificateInfoModel{latestValidCertInfo, earlierValidCertInfo, invalidCertInfo},
want: ValidCertificateInfo{
ValidCertificates: []CertificateInfoModel{latestValidCertInfo},
InvalidCertificates: []CertificateInfoModel{invalidCertInfo},
DuplicatedCertificates: []CertificateInfoModel{earlierValidCertInfo},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := FilterValidCertificateInfos(tt.certificateInfos); !reflect.DeepEqual(got, tt.want) {
t.Errorf("FilterValidCertificateInfos() = %v, want %v", got, tt.want)
}
})
}
}
Loading