Tizen.Pims.Calendar.dll #common #mobile #mobile-emul #tv #wearable
Tizen.Pims.Contacts.dll #mobile #mobile-emul #wearable
Tizen.Security.dll #common #mobile #mobile-emul #tv #ivi #wearable
+Tizen.Security.PrivacyPrivilegeManager.dll #common #mobile #mobile-emul #tv #ivi #wearable
Tizen.Security.SecureRepository.dll #common #mobile #mobile-emul #tv #ivi #wearable
Tizen.Security.TEEC.dll #mobile #mobile-emul #tv #ivi #wearable
Tizen.Sensor.dll #common #mobile #mobile-emul #tv #ivi #wearable
Tizen.Pims.Calendar
Tizen.Pims.Contacts
Tizen.Security
+Tizen.Security.PrivacyPrivilegeManager
Tizen.Security.SecureRepository
Tizen.Security.TEEC
Tizen.Sensor
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+internal static partial class Interop
+{
+ internal static partial class Libraries
+ {
+ internal const string PrivacyPrivilegeManager = "libcapi-privacy-privilege-manager.so.0";
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Runtime.InteropServices;
+
+internal static partial class Interop
+{
+ internal static partial class PrivacyPrivilegeManager
+ {
+ internal enum ErrorCode
+ {
+ None = Tizen.Internals.Errors.ErrorCode.None,
+ IoError = Tizen.Internals.Errors.ErrorCode.IoError,
+ InvalidParameter = Tizen.Internals.Errors.ErrorCode.InvalidParameter,
+ OutOfMemory = Tizen.Internals.Errors.ErrorCode.OutOfMemory,
+ Unknown = Tizen.Internals.Errors.ErrorCode.Unknown
+ }
+
+ internal enum CallCause
+ {
+ Answer = 0,
+ Error = 1,
+ }
+
+ internal enum CheckResult
+ {
+ Allow = 0,
+ Deny = 1,
+ Ask = 2,
+ }
+
+ internal enum RequestResult
+ {
+ AllowForever = 0,
+ DenyForever = 1,
+ DenyOnce = 2,
+ }
+
+ //[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
+ internal delegate void RequestResponseCallback(CallCause cause, RequestResult result, string privilege, IntPtr userData);
+
+ [DllImport(Libraries.PrivacyPrivilegeManager, EntryPoint = "ppm_check_permission")]
+ internal static extern ErrorCode CheckPermission(string privilege, out CheckResult result);
+
+ [DllImport(Libraries.PrivacyPrivilegeManager, EntryPoint = "ppm_request_permission")]
+ internal static extern ErrorCode RequestPermission(string privilege, RequestResponseCallback callback, IntPtr userData);
+ }
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <TargetFramework>netstandard2.0</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\Tizen\Tizen.csproj" />
+ <ProjectReference Include="..\Tizen.Log\Tizen.Log.csproj" />
+ </ItemGroup>
+</Project>
--- /dev/null
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26124.0
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tizen.Security.PrivacyPrivilegeManager", "Tizen.Security.PrivacyPrivilegeManager.csproj", "{588EBECE-A11C-4837-80F3-5EDECFC17E5E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|x64.ActiveCfg = Debug|x64
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|x64.Build.0 = Debug|x64
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|x86.ActiveCfg = Debug|x86
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Debug|x86.Build.0 = Debug|x86
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|x64.ActiveCfg = Release|x64
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|x64.Build.0 = Release|x64
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|x86.ActiveCfg = Release|x86
+ {588EBECE-A11C-4837-80F3-5EDECFC17E5E}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+EndGlobal
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Tizen.Security
+{
+ /// <summary>
+ /// Enumeration for the call cause of a permission request callback.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ public enum CallCause
+ {
+ /// <summary>
+ /// The call cause is a permission request answer.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ Answer = Interop.PrivacyPrivilegeManager.CallCause.Answer,
+ /// <summary>
+ /// The call cause is an error.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ Error = Interop.PrivacyPrivilegeManager.CallCause.Error,
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Tizen.Security
+{
+ /// <summary>
+ /// Enumeration for the result of a permission check.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ public enum CheckResult
+ {
+ /// <summary>
+ /// The access to privilege is allowed permanently.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ Allow = Interop.PrivacyPrivilegeManager.CheckResult.Allow,
+ /// <summary>
+ /// The access to privilege is denied permanently.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ Deny = Interop.PrivacyPrivilegeManager.CheckResult.Deny,
+ /// <summary>
+ /// The access to privilege must be resolved by the user.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ Ask = Interop.PrivacyPrivilegeManager.CheckResult.Ask,
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using Tizen.Internals.Errors;
+
+namespace Tizen.Security
+{
+ /// <summary>
+ /// The PrivacyPrivilegeManager provides the properties or methods to check and request a permission for privacy privilege.
+ /// </summary>
+ public static class PrivacyPrivilegeManager
+ {
+ private const string LogTag = "Tizen.Privilege";
+ private static Interop.PrivacyPrivilegeManager.RequestResponseCallback s_requestResponseCb;
+ private static IDictionary<string, ResponseContext> s_responseMap = new Dictionary<string, ResponseContext>();
+
+ static PrivacyPrivilegeManager()
+ {
+ s_requestResponseCb = (Interop.PrivacyPrivilegeManager.CallCause cause, Interop.PrivacyPrivilegeManager.RequestResult result, string privilege, IntPtr userData) =>
+ {
+ try
+ {
+ s_responseMap[privilege].FireEvent((CallCause)cause, (RequestResult) result);
+ }
+ catch (Exception e)
+ {
+ Log.Error(LogTag, "Exception in callback : " + e.Message);
+ }
+ };
+ }
+
+ /// <summary>
+ /// Gets the status of a privacy privilege permission.
+ /// </summary>
+ /// <param name="privilege">The privacy privilege to be checked.</param>
+ /// <returns>The permission setting for a respective privilege.</returns>
+ /// <exception cref="ArgumentException">Thrown when an invalid parameter is passed.</exception>
+ /// <exception cref="OutOfMemoryException">Thrown when a memory error occurred.</exception>
+ /// <exception cref="System.IO.IOException">Thrown when the method failed due to an internal I/O error.</exception>
+ /// <example>
+ /// <code>
+ /// CheckResult result = PrivacyPrivilegeManager.CheckPermission("http://tizen.org/privilege/account.read");
+ /// switch (result)
+ /// {
+ /// case Allow:
+ /// // Privilege can be used
+ /// break;
+ /// case Deny:
+ /// // Privilege can't be used
+ /// break;
+ /// case Ask:
+ /// // User permission request required
+ /// PrivacyPrivilegeManager.RequestPermission("http://tizen.org/privilege/account.read");
+ /// break;
+ /// }
+ /// </code>
+ /// </example>
+ public static CheckResult CheckPermission(string privilege)
+ {
+ Interop.PrivacyPrivilegeManager.CheckResult result;
+ int ret = (int)Interop.PrivacyPrivilegeManager.CheckPermission(privilege, out result);
+ if (ret != (int)Interop.PrivacyPrivilegeManager.ErrorCode.None)
+ {
+ Log.Error(LogTag, "Failed to check permission");
+ throw PrivacyPrivilegeManagerErrorFactory.GetException(ret);
+ }
+ return (CheckResult)result;
+ }
+
+ /// <summary>
+ /// Triggers the permission request for a user.
+ /// </summary>
+ /// <param name="privilege">The privacy privilege to be requested.</param>
+ /// <exception cref="ArgumentException">Thrown when an invalid parameter is passed.</exception>
+ /// <exception cref="OutOfMemoryException">Thrown when a memory error occurred.</exception>
+ /// <exception cref="System.IO.IOException">Thrown when the method failed due to an internal I/O error.</exception>
+ /// <example>
+ /// <code>
+ /// CheckResult result = PrivacyPrivilegeManager.CheckPermission("http://tizen.org/privilege/account.read");
+ /// switch (result)
+ /// {
+ /// case Allow:
+ /// // Privilege can be used
+ /// break;
+ /// case Deny:
+ /// // Privilege can't be used
+ /// break;
+ /// case Ask:
+ /// // User permission request required
+ /// PrivacyPrivilegeManager.RequestPermission("http://tizen.org/privilege/account.read");
+ /// break;
+ /// }
+ /// </code>
+ /// </example>
+ public static void RequestPermission(string privilege)
+ {
+ int ret = (int)Interop.PrivacyPrivilegeManager.RequestPermission(privilege, s_requestResponseCb, IntPtr.Zero);
+ if (ret != (int)Interop.PrivacyPrivilegeManager.ErrorCode.None)
+ {
+ Log.Error(LogTag, "Failed to request permission");
+ throw PrivacyPrivilegeManagerErrorFactory.GetException(ret);
+ }
+ }
+
+ /// <summary>
+ /// Gets the response context for a given privilege.
+ /// </summary>
+ /// <seealso cref="ResponseContext"/>
+ /// <param name="privilege">The privilege.</param>
+ /// <returns>The response context of a respective privilege.</returns>
+ /// <exception cref="ArgumentException">Thrown if the key is an invalid parameter.</exception>
+ /// <example>
+ /// <code>
+ /// private static void PPM_RequestResponse(object sender, RequestResponseEventArgs e)
+ /// {
+ /// if (e.cause == CallCause.Answer)
+ /// {
+ /// switch(e.result)
+ ///
+ /// {
+ ///
+ /// case RequestResult.AllowForever:
+ /// Console.WriteLine("User allowed usage of privilege {0} definitely", e.privilege);
+ /// break;
+ /// case RequestResult.DenyForever:
+ /// Console.WriteLine("User denied usage of privilege {0} definitely", e.privilege);
+ /// break;
+ /// case RequestResult.DenyOnce:
+ /// Console.WriteLine("User denied usage of privilege {0} this time", e.privilege);
+ /// break;
+ /// };
+ /// }
+ /// else
+ /// {
+ /// Console.WriteLine("Error occured during requesting permission for {0}", e.privilege);
+ /// }
+ ///}
+ ///
+ /// PrivacyPrivilegeManager.ResponseContext context = null;
+ /// PrivacyPrivilegeManager.GetResponseContext("http://tizen.org/privilege/account.read").TryGetTarget(out context);
+ /// if(context != null)
+ /// {
+ /// context.ResponseFetched += PPM_RequestResponse;
+ /// }
+ ///
+ /// PrivacyPrivilegeManager.RequestPermission("http://tizen.org/privilege/account.read");
+ ///
+ /// PrivacyPrivilegeManager.GetResponseContext("http://tizen.org/privilege/account.read").TryGetTarget(out context);
+ /// if(context != null)
+ /// {
+ /// context.ResponseFetched -= PPM_RequestResponse;
+ /// }
+ /// </code>
+ /// </example>
+ public static WeakReference<ResponseContext> GetResponseContext(string privilege)
+ {
+ if (!s_responseMap.ContainsKey(privilege))
+ {
+ s_responseMap[privilege] = new ResponseContext(privilege);
+ }
+ return new WeakReference<ResponseContext>(s_responseMap[privilege]);
+ }
+
+ /// <summary>
+ /// This class manages event handlers of the privilege permission requests.
+ /// This class enables having event handlers for an individual privilege.
+ /// </summary>
+ public class ResponseContext
+ {
+ private string _privilege;
+
+ internal ResponseContext(string privilege)
+ {
+ _privilege = privilege;
+ }
+ /// <summary>
+ /// Occurs when the response for a permission request is fetched.
+ /// </summary>
+ /// <exception cref="System.InvalidOperationException">Thrown when the bundle instance has been disposed.</exception>
+ public event EventHandler<RequestResponseEventArgs> ResponseFetched
+ {
+ add
+ {
+ _ResponseFetched += value;
+ }
+
+ remove
+ {
+ _ResponseFetched -= value;
+ if (_ResponseFetched == null)
+ {
+ s_responseMap.Remove(_privilege);
+ }
+ }
+ }
+
+ private event EventHandler<RequestResponseEventArgs> _ResponseFetched;
+
+ internal void FireEvent(CallCause _cause, RequestResult _result)
+ {
+ _ResponseFetched?.Invoke(null, new RequestResponseEventArgs() { cause = _cause, result = _result, privilege = _privilege });
+ }
+ }
+ }
+
+ internal static class PrivacyPrivilegeManagerErrorFactory
+ {
+ static internal Exception GetException(int error)
+ {
+ Interop.PrivacyPrivilegeManager.ErrorCode errCode = (Interop.PrivacyPrivilegeManager.ErrorCode)error;
+ switch(errCode)
+ {
+ case Interop.PrivacyPrivilegeManager.ErrorCode.InvalidParameter:
+ return new ArgumentException("Invalid parameter");
+ case Interop.PrivacyPrivilegeManager.ErrorCode.IoError:
+ return new System.IO.IOException("I/O Error");
+ case Interop.PrivacyPrivilegeManager.ErrorCode.OutOfMemory:
+ return new OutOfMemoryException("Out of memory");
+ case Interop.PrivacyPrivilegeManager.ErrorCode.Unknown:
+ default:
+ return new ArgumentException("Unknown error");
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+namespace Tizen.Security
+{
+ /// <summary>
+ /// This class is an event argument of the RequestResponse event.
+ /// </summary>
+
+ public class RequestResponseEventArgs : EventArgs
+ {
+ /// <summary>
+ /// The cause of a triggered response.
+ /// </summary>
+ public CallCause cause { get; internal set; }
+
+ /// <summary>
+ /// The result of a permission request.
+ /// </summary>
+ public RequestResult result { get; internal set; }
+
+ /// <summary>
+ /// The privilege for which a permission was requested for.
+ /// </summary>
+ public string privilege { get; internal set; }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Tizen.Security
+{
+ /// <summary>
+ /// Enumeration for the result of a permission request.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ public enum RequestResult
+ {
+ /// <summary>
+ /// The privilege is allowed permanently.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ AllowForever = Interop.PrivacyPrivilegeManager.RequestResult.AllowForever,
+ /// <summary>
+ /// The privilege is denied permanently.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ DenyForever = Interop.PrivacyPrivilegeManager.RequestResult.DenyForever,
+ /// <summary>
+ /// The privilege is denied temporarily.
+ /// </summary>
+ /// <since_tizen> 4 </since_tizen>
+ DenyOnce = Interop.PrivacyPrivilegeManager.RequestResult.DenyOnce,
+ }
+}