89a8f9e82b2fe2785877e7ae12c1340dbeab5eef
[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                 nativeCertificates.Add(certType, certValue);
67                 return true;
68             };
69
70             Interop.PackageManager.ErrorCode err = Interop.Package.PackageInfoForeachCertificateInfo(packageInfoHandle, certificateInfoCb, IntPtr.Zero);
71             if (err != Interop.PackageManager.ErrorCode.None)
72             {
73                 Log.Warn(LogTag, string.Format("Failed to get certificate info. err = {0}", err));
74             }
75
76             Dictionary<CertificateType, PackageCertificate> certificates = new Dictionary<CertificateType, PackageCertificate>();
77             string authorRootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorRootCertificate);
78             string authorIntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorIntermediateCertificate);
79             string aurthorSignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.AuthorSignerCertificate);
80             certificates.Add(CertificateType.Author, new PackageCertificate(authorRootCertificate, authorIntermediateCertificate, aurthorSignerCertificate));
81
82             string distRootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorRootCertificate);
83             string distIntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorIntermediateCertificate);
84             string distSignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.DistributorSignerCertificate);
85             certificates.Add(CertificateType.Distributor, new PackageCertificate(distRootCertificate, distIntermediateCertificate, distSignerCertificate));
86
87             string dist2RootCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2RootCertificate);
88             string dist2IntermediateCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2IntermediateCertificate);
89             string dist2SignerCertificate = GetValue(nativeCertificates, Interop.Package.CertificateType.Distributor2SignerCertificate);
90             certificates.Add(CertificateType.Distributor2, new PackageCertificate(dist2RootCertificate, dist2IntermediateCertificate, dist2SignerCertificate));
91
92             return certificates;
93         }
94
95         private static string GetValue(IDictionary<Interop.Package.CertificateType, string> dict, Interop.Package.CertificateType key)
96         {
97             string value;
98             dict.TryGetValue(key, out value);
99             return value;
100         }
101     }
102 }