[Packagemanager] Fix GetPackageCertificate (#5428)
[platform/core/csapi/tizenfx.git] / src / Tizen.Applications.PackageManager / Tizen.Applications / PackageCertificate.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using System.Collections.Generic;
19 using System.Runtime.InteropServices;
20
21 namespace Tizen.Applications
22 {
23     /// <summary>
24     /// This class provides information about the package certification.
25     /// </summary>
26     /// <since_tizen> 3 </since_tizen>
27     public class PackageCertificate
28     {
29         private const string LogTag = "Tizen.Applications";
30
31         private readonly string _root;
32         private readonly string _intermediate;
33         private readonly string _signer;
34
35         internal PackageCertificate(string root, string intermediate, string signer)
36         {
37             _root = root;
38             _intermediate = intermediate;
39             _signer = signer;
40         }
41
42         /// <summary>
43         /// Root certificate.
44         /// </summary>
45         /// <since_tizen> 3 </since_tizen>
46         public string Root { get { return _root;  } }
47
48         /// <summary>
49         /// Intermediate certificate.
50         /// </summary>
51         /// <since_tizen> 3 </since_tizen>
52         public string Intermediate { get { return _intermediate; } }
53
54         /// <summary>
55         /// Signer certificate.
56         /// </summary>
57         /// <since_tizen> 3 </since_tizen>
58         public string Signer { get { return _signer; } }
59
60         internal static IReadOnlyDictionary<CertificateType, PackageCertificate> GetPackageCertificates(IntPtr packageInfoHandle)
61         {
62             Dictionary<Interop.Package.CertificateType, string> nativeCertificates = new Dictionary<Interop.Package.CertificateType, string>();
63             Interop.Package.PackageInfoCertificateInfoCallback certificateInfoCb = (handle, certType, certValue, userData) =>
64             {
65                 if (certValue == null) certValue = string.Empty;
66                 try
67                 {
68                     nativeCertificates.Add(certType, certValue);
69                 }
70                 catch (ArgumentException ex)
71                 {
72                     Log.Warn(LogTag, string.Format("Failed to add cert value. certType = {0}, err = {1}", certType, ex.Message));
73                 }
74                 return true;
75             };
76
77             Interop.PackageManager.ErrorCode err = Interop.Package.PackageInfoForeachCertificateInfo(packageInfoHandle, certificateInfoCb, IntPtr.Zero);
78             if (err != Interop.PackageManager.ErrorCode.None)
79             {
80                 Log.Warn(LogTag, string.Format("Failed to get certificate info. err = {0}", err));
81             }
82
83             Dictionary<CertificateType, PackageCertificate> certificates = new Dictionary<CertificateType, PackageCertificate>();
84             string authorRootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorRootCertificate);
85             string authorIntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorIntermediateCertificate);
86             string aurthorSignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorSignerCertificate);
87             certificates.Add(CertificateType.Author, new PackageCertificate(authorRootCertificate, authorIntermediateCertificate, aurthorSignerCertificate));
88
89             string distRootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorRootCertificate);
90             string distIntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorIntermediateCertificate);
91             string distSignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorSignerCertificate);
92             certificates.Add(CertificateType.Distributor, new PackageCertificate(distRootCertificate, distIntermediateCertificate, distSignerCertificate));
93
94             string dist2RootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2RootCertificate);
95             string dist2IntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2IntermediateCertificate);
96             string dist2SignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2SignerCertificate);
97             certificates.Add(CertificateType.Distributor2, new PackageCertificate(dist2RootCertificate, dist2IntermediateCertificate, dist2SignerCertificate));
98
99             return certificates;
100         }
101
102         private static string GetValue(IDictionary<Interop.Package.CertificateType, string> dict, Interop.Package.CertificateType key)
103         {
104             string value;
105             dict.TryGetValue(key, out value);
106             return value;
107         }
108     }
109 }