diff --git a/Changes.log b/Changes.log
new file mode 100644
index 00000000..79d32b42
--- /dev/null
+++ b/Changes.log
@@ -0,0 +1,25 @@
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+SecretStore Client Service Version 4.0
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+
+June 4th, 2004 - Cameron Mashayekhi
+New project for version 3.0 was created with no dependency on the
+older versions in CCM. All files started at version 1.0.
+
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+
+February 14th, 2005 - Cameron Mashayekhi
+Windows build compiler was converted to MSC 7.0.
+
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+
+March 9th, 2005 - Cameron Mashayekhi
+
+MSC 7.0 IDE stopped working after we moved the Vc7 directory to the
+c:/tools instead of its defautl place in Visual C directory. We
+either have to have two copies of it or make a shortcult to the
+original dir from c:/tools.
+
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
\ No newline at end of file
diff --git a/ClientPasswordManager/AUTHORS b/ClientPasswordManager/AUTHORS
new file mode 100644
index 00000000..e69de29b
diff --git a/ClientPasswordManager/ChangeLog b/ClientPasswordManager/ChangeLog
new file mode 100644
index 00000000..e69de29b
diff --git a/ClientPasswordManager/ClientPasswordManager.csproj b/ClientPasswordManager/ClientPasswordManager.csproj
new file mode 100644
index 00000000..229da90e
--- /dev/null
+++ b/ClientPasswordManager/ClientPasswordManager.csproj
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/ClientPasswordManager.csproj.user b/ClientPasswordManager/ClientPasswordManager.csproj.user
new file mode 100644
index 00000000..0e89b7e9
--- /dev/null
+++ b/ClientPasswordManager/ClientPasswordManager.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/ClientPasswordManager.sln b/ClientPasswordManager/ClientPasswordManager.sln
new file mode 100644
index 00000000..7c630bd9
--- /dev/null
+++ b/ClientPasswordManager/ClientPasswordManager.sln
@@ -0,0 +1,66 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c-sharp-net-credential", "c-sharp-net-credential\c-sharp-net-credential.csproj", "{D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5A211C70-3AEB-4305-8CB6-42757D01DC22} = {5A211C70-3AEB-4305-8CB6-42757D01DC22}
+ {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C} = {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5} = {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c-sharp-password-dialog", "c-sharp-password-dialog\c-sharp-password-dialog.csproj", "{5A211C70-3AEB-4305-8CB6-42757D01DC22}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5} = {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c-sharp-username-dialog", "c-sharp-username-dialog\c-sharp-username-dialog.csproj", "{AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5} = {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c-sharp-utilities", "c-sharp-utilities\c-sharp-utilities.csproj", "{BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "clientpasswordmanager-msm", "package\windows\clientpasswordmanager-msm\clientpasswordmanager-msm.vdproj", "{673D662C-A6F2-4D38-A001-90BD03963CEB}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tester", "Tester\Tester.csproj", "{45A551B6-8919-411F-8711-D34B267E08F4}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}.Debug.ActiveCfg = Debug|.NET
+ {D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}.Debug.Build.0 = Debug|.NET
+ {D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}.Release.ActiveCfg = Release|.NET
+ {D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}.Release.Build.0 = Release|.NET
+ {5A211C70-3AEB-4305-8CB6-42757D01DC22}.Debug.ActiveCfg = Debug|.NET
+ {5A211C70-3AEB-4305-8CB6-42757D01DC22}.Debug.Build.0 = Debug|.NET
+ {5A211C70-3AEB-4305-8CB6-42757D01DC22}.Release.ActiveCfg = Release|.NET
+ {5A211C70-3AEB-4305-8CB6-42757D01DC22}.Release.Build.0 = Release|.NET
+ {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}.Debug.ActiveCfg = Debug|.NET
+ {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}.Debug.Build.0 = Debug|.NET
+ {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}.Release.ActiveCfg = Release|.NET
+ {AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}.Release.Build.0 = Release|.NET
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}.Debug.ActiveCfg = Debug|.NET
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}.Debug.Build.0 = Debug|.NET
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}.Release.ActiveCfg = Release|.NET
+ {BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}.Release.Build.0 = Release|.NET
+ {673D662C-A6F2-4D38-A001-90BD03963CEB}.Debug.ActiveCfg = Debug
+ {673D662C-A6F2-4D38-A001-90BD03963CEB}.Debug.Build.0 = Debug
+ {673D662C-A6F2-4D38-A001-90BD03963CEB}.Release.ActiveCfg = Release
+ {673D662C-A6F2-4D38-A001-90BD03963CEB}.Release.Build.0 = Release
+ {45A551B6-8919-411F-8711-D34B267E08F4}.Debug.ActiveCfg = Debug|.NET
+ {45A551B6-8919-411F-8711-D34B267E08F4}.Debug.Build.0 = Debug|.NET
+ {45A551B6-8919-411F-8711-D34B267E08F4}.Release.ActiveCfg = Release|.NET
+ {45A551B6-8919-411F-8711-D34B267E08F4}.Release.Build.0 = Release|.NET
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/ClientPasswordManager/ClientPasswordManager.suo b/ClientPasswordManager/ClientPasswordManager.suo
new file mode 100644
index 00000000..f7615d81
Binary files /dev/null and b/ClientPasswordManager/ClientPasswordManager.suo differ
diff --git a/ClientPasswordManager/Makefile.am b/ClientPasswordManager/Makefile.am
new file mode 100644
index 00000000..d6c3506b
--- /dev/null
+++ b/ClientPasswordManager/Makefile.am
@@ -0,0 +1,50 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+SUBDIRS = c-sharp-utilities c-sharp-password-dialog c-sharp-username-dialog c-sharp-net-credential package
+
+EXTRA_DIST =
+
+.PHONY: package package-clean package-install package-uninstall
+package package-clean package-install package-uninstall:
+ $(MAKE) -C package $@
+
+installcheck-summary:
+ $(MAKE) -C src $@
+
+clean-local:
+ rm -rf *.suo
+
+maintainer-clean-local:
+ rm -f configure Makefile.in clientpasswordmanager-*.tar.gz
+ rm -f aclocal.m4 conf*.sh configure.lineno
+ rm -f config.guess config.sub config.status
+ rm -f ltmain.sh libtool
+ rm -f install-sh install-sh.lnk INSTALL INSTALL.lnk
+ rm -f missing missing.lnk mkinstalldirs mkinstalldir.lnk
+ rm -rf autom4te.cache
diff --git a/ClientPasswordManager/NEWS b/ClientPasswordManager/NEWS
new file mode 100644
index 00000000..e69de29b
diff --git a/ClientPasswordManager/README b/ClientPasswordManager/README
new file mode 100644
index 00000000..fa4eaba9
--- /dev/null
+++ b/ClientPasswordManager/README
@@ -0,0 +1,193 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The ClientPasswordManager provides a set of libraries to allow applications
+to share user name and password credentials. The ClientPasswordManager also
+provides dialog components that can be leveraged by applications to prompt
+users for credentials.
+
+The goal of the ClientPasswordManager is to minimize the number of prompts
+that users experience when accessing applications that require the user's
+name and password to authenticate to backend systems.
+
+A secondary goal of the ClientPasswordManager is to normalize the prompts
+for credentials that are seen by the user.
+
+FEATURES
+
+The ClientPasswordManager consists of APIs for obtaining/setting user password
+credentials as well as a set of dialogs that can be used to prompt the user
+for its credentials.
+
+The ClientPasswordManager leverages the services of the SecretStore Client Wallet
+Service for the secure storage of user credentials and for controlling access to
+the credentials. Usage of the ClientPasswordManager instead of writting to the
+SecretStore Wallet API directly free applications from having to agree on a
+standard on how credentials need to be stored in the wallet.
+
+The ClientPasswordManager will try to make its services available to native, .NET,
+and Java applications.
+
+CONTENTS
+
+c-sharp-net-credential - This folder contains an implemtation of the .NET ICredentials
+interface called the NetCredential class. NetCredential objects leverage the contents
+of the wallet when queried for user credentials.
+
+c-sharp-password-dialog - This folder contains a dialog class that can be used by .NET
+applications to query the user for its password.
+
+c-sharp-username-dialog - This folder contains a dialog class that can be used by .NET
+applications to query the user for its user name.
+
+c-sharp-utilities - This folder contains .NET utilities leveraged by ClientPAsswordManager
+.NET components.
+
+package - This folder contains the files necessary to build the software packages
+under windows and under linux.
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON WINDOWS
+
+ - Install Visual Studio .NET 2003
+ - Install Cygwin - See instructions below.
+
+Download and start cygwin install:
+Browse to http://sources.redhat.com/cygwin/
+
+Click on "Install or update now!" or "Install Cygwin now"
+
+Cygwin Setup:
+Next
+
+Cygwin Setup - Choose Installation Type:
+Install from Internet
+Next
+
+Cygwin Setup - Choose Installation Directory:
+Root Directory: C:\cygwin
+Install For: "All Users"
+
+Default Text File Type: DOS
+
+Cygwin Setup - Select Local Package Directory:
+ Local Package Directory: C:\cygwin-packages
+
+Cygwin Setup - Select Connection Type:
+ Direct Connection
+
+Choose A Download Site:
+ ftp://ftp.nas.nasa.gov
+
+Cywin Setup - Select Packages:
+ Base:
+ defaults
+
+ Devel:
+ autoconf
+ automake
+ libtool
+ make
+ pkgconfig
+ cvs
+ gcc
+ gcc-g++
+
+ Editors:
+ vim (optional)
+
+ Net:
+ openssh
+ openssl
+
+ Text:
+ more
+
+ Utils:
+ clear (optional)
+
+Cygwin Setup - Create Icons:
+Finish
+
+Edit cygwin.bat (c:\cygwin\cygwin.bat) to add a call to
+%VS71COMNTOOLS%\vsvars32.bat (see example below). This sets up the
+Visual Studio tools in Cygwin.
+
+Sample cygwin.bat:
+
+@echo off
+
+call "%VS71COMNTOOLS%\vsvars32.bat" > NUL
+
+C:
+chdir C:\cygwin\bin
+
+bash --login -i
+
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON LINUX
+
+Install latest mono and mono-devel RPM - Obtain RPMs from
+www.go-mono.org.
+
+
+BUILDING THE SOFTWARE PACKAGE
+
+Windows: Start at Step 1.
+Linux: Skip to Step 2.
+
+1. Run cygwin.bat to start up Cygwin.
+
+2. Generate autotools files:
+./autogen.sh --prefix=/ [--enable-debug]
+( is some writable directory where 'make install' will
+install files for testing.
+
+3. To reconfigure later, or to configure software that came from a source
+distribution (.tar.gz) file, use configure.
+./configure --prefix/ [--enable-debug]
+(run ./configure --help for more options)
+
+4. Select your make target, here are a few interesting ones:
+
+make [all] - build product files (package files not included)
+
+make clean - clean up files built by 'make all'
+
+make package - build product and package files
+
+make package-clean - clean up package files
+
+make install - install product files to specified by
+--prefix during configure
+
+make uninstall - undo 'make install'
+
+make dist - build a source distribution tarball.
+
+make distclean - removes files to return state back to same as the
+source distribution (configure, Makefile.in files, and other distributed
+autotools files are not removed)
+
+make maintainer-clean - removes files to return state back to same as
+the CVS checkout (you will need to run ./autogen.sh again before running
+make again)
+
diff --git a/ClientPasswordManager/Tester/App.ico b/ClientPasswordManager/Tester/App.ico
new file mode 100644
index 00000000..3a5525fd
Binary files /dev/null and b/ClientPasswordManager/Tester/App.ico differ
diff --git a/ClientPasswordManager/Tester/AssemblyInfo.cs b/ClientPasswordManager/Tester/AssemblyInfo.cs
new file mode 100644
index 00000000..177a4f0e
--- /dev/null
+++ b/ClientPasswordManager/Tester/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/ClientPasswordManager/Tester/Class1.cs b/ClientPasswordManager/Tester/Class1.cs
new file mode 100644
index 00000000..dc4717c3
--- /dev/null
+++ b/ClientPasswordManager/Tester/Class1.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Net;
+using System.Reflection ;
+using Novell.Security.ClientPasswordManager;
+
+
+namespace Tester
+{
+ ///
+ /// Summary description for Class1.
+ ///
+ class Class1
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main(string[] args)
+ {
+ // call NetCredential code
+ NetCredential nc = new NetCredential("Ifolder", "Network", true, "jnorman", "novell");
+ NetCredential nc2 = new NetCredential("Ifolder", null, false, "ifolderusername", "novell");
+
+ NetworkCredential nwc = nc2.GetCredential(new System.Uri("http://IFolder"), "Basic");
+
+ if (nwc != null)
+ {
+ Console.WriteLine("Username: "+ nwc.UserName);
+ Console.WriteLine("Password: "+ nwc.Password);
+ }
+
+ /*
+ // call SetCredential
+ Type type = assembly.GetType("Novell.CASA.miCASA");
+ MemberInfo[] members = type.GetMembers();
+
+ object Instance = Activator.CreateInstance (type);
+
+ object[] cargs = new object[4];
+ //cargs[0] = 0;
+ cargs[0] = "AppSecretIDTest";
+ cargs[1] = null; //"SharedSecretIDTEST";
+ //cargs[3] = 0;
+ cargs[2] = "Username";
+ cargs[3] = "password";
+
+ object result; // = type.InvokeMember ("SetCredential" ,BindingFlags.InvokeMethod ,null,Instance,cargs);
+ // call SetBasicCredential
+ try
+ {
+ type.InvokeMember("SetBasicCredential", BindingFlags.InvokeMethod, null, Instance, cargs);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+
+
+ // now get the basicCred back
+ try
+ {
+ object[] getArgs = new object[2];
+ getArgs[0] = "AppSecretIDTest";
+ getArgs[1] = null;
+
+
+ result = type.InvokeMember("GetCredentialUsername", BindingFlags.InvokeMethod, null, Instance, getArgs);
+ Console.WriteLine("Username: "+result.ToString());
+
+ result = type.InvokeMember("GetCredentialPassword", BindingFlags.InvokeMethod, null, Instance, getArgs);
+ Console.WriteLine("Password: "+result.ToString());
+ // invoke the GetUsername and GetPassword methods
+ //Type basicCred = assembly.GetType("Novell.CASA.miCASA.BasicCredential");
+ //object username = basicCred.InvokeMember("GetUsername", BindingFlags.InvokeMethod, null, result, null);
+ //object password = basicCred.InvokeMember("GetPassword", BindingFlags.InvokeMethod, null, result, null);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ */
+
+ }
+ }
+}
diff --git a/ClientPasswordManager/Tester/Tester.csproj b/ClientPasswordManager/Tester/Tester.csproj
new file mode 100644
index 00000000..b47bec35
--- /dev/null
+++ b/ClientPasswordManager/Tester/Tester.csproj
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/Tester/Tester.csproj.user b/ClientPasswordManager/Tester/Tester.csproj.user
new file mode 100644
index 00000000..9325edba
--- /dev/null
+++ b/ClientPasswordManager/Tester/Tester.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/autogen.sh b/ClientPasswordManager/autogen.sh
new file mode 100644
index 00000000..dce68973
--- /dev/null
+++ b/ClientPasswordManager/autogen.sh
@@ -0,0 +1,130 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=ClientPasswordManager
+TEST_TYPE=-f
+FILE=c-sharp-net-credential/NetCredential.cs
+
+DIE=0
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+AUTOMAKE=automake-1.7
+ACLOCAL=aclocal-1.7
+
+($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
+ AUTOMAKE=automake
+ ACLOCAL=aclocal
+}
+
+($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+test $TEST_TYPE $FILE || {
+ echo "You must run this script in the top-level $PROJECT directory"
+ exit 1
+}
+
+if test -z "$*"; then
+ echo "I am going to run ./configure with no arguments - if you wish "
+ echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+case $CC in
+*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+esac
+
+for coin in `find $srcdir -name configure.in -print`
+do
+ dr=`dirname $coin`
+ if test -f $dr/NO-AUTO-GEN; then
+ echo skipping $dr -- flagged as no auto-gen
+ else
+ echo processing $dr
+ macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+ ( cd $dr
+ aclocalinclude="$ACLOCAL_FLAGS"
+ for k in $macrodirs; do
+ if test -d $k; then
+ aclocalinclude="$aclocalinclude -I $k"
+ ##else
+ ## echo "**Warning**: No such directory \`$k'. Ignored."
+ fi
+ done
+ if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
+ if grep "sed.*POTFILES" configure.in >/dev/null; then
+ : do nothing -- we still have an old unmodified configure.in
+ else
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ fi
+ if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | glib-gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
+ echo "Running libtoolize..."
+ libtoolize --force --copy
+ fi
+ echo "Running $ACLOCAL $aclocalinclude ..."
+ $ACLOCAL $aclocalinclude
+ if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
+ echo "Running autoheader..."
+ autoheader
+ fi
+ echo "Running $AUTOMAKE --gnu $am_opt ..."
+ $AUTOMAKE --add-missing --gnu $am_opt
+ echo "Running autoconf ..."
+ autoconf
+ )
+ fi
+done
+
+conf_flags="--config-cache --enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
+
+cd "$ORIGDIR"
+
+if test x$NOCONFIGURE = x; then
+ echo Running $srcdir/configure $conf_flags "$@" ...
+ $srcdir/configure $conf_flags "$@" \
+ && echo Now type \`make\' to compile $PROJECT || exit 1
+else
+ echo Skipping configure process.
+fi
diff --git a/ClientPasswordManager/c-sharp-net-credential/AssemblyInfo.cs b/ClientPasswordManager/c-sharp-net-credential/AssemblyInfo.cs
new file mode 100644
index 00000000..725babfa
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("Novell.Security.ClientPasswordManager NetCredential")]
+[assembly: AssemblyDescription("Implements the NetCredential class for Novell.Security.ClientPasswordManager")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Novell, Inc.")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Copyright (C) 2004 Novell, Inc.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("..\\..\\c-sharp-net-credential.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/ClientPasswordManager/c-sharp-net-credential/Makefile.am b/ClientPasswordManager/c-sharp-net-credential/Makefile.am
new file mode 100644
index 00000000..3ab102e3
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/Makefile.am
@@ -0,0 +1,77 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+Module_CSFILES = $(srcdir)/NetCredential.cs
+Module_CSFILES_CSC := $(subst /,$(SEP),$(Module_CSFILES))
+Module_KEYFILE = $(srcdir)/c-sharp-net-credential.snk
+Module_INCLUDES =
+Module_RESOURCES =
+Module_FLAGS = $(CSC_LIBFLAG)
+Module_LIBS = System.dll System.Data.dll $(SYSTEM_XML) Novell.Security.ClientPasswordManager.PasswordDialog.dll Novell.Security.ClientPasswordManager.UsernameDialog.dll Novell.Security.Utilities.dll
+Module_LIBPATH = ../c-sharp-password-dialog/bin/$(TARGET_CFG) ../c-sharp-username-dialog/bin/$(TARGET_CFG) ../c-sharp-utilities/bin/$(TARGET_CFG)
+
+EXTRA_DIST = $(Module_CSFILES) $(Module_KEYFILE)
+
+CUR_DIR := $(shell pwd)
+
+all: Novell.Security.ClientPasswordManager.NetCredential.dll
+
+Novell.Security.ClientPasswordManager.NetCredential.dll: $(Module_CSFILES) $(Module_RESOURCES)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+if WINDOWS
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.NetCredential.doc.xml
+else
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) /keyfile:$(Module_KEYFILE) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.NetCredential.doc.xml
+endif
+
+install-exec-local: Novell.Security.ClientPasswordManager.NetCredential.dll
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.NetCredential.dll $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f Novell.Security.ClientPasswordManager.NetCredential.dll
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.NetCredential.dll /doc:Novell.Security.ClientPasswordManager.NetCredential.doc.xml
+
+clean-local:
+ rm -rf *.dbg *.exe *.dll $(CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/c-sharp-net-credential/NetCredential.cs b/ClientPasswordManager/c-sharp-net-credential/NetCredential.cs
new file mode 100644
index 00000000..1d2b8835
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/NetCredential.cs
@@ -0,0 +1,471 @@
+/***********************************************************************
+ * File: NetCredential.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Namespace: Novell.Security.ClientPasswordManager
+ *
+ * Classes implemented: NetCredential.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+using System;
+using System.Net;
+using System.IO;
+using System.Diagnostics;
+using Novell.Security;
+using System.Reflection;
+
+namespace Novell.Security.ClientPasswordManager
+{
+ ///
+ /// Provides an implementation of ICredentials that leverages the
+ /// services of the SecretStore Client Service Wallet.
+ ///
+ public class NetCredential: ICredentials
+ {
+ #region Class Members and Defines
+
+ // This is temporary until we add code to interact with the SecretStore
+ private class UserCache
+ {
+ public string m_userName;
+ public CredentialCache m_credentialCache;
+
+ public UserCache()
+ {
+ m_userName = null;
+ m_credentialCache = null;
+ }
+ }
+
+ // This is temporary until we add code to interact with the SecretStore
+ private static UserCache[] m_userCaches = new UserCache[10];
+
+ private string m_svcName = null;
+ private string m_svcGroupName = null;
+ private string m_userName = null;
+ private string m_password = null;
+ private string m_credScope = null;
+
+ private bool m_haveCredentials;
+
+ #endregion
+
+
+ private static bool bMiCasaIsAvailable = false;
+ private static Assembly assembly = null; //
+ private static string MI_CASA_CLASS_NAME = "Novell.CASA.miCASA";
+
+
+ static NetCredential()
+ {
+
+ try
+ {
+ assembly = Assembly.LoadWithPartialName("Novell.CASA.miCASAWrapper");
+ if (assembly != null)
+ bMiCasaIsAvailable = true;
+ }
+ catch (Exception e)
+ {
+ Dbg.trcError(e.ToString());
+ }
+ }
+
+
+
+ ///
+ /// Constructs a NetCredential object for Windows Applications.
+ ///
+ /// There is a high probability that services under the same group share the
+ /// same user name and passwords. By specifying a service group name, the caller wants to
+ /// take advantage of this to try to improve the user experience. If the service group
+ /// name is not specified then no effort is made to share usernames and passwords with
+ /// other services.
+ ///
+ /// If the svcGroupNameIsRealmName parameter is set to true then it is assumed that
+ /// the services in the group validate username and passwords against the same
+ /// database or against synchronized databases.
+ ///
+ /// If the svcGroupNameIsRealmName parameter is set to false then an attempt will be
+ /// made to share passwords between the services in the group but services will be
+ /// allowed to use different passwords. Specifying a service group does not mean
+ /// that the system will not be able to obtain a username and password that is
+ /// unique to a particular service.
+ ///
+ /// Name of service requesting credentials.
+ /// Name of group to which the service belongs, can be null or zero length.
+ /// The group name is the name of the backend authentication realm.
+ /// Name of the user.
+ /// User password if known, otherwise null or empty string.
+ public NetCredential(string svcName,
+ string svcGroupName,
+ bool svcGroupNameIsRealmName,
+ string userName,
+ string password)
+ {
+ // Check input parameters
+ if (svcName == null
+ || svcName.Length == 0
+ || (svcGroupNameIsRealmName
+ && (svcGroupName == null
+ || svcGroupName.Length == 0))
+ || userName == null
+ || userName.Length == 0)
+ {
+ Dbg.trcError("NetCredential constructor- Invalid input parameter");
+ throw new Exception("NetCredential constructor- Invalid input parameter");
+ }
+
+ m_svcName = svcName;
+ m_svcGroupName = svcGroupName;
+ m_userName = userName;
+ m_password = password;
+
+ // Determine the name under which the credentials are scoped
+ if (svcGroupNameIsRealmName)
+ m_credScope = m_svcGroupName;
+ else
+ m_credScope = m_svcName;
+
+ // Check if we need to update the credential cache
+ if (password != null
+ && password.Length != 0)
+ {
+ if (bMiCasaIsAvailable)
+ {
+ UpdateMiCasaCredential(userName, password, m_svcName, svcGroupName);
+ }
+ else
+ {
+ UpdateCredentialCache(userName, password, m_credScope);
+ }
+
+ // Remember that there object has credentials associated with it to avoid
+ // looking them up in the cache at a later time.
+ m_haveCredentials = true;
+ }
+ else
+ {
+ // Indicate that we need to look up the credentials in the cache
+ m_haveCredentials = false;
+ }
+ }
+
+ ///
+ /// Constructs a NetCredential object.
+ ///
+ /// No effort is made to share usernames and passwords with other services.
+ ///
+ /// Name of service requesting credentials.
+ /// Name of the user.
+ /// User password if known, otherwise null or empty string. Not meaningfull if username is not specified.
+ public NetCredential(string svcName,
+ string userName,
+ string password)
+ {
+ // Check input parameters
+ if (svcName == null
+ || svcName.Length == 0
+ || userName == null
+ || userName.Length == 0)
+ {
+ Dbg.trcError("NetCredential constructor- Invalid input parameter");
+ throw new Exception("NetCredential constructor- Invalid input parameter");
+ }
+
+ m_svcName = svcName;
+ m_userName = userName;
+ m_password = password;
+
+ // The credentials are scoped to the service name
+ m_credScope = m_svcName;
+
+ // Check if we need to update the credential cache
+ if (password != null
+ && password.Length != 0)
+ {
+
+ if (bMiCasaIsAvailable)
+ {
+ UpdateMiCasaCredential(userName, password, m_svcName, null);
+ }
+ else
+ {
+ UpdateCredentialCache(userName, password, m_credScope);
+ }
+
+ // Remember that there object has credentials associated with it to avoid
+ // looking them up in the cache at a later time.
+ m_haveCredentials = true;
+ }
+ else
+ {
+ // Indicate that we need to look up the credentials in the cache
+ m_haveCredentials = false;
+ }
+ }
+
+ ///
+ /// Removes a NetworkCredential instance from the cache.
+ ///
+ /// A Uri that specifies the URI prefix of the resources that the credential is used for.
+ /// The authentication scheme used by the host named in uriPrefix.
+ public void Remove(Uri uriPrefix,
+ String authType)
+ {
+ // Only process requests for the "Basic" authentication scheme
+ if (authType.ToUpper() == "BASIC")
+ {
+
+ if (bMiCasaIsAvailable)
+ {
+ RemoveMiCasaCredential(uriPrefix.ToString());
+ return;
+ }
+
+ // Check if we already have credentials
+ if (m_haveCredentials)
+ {
+ // Clear the credentials.
+ m_password = null;
+ m_haveCredentials = false;
+ }
+
+ //
+ // Lookup the credentials in the cache
+ //
+ // Synchronize access into the cache
+ lock (m_userCaches)
+ {
+ // Look for the user's cache
+ int i;
+ for (i = 0; i < m_userCaches.Length; i++)
+ {
+ // Check if the user cache has been instantiated
+ if (m_userCaches[i] != null)
+ {
+ if (m_userCaches[i].m_userName == m_userName)
+ {
+ // We found a cache for this user, remove the credentials.
+ m_userCaches[i].m_credentialCache.Remove(new Uri("http://" + m_credScope, true), "Basic");
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ Dbg.trcError("NetCredential.GetCredential- Unsupported authentication scheme");
+ }
+ }
+
+ ///
+ /// Obtains the network credentials necessary to gain access to the resources associated
+ /// with the specified uri prefix.
+ ///
+ /// Uri that specifies the URI prefix of resources that the credential grant access to
+ /// The authentication scheme used by the resource
+ /// NetworkCredential object or null if not successful
+ public NetworkCredential GetCredential(Uri uriPrefix,
+ String authType)
+ {
+ NetworkCredential cred = null;
+
+ // Only process requests for the "Basic" authentication scheme
+ if (authType.ToUpper() == "BASIC")
+ {
+
+ if (bMiCasaIsAvailable)
+ {
+ return GetMiCasaCredential(m_svcName, m_svcGroupName);
+ }
+
+ // Check if we already have credentials
+ if (m_haveCredentials)
+ {
+ // Create NetworkCredential object with the credentials that we have.
+ cred = new NetworkCredential(m_userName, m_password);
+ }
+ else
+ {
+ //
+ // Lookup the credentials in the cache
+ //
+ // Synchronize access into the cache
+ lock (m_userCaches)
+ {
+ // Look for the user's cache
+ int i;
+ for (i = 0; i < m_userCaches.Length; i++)
+ {
+ // Check if the user cache has been instantiated
+ if (m_userCaches[i] != null)
+ {
+ if (m_userCaches[i].m_userName == m_userName)
+ {
+ // We found a cache for this user, check if we already have the
+ // necessary credentials.
+ cred = m_userCaches[i].m_credentialCache.GetCredential(new Uri("http://" + m_credScope, true), "Basic");
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ Dbg.trcError("NetCredential.GetCredential- Unsuported authentication scheme");
+ }
+
+ return cred;
+ }
+
+ ///
+ /// Updates the credential cache with the supplied credentials.
+ ///
+ /// Name of the user.
+ /// User password.
+ /// Credential scope.
+ private void UpdateCredentialCache(string userName, string password, string credScope)
+ {
+ // Check if we already have a cache for the user
+ lock (m_userCaches)
+ {
+ int i;
+ for (i = 0; i < m_userCaches.Length; i++)
+ {
+ // Check if the user cache has been instantiated
+ if (m_userCaches[i] != null)
+ {
+ if (m_userCaches[i].m_userName == userName)
+ {
+ // A user cache has already been instantiated, check if
+ // we already have a cache entry.
+ if (m_userCaches[i].m_credentialCache.GetCredential(new Uri("http://" + credScope, true), "Basic") != null)
+ {
+ // We have a cache entry, remove it.
+ m_userCaches[i].m_credentialCache.Remove(new Uri("http://" + credScope, true), "Basic");
+ }
+ break;
+ }
+ }
+ else
+ {
+ // Instantiate user cache and use it
+ m_userCaches[i] = new UserCache();
+
+ // Setup user cache
+ m_userCaches[i].m_userName = userName;
+ m_userCaches[i].m_credentialCache = new CredentialCache();
+ break;
+ }
+ }
+
+ // Exit if we failed to obtain a user cache
+ if (i == m_userCaches.Length)
+ return;
+
+ // Create NetworkCredential object and add it to the credential cache
+ NetworkCredential cred = new NetworkCredential(userName, password);
+ m_userCaches[i].m_credentialCache.Add(new Uri("http://" + credScope, true), "Basic", cred);
+ }
+ }
+
+
+ // the following is micasa/secretstore code.
+ private void UpdateMiCasaCredential(string sUsername, string sPassword, string sSecretID, string sSharedID)
+ {
+
+ // call SetCredential through reflection
+ Type type = assembly.GetType(MI_CASA_CLASS_NAME);
+ object Instance = Activator.CreateInstance (type);
+
+ object[] arguments = new object[4];
+ arguments[0] = sSecretID;
+ arguments[1] = sSharedID;
+ arguments[2] = sUsername;
+ arguments[3] = sPassword;
+
+ object result;
+ try
+ {
+ result = type.InvokeMember("SetBasicCredential", BindingFlags.InvokeMethod, null, Instance, arguments);
+ }
+ catch (Exception e)
+ {
+ Dbg.trcError(e.ToString());
+ }
+ }
+
+ private NetworkCredential GetMiCasaCredential(string sSecretID, string sSharedID)
+ {
+ object oUsername;
+ object oPassword;
+
+ Type type = assembly.GetType(MI_CASA_CLASS_NAME);
+ object Instance = Activator.CreateInstance (type);
+
+ try
+ {
+ object[] arguments = new object[2];
+ arguments[0] = sSecretID;
+ arguments[1] = sSharedID;
+
+ // reflection call
+ oUsername = type.InvokeMember("GetCredentialUsername", BindingFlags.InvokeMethod, null, Instance, arguments);
+ oPassword = type.InvokeMember("GetCredentialPassword", BindingFlags.InvokeMethod, null, Instance, arguments);
+
+ if ((oUsername != null) & (oPassword != null))
+ return new NetworkCredential(oUsername.ToString().Trim(), oPassword.ToString().Trim());
+
+ // invoke the GetUsername and GetPassword methods
+ //object username = basicCred.InvokeMember("GetUsername", BindingFlags.InvokeMethod, null, result, null);
+ //object password = basicCred.InvokeMember("GetPassword", BindingFlags.InvokeMethod, null, result, null);
+ }
+ catch (Exception e)
+ {
+ Dbg.trcError(e.ToString());
+ }
+
+ return null;
+ }
+
+ private void RemoveMiCasaCredential(string sSecretID)
+ {
+ Type type = assembly.GetType(MI_CASA_CLASS_NAME);
+ object Instance = Activator.CreateInstance (type);
+
+ try
+ {
+ object[] arguments = new object[2];
+ arguments[0] = sSecretID;
+ arguments[1] = null;
+
+ // reflection call
+ type.InvokeMember("RemoveBasicCredential", BindingFlags.InvokeMethod, null, Instance, arguments);
+ }
+ catch (Exception e)
+ {
+ Dbg.trcError(e.ToString());
+ }
+ }
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-net-credential/README b/ClientPasswordManager/c-sharp-net-credential/README
new file mode 100644
index 00000000..f4bb7ed8
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/README
@@ -0,0 +1,34 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The c-sharp-net-credential component provides the class NetCredential
+which is an implementation of the ICredentials interface. Applications
+can use objects of this class to satisfy credential queries from classes
+such as the WebRequest class..
+
+FEATURES
+
+The c-sharp-net-credential class allows the user to set or retrieve
+password credentials from the credential cache provided by the SecretStore
+Client Service Wallet. The application can control how credentials are scoped
+in the credential store through the parameters utilized to instantiate
+NetCredential objects.
diff --git a/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj
new file mode 100644
index 00000000..a522551f
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj.user b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj.user
new file mode 100644
index 00000000..fd50a422
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.snk b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.snk
new file mode 100644
index 00000000..c94ca680
Binary files /dev/null and b/ClientPasswordManager/c-sharp-net-credential/c-sharp-net-credential.snk differ
diff --git a/ClientPasswordManager/c-sharp-password-dialog/Makefile.am b/ClientPasswordManager/c-sharp-password-dialog/Makefile.am
new file mode 100644
index 00000000..7f56a9d5
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/Makefile.am
@@ -0,0 +1,85 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+if WINDOWS
+Module_CSFILES = $(srcdir)/passwordDialog.cs
+Module_LIBS = System.dll System.Data.dll $(SYSTEM_XML) Novell.Security.Utilities.dll
+Module_PKGS =
+else
+Module_CSFILES = $(srcdir)/passwordDialog-gtk.cs
+Module_LIBS = System.dll System.Data.dll System.Drawing $(SYSTEM_XML) Novell.Security.Utilities.dll
+Module_PKGS = -pkg:gtk-sharp
+endif
+
+Module_KEYFILE = $(srcdir)/c-sharp-password-dialog.snk
+Module_CSFILES_CSC := $(subst /,$(SEP),$(Module_CSFILES))
+Module_INCLUDES =
+Module_RESOURCES =
+Module_FLAGS = $(CSC_LIBFLAG)
+Module_LIBPATH = ../c-sharp-utilities/bin/$(TARGET_CFG)
+
+EXTRA_DIST = $(Module_CSFILES) $(Module_KEYFILE)
+
+CUR_DIR := $(shell pwd)
+
+all: Novell.Security.ClientPasswordManager.PasswordDialog.dll
+
+Novell.Security.ClientPasswordManager.PasswordDialog.dll: $(Module_CSFILES) $(Module_RESOURCES)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+if WINDOWS
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) $(Module_PKGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.PasswordDialog.doc.xml
+else
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) /keyfile:$(Module_KEYFILE) $(Module_PKGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.PasswordDialog.doc.xml
+endif
+
+install-exec-local: Novell.Security.ClientPasswordManager.PasswordDialog.dll
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.PasswordDialog.dll $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f Novell.Security.ClientPasswordManager.PasswordDialog.dll
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.PasswordDialog.dll /doc:Novell.Security.ClientPasswordManager.PasswordDialog.doc.xml
+
+clean-local:
+ rm -rf *.dbg *.exe *.dll $(CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/c-sharp-password-dialog/README b/ClientPasswordManager/c-sharp-password-dialog/README
new file mode 100644
index 00000000..cc9e69af
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/README
@@ -0,0 +1,28 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The c-sharp-password-dialog provides a class (PasswordDialog) that can be used
+by .NET applications to query users for their password.
+
+FEATURES
+
+The PasswordDialog Class utilizes Windows Forms under Win32 and GTK# under Linux.
\ No newline at end of file
diff --git a/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj
new file mode 100644
index 00000000..e1753266
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj.user b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj.user
new file mode 100644
index 00000000..0e89b7e9
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.snk b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.snk
new file mode 100644
index 00000000..f132e520
Binary files /dev/null and b/ClientPasswordManager/c-sharp-password-dialog/c-sharp-password-dialog.snk differ
diff --git a/ClientPasswordManager/c-sharp-password-dialog/passwordDialog-gtk.cs b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog-gtk.cs
new file mode 100644
index 00000000..961ae3b1
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog-gtk.cs
@@ -0,0 +1,183 @@
+/***********************************************************************
+ * File: passwordDialog-gtk.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Namespace: Novell.Security.ClientPasswordManager
+ *
+ * Classes implemented: PasswordDialog.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Text.RegularExpressions;
+using Gtk;
+
+namespace Novell.Security.ClientPasswordManager
+{
+ ///
+ /// Class implements user name dialog leveraging Gtk#.
+ ///
+ sealed public class passwordDialog : Dialog
+ {
+ #region Class Members and Defines
+
+ private Entry m_passwordEntry;
+ private Button m_okButton;
+ private Button m_cancelButton;
+
+ // The following strings need to be localized
+ private static string m_passwordLabelText = "Password:";
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Title to use for the dialog.
+ public passwordDialog(string title) : base()
+ {
+ this.Title = title;
+ this.HasSeparator = false;
+ this.Resizable = false;
+ this.Modal = true;
+
+ HBox h = new HBox();
+ h.BorderWidth = 12;
+ h.Spacing = 6;
+
+ Label l = new Label(m_passwordLabelText);
+ l.Xalign = 0;
+ h.PackStart(l, false, false, 0);
+
+ m_passwordEntry = new Entry();
+ m_passwordEntry.ActivatesDefault = true;
+ m_passwordEntry.Visibility = false;
+ h.PackStart(m_passwordEntry, true, true, 0);
+
+ h.ShowAll();
+ this.VBox.Add(h);
+
+ m_okButton = new Button(Stock.Ok);
+ m_okButton.CanDefault = true;
+ this.AddActionWidget(m_okButton, ResponseType.Ok);
+
+ m_cancelButton = new Button(Stock.Cancel);
+ this.AddActionWidget(m_cancelButton, ResponseType.Cancel);
+
+ this.DefaultResponse = ResponseType.Ok;
+ this.ShowAll();
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(Window parent)
+ {
+ // Set focus on the entry widget, display the dialog, and
+ // hide it once it is answered.
+ this.Focus = m_passwordEntry;
+ this.TransientFor = parent;
+ ResponseType resp = (ResponseType) this.Run();
+ this.Hide();
+
+ // Proceed based on the dialog response value
+ if (resp == ResponseType.Ok)
+ {
+ // The user provided the necessary input
+ return true;
+ }
+ else
+ {
+ // The user either hit the cancel button or closed
+ // the window.
+ return false;
+ }
+ }
+
+ ///
+ /// Gets the password entered by the user.
+ ///
+ /// NetworkCredential object or null if not successful
+ public System.String password { get {return m_passwordEntry.Text;}}
+ }
+
+ ///
+ /// Class wrapper around the passwordDialog class. This wrapper is utilized
+ /// to hide the use of Gtk# from its users.
+ ///
+ public class PasswordDialog
+ {
+ #region Class Members and Defines
+
+ passwordDialog m_dialog;
+
+ // The following strings need to be localized
+ private static string m_titleStartText = "Login to ";
+ private static string m_titleRealmText = ", Realm: ";
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring password.
+ public PasswordDialog(string svcName)
+ {
+ // Instantiate the dialog with the appropriate title
+ m_dialog = new passwordDialog(m_titleStartText + svcName);
+ }
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring password.
+ /// Name of realm to which the service belongs, can be empty string or null.
+ public PasswordDialog(string svcName, string realm)
+ {
+ // Instantiate the dialog with the appropriate title
+ if (realm != null && realm.Length != 0)
+ {
+ m_dialog = new passwordDialog(m_titleStartText + svcName + m_titleRealmText + realm);
+ }
+ else
+ {
+ m_dialog = new passwordDialog(m_titleStartText + svcName);
+ }
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(System.Object o)
+ {
+ return m_dialog.Invoke((Window) o);
+ }
+
+ ///
+ /// Gets the password entered by the user.
+ ///
+ public System.String password { get {return m_dialog.password;}}
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.cs b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.cs
new file mode 100644
index 00000000..b26f39b3
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.cs
@@ -0,0 +1,266 @@
+/***********************************************************************
+ * File: passwordDialog.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Namespace: Novell.Security.ClientPasswordManager
+ *
+ * Classes implemented: PasswordDialog.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Text.RegularExpressions;
+
+namespace Novell.Security.ClientPasswordManager
+{
+ ///
+ /// Provides a dialog for the acquisition of passwords.
+ ///
+ public class passwordDialog : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox passwordField;
+ private System.Windows.Forms.Button okBtn;
+ private System.Windows.Forms.Button cancelBtn;
+
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ ///
+ /// Constructor.
+ ///
+ /// Title to used with dialog.
+ public passwordDialog(string title)
+ {
+ // Required for Windows Form Designer support
+ InitializeComponent();
+
+ // Update the form title
+ Text = title;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.passwordField = new System.Windows.Forms.TextBox();
+ this.okBtn = new System.Windows.Forms.Button();
+ this.cancelBtn = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label1.Location = new System.Drawing.Point(16, 24);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(56, 16);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Password:";
+ //
+ // passwordField
+ //
+ this.passwordField.AcceptsReturn = true;
+ this.passwordField.Location = new System.Drawing.Point(96, 24);
+ this.passwordField.MaxLength = 64;
+ this.passwordField.Name = "passwordField";
+ this.passwordField.PasswordChar = '*';
+ this.passwordField.Size = new System.Drawing.Size(224, 20);
+ this.passwordField.TabIndex = 5;
+ this.passwordField.Text = "";
+ //
+ // okBtn
+ //
+ this.okBtn.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.okBtn.Location = new System.Drawing.Point(152, 64);
+ this.okBtn.Name = "okBtn";
+ this.okBtn.TabIndex = 7;
+ this.okBtn.Text = "Ok";
+ this.okBtn.Click += new System.EventHandler(this.okBtn_Click);
+ //
+ // cancelBtn
+ //
+ this.cancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.cancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.cancelBtn.Location = new System.Drawing.Point(240, 64);
+ this.cancelBtn.Name = "cancelBtn";
+ this.cancelBtn.TabIndex = 8;
+ this.cancelBtn.Text = "Cancel";
+ //
+ // passwordDialog
+ //
+ this.AcceptButton = this.okBtn;
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.CancelButton = this.cancelBtn;
+ this.ClientSize = new System.Drawing.Size(338, 96);
+ this.Controls.Add(this.cancelBtn);
+ this.Controls.Add(this.okBtn);
+ this.Controls.Add(this.passwordField);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "passwordDialog";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Load += new System.EventHandler(this.passwordDialog_Load);
+ this.Activated += new System.EventHandler(this.passwordDialog_Activated);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ ///
+ /// Handler for form activation event.
+ ///
+ private void passwordDialog_Activated(object sender, System.EventArgs e)
+ {
+ passwordField.Focus();
+ }
+
+ ///
+ /// Handler for Ok button click event.
+ ///
+ private void okBtn_Click(object sender, System.EventArgs e)
+ {
+ // Dispose of the dialog and set DialogResult to OK
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void passwordDialog_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ ///
+ /// Returns the password entered by the user.
+ ///
+ public System.String password { get {return passwordField.Text;}}
+ }
+
+ ///
+ /// Class wrapper around the passwordDialog class. This wrapper is utilized
+ /// to hide the use of Gtk# from its users.
+ ///
+ public class PasswordDialog
+ {
+ #region Class Members and Defines
+
+ // The following strings need to be localized
+ private static string m_titleStartText = "Login to ";
+ private static string m_titleRealmText = ", Realm: ";
+
+ // Title that will be used with the dialog
+ private string m_dialogTitle;
+
+ // Input gathered from the user
+ private string m_password;
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring password.
+ public PasswordDialog(string svcName)
+ {
+ // Setup the title that will be used with the dialog
+ m_dialogTitle = m_titleStartText + svcName;
+ }
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring password.
+ /// Name of realm to which the service belongs, can be empty string or null.
+ public PasswordDialog(string svcName, string realm)
+ {
+ // Setup the appropriate title that will be used with the dialog
+ if (realm != null && realm.Length != 0)
+ {
+ m_dialogTitle = m_titleStartText + svcName + m_titleRealmText + realm;
+ }
+ else
+ {
+ m_dialogTitle = m_titleStartText + svcName;
+ }
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(System.Object o)
+ {
+ bool retVal;
+
+ // Instantiate and show passwordDialog
+ passwordDialog dialog = new passwordDialog(m_dialogTitle);
+ if (dialog.ShowDialog((IWin32Window) o) == DialogResult.OK)
+ {
+ // Save the password entered
+ m_password = dialog.password;
+
+ // Indicate success
+ retVal = true;
+ }
+ else
+ {
+ // The user either hit the cancel button or closed
+ // the window.
+ retVal = false;
+ }
+
+ // Dispose of the dialog
+ dialog.Dispose();
+
+ return retVal;
+ }
+
+ ///
+ /// Gets the password entered by the user.
+ ///
+ public System.String password { get {return m_password;}}
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.resx b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.resx
new file mode 100644
index 00000000..e31d717a
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-password-dialog/passwordDialog.resx
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ (Default)
+
+
+ True
+
+
+ passwordDialog
+
+
+ 80
+
+
+ True
+
+
+ Private
+
+
\ No newline at end of file
diff --git a/ClientPasswordManager/c-sharp-username-dialog/AssemblyInfo.cs b/ClientPasswordManager/c-sharp-username-dialog/AssemblyInfo.cs
new file mode 100644
index 00000000..49e804e6
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("Novell.Security.ClientPasswordManager ")]
+[assembly: AssemblyDescription("Implements the usernameDialog class for Novell.Security.ClientPasswordManager")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Novell, Inc.")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Copyright (C) 2004 Novell, Inc.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("..\\..\\c-sharp-username-dialog.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/ClientPasswordManager/c-sharp-username-dialog/Makefile.am b/ClientPasswordManager/c-sharp-username-dialog/Makefile.am
new file mode 100644
index 00000000..7c0cd0ba
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/Makefile.am
@@ -0,0 +1,85 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+if WINDOWS
+Module_CSFILES = $(srcdir)/usernameDialog.cs
+Module_LIBS = System.dll System.Data.dll $(SYSTEM_XML) Novell.Security.Utilities.dll
+Module_PKGS =
+else
+Module_CSFILES = $(srcdir)/usernameDialog-gtk.cs
+Module_LIBS = System.dll System.Data.dll System.Drawing $(SYSTEM_XML) Novell.Security.Utilities.dll
+Module_PKGS = -pkg:gtk-sharp
+endif
+
+Module_KEYFILE = $(srcdir)/c-sharp-username-dialog.snk
+Module_CSFILES_CSC := $(subst /,$(SEP),$(Module_CSFILES))
+Module_INCLUDES =
+Module_RESOURCES =
+Module_FLAGS = $(CSC_LIBFLAG)
+Module_LIBPATH = ../c-sharp-utilities/bin/$(TARGET_CFG)
+
+EXTRA_DIST = $(Module_CSFILES) $(Module_KEYFILE)
+
+CUR_DIR := $(shell pwd)
+
+all: Novell.Security.ClientPasswordManager.UsernameDialog.dll
+
+Novell.Security.ClientPasswordManager.UsernameDialog.dll: $(Module_CSFILES) $(Module_RESOURCES)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+if WINDOWS
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) $(Module_PKGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.UsernameDialog.doc.xml
+else
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) /keyfile:$(Module_KEYFILE) $(Module_PKGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.ClientPasswordManager.UsernameDialog.doc.xml
+endif
+
+install-exec-local: Novell.Security.ClientPasswordManager.UsernameDialog.dll
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.UsernameDialog.dll $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f Novell.Security.ClientPasswordManager.UsernameDialog.dll
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/Novell.Security.ClientPasswordManager.UsernameDialog.dll /doc:Novell.Security.ClientPasswordManager.UsernameDialog.doc.xml
+
+clean-local:
+ rm -rf *.dbg *.exe *.dll $(CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/c-sharp-username-dialog/README b/ClientPasswordManager/c-sharp-username-dialog/README
new file mode 100644
index 00000000..136fb712
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/README
@@ -0,0 +1,28 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The c-sharp-username-dialog provides a class (UsernameDialog) that can be used
+by .NET applications to query users for their user name.
+
+FEATURES
+
+The UsernameDialog Class utilizes Windows Forms under Win32 and GTK# under Linux.
diff --git a/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj
new file mode 100644
index 00000000..f54163c4
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj.user b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj.user
new file mode 100644
index 00000000..0e89b7e9
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.snk b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.snk
new file mode 100644
index 00000000..04140d40
Binary files /dev/null and b/ClientPasswordManager/c-sharp-username-dialog/c-sharp-username-dialog.snk differ
diff --git a/ClientPasswordManager/c-sharp-username-dialog/usernameDialog-gtk.cs b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog-gtk.cs
new file mode 100644
index 00000000..ec23da2a
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog-gtk.cs
@@ -0,0 +1,257 @@
+/***********************************************************************
+ * File: usernameDialog-gtk.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Namespace: Novell.Security.ClientPasswordManager
+ *
+ * Classes implemented: UsernameDialog.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Text.RegularExpressions;
+using Gtk;
+
+namespace Novell.Security.ClientPasswordManager
+{
+ ///
+ /// Class implements user name dialog leveraging Gtk#.
+ ///
+ sealed public class usernameDialog : Dialog
+ {
+ #region Class Members and Defines
+
+ private Entry m_userNameEntry;
+ private Button m_okButton;
+ private Button m_cancelButton;
+
+ // The following strings need to be localized
+ private static string m_userNameLabelText = "User name:";
+
+ #endregion
+
+ ///
+ /// Class implements dialog to notify user that it needs to
+ /// input the user name.
+ ///
+ private class inputRequiredDialog: Dialog
+ {
+ #region Class Members and Defines
+
+ // The following strings need to be localized
+ private static string m_inputRequiredLabelText = "User name required";
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Title to be used with the dialog.
+ public inputRequiredDialog(string title) : base()
+ {
+ this.Title = title;
+ this.HasSeparator = false;
+ this.Resizable = false;
+ this.Modal = true;
+ this.DefaultResponse = ResponseType.Ok;
+
+ HBox h = new HBox();
+ h.BorderWidth = 12;
+ h.Spacing = 6;
+
+ Gtk.Image i = new Gtk.Image();
+ i.SetFromStock(Stock.DialogError, IconSize.Dialog);
+ i.SetAlignment(0.5F, 0);
+ h.PackStart(i, false, false, 0);
+
+ Label l = new Label(""
+ + m_inputRequiredLabelText
+ + "");
+ l.LineWrap = true;
+ l.UseMarkup = true;
+ l.Selectable = false;
+ l.Xalign = 0;
+ l.Yalign = 0;
+ h.PackStart(l, false, false, 0);
+
+ h.ShowAll();
+ this.VBox.Add(h);
+
+ this.AddButton(Stock.Ok, ResponseType.Ok);
+ }
+ }
+
+ ///
+ /// Constructor.
+ ///
+ /// Title to use for the dialog.
+ public usernameDialog(string title) : base()
+ {
+ this.Title = title;
+ this.HasSeparator = false;
+ this.Resizable = false;
+ this.Modal = true;
+
+ HBox h = new HBox();
+ h.BorderWidth = 12;
+ h.Spacing = 6;
+
+ Label l = new Label(m_userNameLabelText);
+ l.Xalign = 0;
+ h.PackStart(l, false, false, 0);
+
+ m_userNameEntry = new Entry();
+ m_userNameEntry.ActivatesDefault = true;
+ h.PackStart(m_userNameEntry, true, true, 0);
+
+ h.ShowAll();
+ this.VBox.Add(h);
+
+ m_okButton = new Button(Stock.Ok);
+ m_okButton.CanDefault = true;
+ this.AddActionWidget(m_okButton, ResponseType.Ok);
+
+ m_cancelButton = new Button(Stock.Cancel);
+ this.AddActionWidget(m_cancelButton, ResponseType.Cancel);
+
+ this.DefaultResponse = ResponseType.Ok;
+ this.ShowAll();
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(Window parent)
+ {
+ bool retVal;
+
+ while (true)
+ {
+ // Set focus on the entry widget, display the dialog, and
+ // hide it once it is answered.
+ this.Focus = m_userNameEntry;
+ this.TransientFor = parent;
+ ResponseType resp = (ResponseType) this.Run();
+ this.Hide();
+
+ // Proceed based on the dialog response value
+ if (resp == ResponseType.Ok)
+ {
+ // Verify that the user entered the desired information
+ if (m_userNameEntry.Text.Length != 0)
+ {
+ // The user name was entered, indicate success and
+ // get ready to exit.
+ retVal = true;
+ break;
+ }
+ else
+ {
+ // Inform the user that it must enter a name
+ inputRequiredDialog errorDialog = new inputRequiredDialog(Title);
+ errorDialog.Run();
+ errorDialog.Hide();
+
+ // Show the user name dialog again
+ continue;
+ }
+ }
+ else
+ {
+ // The user either hit the cancel button or closed
+ // the window.
+ retVal = false;
+ break;
+ }
+ }
+
+ return retVal;
+ }
+
+ ///
+ /// Gets the name entered by the user.
+ ///
+ /// NetworkCredential object or null if not successful
+ public System.String userName { get {return m_userNameEntry.Text;}}
+ }
+
+ ///
+ /// Class wrapper around the usernameDialog class. This wrapper is utilized
+ /// to hide the use of Gtk# from its users.
+ ///
+ public class UsernameDialog
+ {
+ #region Class Members and Defines
+
+ usernameDialog m_dialog;
+
+ // The following strings need to be localized
+ private static string m_titleStartText = "Login to ";
+ private static string m_titleRealmText = ", Realm: ";
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring user name.
+ public UsernameDialog(string svcName)
+ {
+ // Instantiate the dialog with the appropriate title
+ m_dialog = new usernameDialog(m_titleStartText + svcName);
+ }
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring user name.
+ /// Name of realm to which the service belongs, can be empty string or null.
+ public UsernameDialog(string svcName, string realm)
+ {
+ // Instantiate the dialog with the appropriate title
+ if (realm != null && realm.Length != 0)
+ {
+ m_dialog = new usernameDialog(m_titleStartText + svcName + m_titleRealmText + realm);
+ }
+ else
+ {
+ m_dialog = new usernameDialog(m_titleStartText + svcName);
+ }
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(System.Object o)
+ {
+ return m_dialog.Invoke((Window) o);
+ }
+
+ ///
+ /// Gets the name entered by the user.
+ ///
+ public System.String userName { get {return m_dialog.userName;}}
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.cs b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.cs
new file mode 100644
index 00000000..d0466fff
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.cs
@@ -0,0 +1,291 @@
+/***********************************************************************
+ * File: usernameDialog.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Namespace: Novell.Security.ClientPasswordManager
+ *
+ * Classes implemented: UsernameDialog.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Text.RegularExpressions;
+
+namespace Novell.Security.ClientPasswordManager
+{
+ ///
+ /// Provides a dialog for the acquisition of user names.
+ ///
+ sealed public class usernameDialog : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.TextBox usernameField;
+ private System.Windows.Forms.Button okBtn;
+ private System.Windows.Forms.Button cancelBtn;
+ private System.Windows.Forms.Label label1;
+
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ ///
+ /// Constructor.
+ ///
+ /// Title to use with dialog.
+ public usernameDialog(string title)
+ {
+ // Required for Windows Form Designer support
+ InitializeComponent();
+
+ // Update the form title
+ Text = title;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.usernameField = new System.Windows.Forms.TextBox();
+ this.okBtn = new System.Windows.Forms.Button();
+ this.cancelBtn = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // usernameField
+ //
+ this.usernameField.AcceptsReturn = true;
+ this.usernameField.Location = new System.Drawing.Point(96, 24);
+ this.usernameField.MaxLength = 64;
+ this.usernameField.Name = "usernameField";
+ this.usernameField.Size = new System.Drawing.Size(224, 20);
+ this.usernameField.TabIndex = 5;
+ this.usernameField.Text = "";
+ //
+ // okBtn
+ //
+ this.okBtn.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.okBtn.Location = new System.Drawing.Point(152, 64);
+ this.okBtn.Name = "okBtn";
+ this.okBtn.TabIndex = 7;
+ this.okBtn.Text = "Ok";
+ this.okBtn.Click += new System.EventHandler(this.okBtn_Click);
+ //
+ // cancelBtn
+ //
+ this.cancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.cancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.cancelBtn.Location = new System.Drawing.Point(240, 64);
+ this.cancelBtn.Name = "cancelBtn";
+ this.cancelBtn.TabIndex = 8;
+ this.cancelBtn.Text = "Cancel";
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(8, 24);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(72, 16);
+ this.label1.TabIndex = 9;
+ this.label1.Text = "User name:";
+ //
+ // usernameDialog
+ //
+ this.AcceptButton = this.okBtn;
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.CancelButton = this.cancelBtn;
+ this.ClientSize = new System.Drawing.Size(338, 96);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.cancelBtn);
+ this.Controls.Add(this.okBtn);
+ this.Controls.Add(this.usernameField);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "usernameDialog";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Load += new System.EventHandler(this.usernameDialog_Load);
+ this.Activated += new System.EventHandler(this.usernameDialog_Activated);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ ///
+ /// Handler for form activation event.
+ ///
+ private void usernameDialog_Activated(object sender, System.EventArgs e)
+ {
+ usernameField.Focus();
+ }
+
+ ///
+ /// Handler for Ok button click event.
+ ///
+ private void okBtn_Click(object sender, System.EventArgs e)
+ {
+ // Dispose of the dialog and set DialogResult to OK
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void usernameDialog_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ ///
+ /// Returns the username entered by the user.
+ ///
+ public System.String userName { get {return usernameField.Text;}}
+ }
+
+ ///
+ /// Class wrapper around the usernameDialog class. This wrapper is utilized
+ /// to hide the use of Gtk# from its users.
+ ///
+ public class UsernameDialog
+ {
+ #region Class Members and Defines
+
+ // The following strings need to be localized
+ private static string m_titleStartText = "Login to ";
+ private static string m_titleRealmText = ", Realm: ";
+ private static string m_inputRequiredLabelText = "User name required";
+
+ // Title that will be used with the dialog
+ private string m_dialogTitle;
+
+ // Input gathered from the user
+ private string m_userName;
+
+ #endregion
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring user name.
+ public UsernameDialog(string svcName)
+ {
+ // Setup the title that will be used with the dialog
+ m_dialogTitle = m_titleStartText + svcName;
+ }
+
+ ///
+ /// Constructor.
+ ///
+ /// Name of service on whose behalf we are acquiring user name.
+ /// Name of realm to which the service belongs, can be empty string or null.
+ public UsernameDialog(string svcName, string realm)
+ {
+ // Setup the appropriate title that will be used with the dialog
+ if (realm != null && realm.Length != 0)
+ {
+ m_dialogTitle = m_titleStartText + svcName + m_titleRealmText + realm;
+ }
+ else
+ {
+ m_dialogTitle = m_titleStartText + svcName;
+ }
+ }
+
+ ///
+ /// Shows the dialog and gathers the user input.
+ ///
+ /// Window owner.
+ /// True if the user input was gathered, else false.
+ public bool Invoke(System.Object o)
+ {
+ bool retVal;
+
+ while (true)
+ {
+ // Instantiate and show usernameDialog
+ usernameDialog dialog = new usernameDialog(m_dialogTitle);
+ if (dialog.ShowDialog((IWin32Window) o) == DialogResult.OK)
+ {
+ // Save the user name entered
+ m_userName = dialog.userName;
+
+ // Verify that the user entered the desired information
+ if (m_userName.Length != 0)
+ {
+ // The user name was entered, indicate success and
+ // get ready to exit.
+ retVal = true;
+
+ // Dispose of the dialog and exit the loop
+ dialog.Dispose();
+ break;
+ }
+ else
+ {
+ // Inform the user that it must enter a name
+ MessageBox.Show((IWin32Window) o,
+ m_inputRequiredLabelText,
+ "",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+
+ // Dispose of the dialog and continue to prompt the user
+ dialog.Dispose();
+ continue;
+ }
+ }
+ else
+ {
+ // The user either hit the cancel button or closed
+ // the window.
+ retVal = false;
+
+ // Dispose of the dialog and exit the loop
+ dialog.Dispose();
+ break;
+ }
+ }
+
+ return retVal;
+ }
+
+ ///
+ /// Gets the name entered by the user.
+ ///
+ public System.String userName { get {return m_userName;}}
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.resx b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.resx
new file mode 100644
index 00000000..73b2c66b
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-username-dialog/usernameDialog.resx
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ usernameDialog
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+ Private
+
+
\ No newline at end of file
diff --git a/ClientPasswordManager/c-sharp-utilities/AssemblyInfo.cs b/ClientPasswordManager/c-sharp-utilities/AssemblyInfo.cs
new file mode 100644
index 00000000..ef99a3d5
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("Novell.Security Utilities")]
+[assembly: AssemblyDescription("Implements the Dbg class for Novell.Security")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Novell, Inc.")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Copyright (C) 2004 Novell, Inc.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("..\\..\\c-sharp-utilities.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/ClientPasswordManager/c-sharp-utilities/Debug.cs b/ClientPasswordManager/c-sharp-utilities/Debug.cs
new file mode 100644
index 00000000..fa8e6394
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/Debug.cs
@@ -0,0 +1,81 @@
+/***********************************************************************
+ * File: Debug.cs
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ * Date of Creation: February 2004.
+ *
+ * Namespace: Novell.Security.Utilities
+ *
+ * Classes implemented: Dbg.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+using System;
+using System.Diagnostics;
+
+namespace Novell.Security
+{
+ ///
+ /// Implements methods for sending data to the debugger.
+ ///
+ public class Dbg
+ {
+ #region Class Members and Defines
+
+ private static TraceSwitch m_switch = new TraceSwitch("Novell.Security", "Novell Security Components");
+
+ #endregion
+
+ ///
+ /// Send data to the debugger if the trace level is set to error or above.
+ ///
+ /// Line to send to the debugger
+ static public void trcError(string line)
+ {
+ if (m_switch.TraceError)
+ {
+ Trace.WriteLine(line);
+ }
+ //Console.WriteLine(line);
+ }
+
+ ///
+ /// Send data to the debugger if the trace level is set to informational or above.
+ ///
+ /// Line to send to the debugger
+ static public void trcInfo(string line)
+ {
+ if (m_switch.TraceInfo)
+ {
+ Trace.WriteLine(line);
+ }
+ //Console.WriteLine(line);
+ }
+
+ ///
+ /// Send data to the debugger if the trace level is set to verbose.
+ ///
+ /// Line to send to the debugger
+ static public void trcVerbose(string line)
+ {
+ if (m_switch.TraceVerbose)
+ {
+ Trace.WriteLine(line);
+ }
+ //Console.WriteLine(line);
+ }
+ }
+}
diff --git a/ClientPasswordManager/c-sharp-utilities/Makefile.am b/ClientPasswordManager/c-sharp-utilities/Makefile.am
new file mode 100644
index 00000000..50eabf9e
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/Makefile.am
@@ -0,0 +1,77 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+Module_CSFILES = $(srcdir)/Debug.cs
+Module_KEYFILE = $(srcdir)/c-sharp-utilities.snk
+Module_CSFILES_CSC := $(subst /,$(SEP),$(Module_CSFILES))
+Module_INCLUDES =
+Module_RESOURCES =
+Module_FLAGS = $(CSC_LIBFLAG)
+Module_LIBS = System.dll System.Data.dll System.Security.dll $(SYSTEM_XML)
+Module_LIBPATH =
+
+EXTRA_DIST = $(Module_CSFILES) $(Module_KEYFILE)
+
+CUR_DIR := $(shell pwd)
+
+all: Novell.Security.Utilities.dll
+
+Novell.Security.Utilities.dll: $(Module_CSFILES) $(Module_RESOURCES)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+if WINDOWS
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.Utilities.doc.xml
+else
+ $(CSC) /nowarn:1591,1573,1572 /out:bin/$(TARGET_CFG)/$@ $(CSCFLAGS) $(Module_FLAGS) /keyfile:$(Module_KEYFILE) $(Module_LIBS:%=/r:%) $(Module_LIBPATH:%=/lib:%) $(Module_CSFILES_CSC) /doc:Novell.Security.Utilities.doc.xml
+endif
+
+install-exec-local: Novell.Security.Utilities.dll
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/Novell.Security.Utilities.dll $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f Novell.Security.Utilities.dll
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/Novell.Security.Utilities.dll /doc:Novell.Security.Utilities.doc.xml
+
+clean-local:
+ rm -rf *.dbg *.exe *.dll $(CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/c-sharp-utilities/README b/ClientPasswordManager/c-sharp-utilities/README
new file mode 100644
index 00000000..7c5b3597
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/README
@@ -0,0 +1,30 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The c-sharp-utilities component provides .NET facilities that are common to
+the ClientPasswordManager .NET components.
+
+FEATURES
+
+Provides the following utilities:
+
+Dbg class that can be used for tracing debugging information.
diff --git a/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj
new file mode 100644
index 00000000..880c6701
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj.user b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj.user
new file mode 100644
index 00000000..0e89b7e9
--- /dev/null
+++ b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.snk b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.snk
new file mode 100644
index 00000000..1f81f28f
Binary files /dev/null and b/ClientPasswordManager/c-sharp-utilities/c-sharp-utilities.snk differ
diff --git a/ClientPasswordManager/configure.in b/ClientPasswordManager/configure.in
new file mode 100644
index 00000000..428f1530
--- /dev/null
+++ b/ClientPasswordManager/configure.in
@@ -0,0 +1,204 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+AC_INIT(c-sharp-net-credential/NetCredential.cs)
+AC_CANONICAL_SYSTEM
+AM_INIT_AUTOMAKE(clientpasswordmanager, 0.1.1)
+RELEASE=`date +%Y%m%d_%H%M`
+AC_SUBST(RELEASE)
+AM_MAINTAINER_MODE
+
+#
+# Check for a valid C# compiler
+#
+AC_CHECK_PROG(CSC, csc, csc)
+test -z "$CSC" && AC_CHECK_PROG(CSC, mcs, mcs)
+test -z "$CSC" && AC_MSG_ERROR([no acceptable C Sharp compiler found in \$PATH])
+
+case $CSC in
+ #
+ # Mono-specific configuration
+ #
+ mcs)
+ CSC_EXEFLAG=/target:exe
+ CSC_LIBFLAG=/target:library
+ CSC_EXEFLAG=/target:exe
+ CSC_WINEXEFLAG=/target:winexe
+ CSCFLAGS='/d:MONO /warn:4 /d:TRACE'
+ CSCFLAGS_DEBUG="/debug+ /d:DEBUG"
+ CSCFLAGS_OPTIMIZE="/optimize+"
+ MONO=mono
+ MONO_DEBUG='mono --debug'
+ MONO_PATH=
+ SYSTEM_XML='System.Xml.dll'
+ ;;
+ #
+ # .NET-specific configuration
+ #
+ csc)
+ CSC_EXEFLAG=/target:exe
+ CSC_LIBFLAG=/target:library
+ CSC_EXEFLAG=/target:exe
+ CSC_WINEXEFLAG=/target:winexe
+ CSCFLAGS='/d:DOTNET /warn:4 /d:TRACE /nologo'
+ CSCFLAGS_DEBUG="/debug+ /d:DEBUG"
+ CSCFLAGS_OPTIMIZE="/optimize+"
+ MONO=
+ MONO_DEBUG=
+ MONO_PATH=
+ SYSTEM_XML='System.XML.dll'
+ ;;
+esac
+AC_SUBST(CSC)
+AC_SUBST(CSC_EXEFLAG)
+AC_SUBST(CSC_LIBFLAG)
+AC_SUBST(CSC_WINEXEFLAG)
+AC_SUBST(CSCFLAGS)
+AC_SUBST(MONO)
+AC_SUBST(MONO_PATH)
+AC_SUBST(SYSTEM_XML)
+
+SRCDIR='$(top_srcdir)'
+DOCDIR="$SRCDIR/doc"
+
+AC_SUBST(SRCDIR)
+AC_SUBST(DOCDIR)
+
+EMPTY=
+SPACE='$(EMPTY) $(EMPTY)'
+
+AC_SUBST(EMPTY)
+AC_SUBST(SPACE)
+
+#
+# Check for a valid operating system
+#
+case $host_os in
+ linux*)
+ TARGET_OS='linux'
+ ;;
+ cygwin*)
+ TARGET_OS='windows'
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown host_os: $host_os])
+ ;;
+esac
+AC_SUBST(TARGET_OS)
+AM_CONDITIONAL(LINUX, test "$TARGET_OS" = "linux")
+AM_CONDITIONAL(WINDOWS, test "$TARGET_OS" = "windows")
+
+#
+# Set platform-specific variables
+#
+case $TARGET_OS in
+ #
+ # Linux-specific configuration
+ #
+ linux)
+ #
+ # Set variables
+ #
+ COMMON_CLEAN_FILES=''
+ ICON_EXT='.ico'
+ ICON_FLAG='/resource:'
+ PLATFORM_SUBDIRS=$LINUX_SUBDIRS
+ SEP='/'
+ ;;
+ #
+ # Windows-specific configuration
+ #
+ windows)
+ COMMON_CLEAN_FILES='*.suo */*.suo *.csproj.user */*.csproj.user bin obj */bin */obj *.xml */*.xml *.pdb */*.pdb'
+ ICON_EXT='.ico'
+ ICON_FLAG='/win32icon:'
+ PLATFORM_SUBDIRS=$WINDOWS_SUBDIRS
+ SEP='$(EMPTY)\\$(EMPTY)'
+ ;;
+esac
+AC_SUBST(COMMON_CLEAN_FILES)
+AC_SUBST(ICON_EXT)
+AC_SUBST(ICON_FLAG)
+AC_SUBST(PLATFORM_SUBDIRS)
+AC_SUBST(SEP)
+
+#
+# Run standard macros
+#
+AM_PROG_CC_STDC
+AC_PROG_INSTALL
+AC_HEADER_STDC
+
+#
+# Handle --enable-debug
+#
+AC_ARG_ENABLE(debug, [
+ --enable-debug configure the Makefiles to build in DEBUG mode],
+ [case "${enableval}" in
+ yes) enable_debug=true ;;
+ no) enable_debug=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
+ esac],[enable_debug=false])
+AM_CONDITIONAL(DEBUG, test x$enable_debug = xtrue)
+if test "$enable_debug" = "true"
+then
+ # Build debug version.
+ CFLAGS="$CFLAGS_DEBUG $CFLAGS"
+ CSCFLAGS="$CSCFLAGS_DEBUG $CSCFLAGS"
+ CXXFLAGS="$CXXFLAGS_DEBUG $CXXFLAGS"
+ DEVENV_CONFIGURATION=Debug
+ MONO=$MONO_DEBUG
+else
+ # Build optimized version.
+ CFLAGS="$CFLAGS_OPTIMIZE $CFLAGS"
+ CSCFLAGS="$CSCFLAGS_OPTIMIZE $CSCFLAGS"
+ CXXFLAGS="$CXXFLAGS_OPTIMIZE $CXXFLAGS"
+ DEVENV_CONFIGURATION=Release
+fi
+AC_SUBST(CSCFLAGS)
+AC_SUBST(DEVENV_CONFIGURATION)
+
+#
+# Configure PKG_CONFIG
+#
+AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+if test "x$PKG_CONFIG" = "xno"; then
+ AC_MSG_ERROR([You need to install pkg-config])
+fi
+
+#
+# Configure files
+#
+AC_OUTPUT([
+Makefile
+c-sharp-net-credential/Makefile
+c-sharp-password-dialog/Makefile
+c-sharp-username-dialog/Makefile
+c-sharp-utilities/Makefile
+package/Makefile
+package/windows/Makefile
+package/windows/clientpasswordmanager-msm/Makefile
+package/linux/Makefile
+package/linux/clientpasswordmanager.spec
+])
+
+
diff --git a/ClientPasswordManager/package/Makefile.am b/ClientPasswordManager/package/Makefile.am
new file mode 100644
index 00000000..bf6f36f8
--- /dev/null
+++ b/ClientPasswordManager/package/Makefile.am
@@ -0,0 +1,33 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = $(TARGET_OS)
+
+DIST_SUBDIRS = linux windows
+
+.PHONY: package package-clean package-install package-uninstall
+package package-clean package-install package-uninstall:
+ $(MAKE) -C $(TARGET_OS) $@
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/package/linux/Makefile.am b/ClientPasswordManager/package/linux/Makefile.am
new file mode 100644
index 00000000..b06a5b93
--- /dev/null
+++ b/ClientPasswordManager/package/linux/Makefile.am
@@ -0,0 +1,65 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+RPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).$(target_cpu).rpm
+SRPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).src.rpm
+
+.PHONY: package package-clean package-install package-uninstall
+
+#all: $(RPM_FILE)
+
+package: $(RPM_FILE)
+
+all clean:
+
+$(RPM_FILE):
+ cd $(top_srcdir); make dist
+ rm -rf RPM
+ mkdir RPM
+ echo %_topdir `pwd`/RPM > $(HOME)/.rpmmacros
+ mkdir -p RPM/BUILD
+ mkdir -p RPM/RPMS
+ mkdir -p RPM/SOURCES
+ mkdir -p RPM/SPECS
+ mkdir -p RPM/SRPMS
+ cp clientpasswordmanager.spec RPM/SPECS
+ cp $(top_srcdir)/$(PACKAGE)-$(VERSION).tar.gz RPM/SOURCES
+ mv $(top_srcdir)/$(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)-$(RELEASE).tar.gz
+ rpmbuild -ba -v -vv --target=$(target_triplet) RPM/SPECS/clientpasswordmanager.spec
+ cp RPM/RPMS/*/$(RPM_FILE) .
+ cp RPM/SRPMS/$(SRPM_FILE) .
+
+package-install: package
+ su -c "rpm -Uvh $(RPM_FILE)"
+
+package-uninstall:
+ su -c "rpm -e $(PACKAGE)"
+
+package-clean clean-local:
+ rm -rf *.rpm RPM *.gz
+
+distclean-local: package-clean
+ rm -f Makefile clientpasswordmanager.spec
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/package/linux/clientpasswordmanager.spec.in b/ClientPasswordManager/package/linux/clientpasswordmanager.spec.in
new file mode 100644
index 00000000..8906a8ab
--- /dev/null
+++ b/ClientPasswordManager/package/linux/clientpasswordmanager.spec.in
@@ -0,0 +1,95 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+# SuSE Specific autobuild tags
+# neededforbuild mono mono-devel pkgconfig glib2 glib2-devel libicu26
+
+%define prefix /opt/novell/clientpasswordmanager
+
+Summary: ClientPasswordManager
+Name: @PACKAGE@
+Version: @VERSION@
+Release: @RELEASE@
+Copyright: GPL
+Group: Applications/Productivity
+Source: %{name}-%{version}.tar.gz
+URL: http://forge.novell.com/modules/xfmod/project/?isecure
+#Distribution :
+Vendor:
+Packager:
+BuildRoot: %{_tmppath}/%{name}-%{version}
+
+Requires: mono >= 0.31
+Obsoletes: %{name} <= %{version}
+#=============================================================================
+%Description
+ClientPasswordManager provides an infrastructure that allows trusted
+applications to share passwords to help provide a Single Sign-On experience
+to the user.
+
+#=============================================================================
+%ChangeLog
+
+
+#=============================================================================
+%Prep
+%setup -n %{name}-%{version}
+
+
+#=============================================================================
+%Build
+./configure --prefix=%{prefix}
+make
+
+#=============================================================================
+%Install
+%{__rm} -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+#=============================================================================
+%Clean
+%{__rm} -rf $RPM_BUILD_ROOT
+
+#=============================================================================
+%Post
+cd /opt/novell/clientpasswordmanager/lib
+gacutil -i Novell.Security.ClientPasswordManager.NetCredential.dll
+gacutil -i Novell.Security.ClientPasswordManager.UsernameDialog.dll
+gacutil -i Novell.Security.ClientPasswordManager.PasswordDialog.dll
+gacutil -i Novell.Security.Utilities.dll
+exit 0
+
+#=============================================================================
+%Preun
+gacutil -u Novell.Security.ClientPasswordManager.NetCredential
+gacutil -u Novell.Security.ClientPasswordManager.UsernameDialog
+gacutil -u Novell.Security.ClientPasswordManager.PasswordDialog
+gacutil -u Novell.Security.Utilities
+exit 0
+
+#=============================================================================
+%Files
+%defattr(-,root,root)
+%{prefix}/*
+#%{prefix}/lib/*
+#%{prefix}/share/*
+
diff --git a/ClientPasswordManager/package/windows/Makefile.am b/ClientPasswordManager/package/windows/Makefile.am
new file mode 100644
index 00000000..e93c496f
--- /dev/null
+++ b/ClientPasswordManager/package/windows/Makefile.am
@@ -0,0 +1,32 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = clientpasswordmanager-msm
+
+.PHONY: package-clean package-install package-uninstall
+
+package package-clean package-install package-uninstall:
+ $(MAKE) -C clientpasswordmanager-msm $@
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/ClientPasswordManager/package/windows/clientpasswordmanager-msm/Makefile.am b/ClientPasswordManager/package/windows/clientpasswordmanager-msm/Makefile.am
new file mode 100644
index 00000000..17bf382b
--- /dev/null
+++ b/ClientPasswordManager/package/windows/clientpasswordmanager-msm/Makefile.am
@@ -0,0 +1,61 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+MSM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).msm
+MSM_LOG_FILE = devenv-clientpasswordmanager-msm.log
+
+.PHONY: package package-clean package-install package-uninstall c-sharp-net-credential c-sharp-password-dialog c-sharp-username-dialog c-sharp-utilities devenv
+
+#all clean:
+
+package: $(MSM_FILE)
+
+devenv:
+ @if ! test -x "$(VSINSTALLDIR)/devenv.exe"; then echo "Error: Microsoft Visual Studio .NET is currently required to build MSI and MSM packages"; exit 1; fi
+
+$(MSM_FILE): devenv
+ @rm -f $(MSM_LOG_FILE) $@
+ @CMD='"$(VSINSTALLDIR)/devenv.exe" ../../../ClientPasswordManager.sln /build $(DEVENV_CONFIGURATION) /project clientpasswordmanager-msm /out $(MSM_LOG_FILE)'; \
+ echo $$CMD; \
+ if eval $$CMD; then \
+ ls -l $(DEVENV_CONFIGURATION)/clientpasswordmanager-msm.msm; \
+ else \
+ grep -a "ERROR:" $(MSM_LOG_FILE); \
+ fi
+
+securesink:
+ make -C ../.. all
+
+package-clean clean-local:
+ rm -rf Release/* Release Debug/* Debug*/Release */Debug *.log *.suo
+
+clean:
+ rm -rf Release/* Release Debug/* Debug */Release */Debug *.log *.suo
+
+distclean-local: package-clean
+ rm -f Makefile clientpasswordmanager.msm
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
+
+
diff --git a/ClientPasswordManager/package/windows/clientpasswordmanager-msm/clientpasswordmanager-msm.vdproj b/ClientPasswordManager/package/windows/clientpasswordmanager-msm/clientpasswordmanager-msm.vdproj
new file mode 100644
index 00000000..f76b5c6c
--- /dev/null
+++ b/ClientPasswordManager/package/windows/clientpasswordmanager-msm/clientpasswordmanager-msm.vdproj
@@ -0,0 +1,326 @@
+"DeployProject"
+{
+"VSVersion" = "3:701"
+"ProjectType" = "8:{DD7A5B58-C2F9-40FF-B2EF-0773356FB978}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:clientpasswordmanager-msm"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+ "Hierarchy"
+ {
+ "Entry"
+ {
+ "MsmKey" = "8:_3AD7204448FD4A0FB065CE3B19B85187"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3CA7DFE20AFF49E1A5059CAA12A6F262"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_763071E9529E47298E0D483C70C9DD2C"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C87D109CB52E451B8D4C9C425B9F408F"
+ "OwnerKey" = "8:_763071E9529E47298E0D483C70C9DD2C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C87D109CB52E451B8D4C9C425B9F408F"
+ "OwnerKey" = "8:_D54A8D63A6224AABA81E04F4DB6AD917"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C87D109CB52E451B8D4C9C425B9F408F"
+ "OwnerKey" = "8:_3CA7DFE20AFF49E1A5059CAA12A6F262"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C87D109CB52E451B8D4C9C425B9F408F"
+ "OwnerKey" = "8:_3AD7204448FD4A0FB065CE3B19B85187"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D54A8D63A6224AABA81E04F4DB6AD917"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ }
+ "Configurations"
+ {
+ "Debug"
+ {
+ "DisplayName" = "8:Debug"
+ "IsDebugOnly" = "11:TRUE"
+ "IsReleaseOnly" = "11:FALSE"
+ "OutputFilename" = "8:Debug\\clientpasswordmanager-msm.msm"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:1"
+ }
+ "Release"
+ {
+ "DisplayName" = "8:Release"
+ "IsDebugOnly" = "11:FALSE"
+ "IsReleaseOnly" = "11:TRUE"
+ "OutputFilename" = "8:Release\\clientpasswordmanager-msm.msm"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:1"
+ }
+ }
+ "Deployable"
+ {
+ "CustomAction"
+ {
+ }
+ "DefaultFeature"
+ {
+ "Name" = "8:DefaultFeature"
+ "Title" = "8:"
+ "Description" = "8:"
+ }
+ "File"
+ {
+ }
+ "FileType"
+ {
+ }
+ "Folder"
+ {
+ "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_6E6B01F2741A44CEAD98C1596C6D5ECF"
+ {
+ "Name" = "8:#1910"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:CommonFilesFolder"
+ "Folders"
+ {
+ }
+ }
+ "{29CD8198-A6F0-4B93-8B90-AC03CFEAD328}:_99CD6F04CF034FEC8E2E893187E81441"
+ {
+ "DefaultLocation" = "8:[TARGETDIR]"
+ "DisplayName" = "8:Module Retargetable Folder"
+ "Description" = "8:"
+ "Name" = "8:Module Retargetable Folder"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:TRUE"
+ "Property" = "8:NEWRETARGETABLEPROPERTY1"
+ "Folders"
+ {
+ }
+ }
+ }
+ "Sequences"
+ {
+ }
+ "MergeModule"
+ {
+ "{35A69C6E-5BA4-440D-803D-762B59A45393}:_C87D109CB52E451B8D4C9C425B9F408F"
+ {
+ "UseDynamicProperties" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "SourcePath" = "8:dotnetfxredist_x86.msm"
+ "LanguageId" = "3:1033"
+ "Exclude" = "11:FALSE"
+ "Folder" = "8:"
+ "Feature" = "8:"
+ "IsolateTo" = "8:"
+ }
+ }
+ "Module"
+ {
+ "ModuleSignature" = "8:MergeModule.6E7C68BEF7C242F99CC96098C0C93419"
+ "Version" = "8:1.0.0.0"
+ "Title" = "8:clientpasswordmanager-msm"
+ "Subject" = "8:"
+ "Author" = "8:Novell, Inc."
+ "Keywords" = "8:"
+ "Comments" = "8:"
+ "SearchPath" = "8:"
+ "UseSystemSearchPath" = "11:TRUE"
+ }
+ "ProjectOutput"
+ {
+ "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_3AD7204448FD4A0FB065CE3B19B85187"
+ {
+ "SourcePath" = "8:..\\..\\..\\c-sharp-net-credential\\obj\\Debug\\Novell.Security.ClientPasswordManager.NetCredential.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_99CD6F04CF034FEC8E2E893187E81441"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{D7D0F5D8-0F45-4DCA-818B-8E71168A2CA3}"
+ "ShowKeyOutput" = "11:FALSE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_3CA7DFE20AFF49E1A5059CAA12A6F262"
+ {
+ "SourcePath" = "8:..\\..\\..\\c-sharp-username-dialog\\obj\\Debug\\Novell.Security.ClientPasswordManager.UsernameDialog.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_99CD6F04CF034FEC8E2E893187E81441"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{AFE3BA84-436C-4DD1-BA01-3B8C6B9D125C}"
+ "ShowKeyOutput" = "11:FALSE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_763071E9529E47298E0D483C70C9DD2C"
+ {
+ "SourcePath" = "8:..\\..\\..\\c-sharp-password-dialog\\obj\\Debug\\Novell.Security.ClientPasswordManager.PasswordDialog.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_99CD6F04CF034FEC8E2E893187E81441"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{5A211C70-3AEB-4305-8CB6-42757D01DC22}"
+ "ShowKeyOutput" = "11:FALSE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_D54A8D63A6224AABA81E04F4DB6AD917"
+ {
+ "SourcePath" = "8:..\\..\\..\\c-sharp-utilities\\obj\\Debug\\Novell.Security.Utilities.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_99CD6F04CF034FEC8E2E893187E81441"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{BBAD68F3-93C6-448F-8F79-F8CAEA3200C5}"
+ "ShowKeyOutput" = "11:FALSE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ }
+ "Registry"
+ {
+ "HKLM"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKCU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKCR"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKPU"
+ {
+ "Keys"
+ {
+ }
+ }
+ }
+ "Shortcut"
+ {
+ }
+ }
+}
diff --git a/LinkedKeyInfo.cs b/LinkedKeyInfo.cs
new file mode 100644
index 00000000..c0c55674
--- /dev/null
+++ b/LinkedKeyInfo.cs
@@ -0,0 +1,42 @@
+using System;
+
+namespace Novell.CASA.MiCasa.Common
+{
+ ///
+ /// Summary description for LinkInfo.
+ ///
+ ///
+ [Serializable]
+ public class LinkedKeyInfo
+ {
+ private string m_sDestStoreID = null;
+ private string m_sDestKeychainID = null;
+ private string m_sDestSecretID = null;
+ private string m_sDestKeyID = null;
+
+ public LinkedKeyInfo(string sDestSecretID, string sDestKey)
+ {
+ if (sDestSecretID.StartsWith("SS_CredSet"))
+ m_sDestSecretID = sDestSecretID;
+ else
+ m_sDestSecretID = "SS_CredSet:" + sDestSecretID + '\0';
+
+ m_sDestKeyID = sDestKey;
+ }
+
+ public string GetLinkID()
+ {
+ return m_sDestSecretID + ":" + m_sDestKeyID;
+ }
+
+ public string GetLinkedSecretID()
+ {
+ return m_sDestSecretID;
+ }
+
+ public string GetLinkedKeyID()
+ {
+ return m_sDestKeyID;
+ }
+ }
+}
diff --git a/LoginCapture/AUTHORS b/LoginCapture/AUTHORS
new file mode 100644
index 00000000..e69de29b
diff --git a/LoginCapture/ChangeLog b/LoginCapture/ChangeLog
new file mode 100644
index 00000000..e69de29b
diff --git a/LoginCapture/LoginCapture.ncb b/LoginCapture/LoginCapture.ncb
new file mode 100644
index 00000000..22c642a0
Binary files /dev/null and b/LoginCapture/LoginCapture.ncb differ
diff --git a/LoginCapture/LoginCapture.sln b/LoginCapture/LoginCapture.sln
new file mode 100644
index 00000000..bb70484a
--- /dev/null
+++ b/LoginCapture/LoginCapture.sln
@@ -0,0 +1,37 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcredmgr", "windows\windows.vcproj", "{55E85618-3643-4213-A15F-08DA1F02D9BB}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "logincapture-msm", "package\windows\logincapture-msm\logincapture-msm.vdproj", "{4D800AB9-920A-44D6-B996-C986C8121A9D}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "TestInstall", "package\windows\TestInstall\TestInstall.vdproj", "{3521E46A-2DED-4DAC-AE38-A95A3FD45E60}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {55E85618-3643-4213-A15F-08DA1F02D9BB}.Debug.ActiveCfg = Debug|Win32
+ {55E85618-3643-4213-A15F-08DA1F02D9BB}.Debug.Build.0 = Debug|Win32
+ {55E85618-3643-4213-A15F-08DA1F02D9BB}.Release.ActiveCfg = Release|Win32
+ {55E85618-3643-4213-A15F-08DA1F02D9BB}.Release.Build.0 = Release|Win32
+ {4D800AB9-920A-44D6-B996-C986C8121A9D}.Debug.ActiveCfg = Debug
+ {4D800AB9-920A-44D6-B996-C986C8121A9D}.Debug.Build.0 = Debug
+ {4D800AB9-920A-44D6-B996-C986C8121A9D}.Release.ActiveCfg = Release
+ {4D800AB9-920A-44D6-B996-C986C8121A9D}.Release.Build.0 = Release
+ {3521E46A-2DED-4DAC-AE38-A95A3FD45E60}.Debug.ActiveCfg = Debug
+ {3521E46A-2DED-4DAC-AE38-A95A3FD45E60}.Debug.Build.0 = Debug
+ {3521E46A-2DED-4DAC-AE38-A95A3FD45E60}.Release.ActiveCfg = Release
+ {3521E46A-2DED-4DAC-AE38-A95A3FD45E60}.Release.Build.0 = Release
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/LoginCapture/LoginCapture.suo b/LoginCapture/LoginCapture.suo
new file mode 100644
index 00000000..cb49cb60
Binary files /dev/null and b/LoginCapture/LoginCapture.suo differ
diff --git a/LoginCapture/Makefile.am b/LoginCapture/Makefile.am
new file mode 100644
index 00000000..a348e222
--- /dev/null
+++ b/LoginCapture/Makefile.am
@@ -0,0 +1,46 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = $(TARGET_OS) package
+
+DIST_SUBDIRS = linux windows package
+
+EXTRA_DIST =
+
+.PHONY: package package-clean package-install package-uninstall
+package package-clean package-install package-uninstall:
+ $(MAKE) -C package $@
+
+installcheck-summary:
+ $(MAKE) -C src $@
+
+clean-local:
+ rm -rf *.suo
+
+maintainer-clean-local:
+ rm -f configure Makefile.in logincapture-*.tar.gz
+ rm -f aclocal.m4 conf*.sh configure.lineno
+ rm -f config.guess config.sub config.status
+ rm -f ltmain.sh libtool
+ rm -f install-sh install-sh.lnk INSTALL INSTALL.lnk
+ rm -f missing missing.lnk mkinstalldirs mkinstalldir.lnk
+ rm -rf autom4te.cache
diff --git a/LoginCapture/NEWS b/LoginCapture/NEWS
new file mode 100644
index 00000000..e69de29b
diff --git a/LoginCapture/README b/LoginCapture/README
new file mode 100644
index 00000000..6fd7ab21
--- /dev/null
+++ b/LoginCapture/README
@@ -0,0 +1,176 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+INTRODUCTION
+
+The LoginCapture provides a service that exports the credentials used
+by the user to login to the desktop to the SecretStore wallet. Once in the
+SecretStore wallet, the credentials can be leveraged by desktop applications
+to provide a better single sign-on experience to the user.
+
+Please note that the better single sign-on experience will only be realized if
+the credentials used to log to the back-end systems match the credentials
+used to login to the desktop.
+
+FEATURES
+
+The LoginCapture services are provided by components that are platform dependent.
+
+On Linux, LoginCapture provides its services through the use of a PAM module which
+is inserted into the PAM configuration chain of the default Windows Manager during
+the installation of the LoginCapture rpm.
+
+On Windows2000 and above, LoginCapture provides its services through a Credential Manager.
+
+CONTENTS
+
+linux - This folder contains the Linux PAM module implementation.
+
+windows - This folder contanins the Windows Credential Manager implementation.
+
+package - This folder contains the files necessary to build the software packages
+under windows and under linux.
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON WINDOWS
+
+ - Install Visual Studio .NET 2003
+ - Install Cygwin - See instructions below.
+
+Download and start cygwin install:
+Browse to http://sources.redhat.com/cygwin/
+
+Click on "Install or update now!" or "Install Cygwin now"
+
+Cygwin Setup:
+Next
+
+Cygwin Setup - Choose Installation Type:
+Install from Internet
+Next
+
+Cygwin Setup - Choose Installation Directory:
+Root Directory: C:\cygwin
+Install For: "All Users"
+
+Default Text File Type: DOS
+
+Cygwin Setup - Select Local Package Directory:
+ Local Package Directory: C:\cygwin-packages
+
+Cygwin Setup - Select Connection Type:
+ Direct Connection
+
+Choose A Download Site:
+ ftp://ftp.nas.nasa.gov
+
+Cywin Setup - Select Packages:
+ Base:
+ defaults
+
+ Devel:
+ autoconf
+ automake
+ libtool
+ make
+ pkgconfig
+ cvs
+ gcc
+ gcc-g++
+
+ Editors:
+ vim (optional)
+
+ Net:
+ openssh
+ openssl
+
+ Text:
+ more
+
+ Utils:
+ clear (optional)
+
+Cygwin Setup - Create Icons:
+Finish
+
+Edit cygwin.bat (c:\cygwin\cygwin.bat) to add a call to
+%VS71COMNTOOLS%\vsvars32.bat (see example below). This sets up the
+Visual Studio tools in Cygwin.
+
+Sample cygwin.bat:
+
+@echo off
+
+call "%VS71COMNTOOLS%\vsvars32.bat" > NUL
+
+C:
+chdir C:\cygwin\bin
+
+bash --login -i
+
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON LINUX
+
+Install latest mono and mono-devel RPM - Obtain RPMs from
+www.go-mono.org.
+
+
+BUILDING THE SOFTWARE PACKAGE
+
+Windows: Start at Step 1.
+Linux: Skip to Step 2.
+
+1. Run cygwin.bat to start up Cygwin.
+
+2. Generate autotools files:
+./autogen.sh --prefix=/ [--enable-debug]
+( is some writable directory where 'make install' will
+install files for testing.
+
+3. To reconfigure later, or to configure software that came from a source
+distribution (.tar.gz) file, use configure.
+./configure --prefix/ [--enable-debug]
+(run ./configure --help for more options)
+
+4. Select your make target, here are a few interesting ones:
+
+make [all] - build product files (package files not included)
+
+make clean - clean up files built by 'make all'
+
+make package - build product and package files
+
+make package-clean - clean up package files
+
+make install - install product files to specified by
+--prefix during configure
+
+make uninstall - undo 'make install'
+
+make dist - build a source distribution tarball.
+
+make distclean - removes files to return state back to same as the
+source distribution (configure, Makefile.in files, and other distributed
+autotools files are not removed)
+
+make maintainer-clean - removes files to return state back to same as
+the CVS checkout (you will need to run ./autogen.sh again before running
+make again)
+
diff --git a/LoginCapture/autogen.sh b/LoginCapture/autogen.sh
new file mode 100644
index 00000000..7b4b68f9
--- /dev/null
+++ b/LoginCapture/autogen.sh
@@ -0,0 +1,130 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=LoginCapture
+TEST_TYPE=-f
+FILE=linux/pam_pwcapture.c
+
+DIE=0
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have autoconf installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+AUTOMAKE=automake-1.7
+ACLOCAL=aclocal-1.7
+
+($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
+ AUTOMAKE=automake
+ ACLOCAL=aclocal
+}
+
+($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "You must have automake installed to compile $PROJECT."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+test $TEST_TYPE $FILE || {
+ echo "You must run this script in the top-level $PROJECT directory"
+ exit 1
+}
+
+if test -z "$*"; then
+ echo "I am going to run ./configure with no arguments - if you wish "
+ echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+case $CC in
+*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+esac
+
+for coin in `find $srcdir -name configure.in -print`
+do
+ dr=`dirname $coin`
+ if test -f $dr/NO-AUTO-GEN; then
+ echo skipping $dr -- flagged as no auto-gen
+ else
+ echo processing $dr
+ macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+ ( cd $dr
+ aclocalinclude="$ACLOCAL_FLAGS"
+ for k in $macrodirs; do
+ if test -d $k; then
+ aclocalinclude="$aclocalinclude -I $k"
+ ##else
+ ## echo "**Warning**: No such directory \`$k'. Ignored."
+ fi
+ done
+ if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
+ if grep "sed.*POTFILES" configure.in >/dev/null; then
+ : do nothing -- we still have an old unmodified configure.in
+ else
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ fi
+ if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | glib-gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
+ echo "Running libtoolize..."
+ libtoolize --force --copy
+ fi
+ echo "Running $ACLOCAL $aclocalinclude ..."
+ $ACLOCAL $aclocalinclude
+ if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
+ echo "Running autoheader..."
+ autoheader
+ fi
+ echo "Running $AUTOMAKE --gnu $am_opt ..."
+ $AUTOMAKE --add-missing --gnu $am_opt
+ echo "Running autoconf ..."
+ autoconf
+ )
+ fi
+done
+
+conf_flags="--config-cache --enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
+
+cd "$ORIGDIR"
+
+if test x$NOCONFIGURE = x; then
+ echo Running $srcdir/configure $conf_flags "$@" ...
+ $srcdir/configure $conf_flags "$@" \
+ && echo Now type \`make\' to compile $PROJECT || exit 1
+else
+ echo Skipping configure process.
+fi
diff --git a/LoginCapture/configure.in b/LoginCapture/configure.in
new file mode 100644
index 00000000..bc94b1f7
--- /dev/null
+++ b/LoginCapture/configure.in
@@ -0,0 +1,203 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+AC_INIT(linux/pam_pwcapture.c)
+AC_CANONICAL_SYSTEM
+AM_INIT_AUTOMAKE(logincapture, 0.1.1)
+RELEASE=`date +%Y%m%d_%H%M`
+AC_SUBST(RELEASE)
+AM_MAINTAINER_MODE
+
+#
+# Check for a valid C# compiler
+#
+AC_CHECK_PROG(CSC, csc, csc)
+test -z "$CSC" && AC_CHECK_PROG(CSC, mcs, mcs)
+test -z "$CSC" && AC_MSG_ERROR([no acceptable C Sharp compiler found in \$PATH])
+
+case $CSC in
+ #
+ # Mono-specific configuration
+ #
+ mcs)
+ CSC_EXEFLAG=/target:exe
+ CSC_LIBFLAG=/target:library
+ CSC_EXEFLAG=/target:exe
+ CSC_WINEXEFLAG=/target:winexe
+ CSCFLAGS='/d:MONO /warn:4 /d:TRACE'
+ CSCFLAGS_DEBUG="/debug+ /d:DEBUG"
+ CSCFLAGS_OPTIMIZE="/optimize+"
+ MONO=mono
+ MONO_DEBUG='mono --debug'
+ MONO_PATH=
+ SYSTEM_XML='System.Xml.dll'
+ ;;
+ #
+ # .NET-specific configuration
+ #
+ csc)
+ CSC_EXEFLAG=/target:exe
+ CSC_LIBFLAG=/target:library
+ CSC_EXEFLAG=/target:exe
+ CSC_WINEXEFLAG=/target:winexe
+ CSCFLAGS='/d:DOTNET /warn:4 /d:TRACE /nologo'
+ CSCFLAGS_DEBUG="/debug+ /d:DEBUG"
+ CSCFLAGS_OPTIMIZE="/optimize+"
+ MONO=
+ MONO_DEBUG=
+ MONO_PATH=
+ SYSTEM_XML='System.XML.dll'
+ ;;
+esac
+AC_SUBST(CSC)
+AC_SUBST(CSC_EXEFLAG)
+AC_SUBST(CSC_LIBFLAG)
+AC_SUBST(CSC_WINEXEFLAG)
+AC_SUBST(CSCFLAGS)
+AC_SUBST(MONO)
+AC_SUBST(MONO_PATH)
+AC_SUBST(SYSTEM_XML)
+
+SRCDIR='$(top_srcdir)'
+DOCDIR="$SRCDIR/doc"
+
+AC_SUBST(SRCDIR)
+AC_SUBST(DOCDIR)
+
+EMPTY=
+SPACE='$(EMPTY) $(EMPTY)'
+
+AC_SUBST(EMPTY)
+AC_SUBST(SPACE)
+
+#
+# Check for a valid operating system
+#
+case $host_os in
+ linux*)
+ TARGET_OS='linux'
+ ;;
+ cygwin*)
+ TARGET_OS='windows'
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown host_os: $host_os])
+ ;;
+esac
+AC_SUBST(TARGET_OS)
+AM_CONDITIONAL(LINUX, test "$TARGET_OS" = "linux")
+AM_CONDITIONAL(WINDOWS, test "$TARGET_OS" = "windows")
+
+#
+# Set platform-specific variables
+#
+case $TARGET_OS in
+ #
+ # Linux-specific configuration
+ #
+ linux)
+ #
+ # Set variables
+ #
+ COMMON_CLEAN_FILES=''
+ ICON_EXT='.ico'
+ ICON_FLAG='/resource:'
+ PLATFORM_SUBDIRS=$LINUX_SUBDIRS
+ SEP='/'
+ ;;
+ #
+ # Windows-specific configuration
+ #
+ windows)
+ COMMON_CLEAN_FILES='*.suo */*.suo *.csproj.user */*.csproj.user bin obj */bin */obj *.xml */*.xml *.pdb */*.pdb'
+ ICON_EXT='.ico'
+ ICON_FLAG='/win32icon:'
+ PLATFORM_SUBDIRS=$WINDOWS_SUBDIRS
+ SEP='$(EMPTY)\\$(EMPTY)'
+ ;;
+esac
+AC_SUBST(COMMON_CLEAN_FILES)
+AC_SUBST(ICON_EXT)
+AC_SUBST(ICON_FLAG)
+AC_SUBST(PLATFORM_SUBDIRS)
+AC_SUBST(SEP)
+
+#
+# Run standard macros
+#
+AM_PROG_CC_STDC
+AC_PROG_INSTALL
+AC_HEADER_STDC
+
+#
+# Handle --enable-debug
+#
+AC_ARG_ENABLE(debug, [
+ --enable-debug configure the Makefiles to build in DEBUG mode],
+ [case "${enableval}" in
+ yes) enable_debug=true ;;
+ no) enable_debug=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
+ esac],[enable_debug=false])
+AM_CONDITIONAL(DEBUG, test x$enable_debug = xtrue)
+if test "$enable_debug" = "true"
+then
+ # Build debug version.
+ CFLAGS="$CFLAGS_DEBUG $CFLAGS"
+ CSCFLAGS="$CSCFLAGS_DEBUG $CSCFLAGS"
+ CXXFLAGS="$CXXFLAGS_DEBUG $CXXFLAGS"
+ DEVENV_CONFIGURATION=Debug
+ MONO=$MONO_DEBUG
+else
+ # Build optimized version.
+ CFLAGS="$CFLAGS_OPTIMIZE $CFLAGS"
+ CSCFLAGS="$CSCFLAGS_OPTIMIZE $CSCFLAGS"
+ CXXFLAGS="$CXXFLAGS_OPTIMIZE $CXXFLAGS"
+ DEVENV_CONFIGURATION=Release
+fi
+AC_SUBST(CSCFLAGS)
+AC_SUBST(DEVENV_CONFIGURATION)
+
+#
+# Configure PKG_CONFIG
+#
+AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+if test "x$PKG_CONFIG" = "xno"; then
+ AC_MSG_ERROR([You need to install pkg-config])
+fi
+
+#
+# Configure files
+#
+AC_OUTPUT([
+Makefile
+linux/Makefile
+linux/install/Makefile
+windows/Makefile
+package/windows/Makefile
+package/windows/logincapture-msm/Makefile
+package/Makefile
+package/linux/Makefile
+package/linux/logincapture.spec
+])
+
+
diff --git a/LoginCapture/linux/Makefile.am b/LoginCapture/linux/Makefile.am
new file mode 100644
index 00000000..e2a412f5
--- /dev/null
+++ b/LoginCapture/linux/Makefile.am
@@ -0,0 +1,69 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = install
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+PamMod_CFILES = $(srcdir)/pam_pwcapture.c
+PamMod_OBJ = pam_pwcapture.o
+PamMod_CSFILES_CSC :=
+PamMod_INCLUDES =
+PamMod_RESOURCES =
+PamMod_CFLAGS = $(CFLAGS)
+PamMod_LIBS =
+PamMod_LIBPATH =
+
+EXTRA_DIST = $(PamMod_CFILES)
+
+CUR_DIR := $(shell pwd)
+
+all: pam_pwcapture.so
+
+pam_pwcapture.so: $(PamMod_CFILES)
+ $(mkinstalldirs) bin/$(DEVENV_CONFIGURATION)
+ $(CC) -shared -lpam -lpam_misc -o bin/$(DEVENV_CONFIGURATION)/$@ $(PamMod_CFILES)
+
+install-exec-local: pam_pwcapture.so
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(DEVENV_CONFIGURATION)/pam_pwcapture.so $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f pam_pwcapture.so
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(DEVENV_CONFIGURATION)/pam_pwcapture.so
+
+clean-local:
+ rm -rf *.dbg *.exe *.so *.o *.dll $(CLEAN_FILES) $(COMMON_CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/linux/install/Makefile.am b/LoginCapture/linux/install/Makefile.am
new file mode 100644
index 00000000..02ac2f3c
--- /dev/null
+++ b/LoginCapture/linux/install/Makefile.am
@@ -0,0 +1,73 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+ModInstall_CFILES = $(srcdir)/modinstall.c
+ModInstall_OBJ = modinstall.o
+ModInstall_CSFILES_CSC :=
+ModInstall_INCLUDES =
+ModInstall_RESOURCES =
+ModInstall_CFLAGS = $(CFLAGS)
+ModInstall_LIBS =
+ModInstall_LIBPATH =
+
+EXTRA_DIST = $(ModInstall_CFILES)
+
+CUR_DIR := $(shell pwd)
+
+all: modinstall
+
+modinstall: $(ModInstall_CFILES)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+ $(CC) -g -o bin/$(TARGET_CFG)/$@ $(ModInstall_CFILES)
+
+install-exec-local: modinstall
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/modinstall $(DESTDIR)$(bindir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(bindir); rm -f modinstall
+ rmdir $(DESTDIR)$(bindir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(bindir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(bindir)
+# cd $(DESTDIR)$(bindir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/modinstall
+
+clean-local:
+ rm -rf *.dbg *.exe *.so *.o *.dll $(CLEAN_FILES) $(COMMON_CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/linux/install/README b/LoginCapture/linux/install/README
new file mode 100644
index 00000000..07aeac15
--- /dev/null
+++ b/LoginCapture/linux/install/README
@@ -0,0 +1,75 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+if DEBUG
+TARGET_CFG = Debug
+else
+TARGET_CFG = Release
+endif
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+PamMod_CFILES = $(srcdir)/pam_pwcapture.c
+PamMod_OBJ = pam_pwcapture.o
+PamMod_CSFILES_CSC :=
+PamMod_INCLUDES =
+PamMod_RESOURCES =
+PamMod_CFLAGS = $(CFLAGS)
+PamMod_LIBS =
+PamMod_LIBPATH =
+
+EXTRA_DIST = $(PamMod_CFILES)
+
+CUR_DIR := $(shell pwd)
+
+all: pam_pwcapture.so
+
+pam_pwcapture.so: $(PamMod_CFILES)
+ $(mkinstalldirs) ../Common/$(TARGET_CFG)
+ $(mkinstalldirs) bin/$(TARGET_CFG)
+ $(CC) -shared -lpam -lpam_misc -o bin/$(TARGET_CFG)/$@ $(PamMod_CFILES)
+ cp bin/$(TARGET_CFG)/$@ ../Common/$(TARGET_CFG)/$@
+
+install-exec-local: pam_pwcapture.so
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(TARGET_CFG)/pam_pwcapture.so $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f pam_pwcapture.so
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(TARGET_CFG)/pam_pwcapture.so
+
+clean-local:
+ rm -rf *.dbg *.exe *.so *.o *.dll $(CLEAN_FILES) $(COMMON_CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/linux/install/modinstall.c b/LoginCapture/linux/install/modinstall.c
new file mode 100644
index 00000000..f4d76b62
--- /dev/null
+++ b/LoginCapture/linux/install/modinstall.c
@@ -0,0 +1,304 @@
+/***********************************************************************
+ * File: modinstall.c
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Abstract: Implements a utility to install or un-install the
+ * pam_pwcapture module.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+#include "stdio.h"
+#include "errno.h"
+#include
+#include
+
+typedef int BOOL;
+#define TRUE 1
+#define FALSE 0
+
+
+// Usage string
+char usage[] = "\nmodinstall: usage: [-i InstallPamConfigFilePath] [-u UninstallPamConfigFilePath]\n";
+
+// Our PAM Configuration Line
+char pamConfigLine[] = "auth required\tpam_pwcapture.so\n";
+
+
+/* ************************************************************************
+ * InstallModule()
+ *
+ * Installs the pam_pwcapture file in the specified file.
+ *
+ * ************************************************************************/
+void
+InstallModule(char *pFilePath)
+{
+ FILE *fp;
+ FILE *fpTemp;
+ fpos_t currLinePosition;
+ char currLine[512];
+ BOOL authLineFound = FALSE;
+ BOOL insertedOurLine = FALSE;
+
+ // Open temporary file
+ if ((fpTemp = tmpfile()) != NULL)
+ {
+ // Open the PAM config file for reading
+ if ((fp = fopen(pFilePath, "r")) != NULL)
+ {
+ // Copy the PAM config file onto the temp file
+ while (fgets(currLine, 512, fp) != NULL)
+ if (fputs(currLine, fpTemp) < 0)
+ fprintf(stderr, "Error writing line to temp file\n");
+
+ // Close the PAM Config file and reopen it for writing
+ fclose(fp);
+ if ((fp = fopen(pFilePath, "w")) != NULL)
+ {
+ // Reset the file position on the temp file to the beginning
+ if (fseek(fpTemp, 0, SEEK_SET) == 0)
+ {
+ // Now move the lines from the temp file onto the clean
+ // PAM config file looking for a place to insert our own
+ // line.
+ while (fgets(currLine, 512, fpTemp) != NULL)
+ {
+ // Check if we are dealing with a line configuring an authentication service
+ if (strlen(currLine) > 4
+ && tolower(currLine[0]) == 'a'
+ && tolower(currLine[1]) == 'u'
+ && tolower(currLine[2]) == 't'
+ && tolower(currLine[3]) == 'h')
+ {
+ authLineFound = TRUE;
+ }
+ else
+ {
+ // This line is not configuring an authentication service, check if we
+ // now need to add a line for our module.
+ if (authLineFound && insertedOurLine == FALSE)
+ {
+ // Do not add our line if the line is commented out
+ if (strlen(currLine) > 1
+ && currLine[0] != '#')
+ {
+ // Ok, now insert our line into the configuration.
+ if (fputs(pamConfigLine, fp) < 0)
+ fprintf(stderr, "Error writing line to PAM Config file\n");
+ insertedOurLine = TRUE;
+ }
+ }
+ }
+
+ if (fputs(currLine, fp) < 0)
+ fprintf(stderr, "Error writing line to PAM Config file\n");
+ }
+ }
+ else
+ {
+ fprintf(stderr, "Error resetting position in temp file\n");
+ }
+
+ // Close the PAM Config file
+ fclose(fp);
+ }
+ else
+ {
+ fprintf(stderr, "Error reopening PAM Config file\n");
+ }
+ }
+ else
+ {
+ fprintf(stderr, "Error opening PAM Config file for reading\n");
+ }
+
+ // Close the temporary file
+ fclose(fpTemp);
+ }
+ else
+ {
+ fprintf(stderr, "Unable to open temporary file\n");
+ }
+}
+
+
+/* ************************************************************************
+ * UninstallModule()
+ *
+ * Uninstalls the pam_pwcapture file from the specified file.
+ *
+ * ************************************************************************/
+void
+UninstallModule(char *pFilePath)
+{
+ FILE *fp;
+ FILE *fpTemp;
+ char currLine[512];
+
+ // Open temporary file
+ if ((fpTemp = tmpfile()) != NULL)
+ {
+ // Open the PAM config file for reading
+ if ((fp = fopen(pFilePath, "r")) != NULL)
+ {
+ // Copy the PAM config file onto the temp file
+ while (fgets(currLine, 512, fp) != NULL)
+ if (fputs(currLine, fpTemp) < 0)
+ fprintf(stderr, "Error writing line to temp file\n");
+
+ // Close the PAM Config file and reopen it for writing
+ fclose(fp);
+ if ((fp = fopen(pFilePath, "w")) != NULL)
+ {
+ // Reset the file position on the temp file to the beginning
+ if (fseek(fpTemp, 0, SEEK_SET) == 0)
+ {
+ // Now move the lines from the temp file onto the clean
+ // PAM config file looking for our own line.
+ while (fgets(currLine, 512, fpTemp) != NULL)
+ {
+ // Write lines other than our own back to the PAM Config file
+ if (strcmp(currLine, pamConfigLine) != 0)
+ {
+ if (fputs(currLine, fp) < 0)
+ fprintf(stderr, "Error writing line to PAM Config file\n");
+ }
+ }
+ }
+ else
+ {
+ fprintf(stderr, "Error resetting position in temp file\n");
+ }
+
+ // Close the PAM Config file
+ fclose(fp);
+ }
+ else
+ {
+ fprintf(stderr, "Error reopening PAM Config file\n");
+ }
+ }
+ else
+ {
+ fprintf(stderr, "Error opening PAM Config file for reading\n");
+ }
+
+ // Close the temporary file
+ fclose(fpTemp);
+ }
+ else
+ {
+ fprintf(stderr, "Unable to open temporary file\n");
+ }
+}
+
+
+/* ************************************************************************
+ * main()
+ *
+ * Entry point for console application.
+ *
+ * ************************************************************************/
+int main(int argc, char* argv[])
+{
+ int option;
+ int optionsSpecified = 0;
+ BOOL doneScanning = FALSE;
+ BOOL invalidUsage = FALSE;
+ char *pInstallFile = NULL;
+ char *pUninstallFile = NULL;
+
+ // Scan options
+ while (!doneScanning)
+ {
+ opterr = 0;
+ option = getopt(argc, argv, "i:u:?");
+
+ // Proceed based on the result
+ switch (option)
+ {
+ case 'i':
+ // Install option, check the argument.
+ if (optarg != NULL)
+ {
+ // Record location of argument
+ pInstallFile = optarg;
+ optionsSpecified ++;
+ }
+ else
+ {
+ // No install file path specified
+ doneScanning = TRUE;
+ invalidUsage = TRUE;
+ }
+ break;
+
+ case 'u':
+ // Uninstall option, check the argument.
+ if (optarg != NULL)
+ {
+ // Record location of argument
+ pUninstallFile = optarg;
+ optionsSpecified ++;
+ }
+ else
+ {
+ // No uninstall file path specified
+ doneScanning = TRUE;
+ invalidUsage = TRUE;
+ }
+ break;
+
+ case '?':
+ // Invalid option detected
+ doneScanning = TRUE;
+ invalidUsage = TRUE;
+ break;
+
+ default:
+ // Done scanning
+ doneScanning = TRUE;
+ break;
+ }
+ }
+
+ // Do some sanity checking
+ if (!invalidUsage
+ && optionsSpecified)
+ {
+ // Check if we need to install the module
+ if (pInstallFile)
+ {
+ InstallModule(pInstallFile);
+ }
+
+ // Check if we need to uninstall the module
+ if (pUninstallFile)
+ {
+ UninstallModule(pUninstallFile);
+ }
+ }
+ else
+ {
+ // Invalid option detected, print usage message.
+ printf(usage, argv[0]);
+ }
+
+ return 0;
+}
+
diff --git a/LoginCapture/linux/pam_pwcapture.c b/LoginCapture/linux/pam_pwcapture.c
new file mode 100644
index 00000000..fbe10327
--- /dev/null
+++ b/LoginCapture/linux/pam_pwcapture.c
@@ -0,0 +1,239 @@
+/***********************************************************************
+ * File: pam_pwcapture.c
+ * Author: Juan Carlos Luciani (jluciani@novell.com)
+ *
+ * Abstract: Implements a PAM module that caches the username and
+ * password into the SecretStore wallet.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+#define _GNU_SOURCE
+
+#include
+#include
+#ifndef LINUX
+#include
+#endif
+
+#define PAM_SM_AUTH
+#define PAM_SM_ACCOUNT
+#define PAM_SM_PASSWORD
+#define PAM_SM_SESSION
+
+#include
+#include
+
+
+/* ************************************************************************
+ * UpdateWallet()
+ *
+ * Updates the SecretStore wallet with the specified "Local" credentials.
+ *
+ * ************************************************************************/
+static void
+LogError(char *pFormatStr, ... )
+{
+ va_list args;
+
+ openlog("pam_pwcapture", LOG_CONS | LOG_NOWAIT | LOG_ODELAY, LOG_USER);
+ va_start(args, pFormatStr);
+ vsyslog(LOG_USER | LOG_INFO, pFormatStr, args);
+ va_end(args);
+ closelog();
+}
+
+
+/* ************************************************************************
+ * UpdateWallet()
+ *
+ * Updates the SecretStore wallet with the specified "Local" credentials.
+ *
+ * ************************************************************************/
+void UpdateWallet(char *pUsername,
+ char *pPassword)
+{
+ // Do nothing at this time
+ // tbd
+}
+
+
+/* ************************************************************************
+ * pam_sm_authenticate()
+ *
+ * Service provider implementation for pam_authenticate().
+ *
+ * This is a PAM authentication management function.
+ *
+ * We are only interested in obtaining the username and password at this
+ * point and assume that the user has already been authenticated.
+ *
+ * ************************************************************************/
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ char *pUsername = NULL;
+ char *pPassword = NULL;
+
+ // Obtain the username, note that we are not calling
+ // pam_get_user() because we assume that the user has
+ // already been prompted for his name based on where
+ // we are configured in the PAM chain.
+ if (pam_get_item(pamh, PAM_USER, (void*) &pUsername) == PAM_SUCCESS
+ && pUsername != NULL)
+ {
+ // We got the username, now get the password.
+ if (pam_get_item(pamh, PAM_AUTHTOK, (void*) &pPassword) == PAM_SUCCESS
+ && pPassword != NULL)
+ {
+ // We got the password, now set the information in the wallet.
+ UpdateWallet(pUsername, pPassword);
+ }
+ else
+ {
+ LogError("Unable to obtain password");
+ }
+ }
+ else
+ {
+ LogError("Unable to obtain username");
+ }
+
+ // Always succeed, we do not want to risk messing up the user's login
+ return PAM_SUCCESS;
+}
+
+
+/* ************************************************************************
+ * pam_sm_setcred()
+ *
+ * Service provider implementation for pam_setcred().
+ *
+ * This is a PAM authentication management function.
+ *
+ * This function is here just for completedness and to protect against
+ * PAM misconfiguration.
+ *
+ * ************************************************************************/
+PAM_EXTERN int
+pam_sm_setcred(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ return PAM_SUCCESS;
+}
+
+
+/* ************************************************************************
+ * pam_sm_acct_mgmt()
+ *
+ * Service provider implementation for pam_acct_mgmt().
+ *
+ * This is a PAM account management function.
+ *
+ * This function is here just for completedness and to protect against
+ * PAM misconfiguration.
+ *
+ * ************************************************************************/
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ return PAM_SUCCESS;
+}
+
+
+/* ************************************************************************
+ * pam_sm_chauthtok()
+ *
+ * Service provider implementation for pam_chauthtok().
+ *
+ * This is a PAM password management function.
+ *
+ * This function is here just for completedness and to protect against
+ * PAM misconfiguration.
+ *
+ * ************************************************************************/
+PAM_EXTERN int
+pam_sm_chauthtok(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ return PAM_SUCCESS;
+}
+
+
+/* ************************************************************************
+ * pam_sm_open_session()
+ *
+ * Service provider implementation for pam_open_session().
+ *
+ * This is a PAM session management function.
+ *
+ * This function is here just for completedness and to protect against
+ * PAM misconfiguration.
+ *
+ * ************************************************************************/
+PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ return PAM_SUCCESS;
+}
+
+
+/* ************************************************************************
+ * pam_sm_close_session()
+ *
+ * Service provider implementation for pam_close_session().
+ *
+ * This is a PAM session management function.
+ *
+ * This function is here just for completedness and to protect against
+ * PAM misconfiguration.
+ *
+ * ************************************************************************/
+PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+ return PAM_SUCCESS;
+}
+
+
+/* static module data */
+#ifdef PAM_STATIC
+struct pam_module _pam_pwcapture_modstruct = {
+ "pam_pwcapture",
+ pam_sm_authenticate,
+ pam_sm_setcred,
+ pam_sm_acct_mgmt,
+ pam_sm_chauthtok,
+ pam_sm_open_session,
+ pam_sm_close_session
+};
+#endif
+
diff --git a/LoginCapture/package/Makefile.am b/LoginCapture/package/Makefile.am
new file mode 100644
index 00000000..bf6f36f8
--- /dev/null
+++ b/LoginCapture/package/Makefile.am
@@ -0,0 +1,33 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = $(TARGET_OS)
+
+DIST_SUBDIRS = linux windows
+
+.PHONY: package package-clean package-install package-uninstall
+package package-clean package-install package-uninstall:
+ $(MAKE) -C $(TARGET_OS) $@
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/package/linux/Makefile.am b/LoginCapture/package/linux/Makefile.am
new file mode 100644
index 00000000..2c8440a2
--- /dev/null
+++ b/LoginCapture/package/linux/Makefile.am
@@ -0,0 +1,65 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+RPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).$(target_cpu).rpm
+SRPM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).src.rpm
+
+.PHONY: package package-clean package-install package-uninstall logincapture
+
+#all: $(RPM_FILE)
+
+package: $(RPM_FILE)
+
+all clean:
+
+$(RPM_FILE):
+ cd $(top_srcdir); make dist
+ rm -rf RPM
+ mkdir RPM
+ echo %_topdir `pwd`/RPM > $(HOME)/.rpmmacros
+ mkdir -p RPM/BUILD
+ mkdir -p RPM/RPMS
+ mkdir -p RPM/SOURCES
+ mkdir -p RPM/SPECS
+ mkdir -p RPM/SRPMS
+ cp logincapture.spec RPM/SPECS
+ cp $(top_srcdir)/$(PACKAGE)-$(VERSION).tar.gz RPM/SOURCES
+ mv $(top_srcdir)/$(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)-$(RELEASE).tar.gz
+ rpmbuild -ba -v -vv --target=$(target_triplet) RPM/SPECS/logincapture.spec
+ cp RPM/RPMS/*/*.rpm .
+ cp RPM/SRPMS/$(SRPM_FILE) .
+
+package-install: package
+ su -c "rpm -Uvh $(RPM_FILE)"
+
+package-uninstall:
+ su -c "rpm -e $(PACKAGE)"
+
+package-clean clean-local:
+ rm -rf *.rpm RPM *.gz
+
+distclean-local: package-clean
+ rm -f Makefile logincapture.spec
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/package/linux/logincapture.spec.in b/LoginCapture/package/linux/logincapture.spec.in
new file mode 100644
index 00000000..e9fb47cd
--- /dev/null
+++ b/LoginCapture/package/linux/logincapture.spec.in
@@ -0,0 +1,140 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+# SuSE Specific autobuild tags
+# neededforbuild pkgconfig glib2 glib2-devel libicu26
+
+%define prefix /opt/Novell/LoginCapture
+
+Summary: LoginCapture
+Name: @PACKAGE@
+Version: @VERSION@
+Release: @RELEASE@
+Copyright: GPL
+Group: Applications/Productivity
+Source: %{name}-%{version}.tar.gz
+URL: http://forge.novell.com/modules/xfmod/project/?isecure
+#Distribution :
+Vendor:
+Packager:
+BuildRoot: %{_tmppath}/%{name}-%{version}
+
+#Requires: secretstorewallet
+Obsoletes: %{name} <= %{version}
+#=============================================================================
+%Description
+LoginCapture provides a way for applications using the SecretStore Wallet
+to leverage the password entered by the user to login to the desktop when
+authenticating to backend services. The use of this feature in cases where
+the username and password used to login to the desktop are synchronized with
+the backend username and password database should result in fewer requests to
+the user to enter its credentials.
+
+#=============================================================================
+%ChangeLog
+
+
+#=============================================================================
+%Prep
+%setup -n %{name}-%{version}
+
+
+#=============================================================================
+%Build
+./configure --prefix=%{prefix}
+make
+
+#=============================================================================
+%Install
+%{__rm} -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+#=============================================================================
+%Clean
+%{__rm} -rf $RPM_BUILD_ROOT
+
+#=============================================================================
+%Post
+# Do not run script if this is an upgrade
+if test "$1" != 1; then
+ #echo "LoginCapture install script does not run during upgrade"
+ exit 0
+fi
+
+echo "Running LoginCapture install script..."
+
+# Create a symbolic link to our library in the /lib/security folder
+ln -s "%{prefix}/lib/pam_pwcapture.so" /lib/security/pam_pwcapture.so
+
+# Determine what Window Manager is in use
+if [ -f /etc/sysconfig/desktop ]; then
+ if [ -n "´grep GNOME /etc/sysconfig/desktop´" ]; then
+ windows_mgr=/etc/pam.d/gdm
+ echo "Windows Mgr = gdm"
+ elif [ -n "´grep KDE /etc/sysconfig/desktop´" ]; then
+ windows_mgr=/etc/pam.d/kdm
+ echo "Windows Mgr = kdm"
+ elif [ -n "´grep AnotherLevel /etc/sysconfig/desktop´" ]; then
+ windows_mgr=/etc/pam.d/xdm
+ echo "Windows Mgr = xdm"
+ else
+ echo "Unknown windows manager, unable to update windows manager PAM configuration!"
+ exit 0
+ fi
+ if [ -f $windows_mgr ]; then
+ /opt/Novell/LoginCapture/bin/modinstall -i $windows_mgr
+ else
+ echo "Windows manager PAM config file not found!"
+ fi
+else
+ echo "Missing desktop file, unable to update windows manager PAM configuration!"
+ exit 0
+fi
+
+echo "done running LoginCapture install script!"
+
+#=============================================================================
+%Preun
+# Do not run script if this is an upgrade
+if test "$1" == 1; then
+ #echo "LoginCapture un-install script does not run during upgrade"
+ exit 0
+fi
+
+echo "Running LoginCapture un-install script..."
+
+# Uninstall our module from all of the PAM configuration files onto which it
+# has been installed by our utility.
+for i in `grep -l pam_pwcapture /etc/pam.d/*`;do /opt/Novell/LoginCapture/bin/modinstall -u $i; done
+
+# Remove symbolic link to our library from the /lib/security folder
+rm -f /lib/security/pam_pwcapture.so
+
+echo "done running LoginCapture un-install script!"
+
+#=============================================================================
+%Files
+%defattr(-,root,root)
+%{prefix}/*
+#%{prefix}/lib/*
+#%{prefix}/share/*
+
diff --git a/LoginCapture/package/windows/Makefile.am b/LoginCapture/package/windows/Makefile.am
new file mode 100644
index 00000000..abdf072c
--- /dev/null
+++ b/LoginCapture/package/windows/Makefile.am
@@ -0,0 +1,32 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+SUBDIRS = logincapture-msm
+
+.PHONY: package-clean package-install package-uninstall
+
+package package-clean package-install package-uninstall:
+ $(MAKE) -C logincapture-msm $@
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/package/windows/logincapture-msm/Makefile.am b/LoginCapture/package/windows/logincapture-msm/Makefile.am
new file mode 100644
index 00000000..3f53ba07
--- /dev/null
+++ b/LoginCapture/package/windows/logincapture-msm/Makefile.am
@@ -0,0 +1,61 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+MSM_FILE = $(PACKAGE)-$(VERSION)-$(RELEASE).msm
+MSM_LOG_FILE = devenv-logincapture-msm.log
+
+.PHONY: package package-clean package-install package-uninstall logincapture devenv
+
+#all clean:
+
+package: $(MSM_FILE)
+
+devenv:
+ @if ! test -x "$(VSINSTALLDIR)/devenv.exe"; then echo "Error: Microsoft Visual Studio .NET is currently required to build MSI and MSM packages"; exit 1; fi
+
+$(MSM_FILE): devenv
+ @rm -f $(MSM_LOG_FILE) $@
+ @CMD='"$(VSINSTALLDIR)/devenv.exe" ../../../LoginCapture.sln /build $(DEVENV_CONFIGURATION) /project logincapture-msm /out $(MSM_LOG_FILE)'; \
+ echo $$CMD; \
+ if eval $$CMD; then \
+ ls -l $(DEVENV_CONFIGURATION)/logincapture.msm; \
+ else \
+ grep -a "ERROR:" $(MSM_LOG_FILE); \
+ fi
+
+securesink:
+ make -C ../.. all
+
+package-clean clean-local:
+ rm -rf Release/* Release Debug/* Debug*/Release */Debug *.log *.suo
+
+clean:
+ rm -rf Release/* Release Debug/* Debug */Release */Debug *.log *.suo
+
+distclean-local: package-clean
+ rm -f Makefile logincapture.spec
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
+
+
diff --git a/LoginCapture/package/windows/logincapture-msm/logincapture-msm.vdproj b/LoginCapture/package/windows/logincapture-msm/logincapture-msm.vdproj
new file mode 100644
index 00000000..5d53e4f6
--- /dev/null
+++ b/LoginCapture/package/windows/logincapture-msm/logincapture-msm.vdproj
@@ -0,0 +1,284 @@
+"DeployProject"
+{
+"VSVersion" = "3:701"
+"ProjectType" = "8:{DD7A5B58-C2F9-40FF-B2EF-0773356FB978}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:logincapture-msm"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+ "Hierarchy"
+ {
+ "Entry"
+ {
+ "MsmKey" = "8:_1D888F783949406D8AF759805E213BD5"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5024BA67E4D44B2582887A3EE4467610"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ }
+ "Configurations"
+ {
+ "Debug"
+ {
+ "DisplayName" = "8:Debug"
+ "IsDebugOnly" = "11:TRUE"
+ "IsReleaseOnly" = "11:FALSE"
+ "OutputFilename" = "8:Debug\\logincapture.msm"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:1"
+ }
+ "Release"
+ {
+ "DisplayName" = "8:Release"
+ "IsDebugOnly" = "11:FALSE"
+ "IsReleaseOnly" = "11:TRUE"
+ "OutputFilename" = "8:Release\\logincapture.msm"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:1"
+ }
+ }
+ "Deployable"
+ {
+ "CustomAction"
+ {
+ "{0C9D821E-95BB-411F-BE03-2864360EBF94}:_6D6BB2ACDEFC4CA79BDA5440243CBE5D"
+ {
+ "Name" = "8:regsvr32.exe"
+ "Condition" = "8:"
+ "Object" = "8:_1D888F783949406D8AF759805E213BD5"
+ "FileType" = "3:2"
+ "InstallAction" = "3:4"
+ "Arguments" = "8:/u /i /s \"\\Program Files\\Novell\\CASA\\bin\\lcredmgr.dll\""
+ "EntryPoint" = "8:"
+ "Sequence" = "3:1"
+ "Identifier" = "8:_C86BF882_0E19_4471_9251_48E5B7A43128"
+ "InstallerClass" = "11:FALSE"
+ "CustomActionData" = "8:"
+ }
+ "{0C9D821E-95BB-411F-BE03-2864360EBF94}:_71B82B5A576741B7A39384FBDC5965D1"
+ {
+ "Name" = "8:regsvr32.exe"
+ "Condition" = "8:"
+ "Object" = "8:_1D888F783949406D8AF759805E213BD5"
+ "FileType" = "3:2"
+ "InstallAction" = "3:1"
+ "Arguments" = "8:/i /n /s \"\\Program Files\\Novell\\CASA\\bin\\lcredmgr.dll\""
+ "EntryPoint" = "8:"
+ "Sequence" = "3:1"
+ "Identifier" = "8:_C5112ACD_2314_4F87_9D57_4D7313F31D53"
+ "InstallerClass" = "11:FALSE"
+ "CustomActionData" = "8:"
+ }
+ }
+ "DefaultFeature"
+ {
+ "Name" = "8:DefaultFeature"
+ "Title" = "8:"
+ "Description" = "8:"
+ }
+ "File"
+ {
+ "{A582A373-4685-4296-BEFE-614B80A702C3}:_1D888F783949406D8AF759805E213BD5"
+ {
+ "SourcePath" = "8:C:\\WINDOWS\\system32\\regsvr32.exe"
+ "TargetName" = "8:regsvr32.exe"
+ "Tag" = "8:"
+ "Folder" = "8:_297B05AEB9BB4998B00A77B38D50F3C2"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ }
+ "FileType"
+ {
+ }
+ "Folder"
+ {
+ "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_297B05AEB9BB4998B00A77B38D50F3C2"
+ {
+ "Name" = "8:#1914"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:SystemFolder"
+ "Folders"
+ {
+ }
+ }
+ "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_4DAE214C2D21459D8E099142A2C41003"
+ {
+ "Name" = "8:#1910"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:CommonFilesFolder"
+ "Folders"
+ {
+ }
+ }
+ "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_74BD0329C7A64FCBBA7AA1C9017F7231"
+ {
+ "Name" = "8:#1912"
+ "AlwaysCreate" = "11:TRUE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:ProgramFilesFolder"
+ "Folders"
+ {
+ "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_2301CB3437EB4A4D9C07E46824B02F95"
+ {
+ "Name" = "8:Novell"
+ "AlwaysCreate" = "11:TRUE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_74D74862EF3A4184916B7C9EEB362F45"
+ "Folders"
+ {
+ "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_3950800C84A1418EBD9FAB49DED77EE7"
+ {
+ "Name" = "8:CASA"
+ "AlwaysCreate" = "11:TRUE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_5EC83C58CC264998AA2BA9E70CEBE8D2"
+ "Folders"
+ {
+ "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_811C752B8ADB46E7BD2C7DA2E4455D6D"
+ {
+ "Name" = "8:bin"
+ "AlwaysCreate" = "11:TRUE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_BC04516D72544695891BA4E7AE0E46ED"
+ "Folders"
+ {
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ "Sequences"
+ {
+ }
+ "MergeModule"
+ {
+ }
+ "Module"
+ {
+ "ModuleSignature" = "8:MergeModule.76F71560363541FD86D3AE2129C38D1A"
+ "Version" = "8:1.0.0.0"
+ "Title" = "8:logincapture-msm"
+ "Subject" = "8:"
+ "Author" = "8:Novell"
+ "Keywords" = "8:"
+ "Comments" = "8:"
+ "SearchPath" = "8:"
+ "UseSystemSearchPath" = "11:TRUE"
+ }
+ "ProjectOutput"
+ {
+ "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_5024BA67E4D44B2582887A3EE4467610"
+ {
+ "SourcePath" = "8:..\\..\\..\\windows\\bin\\Debug\\lcredmgr.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_811C752B8ADB46E7BD2C7DA2E4455D6D"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:4"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{55E85618-3643-4213-A15F-08DA1F02D9BB}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ }
+ "Registry"
+ {
+ "HKLM"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKCU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKCR"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKPU"
+ {
+ "Keys"
+ {
+ }
+ }
+ }
+ "Shortcut"
+ {
+ }
+ }
+}
diff --git a/LoginCapture/windows/Makefile.am b/LoginCapture/windows/Makefile.am
new file mode 100644
index 00000000..34eabbbd
--- /dev/null
+++ b/LoginCapture/windows/Makefile.am
@@ -0,0 +1,75 @@
+#######################################################################
+#
+# Copyright (C) 2004 Novell, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author: Juan Carlos Luciani
+#
+#######################################################################
+
+# handle Mono secondary dependencies
+export MONO_PATH := $(MONO_PATH)
+
+lcredmgr_CSFILES = $(srcdir)/lextend.cpp $(srcdir)/lcredmgr.cpp
+lcredmgr_CSFILES_CSC := $(subst /,$(SEP),$(lcredmgr_CSFILES))
+lcredmgr_INCLUDES =
+lcredmgr_RESOURCES =
+lcredmgr_FLAGS = $(CSC_LIBFLAG)
+lcredmgr_LIBS =
+lcredmgr_LIBPATH =
+
+EXTRA_DIST = $(lcredmgr_CSFILES)
+
+CUR_DIR := $(shell pwd)
+
+all: lcredmgr.dll
+
+devenv:
+ @if ! test -x "$(VSINSTALLDIR)/devenv.exe"; then echo "Error: Microsoft Visual Studio .NET is currently required to build MSI and MSM packages"; exit 1; fi
+
+lcredmgr.dll: $(lcredmgr_CSFILES) $(lcredmgr_RESOURCES) devenv
+ @rm -f $(MSM_LOG_FILE) $@
+ @CMD='"$(VSINSTALLDIR)/devenv.exe" ../LoginCapture.sln /build $(DEVENV_CONFIGURATION) /project lcredmgr /out build.log'; \
+ echo $$CMD; \
+ if eval $$CMD; then \
+ ls -l bin/$(DEVENV_CONFIGURATION)/lcredmgr.dll; \
+ else \
+ grep -a "ERROR:" build.log; \
+ fi
+
+install-exec-local: Novell.Security.lcredmgr.dll
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) bin/$(DEVENV_CONFIGURATION)/lcredmgr.dll $(DESTDIR)$(libdir)/
+
+uninstall-local:
+ cd $(DESTDIR)$(libdir); rm -f lcredmgr.dll
+ rmdir $(DESTDIR)$(libdir)
+
+#installcheck-local: install
+# $(mkinstalldirs) $(DESTDIR)$(libdir)
+# $(INSTALL_PROGRAM) $(DESTDIR)$(libdir)
+# cd $(DESTDIR)$(libdir); $(MONO)
+
+CLEAN_FILES = bin/$(DEVENV_CONFIGURATION)/lcredmgr.dll ../Common/$(DEVENV_CONFIGURATION)/lcredmgr.dll
+
+clean-local:
+ rm -rf *.dbg *.exe *.dll $(CLEAN_FILES) $(COMMON_CLEAN_FILES)
+
+distclean-local:
+
+maintainer-clean-local:
+ rm -f Makefile.in
+
diff --git a/LoginCapture/windows/external/provider/include/nwlgext.h b/LoginCapture/windows/external/provider/include/nwlgext.h
new file mode 100644
index 00000000..c2a25d1d
--- /dev/null
+++ b/LoginCapture/windows/external/provider/include/nwlgext.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+ Source module name: nwlgext.h
+ Release Version: 1.00
+
+ $Workfile: nwlgext.h $
+ $Revision: 1.1 $
+ $Modtime:: $
+ $Copyright:
+
+ Copyright (c) 1989-1999 Novell, Inc. All Rights Reserved.
+ U.S. Patent Number 5,781,724 -- Novell, Inc.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+****************************************************************************/
+#ifndef NWLOGIN_H
+# include
+#endif
+
+#ifndef NWLGEXT_H
+#define NWLGEXT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct tagNWLGLoginExtInfo
+{
+ nint loginExtIDLen; // ID buffer length (max allowed by api is 32)
+ pnstr loginExtID; // ID is the unique name for subkey in registry
+ nint loginExtDLLNameLen; // DLL file name length
+ pnstr loginExtDLLName; // DLL file name (may include path)
+ nint loginExtDescLen; // Descriptive text buffer length
+ pnstr loginExtDesc; // Any descriptive text
+ DWORD loginExtType; // Login extension in type, UI, Authentication, Script only,...
+} NWLGLoginExtInfo;
+
+typedef NWLGLoginExtInfo N_FAR * pNWLGLoginExtInfo;
+
+/* some arbitrary limits set by API */
+#define LOGIN_EXT_MAX_ID_BYTES 32
+#define LOGIN_EXT_MAX_DLL_NAME MAX_PATH
+#define LOGIN_EXT_MAX_DESC 64
+
+/* definitions valid for loginExtType */
+#define LOGIN_EXT_UI 0x0001
+#define LOGIN_EXT_AUTHENTICATE 0x0002
+#define LOGIN_EXT_SCRIPT 0x0004
+#define LOGIN_EXT_ALL 0x00FF
+
+#define LOGIN_EXT_MANDATORY 0x0100
+#define LOGIN_EXT_OPTIONAL 0x0200
+
+#define LOGIN_EXT_SECONDARY 0x4000
+#define LOGIN_EXT_MASTER 0x8000
+
+ /* Login extension init (registration) entry point */
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLoginExtInit
+ (
+ pNWLGAccessRec * pAccess,
+ pNWVersion pCompiledVersion,
+ pNWVersion pRuntimeVersion,
+ nptr reserved1,
+ nptr reserved2
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGLoginExtRegOpen
+ (
+ HKEY *hKey
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGLoginExtRegGet
+ (
+ DWORD *iSubKey, // -1 = find from structure, 0 = read first, increment for next
+ pNWLGLoginExtInfo loginExtInfo
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGLoginExtRegWrite
+ (
+ pNWLGLoginExtInfo
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGLoginExtRegDelete
+ (
+ pNWLGLoginExtInfo loginExtInfo
+ );
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/LoginCapture/windows/external/provider/include/nwlogin.h b/LoginCapture/windows/external/provider/include/nwlogin.h
new file mode 100644
index 00000000..e6179bdd
--- /dev/null
+++ b/LoginCapture/windows/external/provider/include/nwlogin.h
@@ -0,0 +1,907 @@
+/****************************************************************************
+ Source module name: nwlogin.h
+ Release Version: 1.00
+
+ Copyright (c) 1989-1999 Novell, Inc. All Rights Reserved.
+ U.S. Patent Number 5,781,724 -- Novell, Inc.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+****************************************************************************/
+/****************************************************************************
+2-6-98 KPW remove PRE_NETWARE_LOGIN event - never used and don't plan to
+2-18-98 KPW added NWLG_RESTART_PRIMARY_LOGIN restartMode
+****************************************************************************/
+#ifndef NWLOGIN_H
+#define NWLOGIN_H
+
+#ifndef NTYPES_H
+ #include
+#endif
+
+// MSVC 4.x MSVC 1.52 4.x BC4.x BC5.x
+#if !defined (_WINDOWS_) && !defined(_INC_WINDOWS) && !defined(__WINDOWS_H)
+ // take care of a compile error for modules that do not need windows.h
+ // but do include nwlogin.h
+ #if defined (N_PLAT_MSW4) || defined (N_PLAT_WNT)
+ typedef nptr HWND;
+ #else
+ typedef nuint HWND;
+ #endif
+#endif
+
+#ifndef NWCALDEF_H
+ #include
+#endif
+
+#ifndef __NWDSDEFS_H
+ #include
+#endif
+
+#if defined (N_ARCH_32)
+ #if ! defined ( NWAPIDEF_H )
+ #include
+ #endif
+#endif
+
+#ifndef _NWDSDC_HEADER_
+ #include
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ Event constants
+ Command Line parsing events
+*/
+
+#define NWLG_INITIALIZE 0
+#define NWLG_CMD_LINE_SERVICE 1
+#define NWLG_CMD_LINE_USER 2
+#define NWLG_CMD_LINE_NS 3
+#define NWLG_PRESCRIPT_CLS 4
+#define NWLG_CMD_LINE_SCRIPT_FILE 5
+#define NWLG_CMD_LINE_PROFILE 51
+#define NWLG_CMD_LINE_FLAGS 52
+#define NWLG_CMD_LINE_ARGS 53
+#define NWLG_CMD_LINE_BIND_LOGIN 6
+#define NWLG_CMD_LINE_TREE 7
+#define NWLG_RESOLVE_USER_NAME 8
+#define NWLG_NO_BANNER 9
+#define NWLG_CMD_LINE_ARG_DONE 10
+#define NWLG_CMD_LINE_HELP 11
+
+/*
+ Script related events
+*/
+#define NWLG_PRE_SCRIPTS 12
+#define NWLG_OPEN_SCRIPT 13
+#define NWLG_GET_SCRIPT_LINE 14
+#define NWLG_SCRIPT_BREAK 15
+#define NWLG_REWIND_SCRIPT 16
+#define NWLG_BIND_ATTACH 17
+#define NWLG_TERMINATE 18
+#define NWLG_CLEAR_SCREEN 19
+#define NWLG_DOS_COMSPEC 20
+#define NWLG_DS_CONTEXT 21
+#define NWLG_DISP_FILE 22
+#define NWLG_DOS_BREAK 23
+#define NWLG_DOS_VERIFY 24
+#define NWLG_DRIVE 25
+#define NWLG_EXIT 26
+#define NWLG_EXEC 27
+#define NWLG_FIRE_PHASERS 28
+#define NWLG_DISP_LTIME 29
+#define NWLG_MACHINE 30
+#define NWLG_MEMBER_OF 31
+#define NWLG_NO_DEFAULT 32
+#define NWLG_TERM_CMD 33
+#define NWLG_PAUSE 34
+#define NWLG_DOS_PC_COMPAT 35
+#define NWLG_PROFILE 36
+#define NWLG_NOTHING 37
+#define NWLG_BIND_SCRIPT_SERVER 38
+#define NWLG_SET_ENV_VAR 39
+#define NWLG_SYNC_TIME_FLAG 40
+#define NWLG_DOS_SWAP_PATH 41
+#define NWLG_DISP_LINE 42
+#define NWLG_INCLUDE 43
+#define NWLG_TREE_ATTACH 44
+#define NWLG_SWAP_CMD 45
+#define NWLG_NO_SWAP_CMD 46
+#define NWLG_CHDIR 47
+#define NWLG_LOGOUT_ALL 48
+#define NWLG_LOGOUT_ONE 49
+#define NWLG_CONTINUE 50
+
+#define NWLG_RUN_SCRIPT 60
+#define NWLG_POST_SCRIPTS 61
+#define NWLG_DISP_BANNER 62
+#define NWLG_PWD_EXP_CHK 63
+#define NWLG_PWD_EXP_CHK_STAT 64
+#define NWLG_PWD_EXP_UPD 65
+
+/*
+ Connection Events
+*/
+#define NWLG_CONN_GET 90
+#define NWLG_CONN_AUTH 91
+#define NWLG_CONN_EXPIRED 92
+#define NWLG_SYNC_PWD_START 93
+#define NWLG_SYNC_PWD_END 94
+#define NWLG_SYNC_LIST_BLD 95
+#define NWLG_SYNC_LIST_UPD 96
+#define NWLG_SYNC_LIST_FREE 97
+
+#define NWLG_PRE_LOGIN 98
+
+/* Internal SYSTEM type message */
+#define NWLG_SYSTEM 100
+
+#define NWLG_NETWARE_LOGIN 101
+
+#define NWLG_ELSE 190
+#define NWLG_END 191
+#define NWLG_GOTO 192
+#define NWLG_IF 193
+#define NWLG_IFDO 194
+#define NWLG_LABEL 195
+#define NWLG_MAP 196
+#define NWLG_SHIFT 197
+
+/*
+ Map events
+*/
+/* Individual map events */
+#define NWLG_MAP_ADD 200
+#define NWLG_MAP_DEL 201
+#define NWLG_MAP_CHANGE 202
+#define NWLG_MAP_MOVE 203
+#define NWLG_MAP_DISP 204
+#define NWLG_MAP_MSG 205
+#define NWLG_MAP_ERR 206
+
+/* detail map events from parser
+ summary events below are passed to event handler
+*/
+#define NWLG_MAP_ADD_DRV 210
+#define NWLG_MAP_ADD_DRV_TO_SDRV 211
+#define NWLG_MAP_ADD_SRCH 212
+#define NWLG_MAP_ADD_SRCH_TO_SDRV 213
+#define NWLG_MAP_CHG_DRV_TO_SDRV 214
+#define NWLG_MAP_CHG_INS_DRV_TO_SDRV 215
+#define NWLG_MAP_CHG_SRCH 216
+#define NWLG_MAP_DEL_DRV 217
+#define NWLG_MAP_DEL_SRCH 218
+#define NWLG_MAP_DISP_ALL_DRVS 219
+#define NWLG_MAP_DISP_DRV 220
+#define NWLG_MAP_DISP_OFF 221
+#define NWLG_MAP_DISP_ON 222
+#define NWLG_MAP_DISP_SRCH 223
+#define NWLG_MAP_ERRORS_OFF 224
+#define NWLG_MAP_ERRORS_ON 225
+#define NWLG_MAP_INS_SRCH 226
+#define NWLG_MAP_INS_SRCH_TO_SDRV 227
+#define NWLG_MAP_NEXT_DRV 228
+
+/*
+ event types for extended script commands and to introduce some new hooks
+ used by Mobile
+*/
+#define NWLG_DISP_WIBBLE 300
+#define NWLG_CAPTURE_PRINTER 301
+#define NWLG_DCACHE_ADD 302
+#define NWLG_DCACHE_FIND 303
+
+#define NWLG_DO_GOTO 305
+
+#define NWLG_AVAILABLE_DRIVE 309
+#define NWLG_NOTIFY_PARENT_WINDOW 310
+#define NWLG_PARSE_SCRIPT_LINE 311
+#define NWLG_NOTIFY_LOGIN_NAMES 312
+#define NWLG_NOTIFY_PROGRESS 313
+#define NWLG_GET_LOCATION_NAME 314
+#define NWLG_GET_FIRST_NETWORK_DRIVE 315
+
+/*
+ Event types for communication between extensions and default UI.
+*/
+#define NWLG_UI_DATA_CHANGED 400
+ /* Event types for NWLG_UI_DATA_CHANGED */
+# define NWLG_UI_DC_USERNAME 0x0101
+# define NWLG_UI_DC_TREE_LOGIN 0x0201
+# define NWLG_UI_DC_TREE 0x0202
+# define NWLG_UI_DC_SERVER 0x0203
+# define NWLG_UI_DC_BINDERY_CONN 0x0204
+# define NWLG_UI_DC_CONTEXT 0x0205
+# define NWLG_UI_DC_CLEAR_CONNS 0x0206
+# define NWLG_UI_DC_RUN_SCRIPTS 0x0301
+# define NWLG_UI_DC_DISPLAY_RESULTS 0x0302
+# define NWLG_UI_DC_AUTO_CLOSE 0x0303
+# define NWLG_UI_DC_LOGIN_SCRIPT 0x0304
+# define NWLG_UI_DC_PROFILE_SCRIPT 0x0305
+# define NWLG_UI_DC_VAR 0x0400
+# define NWLG_UI_DC_MOBILE_PROFILE 0x4101
+# define NWLG_UI_DC_CONNECT_OFFLINE 0x4102
+# define NWLG_UI_DC_DEBUG_MODE 0x4301
+# define NWLG_UI_DC_VERBOSE_MODE 0x4302
+
+#define NWLG_UNKNOWN 999
+/*
+ END OF Event constants
+*/
+
+/*
+ NWLogin Shared Data identifier tags
+*/
+#define NWLG_SD_SERVER 1
+#define NWLG_SD_USER 2
+#define NWLG_SD_NS 3
+#define NWLG_SD_CLS 4
+#define NWLG_SD_SCRIPT_FILE 5
+#define NWLG_SD_BIND_LOGIN 6
+#define NWLG_SD_TREE_NAME 7
+#define NWLG_SD_SWAP_FLAG 8
+#define NWLG_SD_SWAP_PATH 9
+#define NWLG_SD_NB 10
+
+#define NWLG_SD_ACCESS_SERVER 11
+#define NWLG_SD_AM_PM 12
+#define NWLG_SD_DAY 13
+#define NWLG_SD_DAY_OF_WEEK 14
+#define NWLG_SD_ENVAR 15
+#define NWLG_SD_FILE_SERVER 16
+#define NWLG_SD_FULL_NAME 17
+#define NWLG_SD_GREETING_TIME 18
+#define NWLG_SD_HOUR 19
+#define NWLG_SD_HOUR24 20
+#define NWLG_SD_LAST_NAME 21
+#define NWLG_SD_LOGIN_NAME 22
+#define NWLG_SD_LOGIN_CONTEXT 23
+#define NWLG_SD_MACHINE 24
+#define NWLG_SD_MINUTE 25
+#define NWLG_SD_MONTH 26
+#define NWLG_SD_MONTH_NAME 27
+#define NWLG_SD_NDAY_OF_YEAR 28
+#define NWLG_SD_NET_ADDRESS 29
+#define NWLG_SD_MAIL_STATUS 30
+#define NWLG_SD_PASSWORD_EXPIRES 31
+#define NWLG_SD_OS_VERSION 32
+#define NWLG_SD_OS_NAME 33
+#define NWLG_SD_REQ_VERSION 34
+#define NWLG_SD_REQ_CONTEXT 35
+#define NWLG_SD_SECOND 36
+#define NWLG_SD_SHORT_YEAR 37
+#define NWLG_SD_SHELL_VERSION 38
+#define NWLG_SD_SHORT_MACHINE 39
+#define NWLG_SD_STATION 40
+#define NWLG_SD_USER_OBJ 41
+#define NWLG_SD_YEAR 42
+#define NWLG_SD_CL_USER 43
+#define NWLG_SD_CL_SERVER 44
+#define NWLG_SD_PROFILE 45
+#define NWLG_SD_PASSWORD 46
+#define NWLG_SD_LOADPATH 47
+#define NWLG_SD_CMD_LINE_FLAGS 48
+#define NWLG_SD_CMD_LINE_ARG 49
+#define NWLG_SD_CONTEXT_HND 50
+#define NWLG_SD_PC_COMPATIBLE 51
+#define NWLG_SD_PRI_CONN_HANDLE 52
+#define NWLG_SD_APP_INSTANCE_HND 53
+#define NWLG_SD_ERROR_LEVEL 54
+#define NWLG_SD_START_INFO 55
+#define NWLG_SD_MULTI_TREE 56
+
+/* Extensions to the Shared Data identifier tags for Mobile */
+#define NWLG_SD_DISPLAY_ERRORS 100
+#define NWLG_SD_DISPLAY_MAPPINGS 101
+#define NWLG_SD_PARSED_NAME 102
+#define NWLG_SD_PARSED_STRING 103
+#define NWLG_SD_PARSED_CMD_TYPE 104
+#define NWLG_SD_CL_SERVER_VERSION 105
+#define NWLG_SD_CL_SERVER_TYPE 106
+#define NWLG_SD_CL_TREE 107
+
+/*
+ END OF NWLogin Shared Data identifier tags
+*/
+
+/*
+ Error codes
+*/
+
+#define NWLG_ERR_VERSION 0xff
+
+/*
+ Return codes for handlers
+*/
+#define NWLG_OK 0
+#define NWLG_RETRY 1
+#define NWLG_ABORT 2
+#define NWLG_FAIL 3
+#define NWLG_IGNORE 4
+#define NWLG_STOP_CYCLE 5
+#define NWLG_CANCEL 6
+#define NWLG_SHUT_DOWN 7
+#define NWLG_SHUT_DOWN_RESTART 8
+
+/*
+ END OF Return codes for handlers
+*/
+
+#define NWLG_ON N_TRUE
+#define NWLG_OFF N_FALSE
+
+/*
+ Command Line Flag masks (NWLG_SD_CMD_LINE_FLAGS)
+*/
+
+#define NWLG_CL_FLAG_CLS 0x00000001 /* Clear screen before login */
+#define NWLG_CL_FLAG_NS 0x00000002 /* Attach to a server and do not run script */
+#define NWLG_CL_FLAG_ATTACH 0x00000002
+#define NWLG_CL_FLAG_BIND 0x00000004 /* Force bindery mode login */
+#define NWLG_CL_FLAG_TREE 0x00000008 /* name specified on cmd line is a tree name */
+
+#define NWLG_CL_FLAG_NB 0x00000010 /* Do not show login banner */
+#define NWLG_CL_FLAG_SWAP 0x00000020 /* (DOS) Swap to mem or disk for external cmds */
+#define NWLG_CL_FLAG_NOSWAP 0x00000040 /* (DOS) Do not swap to mem or disk for external cmds */
+#define NWLG_CL_FLAG_SCRIPT 0x00000080 /* Script file name specified on command line */
+
+#define NWLG_CL_FLAG_RDF 0x00000100 /* (WIN) Restore permanent connections when done */
+#define NWLG_CL_FLAG_EXTFORK 0x00000200 /* external command is another process */
+#define NWLG_CL_FLAG_NO_DISPLAY 0x00000400 /* Do not display script results */
+#define NWLG_CL_FLAG_NA 0x00000800 /* /NA only, do not login just run scripts
+ /NA and /AT(/NS) login and do not run scripts */
+
+#define NWLG_CL_FLAG_NO_CLOSE 0x00001000 /* /NC Do not close script results */
+#define NWLG_CL_FLAG_ADVANCED 0x00002000 /* /A Advanced level login UI */
+#define NWLG_CL_FLAG_CONTINUE 0x00004000 /* /CONT accept command line and pass to API without stopping for initial UI */
+#define NWLG_CL_FLAG_SIMPLE 0x00008000 /* /SI Simple UI */
+
+#define NWLG_CL_FLAG_MAP_ROOT_OFF 0x00010000 /* do not force map root on NT or other platform that can handle relative mapping */
+#define NWLG_CL_FLAG_START_UI 0x00020000 /* Internal flag to that start_UI in progress */
+#define NWLG_CL_FLAG_RUN_SCRIPT 0x20000000 /* Internal flag to run scripts */
+#define NWLG_CL_FLAG_CLEAR_CONN 0x40000000 /* Internal flag to clear connection (logout) before login */
+#define NWLG_CL_FLAG_DEBUG 0x80000000 /* API in debug mode */
+
+/* Map flags */
+#define NWLG_MAP_FLAG_INSERT 0x00000001
+#define NWLG_MAP_FLAG_ROOT 0x00000002
+#define NWLG_MAP_FLAG_PHYSICAL 0x00000004
+
+/*
+ Get Service connection type flags
+*/
+#define NWLG_CONN_GET_DEFAULT 0
+#define NWLG_CONN_GET_SERVER 1
+#define NWLG_CONN_GET_TREE 2
+
+/*
+ Known Service types
+*/
+#define NWLG_TYPE_DS 0
+#define NWLG_TYPE_BINDERY 1
+#define NWLG_TYPE_HOST_OS 9
+
+/*
+ Message type and login process definitions.
+ Allows room for future expansion and definitions
+ Defines are used mainly for defining what type of messages are
+ sent to IO routines.
+ The first defines show what part of the login process we are in.
+ The NWLG_MSGTYP_... are || with _PROC_ to indicate specific message type within
+ process. Currently, the only one that is looked at is _MSGTYP_ERROR in
+ IO event NWLG_IO_DATA_BLOCK
+*/
+#define NWLG_PROC 0x00ff
+#define NWLG_PROC_INIT 0x0000
+#define NWLG_PROC_LOGIN 0x0010
+#define NWLG_PROC_SCRIPT 0x0020
+#define NWLG_PROC_TERM 0x0040
+
+#define NWLG_MSGTYP 0xff00
+#define NWLG_MSGTYP_INFO 0x0100
+#define NWLG_MSGTYP_ERROR 0x0200
+#define NWLG_MSGTYP_SCRIPT 0x0400
+
+/************************ Handler definitions ********************/
+
+/*
+ I/O handler events
+*/
+#define NWLG_IO_MSG_PAUSE 0
+#define NWLG_IO_IDENTITY 1
+#define NWLG_IO_YES_NO 2
+#define NWLG_IO_EXP_PWD 22
+#define NWLG_IO_DATA_BLOCK 3
+#define NWLG_IO_BANNER 4
+#define NWLG_IO_FILE 5
+#define NWLG_IO_ERROR 6
+#define NWLG_IO_CLS 7
+#define NWLG_IO_SOUNDS 8
+#define NWLG_IO_CHANGE_PWD 9
+#define NWLG_IO_PWD_CHG 1
+#define NWLG_IO_PWD_SYNC 0
+#define NWLG_IO_CONFIRM_REATTACH 10
+#define NWLG_IO_DOS_SWAP_PATH 11
+#define NWLG_IO_START_UI 12
+#define NWLG_IO_FINISH_UI 13
+#define NWLG_IO_START_LOG 14
+#define NWLG_IO_FINISH_LOG 15
+#define NWLG_IO_WAIT 16
+#define NWLG_IO_WAIT_ON 1
+#define NWLG_IO_WAIT_OFF 0
+
+
+#define NWLG_IO_BRING_TO_FRONT 99
+
+/* IO routine optional extensions */
+#define NWLG_IO_GET_DATA_LINE 900
+#define NWLG_IO_GET_DATA_BUF 901
+
+#if defined (N_PLAT_MSW)
+/*
+ Special values for the progress to NWMLGUIUpdate().
+ A positive integer indicates the line count of a disconnected script
+*/
+#define NWLG_UIU_LOGIN_BEGIN (-1) // Connected/Disconnected: output dialog opens
+#define NWLG_UIU_LOGIN_PROPER_UPDATE (-2) // Connected: regular update from login proper (called many times)
+#define NWLG_UIU_SCRIPTS_BEGIN (-3) // Connected/Disconnected: signal that login proper is complete and scripts are about to run
+#define NWLG_UIU_END_OF_SCRIPT (-4) // Connected: signal that a script has closed
+#define NWLG_UIU_ALL_PROCESSING_COMPLETE (-5) // Connected/Disconnected: all login and script processing done
+#define NWLG_UIU_DISC_SCRIPT_LINE (-6) // Disconnected: signal that a new line is about to execute
+#define NWLG_UIU_ABORTED_INCOMPLETE (-7) // Connected/Disconnected: user aborted from debug dialog with script exec incomplete
+#endif
+
+/*
+ Event manager return codes
+*/
+
+#define NWLG_EVT_OK NWLG_OK
+#define NWLG_EVT_RETRY NWLG_RETRY
+#define NWLG_EVT_ABORT NWLG_ABORT
+#define NWLG_EVT_FAIL NWLG_FAIL
+#define NWLG_EVT_IGNORE NWLG_IGNORE
+#define NWLG_EVT_STOP_CYCLE NWLG_STOP_CYCLE
+/*
+ Event delivery types
+*/
+
+#define NWLG_EVT_SYSTEM 0
+#define NWLG_EVT_PRIVATE 1
+#define NWLG_EVT_BROADCAST 2
+#define NWLG_EVT_UNTIL_OK 3
+#define NWLG_EVT_UNTIL_FAIL 4
+
+/*
+ -> NT ONLY
+ Defines for restartMode in startinfo structure.
+ Normal processing is NONE. Initial login on Wnt require that we authenticate
+ then roll out to login to the workstation. Login is then restarted after
+ the authenticate.
+ GINA flag indicates that GINA does initial login (password expiration handled
+ differently)
+*/
+#define NWLG_RESTART_NONE 0x0000
+ /* only set during initial pass of NT login */
+#define NWLG_RESTART_AUTH_ONLY 0x0001
+#define NWLG_RESTART_SCRIPT 0x0002
+ /* only set if netware authentication is performed in another module */
+#define NWLG_RESTART_ALT_AUTH 0x0004
+#define NWLG_RESTART_CITRIX_AUTH 0x0080
+#define NWLG_RESTART_NETWARE_LOGIN 0x0100
+#define NWLG_RESTART_PRIMARY_LOGIN 0x4000
+#define NWLG_RESTART_GINA_AUTH 0x8000
+
+/*
+ Flag set/clear/test macros
+*/
+
+#define NWLGSetFlag( flag, var ) ((var) = (flag) | (var))
+#define NWLGSetFlagP( flag, pvar ) ((*pvar) = (flag) | (*pvar))
+
+#define NWLGClearFlag( flag, var ) ((var) = (~(flag)) & (var))
+#define NWLGClearFlagP( flag, pvar ) ((*pvar) = (~(flag)) & (*pvar))
+
+#define NWLGTestFlag( flag, var ) (((var) & (flag)) ? N_TRUE : N_FALSE)
+#define NWLGTestFlagP( flag, pvar ) (((*pvar) & (flag)) ? N_TRUE : N_FALSE)
+
+/***
+ Version information
+***/
+#define NWLG_MAJOR_VER 1
+#define NWLG_MINOR_VER 0
+#define NWLG_REV_VER 7
+
+#define NWLGSetVersionP( pVersion ) pVersion->major = NWLG_MAJOR_VER;\
+ pVersion->minor=NWLG_MINOR_VER;pVersion->revision = NWLG_REV_VER;
+#define NWLGSetVersion( version ) version.major = NWLG_MAJOR_VER;\
+ version.minor=NWLG_MINOR_VER;version.revision = NWLG_REV_VER;
+
+#define NWLGVersionLong( version ) (unsigned long) (version.major * 1000000L \
+ + version.minor * 1000 \
+ + version.revision)
+#define NWLGVersionLongP( pVersion ) (unsigned long) (pVersion->major * 1000000L \
+ + pVersion->minor * 1000 \
+ + pVersion->revision)
+#define NWLGVersionLongV( major, minor, revision ) (unsigned long) (major * 1000000L \
+ + minor * 1000 + revision)
+#define NWLG_CURRENT_VERSION NWLGUIVersionLongV( NWLG_MAJOR_VER, NWLG_MINOR_VER, NWLG_REV_VER )
+
+typedef struct tagNWLGAccessRec N_FAR * pNWLGAccessRec;
+
+N_TYPEDEF_CALLBACK( NWCCODE, pEVTSend )
+(
+ nint deliveryType,
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+);
+
+N_TYPEDEF_CALLBACK( NWCCODE, pEvtHndlr )
+(
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam param1,
+ nparam param2,
+ nflag32 flag
+);
+
+N_TYPEDEF_CALLBACK( NWCCODE, pIOHndlr )
+(
+ pNWLGAccessRec pAccess,
+ nint ioEvent,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+);
+
+
+#if defined(__BORLANDC__) // Don't pack the structs.
+# pragma option -a
+#elif defined(N_ARCH_16)
+# pragma pack(2)
+#else
+# pragma pack(4)
+#endif
+
+typedef struct tagNWLGAccessRec
+{
+ nid id; /* event handlers' unique id assigned by NWLogin */
+ NWCCODE status; /* NWLG_OK, ... */
+ NWRCODE errCode; /* Additional error code information */
+ pEvtHndlr pEventHandler; /* callback to extension Event Handler */
+ pEvtHndlr pExceptionHandler; /* callback to extension Exception Handler */
+ pIOHndlr pIOHandler; /* callback to extension IO Event Handler */
+ nptr pUserData; /* optional extension defined data pointer */
+} NWLGAccessRec;
+
+typedef struct tagNWVersion
+{
+ nuint16 major;
+ nuint8 minor;
+ nuint8 revision;
+} NWVersion;
+
+typedef NWVersion N_FAR * pNWVersion;
+
+
+/***************************************************************************/
+/* Start up information structures */
+/***************************************************************************/
+
+/* Elemnts for a generic linked list where id contains the type of data */
+typedef struct tagNWLGStartInfoData
+{
+ nuint32 id;
+ struct tagNWLGStartInfoData *next;
+ nptr data;
+} NWLGStartInfoData;
+
+typedef NWLGStartInfoData N_FAR * pNWLGStartInfoData;
+
+/* Elements for a linked list of strings. */
+typedef struct tagNWLGStringElement
+{
+ pnstr text;
+ struct tagNWLGStringElement *next;
+} NWLGStringElement;
+
+typedef NWLGStringElement N_FAR * pNWLGStringElement;
+
+/* linked list of command line args */
+typedef struct tagNWLGStartInfoCmdArgs
+{
+ pnstr arg;
+ struct tagNWLGStartInfoCmdArgs *next;
+ nint argLen;
+} NWLGStartInfoCmdArgs;
+
+typedef NWLGStartInfoCmdArgs N_FAR * pNWLGStartInfoCmdArgs;
+#define NWLG_CMDLINE_ARG_LEN 65
+
+#define NWLG_STARTINFO_NONE 0
+#define NWLG_STARTINFO_USE 1
+#define NWLG_STARTINFO_CMDLINE 2
+
+typedef struct tagNWLGStartInfo
+{
+ NWVersion APIVersion;
+ pNWLGStartInfoData dataList;// linked list pointer or NULL
+ pEVTSend pNWLGEVTSend;
+ nint useStartInfo; // TRUE= info in structure, FALSE= info in cmdline
+ nint serverLen;
+ pnstr server; // server to log into
+ nint treeLen;
+ pnstr tree; // tree name if logging into tree instead of specific server
+ nint userLen;
+ pnstr user; // real login user name (normally no context)
+ nint scriptUserLen;
+ pnstr scriptUser; // user name to use when executing scripts
+ nint passwordLen;
+ pnstr password;
+ nint profileLen;
+ pnstr profile; // profile file/object name
+ nint scriptFileLen;
+ pnstr scriptFile; // override script file/object name
+ nint contextLen;
+ pnstr context; // full text context without leading '.'
+ nint bannerInfoLen;
+ pnstr bannerInfo; // name of banner file (NI)
+ nint swapPathLen;
+ pnstr swapPath; // DOS only
+ pNWLGStartInfoCmdArgs cmdLine;// linked list of command line args (%2 %3 %4...%MAX_SCRIPT_ARGS+2)
+ nbool noBanner;
+ nbool bindery; // force bindery conns
+ nbool clearConns; // combination of /NS
+ nbool clearScreen; // cmd line versions
+ nbool singleTree; // TRUE = do not allow multi-tree login
+ nbool restorePerm; // W31 restore permanent connections
+ nbool runScripts; // and /NA
+ nint noSwap; // DOS - swap flag
+ nint internalFlags; // 9-21-98 KPW Reserved
+ nptr pData; /** Start Version 1.0.1 **/
+ nint restartMode; /* NT - 0=Full Login, 1=Authenticate only, 2=Restart at Script NWLG_RESTART_... */
+ nbool disableLoginExt; /* TRUE do not allow extensions */
+ HWND hwndParent; /* HWND to treat as this DLL's main window */
+ nuint32 NWMLGFlags; /* Mobile flags */
+ nuint32 callingModule; //
+ pnstr providerName; // Shell Login Extension DLL name (NOVELLNP, EDCMOBILE...)
+ pEvtHndlr providerCallBack; // used to call back W95 provider (not implemented)
+ pEvtHndlr pReserved1; // future FN pointers
+ pEvtHndlr pReserved2; // future FN pointers
+ pEvtHndlr pReserved3; // future FN pointers
+ // 04-02-98 Make available for all 32bit platforms - start
+ // #if defined (N_ARCH_32) IKM- Removed ifdef 08-23-99 as per Ransom's suggestion to make this available to ALL platforms
+ NWCONN_HANDLE expiredConnID;
+ nstr expiredPassword[MAX_DN_BYTES]; /* password that expired */
+ nstr expiredServiceName[NW_MAX_SERVER_NAME_BYTES]; /* server or tree name or workstation description (WindowsNT...) */
+ nint expiredServiceType; /* NDS or BINDERY */
+ nbool expiredDSbinderyServer; /* ds server attached bindery mode SPD 47924 */
+ nbool expiredPrimaryLogin; /* is this from the initial or primary login */
+ nbool expiredWkstaPassword;
+ nstr expiredWkstaNewPassword[MAX_DN_BYTES];
+ // #endif IKM- Removed ifdef 08-23-99 as per Ransom's suggestion to make this available to ALL platforms
+ // 04-02-98 Make available for all 32bit platforms - end
+} NWLGStartInfo;
+
+typedef NWLGStartInfo N_FAR * pNWLGStartInfo;
+
+/* IDs for items found in linked list 'dataList' */
+#define NWLGID_COMMAND_LINE 0x00000000L /* Command-line string */
+#define NWLGID_SI 0x00000001L /* NWLGStartInfo */
+#define NWLGID_SI_ORIG 0x00000002L /* Original NWLGStartInfo */
+#define NWLGID_UI 0x00000011L /* NWLGUIStartInfo */
+#define NWLGID_UI_ORIG 0x00000012L /* Original NWLGUIStartInfo */
+#define NWLGID_SSO 0x00000040L /* NWLGSSOInfo */
+
+/* End of StartInfo */
+/***************************************************************************/
+
+typedef struct tagNWLGMapRec
+{
+ nchar driveLetter; /* NULL char for next drive i.e. c = (char)0 */
+ nuint searchOrder; /* 0 for not a search drive */
+ pnstr path; /* call NWParsePath to get it parsed */
+} NWLGMapRec;
+
+
+typedef NWLGMapRec N_FAR * pNWLGMapRec;
+
+
+/************************ NWLOGIN structures ********************/
+
+typedef struct tagNWLGUserIDStruct
+{
+ NWDSContextHandle context;
+ pnstr server;
+ pnstr user;
+ pnstr password;
+ nbool changeServer; /* allow server/tree to change */
+ nbool DSLogin; /* NDS or bindery login */
+ NWCONN_HANDLE connID;
+ nptr data;
+ nflag32 flags;
+ pnstr tree;
+ pnstr szContext;
+ nbool treeLogin; /* tree or server login */
+} NWLGUserID;
+
+typedef NWLGUserID N_FAR * pNWLGUserID;
+
+typedef struct tagNWLGSrvcConnStruct
+{
+ pnstr server; /* connect(ed) to server name */
+ pnstr tree; /* connect(ed) to tree name */
+ nint serviceType; /* server, tree or default */
+ pnint connType;
+ NWCONN_HANDLE N_FAR *connID;
+} NWLGSrvcConn;
+
+typedef NWLGSrvcConn N_FAR * pNWLGSrvcConn;
+
+typedef struct tagNWLGScriptInfoStruct
+{
+ nint idx;
+ nint scriptNameLen;
+ pnstr scriptName;
+ nint len;
+ pnstr line;
+ nint scriptLineNum;
+ nbool crt;
+ struct CLoginScript* OloginScript; // ref to C++ CLoginScript instance
+} NWLGScriptInfo;
+
+typedef NWLGScriptInfo N_FAR * pNWLGScriptInfo;
+
+#if defined(__BORLANDC__) // Restore to compiler specified.
+# pragma option -a.
+#else
+# pragma pack()
+#endif
+
+
+/************************ NWLOGIN API's ********************/
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLoginInit
+ (
+ pNWLGAccessRec pAccess,
+ pNWVersion pCompiledVersion,
+ pNWVersion pRuntimeVersion
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLogin
+ (
+ pNWLGAccessRec pAccess,
+ pnstr cmdLine,
+ pnstr password,
+ pNWLGStartInfo infoStruct
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLoginTerm
+ (
+ pNWLGAccessRec pAccess,
+ nflag32 reserved
+ );
+
+ N_EXTERN_LIBRARY( void )
+ NWLoginVersion
+ (
+ pNWVersion pRuntimeVersion
+ );
+
+ N_EXTERN_LIBRARY( nbool )
+ NWLGBringLoginToFront
+ (
+ void
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGDefaultEvtHandler
+ (
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGDefaultExcptHandler
+ (
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGDefaultIOHandler
+ (
+ pNWLGAccessRec pAccess,
+ nint ioEvent,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGGetLoginData
+ (
+ nint identifier, /* NWLG_SD_... value*/
+ nint itemIndex, /* 0 or 0.. for multi valued */
+ nptr retvalue,
+ nint len
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGSetLoginData
+ (
+ nint identifier,
+ nint itemIndex,
+ nptr value
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGOpenScriptFD
+ (
+ nint fd,
+ nbool crt,
+ pnint ccode
+ );
+
+ N_EXTERN_LIBRARY( void )
+ NWLGSetCtrlBreak
+ (
+ void
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGEVTSend
+ (
+ nint deliveryType,
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ );
+
+ N_EXTERN_LIBRARY( NWCCODE )
+ NWLGIOEVTSend
+ (
+ pNWLGAccessRec pAccess,
+ nint ioEvent,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ );
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/npackoff.h b/LoginCapture/windows/external/xplatapi/include/npackoff.h
new file mode 100644
index 00000000..99b4685d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/npackoff.h
@@ -0,0 +1,37 @@
+/* this header sets packing back to default for different compilers */
+
+#if defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x500)
+# pragma pack(pop)
+# else
+# pragma option -a.
+# endif
+#elif defined (__WATCOMC__)
+# if (__WATCOMC__ >= 1050)
+# pragma pack(pop)
+# else
+# pragma pack()
+# endif
+#elif defined (__MWERKS__)
+# if (__MWERKS__ >= 0x2100)
+# pragma pack(pop)
+# else
+# pragma pack()
+# endif
+#elif defined(__ECC__) || defined(__ECPP__)
+# pragma pack(pop)
+#elif defined (_MSC_VER)
+# if (_MSC_VER >= 900)
+# pragma pack(pop)
+# else
+# pragma pack()
+# endif
+#else
+# pragma pack()
+#endif
+
+
+#ifdef N_PACK_1
+#undef N_PACK_1
+#endif
+
diff --git a/LoginCapture/windows/external/xplatapi/include/npackon.h b/LoginCapture/windows/external/xplatapi/include/npackon.h
new file mode 100644
index 00000000..a680ef79
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/npackon.h
@@ -0,0 +1,55 @@
+/* this header sets packing to 1 for different compilers */
+
+#if defined (_MSC_VER) && !defined(__BORLANDC__)
+# if (_MSC_VER > 600)
+# pragma warning(disable:4103)
+# endif
+#elif defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x500)
+# pragma warn -pck
+# endif
+#endif
+
+#if defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x500)
+# pragma pack(push)
+# endif
+#elif defined (__WATCOMC__)
+# if (__WATCOMC__ >= 1050)
+# pragma pack(push)
+# endif
+#elif defined (__MWERKS__)
+# if (__MWERKS__ >= 0x2100)
+# pragma pack(push)
+# endif
+#elif defined(__ECC__) || defined(__ECPP__)
+# pragma pack(push)
+#elif defined (_MSC_VER)
+# if (_MSC_VER >= 900)
+# pragma pack(push)
+# endif
+#endif
+
+#if defined(N_PLAT_DOS)\
+ || (defined(N_PLAT_MSW) && defined(N_ARCH_16) && !defined(N_PLAT_WNT))\
+ || defined(N_PLAT_NLM)\
+ || defined(N_PLAT_OS2)\
+ || defined(N_PLAT_UNIX)\
+ || defined(N_PACK_1)\
+ || defined(N_FORCE_INT_16)
+
+# if defined(__BORLANDC__)
+# if (__BORLANDC__ < 0x500)
+# pragma option -a-
+# else
+# pragma pack(1)
+# endif
+# else
+# pragma pack(1)
+# endif
+
+#else
+
+# pragma pack(4)
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/ntypes.h b/LoginCapture/windows/external/xplatapi/include/ntypes.h
new file mode 100644
index 00000000..879b9943
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/ntypes.h
@@ -0,0 +1,1454 @@
+/******************************************************************************
+ Source module name: ntypes.h
+ Release Version: 1.08
+
+ %name: ntypes.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:06:55 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+
+#if ! defined( NTYPES_H )
+#define NTYPES_H
+
+/*
+ For brief documentation, please refer to the associated ntypes.txt
+ with the same release version. For in-depth documentation, please
+ refer to the Portable API Definition Guide.
+*/
+
+
+/*
+ Section 1: Automatic definitions
+ Section 1a: Platforms
+*/
+
+#if !defined(N_INC_NO_AUTO)
+
+ #if defined NWOS2
+ #if !defined N_PLAT_OS2
+ #define N_PLAT_OS2
+ #endif
+ #if !defined N_ARCH_16
+ #define N_ARCH_16
+ #endif
+ #elif defined(NWWIN)
+ #if !defined N_PLAT_MSW
+ #define N_PLAT_MSW
+ #endif
+ #if !defined N_ARCH_16
+ #define N_ARCH_16
+ #endif
+ #elif defined(NWDOS)
+ #if !defined N_PLAT_DOS
+ #define N_PLAT_DOS
+ #endif
+ #if !defined N_ARCH_16
+ #define N_ARCH_16
+ #endif
+ #elif defined(WIN32)
+ #if !defined N_PLAT_MSW
+ #define N_PLAT_MSW
+ #endif
+ #if !defined N_ARCH_32
+ #define N_ARCH_32
+ #endif
+ #endif
+
+ #if defined(N_PLAT_WNT3) || defined(N_PLAT_WNT4)
+ #if !defined(N_PLAT_WNT)
+ #define N_PLAT_WNT
+ #endif
+ #if !defined(N_PLAT_MSW)
+ #define N_PLAT_MSW
+ #endif
+ #endif
+
+ #if defined(N_PLAT_WNT)
+ #if !defined(N_PLAT_WNT3) && !defined(N_PLAT_WNT4)
+ #define N_PLAT_WNT3
+ #endif
+ #if !defined(N_PLAT_MSW)
+ #define N_PLAT_MSW
+ #endif
+ #endif
+
+ #if defined(N_PLAT_MSW3) || defined(N_PLAT_MSW4)
+ #if !defined(N_PLAT_MSW)
+ #define N_PLAT_MSW
+ #endif
+ #endif
+
+ #if defined N_PLAT_MSW && !defined N_PLAT_WNT
+ #if !defined N_PLAT_MSW3 && !defined N_PLAT_MSW4
+ #define N_PLAT_MSW3
+ #endif
+ #endif
+
+ #if defined N_PLAT_NLM
+ #if !defined N_IAPX386 && !defined N_PPC
+ #define N_IAPX386
+ #endif
+ #if !defined N_PLAT_NETWARE && !defined N_PLAT_NIOS
+ #define N_PLAT_NETWARE
+ #endif
+ #endif
+
+ #if defined N_PLAT_NIOS || defined N_PLAT_NETWARE
+ #if !defined N_PLAT_NLM
+ #define N_PLAT_NLM
+ #endif
+ #endif
+
+ /* Set a default architecture size if none is set. Test order is important
+ * and must be elif'ed because N_PLAT_MSW can be set for various Windows
+ * platforms that have differing default int sizes. */
+ #if !defined(N_ARCH_64) && !defined(N_ARCH_32) && !defined(N_ARCH_16)
+ #if defined(N_PLAT_DOS)
+ #define N_ARCH_16
+ #elif defined(N_PLAT_WNT)
+ #define N_ARCH_32
+ #elif defined(N_PLAT_OS2) && defined(_MSC_VER)
+ #define N_ARCH_16
+ #elif defined(N_PLAT_MSW4)
+ #define N_ARCH_32
+ #elif defined(N_PLAT_MSW)
+ #define N_ARCH_16
+ #else
+ #define N_ARCH_32
+ #endif
+ #endif
+
+#endif /* #if !defined(N_INC_NO_AUTO) */
+
+/*
+ Section 1b: Compiler specific
+*/
+
+#if defined _MSC_VER
+ #if(_MSC_VER < 700)
+ #define N_MSC_OLD
+ #else
+ #define N_MSC
+ #endif
+#endif
+
+/*
+ Section 1c: Resource compiler specific
+*/
+#if defined( RC_INVOKED )
+ #if !defined( N_RC_INVOKED )
+ #define N_RC_INVOKED
+ #endif /* !defined( N_RC_INVOKED ) */
+#endif /* defined( RC_INVOKED ) */
+
+/*
+ Section 2: Platform specific definitions
+*/
+#if !defined( N_RC_INVOKED )
+
+ #if defined(N_ARCH_16) && defined(N_PLAT_MSW)
+
+ #if !defined NWWIN
+ #define NWWIN
+ #endif
+
+ #if defined(N_MSC_OLD)
+ #define N_NEAR near
+ #define N_FAR far
+ #define N_HUGE _huge
+ #define N_PASCAL pascal
+ #define N_CDECL cdecl
+ #define N_EXPORT _export
+ #else
+ #define N_NEAR __near
+ #define N_FAR __far
+ #define N_HUGE _huge
+ #define N_PASCAL __pascal
+ #define N_CDECL __cdecl
+ #define N_EXPORT _export
+ #endif
+
+ #define N_API N_FAR N_PASCAL
+ #define N_API_VARARGS N_FAR N_CDECL
+ #define N_CALLBACK N_FAR N_PASCAL
+ #define N_CALLBACK_VARARGS N_FAR N_CDECL
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_ARCH_32) && defined(N_PLAT_MSW)
+
+ #if !defined WIN32
+ #define WIN32
+ #endif
+
+ #define N_NEAR
+ #define N_FAR
+ #define N_HUGE
+ #define N_PASCAL
+ #define N_CDECL __cdecl
+ #define N_EXPORT
+
+ #define N_API __stdcall
+ #define N_API_VARARGS N_CDECL
+ #define N_VARARGS N_CDECL
+ #define N_CALLBACK __stdcall
+ #define N_CALLBACK_VARARGS N_CDECL
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_ARCH_16) && defined(N_PLAT_OS2)
+
+ #if !defined NWOS2
+ #define NWOS2
+ #endif
+
+ #if defined(N_MSC_OLD)
+ #define N_NEAR near
+ #define N_FAR far
+ #define N_HUGE _huge
+ #define N_PASCAL pascal
+ #define N_CDECL cdecl
+ #else
+ #define N_NEAR __near
+ #define N_FAR __far
+ #define N_HUGE _huge
+ #define N_PASCAL __pascal
+ #define N_CDECL __cdecl
+ #endif
+
+ #define N_API N_FAR N_PASCAL
+ #define N_API_VARARGS N_FAR N_CDECL
+ #define N_CALLBACK N_FAR N_PASCAL
+ #define N_CALLBACK_VARARGS N_FAR N_CDECL
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_ARCH_32) && defined(N_PLAT_OS2)
+
+ #define N_NEAR
+ #define N_FAR
+ #define N_HUGE
+ #if defined __BORLANDC__
+ #define N_PASCAL __pascal
+ #else
+ #define N_PASCAL _Pascal
+ #endif
+ #define N_CDECL
+
+ #define N_API N_PASCAL
+ #define N_API_VARARGS N_CDECL
+ #define N_CALLBACK N_PASCAL
+ #define N_CALLBACK_VARARGS N_CDECL
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_PLAT_DOS)
+
+ #if !defined NWDOS
+ #define NWDOS
+ #endif
+
+ #if defined(N_MSC_OLD)
+ #define N_NEAR near
+ #define N_FAR far
+ #define N_HUGE _huge
+ #define N_PASCAL pascal
+ #define N_CDECL cdecl
+ #else
+ #define N_NEAR __near
+ #define N_FAR __far
+ #define N_HUGE _huge
+ #define N_PASCAL __pascal
+ #define N_CDECL __cdecl
+ #endif
+
+ #define N_API N_FAR N_PASCAL
+ #define N_API_VARARGS N_FAR N_CDECL
+ #define N_CALLBACK N_FAR N_PASCAL
+ #define N_CALLBACK_VARARGS N_FAR N_CDECL
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_PLAT_NLM)
+
+ #if defined(N_IAPX386)
+
+ #undef N_INT_ENDIAN_HI_LO
+ #undef N_INT_STRICT_ALIGNMENT
+
+ #elif defined(N_PPC)
+
+ #define N_INT_ENDIAN_HI_LO
+ #define N_INT_STRICT_ALIGNMENT
+
+ #else /* no machine type defined */
+
+ #error A machine type must be defined
+
+ #endif
+ #define N_NEAR
+ #define N_FAR
+ #define N_HUGE
+ #define N_PASCAL pascal
+ #ifdef __WATCOMC__
+ #define N_CDECL cdecl
+ #else
+ #define N_CDECL __cdecl
+ #endif
+ #define N_API
+ #define N_API_VARARGS
+ #define N_CALLBACK
+ #define N_CALLBACK_VARARGS
+
+ #elif defined(N_PLAT_MAC)
+
+ #define N_NEAR
+ #define N_FAR
+ #define N_HUGE
+ #define N_PASCAL pascal
+ #define N_CDECL
+
+ #define N_API N_PASCAL
+ #define N_API_VARARGS N_CDECL
+ #define N_CALLBACK N_PASCAL
+ #define N_CALLBACK_VARARGS N_CDECL
+
+ #define N_INT_ENDIAN_HI_LO
+ #if defined( mc68020 )
+ #undef N_INT_STRICT_ALIGNMENT
+ #else
+ #define N_INT_STRICT_ALIGNMENT
+ #endif
+
+ #elif defined(N_PLAT_UNIX)
+
+ #define N_NEAR
+ #define N_FAR
+ #define N_HUGE
+ #define N_PASCAL
+ #define N_CDECL
+
+ #define N_API N_PASCAL
+ #define N_API_VARARGS N_CDECL
+ #define N_CALLBACK N_PASCAL
+ #define N_CALLBACK_VARARGS N_CDECL
+
+ #if defined(BYTE_ORDER) && defined(BIG_ENDIAN)
+ #if (BYTE_ORDER == BIG_ENDIAN)
+ #define N_INT_ENDIAN_HI_LO
+ #endif
+ #elif defined(vax) || defined(ns32000) || defined(sun386) || \
+ defined(MIPSEL) || defined(BIT_ZERO_ON_RIGHT)
+ /* do nothing (little endian) */
+ #elif defined(sel) || defined(pyr) || defined(mc68000) || \
+ defined(sparc) || defined(is68k) || defined(tahoe) || \
+ defined(ibm032) || defined(ibm370) || defined(MIPSEB) || \
+ defined(__hpux) || defined (BIT_ZERO_ON_LEFT)
+ #define N_INT_ENDIAN_HI_LO
+ #endif
+
+ /* For now, we assume strict alignment for all Unix platforms since it
+ is the worst case (safe); we could optimize for certain platforms
+ in the future */
+
+ #define N_INT_STRICT_ALIGNMENT
+
+ #else /* no platform constant */
+
+ #error A platform must be defined
+
+ #endif /* platforms */
+
+#endif /* !defined( N_RC_INVOKED ) */
+
+/*
+ Section 3: Other constants
+ Section 3a: NULL
+*/
+
+#if !defined(NULL) && defined(__cplusplus)
+ #define NULL 0
+#endif
+
+#if defined( N_RC_INVOKED )
+ #define NULL 0
+#endif
+
+#if !defined NULL
+ #if defined N_MSC
+ #define NULL ((void *) 0)
+ #else
+ #if defined(M_I86S) || defined(M_I86SM) || defined(M_I86C) || \
+ defined(M_I86CM) || \
+ defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) || \
+ defined(N_PLAT_NLM)
+
+ #define NULL 0
+ #else
+ #define NULL 0L
+ #endif
+ #endif
+#endif /* NULL */
+
+/*
+ Section 3b: Standard constants
+*/
+
+#define N_ALWAYS 1
+#define N_SUCCESS 0
+#define N_FAILURE (-1)
+#define N_YES 1
+#define N_NO 0
+#define N_FALSE 0
+#define N_TRUE 1
+#define N_UNKNOWN (N_TRUE + 1)
+
+/*
+ Section 3c: System constants
+*/
+
+#define N_SYS_USER 0
+#define N_SYS_NETWARE 1
+#define N_SYS_NAWF 2
+#define N_SYS_MAX_COUNT 20
+#define N_SYS_NAME_MAX_LEN 31
+
+/*
+ Section 3d: Historical constant synonyms
+*/
+
+#if ! defined( N_INC_NO_OLD_CONSTANTS )
+
+ #if ! defined( TRUE )
+ #define TRUE 1
+ #endif
+
+ #if ! defined( FALSE )
+ #define FALSE 0
+ #endif
+
+#endif
+
+/*
+ Section 3e: Miscellaneous constants
+*/
+
+/* N_BITSPERBYTE is currently only used internally */
+#if defined BITSPERBYTE
+ #define N_BITSPERBYTE BITSPERBYTE
+#else
+ #define N_BITSPERBYTE 8
+#endif
+
+/*
+ Section 4: Types
+ Section 4a: Machine dependent types
+*/
+
+#if !defined(N_RC_INVOKED)
+
+ typedef signed char nint8;
+ typedef unsigned char nuint8;
+ typedef signed short nint16;
+ typedef unsigned short nuint16;
+ #if defined(__alpha)
+ typedef signed int nint32;
+ typedef unsigned int nuint32;
+ typedef signed long nint64;
+ typedef unsigned long nuint64;
+ #define nint64_type
+ #else
+ typedef signed long nint32;
+ typedef unsigned long nuint32;
+ #if (defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS >= 64)) && defined __MWERKS__
+ /* Metrowerks */
+ typedef signed long long nint64;
+ typedef unsigned long long nuint64;
+ #define nint64_type
+ #elif (defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS >= 64)) || defined (__WATCOM_INT64__)
+ /* MS Visual C++ or WATCOM */
+ typedef signed __int64 nint64;
+ typedef unsigned __int64 nuint64;
+ #define nint64_type
+ #endif
+ #endif
+ typedef float nreal32;
+ typedef double nreal64;
+
+ #if !defined N_PLAT_MAC
+
+ #if defined N_FORCE_INT_32
+ typedef signed long nint;
+ typedef unsigned long nuint;
+ #elif defined N_FORCE_INT_16
+ typedef signed short nint;
+ typedef unsigned short nuint;
+ #else
+ typedef signed int nint;
+ typedef unsigned int nuint;
+ #endif
+
+ typedef unsigned int nbool;
+ #if !(defined N_PLAT_MSW && defined N_ARCH_32)
+ #if ! defined(__alpha) && ! defined(_AIX)
+ typedef long double nreal80;
+ #define nreal80_type
+ /* VC++ for NT does not support nreal80's by default. Check readme for
+ instructions on how to enable them */
+ #endif
+ #endif
+
+ typedef double nreal;
+ #else
+ typedef signed long nint;
+ typedef unsigned long nuint;
+ typedef unsigned char nbool;
+
+ #if defined( powerc ) || defined( __powerc ) || defined( THINK_C )
+ typedef long double nreal80;
+ typedef double nreal;
+ #else
+ typedef extended nreal80;
+ typedef extended nreal;
+ #endif
+ #define nreal80_type
+ #endif
+
+/*
+ Section 4b: Derived types
+*/
+
+ #if defined(__alpha)
+ typedef nuint64 nparam;
+ #else
+ typedef nuint32 nparam;
+ #endif
+ typedef nparam nhdl;
+ typedef nparam nid;
+ typedef nuint8 nflag8;
+ typedef nuint16 nflag16;
+ typedef nuint32 nflag32;
+
+ typedef nuint8 nbool8;
+ typedef nuint16 nbool16;
+ typedef nuint32 nbool32;
+
+ typedef nint32 nfixed;
+ #if defined(N_USE_UNSIGNED_CHAR)
+ typedef nuint8 nstr8;
+ #else
+ typedef char nstr8;
+ #endif
+ typedef nuint16 nstr16;
+ #if defined(N_USE_STR_16)
+ typedef nstr16 nstr;
+ #else
+ typedef nstr8 nstr;
+ #endif
+ typedef nstr nchar;
+ typedef nstr8 nchar8;
+ typedef nstr16 nchar16;
+ typedef nchar16 nwchar;
+
+ /*
+ Return code for functions that return status/errors.
+ */
+
+ #define NWRCODE nint32
+
+
+ /*
+ Pointers to scalars.
+ */
+
+ typedef void N_FAR * nptr;
+ typedef void N_FAR * npproc;
+
+ typedef nint8 N_FAR * pnint8;
+ typedef nuint8 N_FAR * pnuint8;
+ typedef nint16 N_FAR * pnint16;
+ typedef nuint16 N_FAR * pnuint16;
+ typedef nint32 N_FAR * pnint32;
+ typedef nuint32 N_FAR * pnuint32;
+ #if defined( nint64_type )
+ typedef nint64 N_FAR * pnint64;
+ typedef nuint64 N_FAR * pnuint64;
+ #endif
+ typedef nint N_FAR * pnint;
+ typedef nuint N_FAR * pnuint;
+ typedef nflag8 N_FAR * pnflag8;
+ typedef nflag16 N_FAR * pnflag16;
+ typedef nflag32 N_FAR * pnflag32;
+ typedef nbool N_FAR * pnbool;
+ typedef nbool8 N_FAR * pnbool8;
+ typedef nbool16 N_FAR * pnbool16;
+ typedef nbool32 N_FAR * pnbool32;
+ typedef nfixed N_FAR * pnfixed;
+ typedef nstr N_FAR * pnstr;
+ typedef pnstr N_FAR * ppnstr;
+ typedef nstr16 N_FAR * pnstr16;
+ typedef pnstr16 N_FAR * ppnstr16;
+ typedef nstr8 N_FAR * pnstr8;
+ typedef pnstr8 N_FAR * ppnstr8;
+ typedef nchar N_FAR * pnchar;
+ typedef pnchar N_FAR * ppnchar;
+ typedef nchar16 N_FAR * pnchar16;
+ typedef pnchar16 N_FAR * ppnchar16;
+ typedef nchar8 N_FAR * pnchar8;
+ typedef pnchar8 N_FAR * ppnchar8;
+ typedef nwchar N_FAR * pnwchar;
+ typedef pnwchar N_FAR * ppnwchar;
+ typedef nreal N_FAR * pnreal;
+ typedef nreal32 N_FAR * pnreal32;
+ typedef nreal64 N_FAR * pnreal64;
+ #if defined( nreal80_type )
+ typedef nreal80 N_FAR * pnreal80;
+ #endif
+ typedef nid N_FAR * pnid;
+ typedef nhdl N_FAR * pnhdl;
+ typedef nparam N_FAR * pnparam;
+
+ /*
+ Pointers to pointers.
+ */
+ typedef nptr N_FAR * pnptr;
+ typedef npproc N_FAR * pnpproc;
+
+ typedef pnint8 N_FAR * ppnint8;
+ typedef pnuint8 N_FAR * ppnuint8;
+ typedef pnint16 N_FAR * ppnint16;
+ typedef pnuint16 N_FAR * ppnuint16;
+ typedef pnint32 N_FAR * ppnint32;
+ typedef pnuint32 N_FAR * ppnuint32;
+ #if defined( nint64_type )
+ typedef pnint64 N_FAR * ppnint64;
+ typedef pnuint64 N_FAR * ppnuint64;
+ #endif
+ typedef pnint N_FAR * ppnint;
+ typedef pnuint N_FAR * ppnuint;
+ typedef pnflag8 N_FAR * ppnflag8;
+ typedef pnflag16 N_FAR * ppnflag16;
+ typedef pnflag32 N_FAR * ppnflag32;
+ typedef pnbool N_FAR * ppnbool;
+ typedef pnbool8 N_FAR * ppnbool8;
+ typedef pnbool16 N_FAR * ppnbool16;
+ typedef pnbool32 N_FAR * ppnbool32;
+ typedef pnfixed N_FAR * ppnfixed;
+ typedef ppnstr N_FAR * pppnstr;
+ typedef ppnstr16 N_FAR * pppnstr16;
+ typedef ppnstr8 N_FAR * pppnstr8;
+ typedef ppnchar N_FAR * pppnchar;
+ typedef ppnchar16 N_FAR * pppnchar16;
+ typedef ppnchar8 N_FAR * pppnchar8;
+ typedef ppnwchar N_FAR * pppnwchar;
+ typedef pnreal N_FAR * ppnreal;
+ typedef pnreal32 N_FAR * ppnreal32;
+ typedef pnreal64 N_FAR * ppnreal64;
+ #if defined( nreal80_type )
+ typedef pnreal80 N_FAR * ppnreal80;
+ #endif
+ typedef pnid N_FAR * ppnid;
+ typedef pnhdl N_FAR * ppnhdl;
+ typedef pnparam N_FAR * ppnparam;
+ typedef pnptr N_FAR * ppnptr;
+ typedef pnpproc N_FAR * ppnpproc;
+
+ /*
+ Section 4c: GUI structures - Removed
+ */
+
+ /*
+ Section 4d: Platform dependent types
+ */
+
+ #if defined( N_PLAT_MSW )
+
+ typedef unsigned char N_HUGE * neptr;
+
+ #elif defined( N_PLAT_MAC )
+
+ typedef unsigned char N_HUGE * neptr;
+
+ #elif defined( N_PLAT_UNIX )
+
+ typedef unsigned char N_HUGE * neptr;
+
+ #elif defined( N_PLAT_OS2 )
+
+ typedef unsigned char N_HUGE * neptr;
+
+ #elif defined( N_PLAT_DOS )
+
+ typedef unsigned char N_HUGE * neptr;
+
+ #elif defined( N_PLAT_NLM )
+
+ /* We just need to include NLM in our thinking */
+ typedef unsigned char N_HUGE * neptr;
+
+ #else /* This should not be reached because it was already */
+ /* tested earlier. */
+ #error A platform must be defined
+ #endif /* MSW or MAC or UNIX or OS2 undefined */
+
+ /*
+ Pointers to scalars.
+ */
+
+ typedef neptr N_FAR * pneptr;
+
+ /*
+ Section 5: Macros
+ */
+
+ #if defined( __cplusplus )
+
+ /* Special 'extern' for C++ to avoid name mangling... */
+
+ #define _N_EXTERN extern "C"
+
+ #else
+ #define _N_EXTERN extern
+ #endif /* __cplusplus */
+
+ #define N_UNUSED_VAR( x ) x = x
+
+ #define N_REG1 register
+ #define N_REG2 register
+ #define N_REG3 register
+ #define N_REG4 register
+
+ #define N_STATIC_VAR static
+ #define N_INTERN_VAR static
+ #define N_GLOBAL_VAR
+ #define N_EXTERN_VAR extern
+
+ #if defined( N_PLAT_MSW )
+ #define N_INTERN_FUNC( retType ) static retType N_NEAR
+ #define N_INTERN_FUNC_C( retType ) static retType N_NEAR
+ #define N_INTERN_FUNC_PAS( retType ) static retType N_NEAR N_PASCAL
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) retType N_PASCAL
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN retType N_PASCAL
+ #elif defined( N_PLAT_MAC )
+ #define N_INTERN_FUNC( retType ) static retType
+ #define N_INTERN_FUNC_C( retType ) static retType
+ #define N_INTERN_FUNC_PAS( retType ) static N_PASCAL retType
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) N_PASCAL retType
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN N_PASCAL retType
+ #elif defined( N_PLAT_UNIX )
+ #define N_INTERN_FUNC( retType ) static retType
+ #define N_INTERN_FUNC_C( retType ) static retType
+ #define N_INTERN_FUNC_PAS( retType ) static retType
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) retType
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN retType
+ #elif defined( N_PLAT_OS2 )
+ #define N_INTERN_FUNC( retType ) static retType
+ #define N_INTERN_FUNC_C( retType ) static retType
+ #define N_INTERN_FUNC_PAS( retType ) static retType N_PASCAL
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) retType N_PASCAL
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN retType N_PASCAL
+ #elif defined( N_PLAT_DOS )
+ #define N_INTERN_FUNC( retType ) static retType N_NEAR
+ #define N_INTERN_FUNC_C( retType ) static retType N_NEAR
+ #define N_INTERN_FUNC_PAS( retType ) static retType N_NEAR N_PASCAL
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) retType N_PASCAL
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN retType N_PASCAL
+ #elif defined( N_PLAT_NLM )
+ #define N_INTERN_FUNC( retType ) static retType
+ #define N_INTERN_FUNC_C( retType ) static retType
+ #define N_INTERN_FUNC_PAS( retType ) static retType
+ #define N_GLOBAL_FUNC( retType ) retType
+ #define N_EXTERN_FUNC( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_C( retType ) retType
+ #define N_EXTERN_FUNC_C( retType ) _N_EXTERN retType
+ #define N_GLOBAL_FUNC_PAS( retType ) retType
+ #define N_EXTERN_FUNC_PAS( retType ) _N_EXTERN retType
+ #endif
+
+ #if ! defined( N_PLAT_MAC )
+ #define N_GLOBAL_LIBRARY( retType ) retType N_API
+ #define N_EXTERN_LIBRARY( retType ) _N_EXTERN retType N_API
+ #define N_GLOBAL_LIBRARY_C( retType ) retType N_API_VARARGS
+ #define N_EXTERN_LIBRARY_C( retType ) _N_EXTERN retType N_API_VARARGS
+ #else
+ #define N_GLOBAL_LIBRARY( retType ) N_PASCAL retType
+ #define N_EXTERN_LIBRARY( retType ) _N_EXTERN N_PASCAL retType
+ #define N_GLOBAL_LIBRARY_C( retType ) retType
+ #define N_EXTERN_LIBRARY_C( retType ) _N_EXTERN retType
+ #endif
+
+ #if defined( N_PLAT_MSW )
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) \
+ retType N_FAR N_PASCAL
+ #define N_EXTERN_LIBRARY_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL
+
+ #define N_GLOBAL_CALLBACK( retType ) \
+ retType N_CALLBACK N_EXPORT
+ #define N_EXTERN_CALLBACK( retType ) \
+ _N_EXTERN retType N_CALLBACK N_EXPORT
+ #define N_GLOBAL_CALLBACK_C( retType ) \
+ retType N_FAR N_CDECL N_EXPORT
+ #define N_EXTERN_CALLBACK_C( retType ) \
+ _N_EXTERN retType N_FAR N_CDECL N_EXPORT
+ #define N_GLOBAL_CALLBACK_PAS( retType ) \
+ retType N_FAR N_PASCAL N_EXPORT
+ #define N_EXTERN_CALLBACK_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL N_EXPORT
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef retType (N_CDECL *typeName)
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef retType (N_PASCAL *typeName)
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL *typeName)
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef retType (N_FAR N_CDECL *typeName)
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL *typeName)
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef retType (N_CALLBACK N_EXPORT *typeName)
+
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef retType (N_FAR N_CDECL N_EXPORT *typeName)
+
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL N_EXPORT *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType (N_NEAR *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef retType (N_NEAR N_CDECL *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef retType (N_NEAR N_PASCAL *typeName)
+
+ #elif defined( N_PLAT_MAC )
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) N_PASCAL retType
+ #define N_EXTERN_LIBRARY_PAS( retType ) _N_EXTERN N_PASCAL retType
+
+ #define N_GLOBAL_CALLBACK( retType ) N_CALLBACK retType
+ #define N_EXTERN_CALLBACK( retType ) _N_EXTERN N_CALLBACK retType
+ #define N_GLOBAL_CALLBACK_C( retType ) N_CDECL retType
+ #define N_EXTERN_CALLBACK_C( retType ) _N_EXTERN N_CDECL retType
+ #define N_GLOBAL_CALLBACK_PAS( retType ) N_PASCAL retType
+ #define N_EXTERN_CALLBACK_PAS( retType ) _N_EXTERN N_PASCAL retType
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType (*typeName)
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef N_CALLBACK retType (*typeName)
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+
+ #elif defined( N_PLAT_UNIX )
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) retType
+ #define N_EXTERN_LIBRARY_PAS( retType ) _N_EXTERN N_PASCAL retType
+
+ #define N_GLOBAL_CALLBACK( retType ) N_CALLBACK retType
+ #define N_EXTERN_CALLBACK( retType ) _N_EXTERN N_CALLBACK retType
+ #define N_GLOBAL_CALLBACK_C( retType ) N_CDECL retType
+ #define N_EXTERN_CALLBACK_C( retType ) _N_EXTERN N_CDECL retType
+ #define N_GLOBAL_CALLBACK_PAS( retType ) N_PASCAL retType
+ #define N_EXTERN_CALLBACK_PAS( retType ) _N_EXTERN N_PASCAL retType
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType (*typeName)
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef retType (*typeName)
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef N_CALLBACK retType (*typeName)
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef N_CDECL retType (*typeName)
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef N_PASCAL retType (*typeName)
+
+ #elif defined( N_PLAT_OS2)
+
+ #define N_PRAGMA_ONCE
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) retType N_PASCAL
+ #define N_EXTERN_LIBRARY_PAS( retType ) _N_EXTERN retType N_PASCAL
+
+ #define N_GLOBAL_CALLBACK( retType ) retType N_CALLBACK _export
+ #define N_EXTERN_CALLBACK( retType ) _N_EXTERN retType N_CALLBACK
+ #define N_GLOBAL_CALLBACK_NATIVE( retType ) retType EXPENTRY _export
+ #define N_EXTERN_CALLBACK_NATIVE( retType ) _N_EXTERN retType EXPENTRY
+ #define N_GLOBAL_CALLBACK_C( retType ) retType N_CDECL _export
+ #define N_EXTERN_CALLBACK_C( retType ) _N_EXTERN retType N_CDECL
+ #define N_GLOBAL_CALLBACK_PAS( retType ) retType N_PASCAL _export
+ #define N_EXTERN_CALLBACK_PAS( retType ) _N_EXTERN retType N_PASCAL
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef retType ( N_CDECL *typeName)
+
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef retType ( N_PASCAL *typeName)
+
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef retType ( N_PASCAL *typeName)
+
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef retType ( N_CDECL *typeName)
+
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef retType ( N_PASCAL *typeName)
+
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef retType (_export N_CALLBACK *typeName)
+
+ #define N_TYPEDEF_CALLBACK_NATIVE( retType, typeName ) \
+ typedef retType (_export EXPENTRY *typeName)
+
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef retType (_export N_CDECL *typeName)
+
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef retType (_export N_PASCAL *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef retType ( N_CDECL *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef retType ( N_PASCAL *typeName)
+
+ #elif defined( N_PLAT_DOS )
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) retType N_FAR N_PASCAL
+ #define N_EXTERN_LIBRARY_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL
+ #define N_GLOBAL_CALLBACK( retType ) retType N_FAR N_CALLBACK _export
+ #define N_EXTERN_CALLBACK( retType ) \
+ _N_EXTERN retType N_FAR N_CALLBACK _export
+ #define N_GLOBAL_CALLBACK_C( retType ) retType N_FAR N_CDECL _export
+ #define N_EXTERN_CALLBACK_C( retType ) \
+ _N_EXTERN retType N_FAR N_CDECL _export
+ #define N_GLOBAL_CALLBACK_PAS( retType ) retType N_FAR N_PASCAL _export
+ #define N_EXTERN_CALLBACK_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL _export
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef retType ( N_CDECL *typeName)
+
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef retType ( N_PASCAL *typeName)
+
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL *typeName)
+
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef retType (N_FAR *typeName)
+
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL *typeName)
+
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef retType (N_FAR N_CALLBACK _export *typeName)
+
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef retType (N_FAR N_CDECL _export *typeName)
+
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef retType (N_FAR N_PASCAL _export *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType (N_NEAR *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef retType (N_NEAR N_CDECL *typeName)
+
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef retType (N_NEAR N_PASCAL *typeName)
+
+ #elif defined( N_PLAT_NLM )
+
+ #define N_GLOBAL_LIBRARY_PAS( retType ) \
+ retType N_FAR N_PASCAL
+ #define N_EXTERN_LIBRARY_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL
+ #define N_GLOBAL_CALLBACK( retType ) retType N_FAR
+ #define N_EXTERN_CALLBACK( retType ) \
+ _N_EXTERN retType N_FAR
+ #define N_GLOBAL_CALLBACK_C( retType ) retType N_FAR N_CDECL
+ #define N_EXTERN_CALLBACK_C( retType ) \
+ _N_EXTERN retType N_FAR N_CDECL
+ #define N_GLOBAL_CALLBACK_PASCAL( retType ) \
+ retType N_FAR N_PASCAL
+ #define N_EXTERN_CALLBACK_PAS( retType ) \
+ _N_EXTERN retType N_FAR N_PASCAL
+
+ #define N_TYPEDEF_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+ #define N_TYPEDEF_FUNC_C( retType, typeName ) \
+ typedef retType (N_CDECL *typeName)
+ #define N_TYPEDEF_FUNC_PAS( retType, typeName ) \
+ typedef retType (N_PASCAL *typeName)
+ #define N_TYPEDEF_LIBRARY( retType, typeName ) \
+ typedef retType ( *typeName)
+ #define N_TYPEDEF_LIBRARY_C( retType, typeName ) \
+ typedef retType (N_CDECL *typeName)
+ #define N_TYPEDEF_LIBRARY_PAS( retType, typeName ) \
+ typedef retType (N_PASCAL *typeName)
+ #define N_TYPEDEF_CALLBACK( retType, typeName ) \
+ typedef retType (N_CALLBACK *typeName)
+ #define N_TYPEDEF_CALLBACK_C( retType, typeName ) \
+ typedef retType (N_CDECL *typeName)
+ #define N_TYPEDEF_CALLBACK_PAS( retType, typeName ) \
+ typedef retType (N_PASCAL *typeName)
+ #define N_TYPEDEF_INTERN_FUNC( retType, typeName ) \
+ typedef retType ( *typeName)
+ #define N_TYPEDEF_INTERN_FUNC_C( retType, typeName ) \
+ typedef retType (N_CDECL *typeName)
+ #define N_TYPEDEF_INTERN_FUNC_PAS( retType, typeName ) \
+ typedef retType (N_PASCAL *typeName)
+
+ #endif /* N_PLAT_NLM */
+
+ /*
+ Untyped logical macros.
+ */
+
+ #define NMin(a,b) ((a) < (b) ? (a) : (b))
+ #define NMax(a,b) ((a) > (b) ? (a) : (b))
+
+ /*
+ Integer construction macros.
+ */
+
+ /* NMakePtrParam is defined here since it can't be used in a resource file */
+
+ #define NMakePtrParam(p) ((nparam) ((nptr) (p)))
+
+#endif /* ! defined(N_RC_INVOKED) */
+
+#define NMake32(lo,hi) ((nuint32) (((nuint16)(lo)) | \
+ (((nuint32)(nuint16)(hi)) << 16)))
+#define NGetLo16(a32) ((nuint16)((nuint32)(a32) & 0xFFFF))
+#define NGetHi16(a32) ((nuint16)((nuint32)(a32) >> 16))
+#define NMake16(lo,hi) ((nuint16) (((nuint8)(lo)) | \
+ (((nuint16)((nuint8)(hi))) << 8)))
+#define NGetLo8(a16) ((nuint8)((nuint16)(a16) & 0xFF))
+#define NGetHi8(a16) ((nuint8)((nuint16)(a16) >> 8))
+
+
+#define NMakePair32 NMake32
+#define NGetFirst16(a) ((nint16) NGetLo16(a))
+#define NGetSecond16(a) ((nint16) NGetHi16(a))
+
+#define NMakePair16 NMake16
+#define NGetFirst8(a) ((nint8) NGetLo8(a))
+#define NGetSecond8(a) ((nint8) NGetHi8(a))
+
+#define NMakeFixed32(i,f) NMake32(f,i)
+#define NGetFixedInt16(a) ((nint16) NGetHi16(a))
+#define NGetFixedFrac16(a) ((nint16) NGetLo16(a))
+
+/* Swap, Copy, Get and Set macros */
+
+#define NSwap32( x ) ((nuint32) \
+ ((((nuint32)(x) & 0x000000FFL) << 24) | \
+ (((nuint32)(x) & 0x0000FF00L) << 8) | \
+ (((nuint32)(x) & 0x00FF0000L) >> 8) | \
+ (((nuint32)(x) & 0xFF000000L) >> 24)))
+
+#define NSwap16( x ) ((nuint16) \
+ ((((nuint16)(x) & 0x00FF) << 8) | \
+ (((nuint16)(x) & 0xFF00) >> 8)))
+
+#define NCopySwap32( pDest, pSrc ) \
+ (((pnuint8) (pDest))[0] = ((pnuint8) (pSrc))[3], \
+ ((pnuint8) (pDest))[1] = ((pnuint8) (pSrc))[2], \
+ ((pnuint8) (pDest))[2] = ((pnuint8) (pSrc))[1], \
+ ((pnuint8) (pDest))[3] = ((pnuint8) (pSrc))[0])
+
+#define NCopySwap16( pDest, pSrc ) \
+ (((pnuint8) (pDest))[0] = ((pnuint8) (pSrc))[1], \
+ ((pnuint8) (pDest))[1] = ((pnuint8) (pSrc))[0])
+
+#if defined( N_INT_ENDIAN_HI_LO )
+
+ #define NSwapHiLo32( x ) ((nuint32) (x))
+ #define NSwapHiLo16( x ) ((nuint16) (x))
+ #define NSwapLoHi32 NSwap32
+ #define NSwapLoHi16 NSwap16
+
+#else
+
+ #define NSwapHiLo32 NSwap32
+ #define NSwapHiLo16 NSwap16
+ #define NSwapLoHi32( x ) ((nuint32) (x))
+ #define NSwapLoHi16( x ) ((nuint16) (x))
+
+#endif
+
+#define NSwapToHiLo32 NSwapHiLo32
+#define NSwapToHiLo16 NSwapHiLo16
+#define NSwapToLoHi32 NSwapLoHi32
+#define NSwapToLoHi16 NSwapLoHi16
+
+#define NSwapFromHiLo32 NSwapHiLo32
+#define NSwapFromHiLo16 NSwapHiLo16
+#define NSwapFromLoHi32 NSwapLoHi32
+#define NSwapFromLoHi16 NSwapLoHi16
+
+#if defined( N_INT_STRICT_ALIGNMENT )
+
+ #define NCopy32( pDest, pSrc ) \
+ (((pnuint8) (pDest))[0] = ((pnuint8) (pSrc))[0], \
+ ((pnuint8) (pDest))[1] = ((pnuint8) (pSrc))[1], \
+ ((pnuint8) (pDest))[2] = ((pnuint8) (pSrc))[2], \
+ ((pnuint8) (pDest))[3] = ((pnuint8) (pSrc))[3])
+
+ #define NCopy16( pDest, pSrc ) \
+ (((pnuint8) (pDest))[0] = ((pnuint8) (pSrc))[0], \
+ ((pnuint8) (pDest))[1] = ((pnuint8) (pSrc))[1])
+
+ #define NSet32( pDest, src ) NCopy32(pDest, &(src))
+
+ #define NSet16( pDest, src ) NCopy16(pDest, &(src))
+
+ #if defined( N_INT_ENDIAN_HI_LO )
+
+ #define NGet32( pSrc ) \
+ ((nuint32)(((pnuint8) (pSrc))[3]) | \
+ ((nuint32)(((pnuint8) (pSrc))[2]) << 8) | \
+ ((nuint32)(((pnuint8) (pSrc))[1]) << 16) | \
+ ((nuint32)(((pnuint8) (pSrc))[0]) << 24))
+
+ #define NGet16( pSrc ) \
+ ((nuint16)(((pnuint8) (pSrc))[1]) | \
+ ((nuint16)(((pnuint8) (pSrc))[0]) << 8))
+
+ #else
+
+ #define NGet32( pSrc ) \
+ ((nuint32)(((pnuint8) (pSrc))[0]) | \
+ ((nuint32)(((pnuint8) (pSrc))[1]) << 8) | \
+ ((nuint32)(((pnuint8) (pSrc))[2]) << 16) | \
+ ((nuint32)(((pnuint8) (pSrc))[3]) << 24))
+
+ #define NGet16( pSrc ) \
+ ((nuint16)(((pnuint8) (pSrc))[0]) | \
+ ((nuint16)(((pnuint8) (pSrc))[1]) << 8))
+
+ #endif
+
+ #if defined( N_INT_ENDIAN_HI_LO )
+
+ #define NWrite32( dest, src ) \
+ (((nuint8 *)(&(dest)))[0] = (nuint32)(src) >> 24, \
+ ((nuint8 *)(&(dest)))[1] = (nuint32)(src) >> 16, \
+ ((nuint8 *)(&(dest)))[2] = (nuint32)(src) >> 8, \
+ ((nuint8 *)(&(dest)))[3] = (nuint32)(src))
+
+ #define NWrite16( dest, src ) \
+ (((nuint8 *)(&(dest)))[0] = (nuint16)(src) >> 8, \
+ ((nuint8 *)(&(dest)))[1] = (nuint16)(src))
+
+ #else
+
+ #define NWrite32( dest, src ) \
+ (((nuint8 *)(&(dest)))[3] = (nuint32)(src) >> 24, \
+ ((nuint8 *)(&(dest)))[2] = (nuint32)(src) >> 16, \
+ ((nuint8 *)(&(dest)))[1] = (nuint32)(src) >> 8, \
+ ((nuint8 *)(&(dest)))[0] = (nuint32)(src))
+
+ #define NWrite16( dest, src ) \
+ (((nuint8 *)(&(dest)))[1] = (nuint16)(src) >> 8, \
+ ((nuint8 *)(&(dest)))[0] = ((nuint16)(src)))
+
+ #endif
+
+#else /* if defined( N_INT_STRICT_ALIGNMENT ) */
+
+ #define NCopy32( pDest, pSrc ) \
+ (*((pnuint32) (pDest)) = *((pnuint32) (pSrc)))
+
+ #define NCopy16( pDest, pSrc ) \
+ (*((pnuint16) (pDest)) = *((pnuint16) (pSrc)))
+
+ #define NSet32( pDest, src ) \
+ (*((pnuint32) (pDest)) = (nuint32)(src))
+
+ #define NSet16( pDest, src ) \
+ (*((pnuint16) (pDest)) = (nuint16)(src))
+
+ #define NGet32( pSrc ) \
+ (*((pnuint32) (pSrc)))
+
+ #define NGet16( pSrc ) \
+ (*((pnuint16) (pSrc)))
+
+ #define NWrite32( dest, src ) NSet32(&(dest), src)
+
+ #define NWrite16( dest, src ) NSet16(&(dest), src)
+
+#endif /* if defined( N_INT_STRICT_ALIGNMENT ) */
+
+#if defined( N_INT_ENDIAN_HI_LO )
+
+ #define NGetHiLo32 NGet32
+
+ #define NGetHiLo16 NGet16
+
+ #define NGetLoHi32( pSrc ) \
+ (((pnuint8) (pSrc))[0] | \
+ (((pnuint8) (pSrc))[1] << 8) | \
+ (((pnuint8) (pSrc))[2] << 16) | \
+ (((pnuint8) (pSrc))[3] << 24))
+
+ #define NGetLoHi16( pSrc ) \
+ (((pnuint8) (pSrc))[0] | \
+ (((pnuint8) (pSrc))[1] << 8))
+
+#else
+
+ #define NGetHiLo32( pSrc ) \
+ (((pnuint8) (pSrc))[3] | \
+ (((pnuint8) (pSrc))[2] << 8) | \
+ (((pnuint8) (pSrc))[1] << 16) | \
+ (((pnuint8) (pSrc))[0] << 24))
+
+ #define NGetHiLo16( pSrc ) \
+ (((pnuint8) (pSrc))[1] | \
+ (((pnuint8) (pSrc))[0] << 8))
+
+ #define NGetLoHi32 NGet32
+
+ #define NGetLoHi16 NGet16
+
+#endif
+
+#if defined( N_INT_ENDIAN_HI_LO )
+
+ #define NSetHiLo32 NSet32
+
+ #define NSetHiLo16 NSet16
+
+ #define NSetLoHi32( pDest, src ) \
+ (((nuint8 *)(pDest))[3] = (nuint32)(src) >> 24, \
+ ((nuint8 *)(pDest))[2] = (nuint32)(src) >> 16, \
+ ((nuint8 *)(pDest))[1] = (nuint32)(src) >> 8, \
+ ((nuint8 *)(pDest))[0] = (nuint32)(src))
+
+ #define NSetLoHi16( pDest, src ) \
+ (((nuint8 *)(pDest))[1] = (nuint16)(src) >> 8, \
+ ((nuint8 *)(pDest))[0] = ((nuint16)(src)))
+
+#else
+
+ #define NSetHiLo32( pDest, src ) \
+ (((nuint8 *)(pDest))[0] = (nuint32)(src) >> 24, \
+ ((nuint8 *)(pDest))[1] = (nuint32)(src) >> 16, \
+ ((nuint8 *)(pDest))[2] = (nuint32)(src) >> 8, \
+ ((nuint8 *)(pDest))[3] = (nuint32)(src))
+
+ #define NSetHiLo16( pDest, src ) \
+ (((nuint8 *)(pDest))[0] = (nuint16)(src) >> 8, \
+ ((nuint8 *)(pDest))[1] = ((nuint16)(src)))
+
+ #define NSetLoHi32 NSet32
+
+ #define NSetLoHi16 NSet16
+
+#endif
+
+#define NRead32( src ) NGet32(&(src))
+
+#define NRead16( src ) NGet16(&(src))
+
+#define NReadHiLo32( src ) NGetHiLo32(&(src))
+
+#define NReadHiLo16( src ) NGetHiLo16(&(src))
+
+#define NReadLoHi32( src ) NGetLoHi32(&(src))
+
+#define NReadLoHi16( src ) NGetLoHi16(&(src))
+
+#define NWriteHiLo32( dest, src ) NSetHiLo32(&(dest), src)
+
+#define NWriteHiLo16( dest, src ) NSetHiLo16(&(dest), src)
+
+#define NWriteLoHi32( dest, src ) NSetLoHi32(&(dest), src)
+
+#define NWriteLoHi16( dest, src ) NSetLoHi16(&(dest), src)
+
+#if defined( N_INT_ENDIAN_HI_LO )
+
+ /* Copy from native format to named format */
+ #define NCopyHiLo32 NCopy32
+ #define NCopyHiLo16 NCopy16
+ #define NCopyLoHi32 NCopySwap32
+ #define NCopyLoHi16 NCopySwap16
+
+#else
+
+ /* Copy from native format to named format */
+ #define NCopyHiLo32 NCopySwap32
+ #define NCopyHiLo16 NCopySwap16
+ #define NCopyLoHi32 NCopy32
+ #define NCopyLoHi16 NCopy16
+
+#endif
+
+#define NCopyToHiLo32 NCopyHiLo32
+#define NCopyToHiLo16 NCopyHiLo16
+#define NCopyToLoHi32 NCopyLoHi32
+#define NCopyToLoHi16 NCopyLoHi16
+
+/* Copy from named format to native format */
+#define NCopyFromHiLo32 NCopyHiLo32
+#define NCopyFromHiLo16 NCopyHiLo16
+#define NCopyFromLoHi32 NCopyLoHi32
+#define NCopyFromLoHi16 NCopyLoHi16
+
+#define NPad32( src ) (((src) + 3) & ~3)
+#define NPad16( src ) (((src) + 1) & ~1)
+
+#define NAlign32(src) *(src) = (void N_FAR *) (((nuint32)*(src) + 3) & ~3);
+
+/*
+ Character and String macros.
+*/
+
+#if defined(N_USE_STR_16)
+ #define NText(a) L a
+#else
+ #define NText(a) a
+#endif
+
+#if defined( N_PLAT_MSW ) || defined( N_PLAT_OS2 ) || defined( N_PLAT_DOS )
+ #define N_NEWLINE NText( "\r\n" )
+#elif defined( N_PLAT_MAC )
+ #if defined( THINK_C ) || defined( __MWERKS__ )
+ #define N_NEWLINE NText( "\r" )
+ #else
+ #define N_NEWLINE NText( "\n" )
+ #endif
+#else
+ #define N_NEWLINE NText( "\n" )
+#endif
+
+/*
+ Historical macro synonyms.
+*/
+
+#if ! defined( N_INC_NO_OLD_MACROS )
+ #if !defined( FAR )
+ #define FAR N_FAR
+ #endif
+ #if !defined( NEAR )
+ #define NEAR N_NEAR
+ #endif
+ #if !defined( MIN )
+ #define MIN NMin
+ #endif
+ #if !defined( MAX )
+ #define MAX NMax
+ #endif
+ #if !defined( MAKELONG )
+ #define MAKELONG NMake32
+ #endif
+ #if !defined( HIWORD )
+ #define HIWORD NGetHi16
+ #endif
+ #if !defined( LOWORD )
+ #define LOWORD NGetLo16
+ #endif
+ #if !defined( MAKEWORD )
+ #define MAKEWORD NMake16
+ #endif
+ #if !defined( HIBYTE )
+ #define HIBYTE NGetHi8
+ #endif
+ #if !defined( LOBYTE )
+ #define LOBYTE NGetLo8
+ #endif
+#endif
+
+#endif /* ! defined( NTYPES_H ) */
diff --git a/LoginCapture/windows/external/xplatapi/include/ntypes.txt b/LoginCapture/windows/external/xplatapi/include/ntypes.txt
new file mode 100644
index 00000000..891ea151
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/ntypes.txt
@@ -0,0 +1,215 @@
+Brief documentation for NTYPES.H v1.08
+
+ NTYPES.H is broken up into five sections. The first defines automatic
+ compiler/platform settings. The second section defines items according
+ to the platform. The third section defines non-platform specific defines.
+ The fourth section defines new types. The fifth section defines macros.
+
+ This file is guaranteed NOT to include any other files. It should be
+ placed before any Novell include files, but after any standard C or
+ platform specific files, such as "windows.h".
+
+ Certain sections may be excluded by defining N_INC_NO... macros. These
+ are currently defined as:
+
+ N_INC_NO_AUTO Don't automatically define platforms defines.
+ N_INC_NO_OLD_CONSTANTS Don't define historical constants.
+ N_INC_NO_OLD_MACROS Don't define historical macros.
+
+ Section 4c is has been removed from v1.06 of NTYPES.H
+
+ N_INC_NO_GUI Is no longer checked
+ N_INC_GUI Is no longer checked
+
+ For compatibility purposes a platform may be defined in multiple ways.
+ Some of these methods are defacto standards for their appropriate
+ platforms. Note that AppWare considers the N_PLAT_xxxx method to be the
+ default.
+
+ (Some of the following are trademarks of their respective companies)
+
+ Microsoft Windows Family - N_PLAT_MSW
+ **************************
+ If N_PLAT_MSW is defined, at least one of the below should be defined;
+ if none is defined, N_PLAT_MSW3 will be forced on.
+ If any of the following are defined, N_PLAT_MSW will be forced on.
+ If N_PLAT_WNT? is defined, N_PLAT_WNT will be forced on.
+ Microsoft Windows 3.x - N_PLAT_MSW3
+ Microsoft Windows 4.x - N_PLAT_MSW4
+ Microsoft Windows NT 3.x - N_PLAT_WNT3
+ Microsoft Windows NT 4.x - N_PLAT_WNT4
+ **************************
+ IBM OS/2 - N_PLAT_OS2
+ DOS - N_PLAT_DOS, NWDOS
+ Novell NetWare NLM - N_PLAT_NLM
+ Macintosh - N_PLAT_MAC
+ Unix - N_PLAT_UNIX
+
+ One of the following architectures will always be defined:
+
+ N_ARCH_16 - 16 bit word size
+ N_ARCH_32 - 32 bit word size
+ N_ARCH_64 - 64 bit word size
+
+ If there is a need to force the natural integer to a specific size
+ use one of the following definitions (like for thunk layers).
+
+ N_FORCE_INT_16 - Force nint and nuint to be 16 bit word size
+ N_FORCE_INT_32 - Force nint and nuint to be 32 bit word size
+
+ Typical combinations are as follows. The preferred defines are the first
+ one in each of the following lines:
+
+ Microsoft Windows (16 bit) - N_PLAT_MSW and N_ARCH_16, NWWIN
+ Microsoft Windows (32 bit) - N_PLAT_MSW and N_ARCH_32, WIN32
+ Microsoft Windows 3.x - N_PLAT_MSW3
+ Microsoft Windows 4.x - N_PLAT_MSW4
+ Microsoft Windows NT - N_PLAT_WNT
+ Microsoft Windows NT 3.x - N_PLAT_WNT3
+ Microsoft Windows NT 4.x - N_PLAT_WNT4
+ IBM OS/2 (16 bit) - N_PLAT_OS2 and N_ARCH_16, NWOS2
+ IBM OS/2 (32 bit) - N_PLAT_OS2 and N_ARCH_32
+ DOS - N_PLAT_DOS, NWDOS
+ Novell NetWare NLM - N_PLAT_NETWARE and N_PLAT_NETWARE
+ Novell NISO NLM - N_PLAT_NIOS and N_PLAT_NIOS
+ Macintosh - N_PLAT_MAC
+ Unix - N_PLAT_UNIX and N_ARCH_32 or N_ARCH_64
+
+ Implied definitions (ntypes.h will create the implied definitions if no
+ additional defines are provided). Variances (ex: N_PLAT_WNT && N_ARCH_16)
+ must be defined explicity:
+
+ Defined Implied
+
+ NWDOS N_PLAT_DOS, N_ARCH_16
+ N_PLAT_DOS NWDOS, N_ARCH_16
+ NWOS2 N_PLAT_OS2, N_ARCH_16
+ N_PLAT_OS2 N_ARCH_32
+ N_PLAT_OS2, N_ARCH_16 NWOS2
+ NWWIN N_PLAT_MSW, N_ARCH_16
+ N_PLAT_MSW N_PLAT_MSW3, N_ARCH_16
+ N_PLAT_MSW, N_ARCH_16 NWWIN, N_PLAT_MSW3
+ N_PLAT_MSW3 N_PLAT_MSW, N_ARCH_16
+ N_PLAT_MSW4 N_PLAT_MSW, N_ARCH_32
+ N_PLAT_WNT N_PLAT_MSW, N_PLAT_WNT3, N_ARCH_32
+ N_PLAT_WNT, N_ARCH_16 NWWIN, N_PLAT_MSW, N_PLAT_WNT3
+ N_PLAT_WNT3 N_PLAT_MSW, N_PLAT_WNT, N_ARCH_32
+ N_PLAT_WNT4 N_PLAT_MSW, N_PLAT_WNT, N_ARCH_32
+ N_PLAT_NLM N_PLAT_NETWARE, N_IAPX386 N_ARCH_32
+ N_PLAT_NETWARE N_PLAT_NLM, N_IAPX386 N_ARCH_32
+ N_PLAT_NIOS N_PLAT_NLM, N_IAPX386 N_ARCH_32
+ N_PLAT_MAC N_ARCH_32
+ N_PLAT_UNIX N_ARCH_32
+
+ Note that the following constants are assumed to be defined for the
+ given circumstances:
+
+ _INC_WINDOWS - Microsoft's WINDOWS.H file has been included.
+ RC_INVOKED - Microsoft's RC resource compiler is currently
+ processing the file.
+
+
+Revision history:
+v1.08
+- Removed inadvertent define of N_EXPORTS for N_PLAT_MSW/N_ARCH_32
+
+v1.07
+- Added auto defines for N_PLAT_NLM:
+ N_PLAT_NLM machine defaults to N_IAPX386 (vs N_PPC).
+ N_PLAT_NLM OS defaults to N_PLAT_NETWARE (vs N_PLAT_NIOS).
+ N_PLAT_NETWARE causes N_PLAT_NLM to be defined.
+ N_PLAT_NIOS causes N_PLAT_NLM to be defined.
+
+v1.06
+- Removed GUI defines.
+- Fixed bug in NGet16/32 and NRead16/32 macros that caused them to swap on
+ N_INT_ENDIAN_HI_LO machines.
+- Cleaned up/reduced macros that were effectively just duplicates of other
+macros with the only difference being how parameters were passed.
+- Cleaned up alignment of macro defines to make them easier to read.
+- Added HiLo/LoHi Get, Set, Read, and Write macros
+
+v1.05
+- Added special pascal type for OS2 under Borland compile.
+- Added Enhanced "endianness" checks for N_PLAT_NLM
+- Changed N_API et.al. under N_PLAT_NLM to use compiler "default" and changed
+N_PASCAL and N_CDECL to be properly defined. This allows forced function
+types when needed.
+- Changed TRUE/FALSE in section 5 to be defined directly, not in terms of
+N_TRUE and N_FALSE.
+- Changed default to NOT include GUI defines. N_INC_GUI must be defined to
+include these now. This section will be removed in v1.06 of NTYPES.H.
+- Broke off large comment at beginning of file into NTYPES.TXT.
+- Added pointers to pointers typedefs.
+- Added sized boolean types.
+Changes to NPACKON.H:
+- Added support for Windows 95 platform
+
+v1.04
+-Added N_..._CALLBACK and N_TYPEDEFs for N_PLAT_NLM
+-Corrected bug in NCopyFrom... macros (they were reversed in functionality)
+-Added support for reading from or writing to unaligned values (NRead... and
+NWrite...)
+-Changed:
+ #if !defined(N_ARCH_64) && \
+ !defined(N_ARCH_32) && \
+ !defined(N_ARCH_16)
+to:
+ #if !defined(N_ARCH_64) && !defined(N_ARCH_32) && !defined(N_ARCH_16)
+to work around a bug in MPW's CFront preprocessor.
+-Changed METROWERKS_C define check to check for __MWERKS__ instead.
+METROWERKS_C is obsolete.
+-Changed N_GLOBAL_LIBRARY and N_EXTERN_LIBRARY to use N_PASCAL instead of
+pascal (which is the purpose of N_PASCAL anyway).
+-Changed platform specific typedefs to use N_HUGE...will probably consolidate
+into platform independent types later.
+-Changed to standardized copyright (smaller)
+-Cosmetic (typo) changes made to introductory comments
+-Changed function definition macros and function pointer type definition
+macros to correctly match document and use the N_CALLBACK, N_CDECL, and
+N_PASCAL defines.
+Changes to NPACKON.H:
+-Added pragma to shut up Visual C compilers so they don't complain about
+changing the alignment.
+
+v1.03
+-Reformat (one time hit, won't happen again); includes removal of embedded
+tabs and consistent indenting to 4,7 "tabbing", consistent use of #if's.
+Various authors have modified this file using different tab stop
+interpretations (some at 4 spaces per tab, some at 3, and some at 8).
+Reading the code was subject to misinterpretations because of differences in
+indentation. Embedded tabs will now be kept out of ntypes.
+-"Fixed" missing section markers and corrected commented documentation on
+sections.
+-Clarified and corrected commented documentation.
+-Added support for N_INC_NO_GUI (don't include GUI structures) so that
+non-interface apps don't need to fill up compiler symbol space.
+-Added automatic defininitions for N_ARCH... and N_PLAT... macros when they
+can be deduced from a single definition. For example, if N_PLAT_DOS is
+defined, N_ARCH_16 is automatically defined if no N_ARCH... macro has yet
+been set.
+-Removed automatic inclusion of Types.h for Mac platform (as stated at the
+beginning of ntypes:
+ "This file is guarenteed NOT to include any other files. It should be
+ placed before any NetWare include files, but after any standard C or
+ platform specific files, such as "windows.h"."
+Types.h should be included before ntypes for Mac code.
+-Added NSwapTo... and NSwapFrom... macros to clarify usage.
+-Renamed NMake32() and NMake16() macro parameters for clarity.
+-Changed use of PASCAL to N_PASCAL as per spec in function macros.
+
+
+v1.02
+- Added support for NLMs
+- Eliminated nbool16 and nbool32 in all Platforms.
+- Fixed bugs in Macintosh PowerPC
+- Added support for OSF on Alpha
+
+v1.01
+- Macintosh compile problems, want to use C calling conventions, not pascal
+(at least for now)
+- Changes in OS/2 Section only to support 32 bit IBM C++ compiler
+- Added support for non-MPW compilers
+
+v1.00
+- Initial release
diff --git a/LoginCapture/windows/external/xplatapi/include/nunicode.h b/LoginCapture/windows/external/xplatapi/include/nunicode.h
new file mode 100644
index 00000000..50885b8d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nunicode.h
@@ -0,0 +1,62 @@
+/******************************************************************************
+
+ %name: nunicode.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:06:59 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1997 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if !defined(NUNICODE_H)
+#define NUNICODE_H
+
+
+#include
+
+ /* For LIBC builds the XPlat libraries use the LIBC unicode and
+ * localization support. LIBC is the next generation of the c-runtime
+ * on NetWare. All other platforms will continue to use unicode.h
+ * NOTE: stddef.h in the LIBC sdk defines __NOVELL_LIBC__
+ *
+ */
+#if defined(__NOVELL_LIBC__)
+
+ #include "unilib.h"
+
+ /* unilib.h doesn't define the following with are used significantly
+ * in the XPlat SDK. Define them for the XPlat SDK.
+ */
+
+ /* NOTE: LibC WinSock2 #defines "unicode" inside ws2defs.h.
+ * If LibC WinSock2 headers have been included, undefine unicode
+ * and typdef it the way XPlat SDK expects it.
+ */
+ #if defined(unicode)
+ #undef unicode
+ #endif
+
+ #ifndef UNICODE_TYPE_DEFINED
+ #define UNICODE_TYPE_DEFINED
+ typedef unicode_t unicode; /* use LibC's unicode_t type */
+ #endif
+
+ typedef unicode * punicode;
+ typedef unicode ** ppunicode;
+
+#else /* All non-LibC builds */
+
+ #include "unicode.h"
+
+#endif /* #if defined(__NOVELL_LIBC__) */
+
+
+#endif /* #if !defined(NUNICODE_H) */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwacct.h b/LoginCapture/windows/external/xplatapi/include/nwacct.h
new file mode 100644
index 00000000..3d7acfd9
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwacct.h
@@ -0,0 +1,105 @@
+/******************************************************************************
+
+ %name: nwacct.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:02 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWACCT_H )
+#define NWACCT_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint32 objectID;
+ nint32 amount;
+} HOLDS_INFO;
+
+typedef struct
+{
+ nuint16 holdsCount;
+ HOLDS_INFO holds[16];
+} HOLDS_STATUS;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetAccountStatus
+(
+ NWCONN_HANDLE conn,
+ nuint16 objType,
+ const nstr8 N_FAR * objName,
+ pnint32 balance,
+ pnint32 limit,
+ HOLDS_STATUS N_FAR * holds
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWQueryAccountingInstalled
+(
+ NWCONN_HANDLE conn,
+ pnuint8 installed
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSubmitAccountCharge
+(
+ NWCONN_HANDLE conn,
+ nuint16 objType,
+ const nstr8 N_FAR * objName,
+ nuint16 serviceType,
+ nint32 chargeAmt,
+ nint32 holdCancelAmt,
+ nuint16 noteType,
+ const nstr8 N_FAR * note
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSubmitAccountHold
+(
+ NWCONN_HANDLE conn,
+ nuint16 objType,
+ const nstr8 N_FAR * objName,
+ nint32 holdAmt
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSubmitAccountNote
+(
+ NWCONN_HANDLE conn,
+ nuint16 objType,
+ const nstr8 N_FAR * objName,
+ nuint16 serviceType,
+ nuint16 noteType,
+ const nstr8 N_FAR * note
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwadevnt.h b/LoginCapture/windows/external/xplatapi/include/nwadevnt.h
new file mode 100644
index 00000000..8368056a
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwadevnt.h
@@ -0,0 +1,778 @@
+/******************************************************************************
+
+ %name: nwadevnt.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:04 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWADEVNT_H )
+#define NWADEVNT_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#include "npackon.h"
+
+/* Bit definitions for volume audit events used in bit map */
+enum auditBitMapIDs
+{
+ /* first 32 (0 - 31)bits reserved for dir service */
+ A_BIT_BIND_CHG_OBJ_SECURITY = 32,
+ A_BIT_BIND_CHG_PROP_SECURITY,
+ A_BIT_BIND_CREATE_OBJ,
+ A_BIT_BIND_CREATE_PROPERTY,
+ A_BIT_BIND_DELETE_OBJ,
+ A_BIT_BIND_DELETE_PROPERTY,
+ A_BIT_CHANGE_DATE_TIME,
+ A_BIT_CHANGE_EQUIVALENCE,
+ A_BIT_CHANGE_SECURITY_GROUP,
+ A_BIT_UCLOSE_FILE,
+ A_BIT_CLOSE_BINDERY,
+ A_BIT_UCREATE_FILE,
+ A_BIT_CREATE_USER,
+ A_BIT_UDELETE_FILE,
+ A_BIT_DELETE_USER,
+ A_BIT_DIR_SPACE_RESTRICTIONS,
+ A_BIT_DISABLE_ACCOUNT,
+ A_BIT_DOWN_SERVER,
+ A_BIT_GRANT_TRUSTEE,
+ A_BIT_INTRUDER_LOCKOUT_CHANGE,
+ A_BIT_LOGIN_USER,
+ A_BIT_LOGIN_USER_FAILURE,
+ A_BIT_LOGOUT_USER,
+ A_BIT_NET_LOGIN,
+ A_BIT_UMODIFY_ENTRY,
+ A_BIT_OPEN_BINDERY,
+ A_BIT_UOPEN_FILE,
+ A_BIT_UREAD_FILE,
+ A_BIT_REMOVE_TRUSTEE,
+ A_BIT_URENAME_MOVE_FILE,
+ A_BIT_RENAME_USER,
+ A_BIT_USALVAGE_FILE,
+ A_BIT_STATION_RESTRICTIONS,
+ A_BIT_CHANGE_PASSWORD,
+ A_BIT_TERMINATE_CONNECTION,
+ A_BIT_UP_SERVER,
+ A_BIT_USER_CHANGE_PASSWORD,
+ A_BIT_USER_LOCKED,
+ A_BIT_USER_SPACE_RESTRICTIONS,
+ A_BIT_USER_UNLOCKED,
+ A_BIT_VOLUME_MOUNT,
+ A_BIT_VOLUME_DISMOUNT,
+ A_BIT_UWRITE_FILE,
+ A_BIT_GOPEN_FILE,
+ A_BIT_GCLOSE_FILE,
+ A_BIT_GCREATE_FILE,
+ A_BIT_GDELETE_FILE,
+ A_BIT_GREAD_FILE,
+ A_BIT_GWRITE_FILE,
+ A_BIT_GRENAME_MOVE_FILE,
+ A_BIT_GMODIFY_ENTRY,
+ A_BIT_IOPEN_FILE,
+ A_BIT_ICLOSE_FILE,
+ A_BIT_ICREATE_FILE,
+ A_BIT_IDELETE_FILE,
+ A_BIT_IREAD_FILE,
+ A_BIT_IWRITE_FILE,
+ A_BIT_IRENAME_MOVE_FILE,
+ A_BIT_IMODIFY_ENTRY,
+ A_BIT_Q_ATTACH_SERVER,
+ A_BIT_Q_CREATE,
+ A_BIT_Q_CREATE_JOB,
+ A_BIT_Q_DESTROY,
+ A_BIT_Q_DETACH_SERVER,
+ A_BIT_Q_EDIT_JOB,
+ A_BIT_Q_JOB_FINISH,
+ A_BIT_Q_JOB_SERVICE,
+ A_BIT_Q_JOB_SERVICE_ABORT,
+ A_BIT_Q_REMOVE_JOB,
+ A_BIT_Q_SET_JOB_PRIORITY,
+ A_BIT_Q_SET_STATUS,
+ A_BIT_Q_START_JOB,
+ A_BIT_Q_SWAP_RIGHTS,
+ A_BIT_NLM_ADD_RECORD,
+ A_BIT_NLM_ADD_ID_RECORD,
+ A_BIT_CLOSE_MODIFIED_FILE,
+ A_BIT_GCREATE_DIRECTORY,
+ A_BIT_ICREATE_DIRECTORY,
+ A_BIT_UCREATE_DIRECTORY,
+ A_BIT_GDELETE_DIRECTORY,
+ A_BIT_IDELETE_DIRECTORY,
+ A_BIT_UDELETE_DIRECTORY, /* 113 */
+ /* Start of Trusted NetWare Auditing */
+ A_BIT_GET_CURRENT_ACCNT_STATS,
+ A_BIT_SUBMIT_ACCOUNT_CHARGE,
+ A_BIT_SUBMIT_ACCOUNT_HOLD,
+ A_BIT_SUBMIT_ACCOUNT_NOTE,
+ A_BIT_DISABLE_BROADCASTS,
+ A_BIT_GET_BROADCAST_MESSAGE,
+ A_BIT_ENABLE_BROADCASTS,
+ A_BIT_BROADCAST_TO_CONSOLE,
+ A_BIT_SEND_BROADCAST_MESSAGE,
+ A_BIT_WRITE_EATTRIB,
+ A_BIT_READ_EATTRIB,
+ A_BIT_ENUM_EATTRIB,
+ A_BIT_SEE_FSO, /* not used */
+ A_BIT_GET_FSO_RIGHTS,
+ A_BIT_PURGE_FILE,
+ A_BIT_SCAN_DELETED,
+ A_BIT_DUPLICATE_EATTRIB,
+ A_BIT_ALLOC_DIR_HANDLE,
+ A_BIT_SET_HANDLE,
+ A_BIT_SEARCH,
+ A_BIT_GEN_DIR_BASE_AND_VOL,
+ A_BIT_OBTAIN_FSO_INFO,
+ A_BIT_GET_REF_COUNT,
+ A_BIT_MODIFY_ENTRY_NO_SRCH, /* not used */
+ A_BIT_SCAN_TRUSTEES,
+ A_BIT_GET_OBJ_EFFECTIVE_RTS,
+ A_BIT_PARSE_TREE,
+ A_BIT_SET_SPOOL_FILE_FLAGS,
+ A_BIT_RESTORE_Q_SERVER_RTS,
+ A_BIT_Q_JOB_SIZE,
+ A_BIT_Q_JOB_LIST,
+ A_BIT_Q_JOB_FROM_FORM_LIST,
+ A_BIT_READ_Q_JOB_ENTRY,
+ A_BIT_MOVE_Q_JOB,
+ A_BIT_READ_Q_STATUS,
+ A_BIT_READ_Q_SERVER_STATUS,
+ A_BIT_EXTENDED_SEARCH,
+ A_BIT_GET_DIR_ENTRY,
+ A_BIT_SCAN_VOL_USER_RESTR,
+ A_BIT_VERIFY_SERIAL,
+ A_BIT_GET_DISK_UTILIZATION,
+ A_BIT_LOG_FILE,
+ A_BIT_SET_COMP_FILE_SZ,
+ A_BIT_DISABLE_LOGIN,
+ A_BIT_ENABLE_LOGIN,
+ A_BIT_DISABLE_TTS,
+ A_BIT_ENABLE_TTS,
+ A_BIT_SEND_CONSOLE_BCAST,
+ A_BIT_GET_REMAIN_OBJ_DISK_SPC,
+ A_BIT_GET_CONN_TASKS,
+ A_BIT_GET_CONN_OPEN_FILES,
+ A_BIT_GET_CONN_USING_FILE,
+ A_BIT_GET_PHYS_REC_LOCKS_CONN,
+ A_BIT_GET_PHYS_REC_LOCKS_FILE,
+ A_BIT_GET_LOG_REC_BY_CONN,
+ A_BIT_GET_LOG_REC_INFO,
+ A_BIT_GET_CONN_SEMS,
+ A_BIT_GET_SEM_INFO,
+ A_BIT_MAP_DIR_TO_PATH,
+ A_BIT_CONVERT_PATH_TO_ENTRY,
+ A_BIT_DESTROY_SERVICE_CONN,
+ A_BIT_SET_Q_SERVER_STATUS,
+ A_BIT_CONSOLE_COMMAND,
+ A_BIT_REMOTE_ADD_NS,
+ A_BIT_REMOTE_DISMOUNT,
+ A_BIT_REMOTE_EXE,
+ A_BIT_REMOTE_LOAD,
+ A_BIT_REMOTE_MOUNT,
+ A_BIT_REMOTE_SET,
+ A_BIT_REMOTE_UNLOAD,
+ A_BIT_GET_CONN_RANGE,
+ A_BIT_GET_VOL_LABEL,
+ A_BIT_SET_VOL_LABEL,
+ A_BIT_FAILED_MASV_ACCESS
+};
+
+/* The following is used for Volume Auditing Events */
+typedef struct tagNWVolAuditRecord
+{
+ nuint16 eventTypeID;
+ nuint16 chkWord;
+ nuint32 connectionID;
+ nuint32 processUniqueID;
+ nuint32 successFailureStatusCode;
+ nuint16 dosDate;
+ nuint16 dosTime;
+/* nuint8 extra[0]; start of 'union EventUnion' */
+}NWVolumeAuditRcd, N_FAR *pNWVolumeAuditRcd;
+
+/* auditing events that are returned in the AuditRecord eventTypeID field */
+enum auditedEventIDs
+{
+ A_EVENT_BIND_CHG_OBJ_SECURITY = 1,
+ A_EVENT_BIND_CHG_PROP_SECURITY = 2,
+ A_EVENT_BIND_CREATE_OBJ = 3,
+ A_EVENT_BIND_CREATE_PROPERTY = 4,
+ A_EVENT_BIND_DELETE_OBJ = 5,
+ A_EVENT_BIND_DELETE_PROPERTY = 6,
+ A_EVENT_CHANGE_DATE_TIME = 7,
+ A_EVENT_CHANGE_EQUIVALENCE = 8,
+ A_EVENT_CHANGE_SECURITY_GROUP = 9,
+ A_EVENT_CLOSE_FILE = 10,
+ A_EVENT_CLOSE_BINDERY = 11,
+ A_EVENT_CREATE_FILE = 12,
+ A_EVENT_CREATE_USER = 13,
+ A_EVENT_DELETE_FILE = 14,
+ A_EVENT_DELETE_USER = 15,
+ A_EVENT_DIR_SPACE_RESTRICTIONS = 16,
+ A_EVENT_DISABLE_ACCOUNT = 17,
+ A_EVENT_DOWN_SERVER = 18,
+ A_EVENT_GRANT_TRUSTEE = 19,
+ A_EVENT_INTRUDER_LOCKOUT_CHNG = 20,
+ A_EVENT_LOGIN_USER = 21,
+ A_EVENT_LOGIN_USER_FAILURE = 22,
+ A_EVENT_LOGOUT_USER = 23,
+ A_EVENT_NET_LOGIN = 24,
+ A_EVENT_MODIFY_ENTRY = 25,
+ A_EVENT_OPEN_BINDERY = 26,
+ A_EVENT_OPEN_FILE = 27,
+ A_EVENT_Q_ATTACH_SERVER = 28,
+ A_EVENT_Q_CREATE = 29,
+ A_EVENT_Q_CREATE_JOB = 30,
+ A_EVENT_Q_DESTROY = 31,
+ A_EVENT_Q_DETACH_SERVER = 32,
+ A_EVENT_Q_EDIT_JOB = 33,
+ A_EVENT_Q_JOB_FINISH = 34,
+ A_EVENT_Q_JOB_SERVICE = 35,
+ A_EVENT_Q_JOB_SERVICE_ABORT = 36,
+ A_EVENT_Q_REMOVE_JOB = 37,
+ A_EVENT_Q_SET_JOB_PRIORITY = 38,
+ A_EVENT_Q_SET_STATUS = 39,
+ A_EVENT_Q_START_JOB = 40,
+ A_EVENT_Q_SWAP_RIGHTS = 41,
+ A_EVENT_READ_FILE = 42,
+ A_EVENT_REMOVE_TRUSTEE = 43,
+ A_EVENT_RENAME_MOVE_FILE = 44,
+ A_EVENT_RENAME_USER = 45,
+ A_EVENT_SALVAGE_FILE = 46,
+ A_EVENT_STATION_RESTRICTIONS = 47,
+ A_EVENT_CHANGE_PASSWORD = 48,
+ A_EVENT_TERMINATE_CONNECTION = 49,
+ A_EVENT_UP_SERVER = 50,
+ A_EVENT_USER_CHANGE_PASSWORD = 51,
+ A_EVENT_USER_LOCKED = 52,
+ A_EVENT_USER_SPACE_RESTRICTION = 53,
+ A_EVENT_USER_UNLOCKED = 54,
+ A_EVENT_VOLUME_MOUNT = 55,
+ A_EVENT_VOLUME_DISMOUNT = 56,
+ A_EVENT_WRITE_FILE = 57,
+ A_ACTIVE_CONNECTION_RCD = 58,
+ A_ADD_AUDITOR_ACCESS = 59,
+ A_ADD_AUDIT_PROPERTY = 60,
+ A_CHANGE_AUDIT_PASSWORD = 61,
+ A_DELETE_AUDIT_PROPERTY = 62,
+ A_DISABLE_VOLUME_AUDIT = 63,
+ A_OPEN_FILE_HANDLE_RCD = 64,
+ A_ENABLE_VOLUME_AUDITING = 65,
+ A_REMOVE_AUDITOR_ACCESS = 66,
+ A_RESET_AUDIT_FILE = 67,
+ A_RESET_AUDIT_FILE2 = 68,
+ A_RESET_CONFIG_FILE = 69,
+ A_WRITE_AUDIT_BIT_MAP = 70,
+ A_WRITE_AUDIT_CONFIG_HDR = 71,
+ A_NLM_ADD_RECORD = 72,
+ A_ADD_NLM_ID_RECORD = 73,
+ A_CHANGE_AUDIT_PASSWORD2 = 74,
+ A_EVENT_CREATE_DIRECTORY = 75,
+ A_EVENT_DELETE_DIRECTORY = 76,
+ A_INTRUDER_DETECT = 77,
+ A_VOLUME_NAME_RCD = 78,
+ A_BEGIN_AUDIT_FILE_READ = 79,
+ A_VOLUME_NAME_RCD_2 = 80,
+ A_DELETE_OLD_AUDIT_FILE = 81,
+ A_QUERY_AUDIT_STATUS = 82,
+
+ /* begin TNW changes */
+
+ A_EVENT_GET_CURRENT_ACNT_STATS = 200,
+ A_EVENT_SUBMIT_ACCOUNT_CHARGE = 201,
+ A_EVENT_SUBMIT_ACCOUNT_HOLD = 202,
+ A_EVENT_SUBMIT_ACCOUNT_NOTE = 203,
+ A_EVENT_DISABLE_BROADCASTS = 204,
+ A_EVENT_GET_BROADCAST_MESSAGE = 205,
+ A_EVENT_ENABLE_BROADCASTS = 206,
+ A_EVENT_BROADCAST_TO_CONSOLE = 207,
+ A_EVENT_SEND_BROADCAST_MESSAGE = 208,
+ A_EVENT_WRITE_EATTRIB = 209,
+ A_EVENT_READ_EATTRIB = 210,
+ A_EVENT_ENUM_EATTRIB = 211,
+ A_EVENT_SEE_FSO = 212, /* not used */
+ A_EVENT_GET_FSO_RIGHTS = 213,
+ A_EVENT_PURGE_FILE = 214,
+ A_EVENT_SCAN_DELETED = 215,
+ A_EVENT_DUPLICATE_EATTRIB = 216,
+ A_EVENT_ALLOC_DIR_HANDLE = 217,
+ A_EVENT_SET_HANDLE = 218,
+ A_EVENT_SEARCH = 219,
+ A_EVENT_GEN_DIR_BASE_AND_VOL = 220,
+ A_EVENT_OBTAIN_FSO_INFO = 221,
+ A_EVENT_GET_REF_COUNT = 222,
+ A_EVENT_MODIFY_ENTRY_NO_SEARCH = 223,
+ A_EVENT_SCAN_TRUSTEES = 224,
+ A_EVENT_GET_OBJ_EFFECTIVE_RGHT = 225,
+ A_EVENT_PARSE_TREE = 226,
+ A_EVENT_SET_SPOOL_FILE_FLAGS = 227,
+ A_EVENT_RESTORE_Q_SERVER_RGHT = 228,
+ A_EVENT_Q_JOB_SIZE = 229,
+ A_EVENT_Q_JOB_LIST = 230,
+ A_EVENT_Q_JOB_FROM_FORM_LIST = 231,
+ A_EVENT_READ_Q_JOB_ENTRY = 232,
+ A_EVENT_MOVE_Q_JOB = 233,
+ A_EVENT_READ_Q_STATUS = 234,
+ A_EVENT_READ_Q_SERVER_STATUS = 235,
+ A_EVENT_EXTENDED_SEARCH = 236,
+ A_EVENT_GET_DIR_ENTRY = 237,
+ A_EVENT_SCAN_VOL_USER_RESTR = 238,
+ A_EVENT_VERIFY_SERIAL = 239,
+ A_EVENT_GET_DISK_UTILIZATION = 240,
+ A_EVENT_LOG_FILE = 241,
+ A_EVENT_SET_COMP_FILE_SZ = 242,
+ A_EVENT_DISABLE_LOGIN = 243,
+ A_EVENT_ENABLE_LOGIN = 244,
+ A_EVENT_DISABLE_TTS = 245,
+ A_EVENT_ENABLE_TTS = 246,
+ A_EVENT_SEND_CONSOLE_BROADCAST = 247,
+ A_EVENT_GET_REMAIN_OBJ_DISK_SPC = 248,
+ A_EVENT_GET_CONN_TASKS = 249,
+ A_EVENT_GET_CONN_OPEN_FILES = 250,
+ A_EVENT_GET_CONN_USING_FILE = 251,
+ A_EVENT_GET_PHYS_REC_LOCKS_CONN = 252,
+ A_EVENT_GET_PHYS_REC_LOCKS_FILE = 253,
+ A_EVENT_GET_LOG_REC_BY_CONN = 254,
+ A_EVENT_GET_LOG_REC_INFO = 255,
+ A_EVENT_GET_CONN_SEMS = 256,
+ A_EVENT_GET_SEM_INFO = 257,
+ A_EVENT_MAP_DIR_TO_PATH = 258,
+ A_EVENT_CONVERT_PATH_TO_ENTRY = 259,
+ A_EVENT_DESTROY_SERVICE_CONN = 260,
+ A_EVENT_SET_Q_SERVER_STATUS = 261,
+ A_EVENT_CONSOLE_COMMAND = 262,
+ A_EVENT_REMOTE_ADD_NS = 263,
+ A_EVENT_REMOTE_DISMOUNT = 264,
+ A_EVENT_REMOTE_EXE = 265,
+ A_EVENT_REMOTE_LOAD = 266,
+ A_EVENT_REMOTE_MOUNT = 267,
+ A_EVENT_REMOTE_SET = 268,
+ A_EVENT_REMOTE_UNLOAD = 269,
+ A_EVENT_GET_CONN_RANGE = 270,
+ A_EVENT_GET_VOL_LABEL = 271,
+ A_EVENT_SET_VOL_LABEL = 272,
+ A_EVENT_FAILED_MASV_ACCESS = 273,
+ A_EVENT_LAST_PLUS_ONE = 274
+};
+
+typedef struct tagNWModifyStructure
+{
+ nuint8 *MModifyName;
+ nuint32 MFileAttributes;
+ nuint32 MFileAttributesMask;
+ nuint16 MCreateDate;
+ nuint16 MCreateTime;
+ nuint32 MOwnerID;
+ nuint16 MLastArchivedDate;
+ nuint16 MLastArchivedTime;
+ nuint32 MLastArchivedID;
+ nuint16 MLastUpdatedDate; /* also last modified date and time. */
+ nuint16 MLastUpdatedTime;
+ nuint32 MLastUpdatedID;
+ nuint16 MLastAccessedDate;
+ nuint16 MInheritanceGrantMask;
+ nuint16 MInheritanceRevokeMask;
+ nuint32 MMaximumSpace;
+} NWModifyStructure, N_FAR *pNWModifyStructure;
+
+#ifndef MModifyNameBit
+#define MModifyNameBit 0x0001L
+#define MFileAttributesBit 0x0002L
+#define MCreateDateBit 0x0004L
+#define MCreateTimeBit 0x0008L
+#define MOwnerIDBit 0x0010L
+#define MLastArchivedDateBit 0x0020L
+#define MLastArchivedTimeBit 0x0040L
+#define MLastArchivedIDBit 0x0080L
+#define MLastUpdatedDateBit 0x0100L
+#define MLastUpdatedTimeBit 0x0200L
+#define MLastUpdatedIDBit 0x0400L
+#define MLastAccessedDateBit 0x0800L
+#define MInheritedRightsMaskBit 0x1000L
+#define MMaximumSpaceBit 0x2000L
+#endif
+
+union EventUnion
+{
+ struct eventChgDate
+ {
+ nuint32 newDosDateTime;
+ } EChgDate;
+
+ struct eventCreateUser
+ {
+ nuint32 userID;
+ nuint8 name[1];
+ } ECreateUser;
+
+ struct eventBindChgSecurity
+ {
+ nuint32 newSecurity;
+ nuint32 oldSecurity;
+ nuint8 name[1];
+ } EBindChgSecurity;
+
+ struct eventBindChgSecGrp
+ {
+ nuint32 addFlag;
+ nuint8 objName[1]; /* obj name */
+ nuint8 name[1]; /* member name */
+ } EBindChgSecGrp;
+
+ struct eventBindCreateObj
+ {
+ nuint32 objectID;
+ nuint32 security;
+ nuint8 name[1];
+ } EBindCreateObj;
+
+ struct eventBindCreateProp
+ {
+ nuint32 security;
+ nuint8 name[1];
+ } EBindCreateProp;
+
+ struct eventBindDeleteProp
+ {
+ nuint8 name[1];
+ } EBindDeleteProp;
+
+ struct eventIntruderLockoutChg
+ {
+ nuint8 hbaa; /* nuint8 exchanged allowed attempts */
+ nuint8 lbaa;
+ nuint8 hbrm; /* reset minutes */
+ nuint8 lbrm;
+ nuint8 hblm; /* lock minutes */
+ nuint8 lblm;
+ } EILockChg;
+
+ struct eventLogin
+ {
+ nuint32 userID;
+ nuint8 networkAddressType;
+ nuint8 networkAddressLength;
+ nuint8 networkAddress[1]; /* variable length */
+ nuint8 name[1];
+ } ELogin;
+
+
+ struct eventChgPasswd
+ {
+ nuint8 name[1]; /* object or user name */
+ } EChgPasswd;
+
+ struct eventChgSecurity
+ {
+ nuint32 newSecurity;
+ nuint32 oldSecurity;
+ nuint8 name[1];
+ } EChgSecurity;
+
+ struct eventFDelete
+ {
+ nuint32 nameSpace;
+ nuint8 fileName[1];
+ } EFDelete;
+
+ struct eventFOpen
+ {
+ nuint32 handle;
+ nuint32 rights;
+ nuint32 nameSpace;
+ nuint8 fileName[1];
+ } EFOpen;
+
+ struct eventFClose
+ {
+ nuint32 handle;
+ nuint32 modified;
+ } EFClose;
+
+ struct eventFRead
+ {
+ nuint32 handle;
+ nuint32 byteCount;
+ nuint32 offset;
+ } EFRead;
+
+ struct eventAuditProperty
+ {
+ nuint8 name[1];
+ } EAuditProperty;
+
+ struct eventModify /* modify dir entry */
+ {
+ nuint32 modifyBits;
+ nuint32 nameSpace;
+ nuint8 modifyStruct[ sizeof(NWModifyStructure) ];
+ nuint8 fileName[1];
+ /* the following length preceeded strings are optional
+ as defined by the modify bits */
+ nuint8 oldDosName[1];
+ nuint8 newOwner[1];
+ nuint8 lastArchivedBy[1];
+ nuint8 lastModifiedBy[1];
+ } EModify;
+
+ struct eventQAttach
+ {
+ nuint8 qname[1];
+ } EQAttach;
+
+ struct eventQCreate
+ {
+ nuint32 qType;
+ nuint8 fileName[1];
+ } EQCreate;
+
+ struct eventQJobService
+ {
+ nuint32 tType;
+ nuint8 qname[1];
+ } EQJobService;
+
+ struct eventQSetStatus
+ {
+ nuint32 status;
+ nuint8 qname[1];
+ } EQSetStatus;
+
+ struct eventStationRestrictions
+ {
+ nuint8 name[1];
+ nuint8 netAddress[1];
+ } EStnRestrictions;
+
+ struct eventTrustee
+ {
+ nuint32 trusteeID;
+ nuint32 rights;
+ nuint32 nameSpace;
+ nuint8 trusteeName[1];
+ nuint8 fileName[1];
+ } ETrustee;
+
+ struct eventTrusteeSpace
+ {
+ nuint32 spaceValue;
+ nuint8 trusteeName[1];
+ } ETSpace;
+
+ struct auditingNLMAddRecord
+ {
+ nuint32 recordTypeID;
+ nuint32 dataLen;
+ nuint8 userName[1];
+ nuint8 data[1];
+ } ENLMRecord;
+};
+
+/* The following is used for Directory Services Auditing Events */
+typedef struct tagNWContAuditRecord
+{
+ nuint16 replicaNumber;
+ nuint16 eventTypeID;
+ nuint32 recordNumber;
+ nuint32 dosDateTime;
+ nuint32 userID;
+ nuint32 processUniqueID;
+ nuint32 successFailureStatusCode;
+/* nuint8 extra[0]; start of 'union EventUnion' */
+}NWContAuditRecord, N_FAR *pNWContAuditRecord;
+
+/* Audit event bit definitions for Container Auditing */
+#define ADS_BIT_ADD_ENTRY 1 /* first bit no. is 1 */
+#define ADS_BIT_REMOVE_ENTRY 2
+#define ADS_BIT_RENAME_OBJECT 3
+#define ADS_BIT_MOVE_ENTRY 4
+#define ADS_BIT_CHANGE_SECURITY_EQUIV 5
+#define ADS_BIT_CHG_SECURITY_ALSO_EQUAL 6
+#define ADS_BIT_CHANGE_ACL 7
+#define ADS_BIT_CHG_STATION_RESTRICTION 8
+#define ADS_BIT_LOGIN 9
+#define ADS_BIT_LOGOUT 10
+#define ADS_BIT_CHANGE_PASSWORD 11
+#define ADS_BIT_USER_LOCKED 12
+#define ADS_BIT_USER_UNLOCKED 13
+#define ADS_BIT_USER_DISABLE 14
+#define ADS_BIT_USER_ENABLE 15
+#define ADS_BIT_CHANGE_INTRUDER_DETECT 16
+
+#define ADS_BIT_ADD_PARTITION 17
+#define ADS_BIT_REMOVE_PARTITION 18
+#define ADS_BIT_ADD_REPLICA 19
+#define ADS_BIT_REMOVE_REPLICA 20
+
+#define ADS_BIT_SPLIT_PARTITION 21
+#define ADS_BIT_JOIN_PARTITIONS 22
+#define ADS_BIT_CHANGE_REPLICA_TYPE 23
+#define ADS_BIT_REPAIR_TIME_STAMPS 24
+#define ADS_BIT_MOVE_SUB_TREE 25
+#define ADS_BIT_ABORT_PARTITION_OP 26
+#define ADS_BIT_SEND_REPLICA_UPDATES 27
+#define ADS_BIT_RECEIVE_REPLICA_UPDATES 28
+
+/* Added for Trusted NetWare auditing */
+#define ADS_BIT_ADD_MEMBER 29
+#define ADS_BIT_BACKUP_ENTRY 30
+#define ADS_BIT_CHANGE_BIND_OBJ_SECUR 31
+#define ADS_BIT_CHANGE_PROP_SECURITY 32
+#define ADS_BIT_CHANGE_TREE_NAME 33
+#define ADS_BIT_CHECK_CONSOLE_OPERATOR 34
+#define ADS_BIT_COMPARE_ATTR_VALUE 35
+#define ADS_BIT_CREATE_PROPERTY 36
+#define ADS_BIT_CREATE_SUBORDINATE_REF 37
+#define ADS_BIT_DEFINE_ATTR_DEF 38
+#define ADS_BIT_DEFINE_CLASS_DEF 39
+#define ADS_BIT_DELETE_MEMBER 40
+#define ADS_BIT_DELETE_PROPERTY 41
+#define ADS_BIT_DS_NCP_RELOAD 42
+#define ADS_BIT_RESET_DS_COUNTERS 43
+#define ADS_BIT_FRAG_REQUEST 44
+#define ADS_BIT_INSPECT_ENTRY 45
+#define ADS_BIT_LIST_CONTAINABLE_CLASS 46
+#define ADS_BIT_LIST_PARTITIONS 47
+#define ADS_BIT_LIST_SUBORDINATES 48
+#define ADS_BIT_MERGE_TREE 49
+#define ADS_BIT_MODIFY_CLASS_DEF 50
+#define ADS_BIT_MOVE_TREE 51
+#define ADS_BIT_OPEN_STREAM 52
+#define ADS_BIT_READ 53
+#define ADS_BIT_READ_REFERENCES 54
+#define ADS_BIT_REMOVE_ATTR_DEF 55
+#define ADS_BIT_REMOVE_CLASS_DEF 56
+#define ADS_BIT_REMOVE_ENTRY_DIR 57
+#define ADS_BIT_RESTORE_ENTRY 58
+#define ADS_BIT_START_JOIN 59
+#define ADS_BIT_START_UPDATE_REPLICA 60
+#define ADS_BIT_START_UPDATE_SCHEMA 61
+#define ADS_BIT_SYNC_PARTITION 62
+#define ADS_BIT_SYNC_SCHEMA 63
+#define ADS_BIT_UPDATE_REPLICA 64
+#define ADS_BIT_UPDATE_SCHEMA 65
+#define ADS_BIT_VERIFY_PASSWORD 66
+#define ADS_BIT_ABORT_JOIN 67
+#define ADS_BIT_RESEND_ENTRY 68
+#define ADS_BIT_MUTATE_ENTRY 69
+#define ADS_BIT_MERGE_ENTRIES 70
+#define ADS_BIT_END_UPDATE_REPLICA 71
+#define ADS_BIT_END_UPDATE_SCHEMA 72
+#define ADS_BIT_CREATE_BACKLINK 73
+#define ADS_BIT_MODIFY_ENTRY 74
+#define ADS_BIT_REMOVE_BACKLINK 75
+#define ADS_BIT_NEW_SCHEMA_EPOCH 76
+#define ADS_BIT_CLOSE_BINDERY 77
+#define ADS_BIT_OPEN_BINDERY 78
+#define ADS_BIT_NLM_FIRST 89
+#define ADS_BIT_NLS_NLM 89
+#define ADS_BIT_NLM_LAST 99
+
+
+/* Audit Event ID for Container Audit Events */
+
+#define ADS_ADD_ENTRY 101 /* unsigned long newEntryID */
+#define ADS_REMOVE_ENTRY 102 /* unsigned long oldEntryID */
+#define ADS_RENAME_OBJECT 103 /* unsigned long renamedEntryID, char *oldRDN */
+#define ADS_MOVE_ENTRY 104 /* unsigned long movedEntryID, char *oldDN */
+#define ADS_CHANGE_SECURITY_EQUIV 105
+#define ADS_CHG_SECURITY_ALSO_EQUAL 106
+#define ADS_CHANGE_ACL 107
+#define ADS_CHG_STATION_RESTRICTION 108
+#define ADS_LOGIN 109 /* unsigned long entryID */
+#define ADS_LOGOUT 110
+#define ADS_CHANGE_PASSWORD 111 /* unsigned long entryID */
+#define ADS_USER_LOCKED 112 /* unsigned long entryID */
+#define ADS_USER_UNLOCKED 113 /* unsigned long entryID */
+#define ADS_USER_DISABLE 114 /* unsigned long entryID */
+#define ADS_USER_ENABLE 115 /* unsigned long entryID */
+#define ADS_CHANGE_INTRUDER_DETECT 116
+#define ADS_ADD_PARTITION 117
+#define ADS_REMOVE_PARTITION 118
+#define ADS_ADD_REPLICA 119
+#define ADS_REMOVE_REPLICA 120
+#define ADS_SPLIT_PARTITION 121
+#define ADS_JOIN_PARTITIONS 122
+#define ADS_CHANGE_REPLICA_TYPE 123
+#define ADS_REPAIR_TIME_STAMPS 124
+#define ADS_MOVE_SUB_TREE 125
+#define ADS_ABORT_PARTITION_OP 126
+#define ADS_SEND_REPLICA_UPDATES 127
+#define ADS_RECEIVE_REPLICA_UPDATES 128
+
+/* start Trusted NetWare auditing events */
+#define ADS_ADD_MEMBER 129
+#define ADS_BACKUP_ENTRY 130
+#define ADS_CHANGE_BIND_OBJ_SECURITY 131
+#define ADS_CHANGE_PROP_SECURITY 132
+#define ADS_CHANGE_TREE_NAME 133
+#define ADS_CHECK_CONSOLE_OPERATOR 134
+#define ADS_COMPARE_ATTR_VALUE 135
+#define ADS_CREATE_PROPERTY 136
+#define ADS_CREATE_SUBORDINATE_REF 137
+#define ADS_DEFINE_ATTR_DEF 138
+#define ADS_DEFINE_CLASS_DEF 139
+#define ADS_DELETE_MEMBER 140
+#define ADS_DELETE_PROPERTY 141
+#define ADS_DS_NCP_RELOAD 142
+#define ADS_RESET_DS_COUNTERS 143
+#define ADS_FRAG_REQUEST 144
+#define ADS_INSPECT_ENTRY 145
+#define ADS_LIST_CONTAINABLE_CLASSES 146
+#define ADS_LIST_PARTITIONS 147
+#define ADS_LIST_SUBORDINATES 148
+#define ADS_MERGE_TREE 149
+#define ADS_MODIFY_CLASS_DEF 150
+#define ADS_MOVE_TREE 151
+#define ADS_OPEN_STREAM 152
+#define ADS_READ 153
+#define ADS_READ_REFERENCES 154
+#define ADS_REMOVE_ATTR_DEF 155
+#define ADS_REMOVE_CLASS_DEF 156
+#define ADS_REMOVE_ENTRY_DIR 157
+#define ADS_RESTORE_ENTRY 158
+#define ADS_START_JOIN 159
+#define ADS_START_UPDATE_REPLICA 160
+#define ADS_START_UPDATE_SCHEMA 161
+#define ADS_SYNC_PARTITION 162
+#define ADS_SYNC_SCHEMA 163
+#define ADS_UPDATE_REPLICA 164
+#define ADS_UPDATE_SCHEMA 165
+#define ADS_VERIFY_PASSWORD 166
+#define ADS_ABORT_JOIN 167
+#define ADS_MUTATE_ENTRY 169
+#define ADS_MERGE_ENTRIES 170
+
+#define ADS_END_UPDATE_REPLICA 171
+#define ADS_END_UPDATE_SCHEMA 172
+#define ADS_CREATE_BACKLINK 173
+#define ADS_MODIFY_ENTRY 174
+#define ADS_REMOVE_BACKLINK 175
+#define ADS_NEW_SCHEMA_EPOCH 176
+#define ADS_CLOSE_BINDERY 177
+#define ADS_OPEN_BINDERY 178
+#define ADS_CLOSE_STREAM 179
+/*
+ 180 - 188 reserved
+*/
+#define ADS_NLM_FIRST 189
+#define ADS_NLS_NLM 189
+#define ADS_NLM_LAST 199
+#define ADS_LAST_PLUS_ONE 200 /* Must be last one */
+/* end TNW additions */
+
+
+#include "npackoff.h"
+#endif /* NWADEVNT_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwafp.h b/LoginCapture/windows/external/xplatapi/include/nwafp.h
new file mode 100644
index 00000000..0390a20f
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwafp.h
@@ -0,0 +1,306 @@
+/******************************************************************************
+
+ %name: nwafp.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:06 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWAFP_H )
+#define NWAFP_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** This is the structure that the application expects to see. Note that the
+ long name and short name will be null terminated, and one extra byte has
+ been added to long name and short name to assure word alignment **/
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 parentID;
+ nuint16 attributes;
+ nuint32 dataForkLength;
+ nuint32 resourceForkLength;
+ nuint16 numOffspring;
+ nuint16 creationDate;
+ nuint16 accessDate;
+ nuint16 modifyDate;
+ nuint16 modifyTime;
+ nuint16 backupDate;
+ nuint16 backupTime;
+ nuint8 finderInfo[32];
+ nstr8 longName[34];
+ nuint32 ownerID;
+ nstr8 shortName[14];
+ nuint16 accessPrivileges;
+ nuint8 proDOSInfo[6];
+} AFPFILEINFO, NW_AFP_FILE_INFO;
+
+/** This is the structure that is actually returned from the NCP call **/
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 parentID;
+ nuint16 attributes;
+ nuint32 dataForkLength;
+ nuint32 resourceForkLength;
+ nuint16 numOffspring;
+ nuint16 creationDate;
+ nuint16 accessDate;
+ nuint16 modifyDate;
+ nuint16 modifyTime;
+ nuint16 backupDate;
+ nuint16 backupTime;
+ nuint8 finderInfo[32];
+ nstr8 longName[32];
+ nuint32 ownerID;
+ nstr8 shortName[12];
+ nuint16 accessPrivileges;
+ nuint8 proDOSInfo[6];
+} RECPKT_AFPFILEINFO;
+
+typedef struct
+{
+ nuint16 attributes;
+ nuint16 creationDate;
+ nuint16 accessDate;
+ nuint16 modifyDate;
+ nuint16 modifyTime;
+ nuint16 backupDate;
+ nuint16 backupTime;
+ nuint8 finderInfo[32];
+ nuint8 proDOSInfo[6];
+} AFPSETINFO, NW_AFP_SET_INFO;
+
+
+/* the following are the constants that can be used for requestMasks
+ in NWAFPScanFileInformation and NWAFPGetFileInformation.
+*/
+#ifndef AFP_GET_ATTRIBUTES
+#define AFP_GET_ATTRIBUTES 0x0001
+#define AFP_GET_PARENT_ID 0x0002
+#define AFP_GET_CREATE_DATE 0x0004
+#define AFP_GET_ACCESS_DATE 0x0008
+#define AFP_GET_MODIFY_DATETIME 0x0010
+#define AFP_GET_BACKUP_DATETIME 0x0020
+#define AFP_GET_FINDER_INFO 0x0040
+#define AFP_GET_LONG_NAME 0x0080
+#define AFP_GET_ENTRY_ID 0x0100
+#define AFP_GET_DATA_LEN 0x0200
+#define AFP_GET_RESOURCE_LEN 0x0400
+#define AFP_GET_NUM_OFFSPRING 0x0800
+#define AFP_GET_OWNER_ID 0x1000
+#define AFP_GET_SHORT_NAME 0x2000
+#define AFP_GET_ACCESS_RIGHTS 0x4000
+#define AFP_GET_PRO_DOS_INFO 0x8000
+#define AFP_GET_ALL 0xffff
+#endif
+
+/*
+ The following constants are used for NWAFPSetFileInformation
+*/
+#ifndef AFP_SET_ATTRIBUTES
+#define AFP_SET_ATTRIBUTES 0x0001
+#define AFP_SET_CREATE_DATE 0x0004
+#define AFP_SET_ACCESS_DATE 0x0008
+#define AFP_SET_MODIFY_DATETIME 0x0010
+#define AFP_SET_BACKUP_DATETIME 0x0020
+#define AFP_SET_FINDER_INFO 0x0040
+#define AFP_SET_PRO_DOS_INFO 0x8000
+#endif
+
+#ifndef AFP_SA_HIDDEN
+#define AFP_SA_NORMAL 0x0000
+#define AFP_SA_HIDDEN 0x0100
+#define AFP_SA_SYSTEM 0x0200
+#define AFP_SA_SUBDIR 0x0400
+#define AFP_SA_FILES 0x0800
+#define AFP_SA_ALL 0x0F00
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPAllocTemporaryDirHandle
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ const nstr8 N_FAR * AFPPathString,
+ NWDIR_HANDLE N_FAR * dirHandle,
+ pnuint8 accessRights
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPCreateDirectory
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ pnuint8 finderInfo,
+ pnstr8 AFPPathString,
+ pnuint32 newAFPEntryID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPCreateFile
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ nuint8 delExistingFile,
+ pnuint8 finderInfo,
+ pnstr8 AFPPathString,
+ pnuint32 newAFPEntryID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPDelete
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ const nstr8 N_FAR * AFPPathString
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPGetEntryIDFromName
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ const nstr8 N_FAR * AFPPathString,
+ pnuint32 newAFPEntryID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPGetEntryIDFromHandle
+(
+ NWCONN_HANDLE conn,
+ const nuint8 N_FAR * NWHandle,
+ pnuint16 volNum,
+ pnuint32 AFPEntryID,
+ pnuint8 forkIndicator
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPGetEntryIDFromPathName
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint32 AFPEntryID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPGetFileInformation
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ nuint16 reqMask,
+ const nstr8 N_FAR * AFPPathString,
+ nuint16 structSize,
+ NW_AFP_FILE_INFO N_FAR * AFPFileInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPDirectoryEntry
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPOpenFileFork
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ nuint8 forkIndicator,
+ nuint8 accessMode,
+ const nstr8 N_FAR * AFPPathString,
+ pnuint32 fileID,
+ pnuint32 forkLength,
+ pnuint8 NWHandle,
+ NWFILE_HANDLE N_FAR * DOSFileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPRename
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPSourceEntryID,
+ nuint32 AFPDestEntryID,
+ const nstr8 N_FAR * AFPSrcPath,
+ const nstr8 N_FAR * AFPDstPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPScanFileInformation
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPEntryID,
+ pnuint32 AFPLastSeenID,
+ nuint16 searchMask,
+ nuint16 reqMask,
+ const nstr8 N_FAR * AFPPathString,
+ nuint16 structSize,
+ NW_AFP_FILE_INFO N_FAR * AFPFileInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPSetFileInformation
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 AFPBaseID,
+ nuint16 reqMask,
+ const nstr8 N_FAR * AFPPathString,
+ nuint16 structSize,
+ NW_AFP_SET_INFO N_FAR * AFPSetInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPSupported
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAFPASCIIZToLenStr
+(
+ pnstr8 pbstrDstStr,
+ const nstr8 N_FAR * pbstrSrcStr
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwalias.h b/LoginCapture/windows/external/xplatapi/include/nwalias.h
new file mode 100644
index 00000000..95cd9e84
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwalias.h
@@ -0,0 +1,329 @@
+/******************************************************************************
+
+ %name: nwalias.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:08 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWALIAS_H )
+#define NWALIAS_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#define FILE_ATTRIBUTES_MASK nuint32
+#define NWACCESS_MODE nuint8
+#define NWACCESS_RIGHTS nuint8
+#define NWACCT_BALANCE nint32
+#define NWACCT_HOLDS nuint16
+#define NWACCT_LIMIT nint32
+#define NWADDR_LEN nuint8
+#define NWADDR_TYPE nuint8
+#define NWAES_COUNT nuint16
+#define NWAFP_ACCESS_PRIVILEGES nuint16
+#define NWAFP_ENTRY_ID nuint32
+#define NWAFP_FILE_ATTRIBUTES nuint16
+#define NWAFP_FILE_INFO AFPFILEINFO
+#define NWAFP_FORK_LEN nuint32
+#define NWAFP_NUM_OFFSPRING nuint16
+#define NWAFP_SET_INFO AFPSETINFO
+#define NWAPP_NUM nuint16
+#define NWASN1_ID Asn1ID_T
+#define NWATTR nuint32
+#define NWATTRIBUTES nuint32
+#define NWATTR_INFO Attr_Info_T
+#define NWAUDIT_BUF_SIZE nuint16
+#define NWAUDIT_CONN_ID nuint32
+#define NWAUDIT_CONTAINER_BIT_MAP nuint32
+#define NWAUDIT_DATA_LEN nuint32
+#define NWAUDIT_DATE_TIME nuint32
+#define NWAUDIT_DS_FLAG nint16
+#define NWAUDIT_EVENT nuint16
+#define NWAUDIT_FILE_CODE nint16
+#define NWAUDIT_FILE_HANDLE nuint32
+#define NWAUDIT_FLAGS nuint32
+#define NWAUDIT_KEY_BUF pnuint8
+#define NWAUDIT_LEVEL nuint8
+#define NWAUDIT_NAME_SPACE nuint32
+#define NWAUDIT_OBJ_SECURITY nuint32
+#define NWAUDIT_PASSWORD pnuint8
+#define NWAUDIT_PROCESS_ID nuint32
+#define NWAUDIT_QUEUE_TYPE nuint32
+#define NWAUDIT_RECORD_ID nuint32
+#define NWAUDIT_REC_NUM nuint32
+#define NWAUDIT_REPLICA_NUM nuint16
+#define NWAUDIT_SIZE NWSIZE
+#define NWAUDIT_STATUS_CODE nuint32
+#define NWAUDIT_TRUSTEE_RIGHTS nuint32
+#define NWAUDIT_VOL_NUM nuint32
+#define NWAUGMENT nuint16 /* AN ADDITIONAL FLAG SIZE */
+#define NWBITS nuint32
+#define NWBROADCAST_MODE nuint16
+#define NWBUF_SIZE nuint16
+#define NWCHANGE_BITS nuint32
+#define NWCHANGE_TYPE nuint32
+#define NWCHARGE_AMOUNT nint32
+#define NWCLASS_INFO Class_Info_T
+#define NWCONFIG_DEFAULT_VALUE nint32
+#define NWCONFIG_ELEMENT_NUM nint16
+#define NWCONFIG_PARAM_TYPE nint16
+#define NWCONN_FLAGS nuint16
+#define NWCONN_NUM_WORD nuint16
+#define NWCONN_TYPE nuint8
+#define NWCOUNT nuint32
+#define NWCTLR_NUM nuint8
+#define NWCTLR_TYPE nuint8
+#define NWCURRENT_REC nuint16
+#define NWDATA_STREAM nuint32
+#define NWDATE nuint16
+#define NWDATE_TIME nuint32
+#define NWDELETE_TIME nuint32
+#define NWDENY_COUNT nuint16
+#define NWDEVICE_ID nuint16
+#define NWDIR_ATTRIBUTES nuint8
+#define NWDIR_BASE nuint32
+#define NWDIR_ENTRY nuint32
+#define NWDIR_ID nuint8
+#define NWDIR_NUM nuint16
+#define NWDIR_SPACE nuint32
+#define NWDIR_STAMP nuint16
+#define NWDIR_TRUSTEE_RIGHTS nuint16
+#define NWDIR_VOL nuint8
+#define NWDISK_CHANNEL nuint8
+#define NWDISK_DRV_TYPE nuint8
+#define NWDISK_FLAGS nuint16
+#define NWDISK_NUM nuint8
+#define NWDISK_SPACE nuint32
+#define NWDISK_TYPE nuint8
+#define NWDISTANCE nuint16
+#define NWDMA nuint8
+#define NWDM_FLAGS nuint32
+#define NWDRIVE_NUM nuint16
+#define NWDRIVE_NUMBER nuint8
+#define NWDRV_COMMAND nuint32
+#define NWDRV_CONFIG nuint32
+#define NWDRV_FLAGS nuint16
+#define NWDRV_ID nuint16
+#define NWDRV_LINK nuint32
+#define NWDRV_MEM nuint32
+#define NWDRV_NAME nuint32
+#define NWDRV_TAG nuint32
+#define NWDRV_TYPE nuint32
+#define NWDRV_VERSION nuint8
+#define NWDSLEN nuint32
+#define NWDS_BUFFER Buf_T
+#define NWDS_EVENT nuint32
+#define NWDS_FILTER_CURSOR Filter_Cursor_T
+#define NWDS_FILTER_LEVEL nuint16
+#define NWDS_FILTER_NODE Filter_Node_T
+#define NWDS_FLAGS nuint32
+#define NWDS_ID nint16
+#define NWDS_INTERVAL nuint32
+#define NWDS_ITERATION nint32
+#define NWDS_LOGIN_FILE nint16
+#define NWDS_NUM_OBJ nint32
+#define NWDS_OPERATION nuint32
+#define NWDS_PRIVILEGES nuint32
+#define NWDS_SEARCH_SCOPE nuint16
+#define NWDS_SESSION_KEY NWDS_Session_Key_T
+#define NWDS_SIZE nuint32
+#define NWDS_SYNTAX_FLAGS nint16
+#define NWDS_TOKEN nuint16
+#define NWDS_TYPE nuint32
+#define NWDS_TYPE_LEVEL nuint32
+#define NWDS_VALIDITY nuint32
+#define NWDS_VALUE nuint32
+#define NWEA NW_EA_HANDLE
+#define NWEA_HANDLE nuint32
+#define NWEA_KEY nuint16
+#define NWEA_KEY_LEN nuint16
+#define NWEA_KEY_OFFSET nuint16
+#define NWEA_SCAN NW_EA_FF_STRUCT
+#define NWECB_CANCEL_COUNT nuint16
+#define NWELEMENT_VALUE nint16
+#define NWEMAIL_TYPE nuint32
+#define NWFACTOR nuint32
+#define NWFAT nuint32
+#define NWFILE_ATTR nuint8
+#define NWFILE_LEN nuint32
+#define NWFILE_MODE nuint8
+#define NWFILE_SYS_ID nuint32
+#define NWFINDER_INFO nuint8
+#define NWFLAGS nuint8
+#define NWFORM_NUM nuint8
+#define NWFORM_TYPE nuint16
+#define NWFRAG_SIZE nuint16
+#define NWFSE_CONN_TYPE nuint32
+#define NWFSE_FLAGS nuint32
+#define NWGLT_FAIL_COUNT nuint16
+#define NWHANDLE nuint8
+#define NWHF_START nuint32
+#define NWHOLDS_INFO HOLDS_INFO
+#define NWHOLDS_STATUS HOLDS_STATUS
+#define NWHOLD_AMOUNT nuint32
+#define NWHOLD_CANCEL_AMOUNT nuint32
+#define NWINFO_LEVEL nuint32
+#define NWINTERRUPT nuint8
+#define NWIO_MEM nuint16
+#define NWJOB_FLAGS nuint16
+#define NWJOB_HANDLE nuint32
+#define NWJOB_POSITION nuint8
+#define NWJOB_POSITION2 nuint16
+#define NWJOB_TYPE nuint16
+#define NWLAN_NUM nuint8
+#define NWLAST_RECORD nint16
+#define NWLEN nuint32
+#define NWLENGTH nuint16
+#define NWLOCAL_FILE_HANDLE nuint16 /* FOR DOS, OS/2, AND WINDOWS */
+#define NWLOCAL_MODE nuint16
+#define NWLOCAL_SCOPE nuint16
+#define NWLOCK_COUNT nuint16
+#define NWLOCK_DATA_STREAM nuint8
+#define NWLOCK_STATE nuint8
+#define NWLOCK_TYPE nuint8
+#define NWLOCK_TYPE nuint8
+#define NWLOGIN_TIME nuint8[7]
+#define NWLPT nuint8
+#define NWMAX_PACKET_SIZE nuint16
+#define NWMEDIA_MASK nuint32
+#define NWMEDIA_TYPE nuint32
+#define NWMEM_OFFSET nuint16
+#define NWMINUTES nuint8
+#define NWMODULE_ID nuint32
+#define NWNAME pnuint8
+#define NWNAME_LEN nuint8
+#define NWNAME_SPACE nuint8
+#define NWNAME_SPACE_TYPE nuint32
+#define NWNET_ADDR nuint8
+#define NWNET_ADDR_LEN nuint32
+#define NWNET_ADDR_TYPE nuint32
+#define NWNEXT_REQUEST nuint16
+#define NWNLM_ID nuint32
+#define NWNLM_TYPE nuint32
+#define NWNOTE_TYPE nuint16
+#define NWNS_ACCESS_MODE nuint16
+#define NWNS_ACCESS_RIGHTS nuint16
+#define NWNS_ATTR nuint16
+#define NWNS_BITS nuint16
+#define NWNS_DATA_STREAM nuint8
+#define NWNS_DATA_STREAM2 nuint16
+#define NWNS_FLAGS nuint16
+#define NWNS_HANDLE nuint32
+#define NWNS_LIST_SIZE nuint8
+#define NWNS_MASK nuint32
+#define NWNS_NUM nuint8
+#define NWNS_TYPE nuint16
+#define NWNUM nuint32
+#define NWNUMBER nuint16
+#define NWNUMBER_ENTRIES nuint8
+#define NWNUM_BLOCKS nuint32
+#define NWNUM_BUFFERS nuint16
+#define NWNUM_BYTES nuint32
+#define NWNUM_CONNS nuint8
+#define NWNUM_COPIES nuint8
+#define NWNUM_DIR_ENTRIES nuint32
+#define NWNUM_DRIVES nuint8
+#define NWNUM_ELEMENTS nint16
+#define NWNUM_ENTRIES nuint16
+#define NWNUM_FORKS nuint8
+#define NWNUM_HEADS nuint8
+#define NWNUM_HOPS nuint16
+#define NWNUM_PACKETS nuint32
+#define NWNUM_REQUESTS nuint32
+#define NWNUM_SECTORS nuint8
+#define NWNUM_TRANSACTIONS nuint8
+#define NWOBJECT_INFO Object_Info_T
+#define NWOBJ_ID nuint32
+#define NWOBJ_TYPE nuint16
+#define NWOFFSET nuint32
+#define NWOPEN_COUNT nuint16
+#define NWOPTION_NUM nuint8
+#define NWOS_REVISION nuint16
+#define NWOS_VERSION nuint16
+#define NWPATH_SIZE nuint16
+#define NWPATH_VOL nuint8
+#define NWPOSITION nuint32
+#define NWPRINTER nuint16
+#define NWPRINT_FLAGS nuint16
+#define NWPRINT_TASK nuint32
+#define NWPROTOCOL_MASK nuint32
+#define NWPROTOCOL_VERSION nuint8
+#define NWPSTR pnstr
+#define NWQMS_HANDLE nuint32
+#define NWQMS_TASK nuint32
+#define NWREC_OFFSET nuint16
+#define NWREPLICA_NUM nint32
+#define NWREPLICA_TYPE nuint32
+#define NWREQUESTER_VERSION nuint8
+#define NWREQUEST_MASK nuint16
+#define NWRESERVED16 nuint32
+#define NWRESERVED32 nuint32
+#define NWREVISION nuint32
+#define NWRIGHTS nuint32
+#define NWRIGHTS_MASK nuint16
+#define NWSEARCH_ATTR nuint8
+#define NWSEARCH_ATTRIBUTES nuint16
+#define NWSEARCH_CONTEXT nuint16
+#define NWSEARCH_MASK nuint16
+#define NWSECONDS nuint32
+#define NWSEGMENT_DATA pnuint8
+#define NWSEGMENT_NUM nuint8
+#define NWSEM_HANDLE nuint32
+#define NWSEM_INT nint16
+#define NWSEM_VALUE nuint16
+#define NWSEQUENCE nuint32
+#define NWSEQUENCE_NUM nuint16
+#define NWSEQ_NUM nuint8
+#define NWSERVER_NAME_LEN nuint16
+#define NWSERVER_TYPE nuint16
+#define NWSERVICE_VERSION nuint8
+#define NWSESSION_ID nuint16
+#define NWSIZE nuint32
+#define NWSOCKET_COUNT nuint16
+#define NWSPX_COUNT nuint16
+#define NWSTATION_NUM nuint8
+#define NWSTATION_NUM2 nuint32
+#define NWSTATS_VERSION nuint8
+#define NWSTATUS nuint32
+#define NWSTRUCT_SIZE nuint16
+#define NWSUPPORT_LEVEL nuint8
+#define NWSYNTAX_ID nuint32
+#define NWSYNTAX_INFO Syntax_Info_T
+#define NWSYS_TIME nuint32
+#define NWTAB nuint8
+#define NWTASK nuint16
+#define NWTASK_COUNT nuint8
+#define NWTASK_NUM nuint16
+#define NWTASK_STATE nuint8
+#define NWTDS nuint16
+#define NWTDS_OFFSET nuint16
+#define NWTICKS nuint16
+#define NWTIME nuint16
+#define NWTRAN_TYPE nuint8
+#define NWTRUSTEE_SEQUENCE_NUM nuint16
+#define NWUSE_COUNT nuint16
+#define NWUTILIZATION nuint32
+#define NWVCONSOLE_REVISION nuint8
+#define NWVCONSOLE_VERSION nuint8
+#define NWVERSION nuint32
+#define NWVOL nuint32
+#define NWVOL_FLAGS nuint16
+#define NWVOL_NUM nuint16
+#define NWVOL_NUMBER nuint8
+#define NWVOL_TYPE nuint32
+#define TRUSTEE_RIGHTS nuint32
+
+#endif /* NWALIAS_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwapidef.h b/LoginCapture/windows/external/xplatapi/include/nwapidef.h
new file mode 100644
index 00000000..0e056e35
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwapidef.h
@@ -0,0 +1,60 @@
+/******************************************************************************
+
+ %name: nwapidef.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:10 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWAPIDEF_H )
+#define NWAPIDEF_H
+
+/* Miscellaneous string lengths (constant) */
+/* NOTE: These max values include a byte for null */
+#define NW_MAX_USER_NAME_LEN 49
+#define NW_MAX_VOLUME_NAME_LEN 17
+#define NW_MAX_SERVER_NAME_LEN 49
+#define NW_MAX_TREE_NAME_LEN 33
+#define NW_MAX_SERVICE_TYPE_LEN 49
+
+/* Miscellaneous unicode string sizes in bytes (constant) */
+
+#define NW_MAX_USER_NAME_BYTES 2 * NW_MAX_USER_NAME_LEN
+#define NW_MAX_VOLUME_NAME_BYTES 2 * NW_MAX_VOLUME_NAME_LEN
+#define NW_MAX_SERVER_NAME_BYTES 2 * NW_MAX_SERVER_NAME_LEN
+#define NW_MAX_TREE_NAME_BYTES 2 * NW_MAX_TREE_NAME_LEN
+#define NW_MAX_SERVICE_TYPE_BYTES 2 * NW_MAX_SERVICE_TYPE_LEN
+
+/* PrintFlags (nuint16 value) */
+#define NW_PRINT_FLAG_RELEASE 0x0001
+#define NW_PRINT_FLAG_SUPPRESS_FF 0x0002
+#define NW_PRINT_FLAG_TEXT_FILE 0x0004
+#define NW_PRINT_FLAG_PRINT_BANNER 0x0008
+#define NW_PRINT_FLAG_NOTIFY 0x0010
+
+/* Print string lengths (constant) */
+#define NW_MAX_JOBDESCR_LEN 50
+#define NW_MAX_FORM_NAME_LEN 13
+#define NW_MAX_BANNER_NAME_LEN 13
+#define NW_MAX_QUEUE_NAME_LEN 65
+
+/* Client Types : these are returned by NWGetClientType */
+#define NW_NETX_SHELL 1
+#define NW_VLM_REQ 2
+#define NW_CLIENT32 3
+#define NW_NT_REQ 4
+#define NW_OS2_REQ 5
+#define NW_NLM_REQ 6
+
+#endif /* NWAPIDEF_INC */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwaudit.h b/LoginCapture/windows/external/xplatapi/include/nwaudit.h
new file mode 100644
index 00000000..8bcf4001
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwaudit.h
@@ -0,0 +1,560 @@
+/******************************************************************************
+
+ %name: nwaudit.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:13 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWAUDIT_H )
+#define NWAUDIT_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWADEVNT_H )
+#include "nwadevnt.h"
+#endif
+
+#include "npackon.h"
+
+/* Error codes */
+#define ERROR_AUDITING_NOT_INITIALIZED 224
+
+/* bit map sizes */
+#define NW_AUDIT_NUMBER_EVENT_BITS 256
+#define NW_AUDIT_NUMBER_EVENT_BITS_TNW 512
+
+/* audit ID types */
+#define AUDIT_ID_IS_TRUSTED_NETWARE 2
+#define AUDIT_ID_IS_CONTAINER 1
+#define AUDIT_ID_IS_VOLUME 0
+
+/* audit flags */
+#define DiscardAuditRcdsOnErrorFlag 0x01
+#define ConcurrentVolAuditorAccess 0x02
+#define DualLevelPasswordsActive 0x04
+#define BroadcastWarningsToAllUsers 0x08
+#define LevelTwoPasswordSet 0x10
+#define ArchiveAuditFileOnErrorFlag 0x20
+
+typedef struct tagNWADOpenStatus
+{
+ nuint32 auditingStatus;
+ nuint32 isTrustedNetWare;
+ nuint32 trustedNetWareStatus;
+ nuint32 reserved1; /* Future status */
+ nuint32 reserved2;
+ nuint32 reserved3;
+ nuint32 reserved4;
+} NWADOpenStatus, N_FAR *pNWADOpenStatus;
+
+typedef struct tagTIMESTAMP
+{
+ nuint32 seconds;
+ nuint16 replicaNumber;
+ nuint16 event;
+} TIMESTAMP;
+
+typedef struct tagNWAuditBitMap
+{
+ nuint8 bitMap[NW_AUDIT_NUMBER_EVENT_BITS / 8];
+}NWAuditBitMap, N_FAR *pNWAuditBitMap;
+
+typedef struct tagNWAuditBitMapTNW
+{
+ nuint8 bitMap[NW_AUDIT_NUMBER_EVENT_BITS_TNW / 8];
+}NWAuditBitMapTNW, N_FAR *pNWAuditBitMapTNW;
+
+typedef struct tagNWAuditFileList
+{
+ nuint32 fileCreateDateTime[16];
+ nuint32 fileSize[16];
+}NWAuditFileList, N_FAR *pNWAuditFileList;
+
+typedef struct tagNWConfigHeader
+{
+ nuint16 fileVersionDate;
+ nuint8 auditFlags;
+ nuint8 errMsgDelayMinutes;
+ nuint8 reserved1[16];
+ nuint32 auditFileMaxSize;
+ nuint32 auditFileSizeThreshold;
+ nuint32 auditRecordCount;
+ nuint32 historyRecordCount;
+ nuint8 reserved2[16];
+ nuint32 reserved3[3];
+ nuint8 auditEventBitMap[NW_AUDIT_NUMBER_EVENT_BITS / 8];
+ nuint32 auditFileCreationDateTime;
+ nuint8 reserved4[8];
+ nuint16 auditFlags2;
+ nuint16 fileVersionDate2;
+ nuint8 fileArchiveDays;
+ nuint8 fileArchiveHour;
+ nuint8 numOldAuditFilesToKeep;
+ nuint8 reserved5;
+ nuint32 headerChecksum;
+ nuint32 headerModifiedCounter;
+ nuint32 reserved6;
+ /* Trusted NetWare uses the following two fields */
+ nuint8 newBitMap[64]; /* Tusted NetWare uses this bit map instead of volumeAuditEventBitMap above */
+ nuint8 reserved7[64];
+} NWConfigHeader, N_FAR *pNWConfigHeader;
+
+typedef struct tagNWDSContainerConfigHdr
+{
+ nuint16 fileVersionDate;
+ nuint8 auditFlags;
+ nuint8 errMsgDelayMinutes;
+ nuint32 containerID;
+ nuint32 reserved1;
+ TIMESTAMP creationTS;
+ nuint32 bitMap;
+ nuint32 auditFileMaxSize;
+ nuint32 auditFileSizeThreshold;
+ nuint32 auditRecordCount;
+ nuint16 replicaNumber;
+ nuint8 enabledFlag;
+ nuint8 fileArchiveDays;
+ nuint8 fileArchiveHour;
+ nuint8 numOldFilesToKeep;
+ nuint16 numberReplicaEntries;
+ nuint32 auditFileCreationDateTime;
+ nuint8 reserved2[8];
+ nuint32 partitionID;
+ nuint32 headerChecksum;
+ nuint32 reserved3[4];
+ nuint32 auditDisabledCounter;
+ nuint32 auditEnabledCounter;
+ nuint8 reserved4[32];
+ nuint32 hdrModifiedCounter;
+ nuint32 fileResetCounter;
+ /* Trusted NetWare uses the following two fields */
+ nuint8 newBitMap[64]; /* Tusted NetWare uses this bit map */
+ nuint8 reserved5[64];
+} NWDSContainerConfigHdr, N_FAR *pNWDSContainerConfigHdr;
+
+typedef struct tagNWAuditStatus
+{
+ nuint16 auditingVersionDate;
+ nuint16 auditFileVersionDate;
+ nuint32 auditingEnabledFlag;
+ nuint32 auditFileSize;
+ nuint32 modifiedCounter;
+ nuint32 auditFileMaxSize;
+ nuint32 auditFileSizeThreshold;
+ nuint32 auditRecordCount;
+ nuint32 auditingFlags;
+} NWAuditStatus, N_FAR *pNWAuditStatus;
+
+typedef struct tagNWAuditRecord
+{
+ nuint32 recordLength;
+ pnuint8 record;
+} NWAuditRecord, N_FAR *pNWAuditRecord;
+
+typedef struct tagNWADAuditPolicy
+{
+ nuint16 policyVersionDate;
+ nuint16 reserved;
+ nuint8 auditFlags[4];
+ nuint32 auditFileMaxSize;
+ nuint32 auditFileThresholdSize;
+ nuint8 fileArchiveDays;
+ nuint8 fileArchiveHour;
+ nuint8 numOldAuditFilesToKeep;
+ nuint8 userRestrictionFlag;
+ nuint32 modifiedCounter;
+ nuint32 auditOverflowFileSize;
+ nuint32 reservedLong;
+ nuint8 auditedEventBitMap[256];
+} NWADAuditPolicy, N_FAR *pNWADAuditPolicy;
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY( void )
+NWGetNWADVersion
+(
+ pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revisionLevel,
+ pnuint8 betaReleaseLevel
+);
+
+/* allocate auditHandle for use in other Auditing calls */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADOpen
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ pnptr auditHandle, /* allocate auditHandle */
+ pNWADOpenStatus openStatus
+);
+
+/* free auditHandle and NULL the pointer */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADClose
+(
+ pnptr auditHandle /* free auditHandle */
+);
+
+#define NWGetVolumeAuditStats(a, b, c, d) \
+ NWADGetStatus(a, AUDIT_ID_IS_VOLUME, b, c, d)
+#define NWDSGetContainerAuditStats(a, b, c, d) \
+ NWADGetStatus(a, AUDIT_ID_IS_CONTAINER, b, c, d)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADGetStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ pNWAuditStatus auditStatus,
+ nuint16 bufferSize
+);
+
+#define NWGetAuditingFlags(a, b, c, d) \
+ NWADGetFlags(a, AUDIT_ID_IS_VOLUME, b, c, d)
+#define NWDSGetAuditingFlags(a, b, c, d) \
+ NWADGetFlags(a, AUDIT_ID_IS_CONTAINER, b, c, d)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADGetFlags
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pnuint8 flags
+);
+
+#define NWLoginAsVolumeAuditor(a, b, c, d) \
+ NWADLogin(a, AUDIT_ID_IS_VOLUME, b, c, d)
+#define NWDSLoginAsContainerAuditor(a, b, c, d) \
+ NWADLogin(a, AUDIT_ID_IS_CONTAINER, b, c, d)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADLogin
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pnuint8 password
+);
+
+#define NWInitAuditLevelTwoPassword NWADInitLevelTwoPassword
+N_EXTERN_LIBRARY( NWRCODE )
+NWADInitLevelTwoPassword
+(
+ nptr auditHandle,
+ pnuint8 password
+);
+
+#define NWLogoutAsVolumeAuditor(a, b, c) \
+ NWADLogout(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSLogoutAsContainerAuditor(a, b, c) \
+ NWADLogout(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADLogout
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+#define NWChangeAuditorPassword(a, b, c, d, e) \
+ NWADChangePassword(a, AUDIT_ID_IS_VOLUME, b, c, d, e)
+#define NWDSChangeAuditorPassword(a, b, c, d, e) \
+ NWADChangePassword(a, AUDIT_ID_IS_CONTAINER, b, c, d, e)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADChangePassword
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pnuint8 newPassword,
+ nuint8 level
+);
+
+#define NWCheckAuditAccess(a, b) \
+ NWADCheckAccess(a, AUDIT_ID_IS_VOLUME, b)
+#define NWDSCheckAuditAccess(a, b) \
+ NWADCheckAccess(a, AUDIT_ID_IS_CONTAINER, b)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADCheckAccess
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID
+);
+
+#define NWCheckAuditLevelTwoAccess(a, b, c) \
+ NWADCheckLevelTwoAccess(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSCheckAuditLevelTwoAccess(a, b, c) \
+ NWADCheckLevelTwoAccess(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADCheckLevelTwoAccess
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+#define NWEnableAuditingOnVolume(a, b, c) \
+ NWADEnable(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSEnableAuditingOnContainer(a, b, c) \
+ NWADEnable(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADEnable
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+#define NWDisableAuditingOnVolume(a, b, c) \
+ NWADDisable(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSDisableAuditingOnContainer(a, b, c) \
+ NWADDisable(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADDisable
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+#define NWIsUserBeingAudited(a, b, c, d) \
+ NWADIsObjectAudited(a, AUDIT_ID_IS_VOLUME, b, d)
+#define NWDSIsObjectBeingAudited(a, b, c) \
+ NWADIsObjectAudited(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADIsObjectAudited
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nuint32 userObjectID
+);
+
+#define NWAddAuditProperty(a, b, c, d) \
+ NWADChangeObjectProperty(a, AUDIT_ID_IS_VOLUME, b, c, d, 1)
+#define NWRemoveAuditProperty(a, b, c, d) \
+ NWADChangeObjectProperty(a, AUDIT_ID_IS_VOLUME, b, c, d, 0)
+#define NWDSChangeObjectAuditProperty(a, b, c, d, e) \
+ NWADChangeObjectProperty(a, AUDIT_ID_IS_CONTAINER, b, c, d, e)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADChangeObjectProperty
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ nuint32 objectID,
+ nuint8 auditFlag /* 0:remove 1:add */
+);
+
+/* Volume audit call only */
+#define NWReadAuditingBitMap(a, b, c, d, e)\
+ NWADReadBitMap(a, b, d, e)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADReadBitMap
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditID, /* can only be volume */
+ NWAuditBitMap N_FAR *buffer,
+ nuint16 bufferSize
+);
+
+#define NWReadAuditConfigHeader(a, b, c, d, e) \
+ NWADReadConfigHeader(a, AUDIT_ID_IS_VOLUME, b, c, d, e)
+#define NWDSReadAuditConfigHeader(a, b, c, d, e) \
+ NWADReadConfigHeader(a, AUDIT_ID_IS_CONTAINER, b, c, d, e)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADReadConfigHeader
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ nptr buffer,
+ nuint16 bufferSize
+);
+
+/* volume auditing only */
+#define NWWriteAuditingBitMap(a, b, c, d) \
+ NWADWriteBitMap(a, b, c, d)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADWriteBitMap
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditID, /* can only be volume */
+ nptr auditHandle,
+ NWAuditBitMap N_FAR *buffer
+);
+
+#define NWWriteAuditConfigHeader(a, b, c, d) \
+ NWADWriteConfigHeader(a, AUDIT_ID_IS_VOLUME, b, c, d)
+#define NWDSWriteAuditConfigHeader(a, b, c, d) \
+ NWADWriteConfigHeader(a, AUDIT_ID_IS_CONTAINER, b, c, d)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADWriteConfigHeader
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pNWConfigHeader buffer
+);
+
+#define NWResetAuditingFile(a, b, c) \
+ NWADResetFile(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSResetAuditingFile(a, b, c) \
+ NWADResetFile(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADResetFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+/* NWADOpenReadFile will only work with NetWare version 4.10 or newer */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADOpenRecordFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ nint16 fileCode,
+ pnptr recordHandle /* Allocate record handle */
+);
+
+/* NWADInitRead will only work with NetWare version 4.10 or newer */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADReadRecord
+(
+ nptr recordHandle, /* Allocated in NWADOpenRecordFile */
+ nuint16 maxSize,
+ nint16 direction,
+ pnuint8 buffer,
+ pnuint16 bufferSize,
+ pnuint8 eofFlag,
+ pnuint32 offsetPtr
+);
+
+/* NWADInitRead will only work with NetWare version 4.10 or newer */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADCloseRecordFile
+(
+ pnptr recordHandle /* Free record handle */
+);
+
+#define NWCloseOldAuditingFile(a, b, c) \
+ NWADCloseOldFile(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSCloseOldAuditingFile(a, b, c) \
+ NWADCloseOldFile(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADCloseOldFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+#define NWDeleteOldAuditingFile(a, b, c) \
+ NWADDeleteFile(a, AUDIT_ID_IS_VOLUME, b, c)
+#define NWDSDeleteOldAuditingFile(a, b, c) \
+ NWADDeleteFile(a, AUDIT_ID_IS_CONTAINER, b, c)
+N_EXTERN_LIBRARY( NWRCODE )
+NWADDeleteFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle
+);
+
+/* NetWare version 4.10 or newer */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADGetFileList
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pNWAuditFileList fileList
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWADDeleteOldFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ nuint32 fileCode
+);
+
+/* Trusted NetWare and Volume Only */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADRestartVolumeAuditing
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID
+);
+
+/* Trusted NetWare Only */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADSetPassword
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditIDType,
+ nuint32 auditID,
+ nptr auditHandle,
+ pnuint8 newPassword
+);
+
+/* Trusted NetWare Only */
+N_EXTERN_LIBRARY( NWRCODE )
+NWADAppendExternalRecords
+(
+ NWCONN_HANDLE conn,
+ nuint32 auditFileObjectID,
+ nuint32 vendorID,
+ nuint32 numberRecords,
+ pNWAuditRecord recordsPtr
+);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#include "npackoff.h"
+#endif /* NWAUDIT_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwbindry.h b/LoginCapture/windows/external/xplatapi/include/nwbindry.h
new file mode 100644
index 00000000..0459a52d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwbindry.h
@@ -0,0 +1,402 @@
+/******************************************************************************
+
+ %name: nwbindry.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:15 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWBINDRY_H )
+#define NWBINDRY_H
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NUNICODE_H )
+#include "nunicode.h"
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Bindery object types (in HIGH-LOW order) */
+#define OT_WILD 0xFFFF
+#define OT_UNKNOWN 0x0000
+#define OT_USER 0x0100
+#define OT_USER_GROUP 0x0200
+#define OT_PRINT_QUEUE 0x0300
+#define OT_FILE_SERVER 0x0400
+#define OT_JOB_SERVER 0x0500
+#define OT_GATEWAY 0x0600
+#define OT_PRINT_SERVER 0x0700
+#define OT_ARCHIVE_QUEUE 0x0800
+#define OT_ARCHIVE_SERVER 0x0900
+#define OT_JOB_QUEUE 0x0A00
+#define OT_ADMINISTRATION 0x0B00
+#define OT_NAS_SNA_GATEWAY 0x2100
+#define OT_REMOTE_BRIDGE_SERVER 0x2600
+#define OT_TCPIP_GATEWAY 0x2700
+#define OT_TREE_NAME 0x7802
+
+/* Extended bindery object types */
+#define OT_TIME_SYNCHRONIZATION_SERVER 0x2D00
+#define OT_ARCHIVE_SERVER_DYNAMIC_SAP 0x2E00
+#define OT_ADVERTISING_PRINT_SERVER 0x4700
+#define OT_BTRIEVE_VAP 0x5000
+#define OT_PRINT_QUEUE_USER 0x5300
+
+
+/* Bindery object and property flags */
+#define BF_STATIC 0x00
+#define BF_DYNAMIC 0x01
+#define BF_ITEM 0x00
+#define BF_SET 0x02
+
+/********* Bindery object and property security access levels **********/
+#define BS_ANY_READ 0x00 /* Readable by anyone */
+#define BS_LOGGED_READ 0x01 /* Must be logged in to read */
+#define BS_OBJECT_READ 0x02 /* Readable by same object or super */
+#define BS_SUPER_READ 0x03 /* Readable by supervisor only */
+#define BS_BINDERY_READ 0x04 /* Readable only by the bindery */
+#define BS_ANY_WRITE 0x00 /* Writeable by anyone */
+#define BS_LOGGED_WRITE 0x10 /* Must be logged in to write */
+#define BS_OBJECT_WRITE 0x20 /* Writeable by same object or super */
+#define BS_SUPER_WRITE 0x30 /* Writeable only by the supervisor */
+#define BS_BINDERY_WRITE 0x40 /* Writeable by the bindery only */
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWVerifyObjectPassword
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * password
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDisallowObjectPassword
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * disallowedPassword
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeObjectPassword
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * oldPassword,
+ const nstr8 N_FAR * newPassword
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadPropertyValue
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ nuint8 segmentNum,
+ pnuint8 segmentData,
+ pnuint8 moreSegments,
+ pnuint8 flags
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWritePropertyValue
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ nuint8 segmentNum,
+ const nuint8 N_FAR * segmentData,
+ nuint8 moreSegments
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAddObjectToSet
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ const nstr8 N_FAR * memberName,
+ nuint16 memberType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteObjectFromSet
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ pnstr8 propertyName,
+ pnstr8 memberName,
+ nuint16 memberType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIsObjectInSet
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ const nstr8 N_FAR * memberName,
+ nuint16 memberType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanProperty
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ pnstr8 searchPropertyName,
+ pnuint32 iterHandle,
+ pnstr8 propertyName,
+ pnuint8 propertyFlags,
+ pnuint8 propertySecurity,
+ pnuint8 valueAvailable,
+ pnuint8 moreFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectID
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ pnuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectDiskSpaceLeft
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ pnuint32 systemElapsedTime,
+ pnuint32 unusedDiskBlocks,
+ pnuint8 restrictionEnforced
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectName
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ pnstr8 objName,
+ pnuint16 objType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanObject
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * searchName,
+ nuint16 searchType,
+ pnuint32 objID,
+ pnstr8 objName,
+ pnuint16 objType,
+ pnuint8 hasPropertiesFlag,
+ pnuint8 objFlags,
+ pnuint8 objSecurity
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetBinderyAccessLevel
+(
+ NWCONN_HANDLE conn,
+ pnuint8 accessLevel,
+ pnuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateProperty
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ nuint8 propertyFlags,
+ nuint8 propertySecurity
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteProperty
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangePropertySecurity
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * propertyName,
+ nuint8 newPropertySecurity
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateObject
+(
+ NWCONN_HANDLE conn,
+ pnstr8 objName,
+ nuint16 objType,
+ nuint8 objFlags,
+ nuint8 objSecurity
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteObject
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRenameObject
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * oldObjName,
+ const nstr8 N_FAR * newObjName,
+ nuint16 objType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeObjectSecurity
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ nuint8 newObjSecurity
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenBindery
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseBindery
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanObjectTrusteePaths
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ nuint16 volNum,
+ pnuint16 iterHandle,
+ pnuint8 accessRights,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectEffectiveRights
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectEffectiveRightsExt
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 buNameSpace,
+ pnuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectEffectiveRights2
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesBeginA
+(
+ nuint32 luObjectType,
+ pnuint32 pluHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesNextA
+(
+ nuint32 luHandle,
+ pnuint32 pluLenBuffer,
+ pnstr8 strBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesEndA
+(
+ nuint32 luHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesBeginW
+(
+ nuint32 luObjectType,
+ pnuint32 pluHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesNextW
+(
+ nuint32 luHandle,
+ pnuint32 pluLenBuffer,
+ punicode strBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectNamesEndW
+(
+ nuint32 luHandle
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwcaldef.h b/LoginCapture/windows/external/xplatapi/include/nwcaldef.h
new file mode 100644
index 00000000..412f8f99
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwcaldef.h
@@ -0,0 +1,178 @@
+/******************************************************************************
+
+ %name: nwcaldef.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:17 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWCALDEF_H )
+#define NWCALDEF_H
+
+#ifdef N_PLAT_NLM
+
+#include
+#if !defined(__NOVELL_LIBC__)
+#if ! defined ( _NWFATTR_H_ )
+#include
+#include
+#endif
+#undef FA_NORMAL
+#undef FA_HIDDEN
+#undef FA_SYSTEM
+#endif
+
+#endif
+
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#ifndef NWPASCAL
+#define NWPASCAL N_PASCAL
+#endif
+
+#ifndef NWFAR
+#define NWFAR N_FAR
+#endif
+
+#define NWCONN_HANDLE nuint
+#define pNWCONN_HANDLE pnuint
+#define NWCONN_NUM nuint16
+#define NWCCODE nuint
+#define NWDIR_HANDLE nuint8
+
+/*
+Changes to this structure need to be mirrored in
+internal header nwclient.h. Would be nice to have
+win31 and OS/2 be defined as HFILE. Need to look
+into that a little more.
+*/
+#if defined (N_PLAT_MSW) && defined (N_ARCH_32)
+ #define NWFILE_HANDLE nptr
+#elif defined (N_PLAT_OS2)
+ #define NWFILE_HANDLE unsigned long
+#else
+ #define NWFILE_HANDLE nint
+#endif
+
+
+#if !defined(__WINDOWS_H) && \
+ !defined(_INC_WINDOWS) && \
+ !defined(__WIN386_INCLUDED__)
+
+#if !defined(BYTE) && !defined(OS2DEF_INCLUDED)
+#define BYTE nuint8
+#endif
+
+#ifndef WORD
+#define WORD nuint16
+#endif
+
+#ifndef DWORD
+#define DWORD nuint32
+#endif
+
+#ifndef LONG
+#define LONG nuint32
+#endif
+
+#endif
+
+#ifndef FA_READ_ONLY
+#define FA_NORMAL 0x00
+#define FA_READ_ONLY 0x01
+#define FA_HIDDEN 0x02
+#define FA_SYSTEM 0x04
+#define FA_EXECUTE_ONLY 0x08
+#define FA_DIRECTORY 0x10
+#define FA_NEEDS_ARCHIVED 0x20
+#define FA_SHAREABLE 0x80
+
+/* Extended file attributes */
+#define FA_TRANSACTIONAL 0x10
+#define FA_INDEXED 0x20
+#define FA_READ_AUDIT 0x40
+#define FA_WRITE_AUDIT 0x80
+#endif
+
+/* the following is a the correct attribute mask list */
+/* The difference between these and the FA_ constants above is that these
+ are in the correct positions. The last four attributes above are 8 bits
+ off. (They need to be shifted 8 bits to the left.) */
+#ifndef A_NORMAL
+#define A_NORMAL 0x00000000L
+#define A_READ_ONLY 0x00000001L
+#define A_HIDDEN 0x00000002L
+#define A_SYSTEM 0x00000004L
+#define A_EXECUTE_ONLY 0x00000008L
+#define A_DIRECTORY 0x00000010L
+#define A_NEEDS_ARCHIVED 0x00000020L
+#define A_SHAREABLE 0x00000080L
+#define A_DONT_SUBALLOCATE 0x00000800L
+#define A_TRANSACTIONAL 0x00001000L
+#define A_INDEXED 0x00002000L /* not in the NCP book */
+#define A_READ_AUDIT 0x00004000L
+#define A_WRITE_AUDIT 0x00008000L
+#define A_IMMEDIATE_PURGE 0x00010000L
+#define A_RENAME_INHIBIT 0x00020000L
+#define A_DELETE_INHIBIT 0x00040000L
+#define A_COPY_INHIBIT 0x00080000L
+#define A_FILE_MIGRATED 0x00400000L
+#define A_DONT_MIGRATE 0x00800000L
+#define A_IMMEDIATE_COMPRESS 0x02000000L
+#define A_FILE_COMPRESSED 0x04000000L
+#define A_DONT_COMPRESS 0x08000000L
+#define A_CANT_COMPRESS 0x20000000L
+#endif
+
+/* access rights attributes */
+#ifndef AR_READ_ONLY
+#define AR_READ 0x0001
+#define AR_WRITE 0x0002
+#define AR_READ_ONLY 0x0001
+#define AR_WRITE_ONLY 0x0002
+#define AR_DENY_READ 0x0004
+#define AR_DENY_WRITE 0x0008
+#define AR_COMPATIBILITY 0x0010
+#define AR_WRITE_THROUGH 0x0040
+#define AR_OPEN_COMPRESSED 0x0100
+#endif
+
+/* search attributes */
+#ifndef SA_HIDDEN
+#define SA_NORMAL 0x0000
+#define SA_HIDDEN 0x0002
+#define SA_SYSTEM 0x0004
+#define SA_SUBDIR_ONLY 0x0010
+#define SA_SUBDIR_FILES 0x8000
+#define SA_ALL 0x8006
+#endif
+
+#ifndef USE_NW_WILD_MATCH
+#define USE_NW_WILD_MATCH 0
+#endif
+
+#ifndef USE_DOS_WILD_MATCH
+#define USE_DOS_WILD_MATCH 1
+#endif
+
+/* Scope specifiers */
+#define GLOBAL 0
+#define PRIVATE 1
+#define MY_SESSION 2
+#define ALL_SESSIONS 3
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwcalls.h b/LoginCapture/windows/external/xplatapi/include/nwcalls.h
new file mode 100644
index 00000000..97a24823
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwcalls.h
@@ -0,0 +1,127 @@
+/******************************************************************************
+
+ %name: nwcalls.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:19 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWCALLS_H )
+#define NWCALLS_H
+
+#if ! defined ( NWAPIDEF_H )
+#include "nwapidef.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWALIAS_H )
+#include "nwalias.h"
+#endif
+
+#if ! defined ( NOAFP_INC )
+#include "nwafp.h"
+#endif
+
+#if ! defined ( NOBINDRY_INC )
+#include "nwbindry.h"
+#endif
+
+#if ! defined ( NOCONNECT_INC )
+#include "nwconnec.h"
+#endif
+
+#if ! defined ( NODEL_INC )
+#include "nwdel.h"
+#endif
+
+#if ! defined ( NODENTRY_INC )
+#include "nwdentry.h"
+#endif
+
+#if ! defined ( NODIRECTORY_INC )
+#include "nwdirect.h"
+#endif
+
+#if ! defined ( NODPATH_INC )
+#include "nwdpath.h"
+#endif
+
+#if ! defined ( NOEA_INC )
+#include "nwea.h"
+#endif
+
+#if ! defined ( NOERROR_INC )
+#include "nwerror.h"
+#endif
+
+#if ! defined ( NOFILES_INC )
+#include "nwfile.h"
+#endif
+
+#if ! defined ( NOMISC_INC )
+#include "nwmisc.h"
+#endif
+
+#if ! defined ( NOMESSAGES_INC )
+#include "nwmsg.h"
+#endif
+
+#if ! defined ( NONAMSPC_INC )
+#include "nwnamspc.h"
+#endif
+
+#if ! defined ( NOPRINT_INC )
+#include "nwprint.h"
+#endif
+
+#if ! defined ( NOQUEUE_INC )
+#include "nwqms.h"
+#endif
+
+#if ! defined ( NOSERVER_INC )
+#include "nwserver.h"
+#endif
+
+#if ! defined ( NOSYNC_INC )
+#include "nwsync.h"
+#endif
+
+#if ! defined ( NONTTS_INC )
+#include "nwtts.h"
+#endif
+
+#if ! defined ( NOVOL_INC )
+#include "nwvol.h"
+#endif
+
+#if ! defined ( NOACCT_INC )
+#include "nwacct.h"
+#endif
+
+#if ! defined ( NOFSE_INC )
+#include "nwfse.h"
+#endif
+
+#if ! defined ( NOMIGRATE_INC )
+#include "nwmigrat.h"
+#endif
+
+#if ! defined ( NOSM_INC )
+#include "nwsm.h"
+#endif
+
+#endif /* NWCALLS_INC */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwclxcon.h b/LoginCapture/windows/external/xplatapi/include/nwclxcon.h
new file mode 100644
index 00000000..1db3f457
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwclxcon.h
@@ -0,0 +1,495 @@
+/****************************************************************************
+
+ %name: nwclxcon.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:21 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ ***************************************************************************/
+
+
+#if ! defined ( NWCLXCON_H )
+#define NWCLXCON_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWAPIDEF_H )
+#include "nwapidef.h"
+#endif
+
+#if ! defined ( NWCALDEF_H ) /* include nwcaldef.h for connection handle */
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+/* Authentication States */
+#define NWCC_AUTHENT_STATE_NONE 0x0000
+#define NWCC_AUTHENT_STATE_BIND 0x0001
+#define NWCC_AUTHENT_STATE_NDS 0x0002
+
+/* Broadcast States */
+#define NWCC_BCAST_PERMIT_ALL 0x0000
+#define NWCC_BCAST_PERMIT_SYSTEM 0x0001
+#define NWCC_BCAST_PERMIT_NONE 0x0002
+#define NWCC_BCAST_PERMIT_POLL 0x0003 /* DOS Windows and OS/2 only */
+
+/* NDS States */
+#define NWCC_NDS_NOT_CAPABLE 0x0000
+#define NWCC_NDS_CAPABLE 0x0001
+
+/* License States */
+#define NWCC_NOT_LICENSED 0x0000
+#define NWCC_CONNECTION_LICENSED 0x0001
+#define NWCC_HANDLE_LICENSED 0x0002
+
+/* Name Format types */
+#define NWCC_NAME_FORMAT_NDS 0x0001 /* Unicode full dot format name */
+#define NWCC_NAME_FORMAT_BIND 0x0002
+#define NWCC_NAME_FORMAT_NDS_TREE 0x0008
+#define NWCC_NAME_FORMAT_WILD 0x8000
+
+/* Transport types */
+#define NWCC_TRAN_TYPE_IPX 0x00000001
+#define NWCC_TRAN_TYPE_DDP 0x00000003
+#define NWCC_TRAN_TYPE_ASP 0x00000004
+#define NWCC_TRAN_TYPE_UDP 0x00000008
+#define NWCC_TRAN_TYPE_TCP 0x00000009
+#define NWCC_TRAN_TYPE_UDP6 0x0000000A
+#define NWCC_TRAN_TYPE_TCP6 0x0000000B
+#define NWCC_TRAN_TYPE_WILD 0x00008000
+
+/* Open States */
+#define NWCC_OPEN_LICENSED 0x0001
+#define NWCC_OPEN_UNLICENSED 0x0002
+#define NWCC_OPEN_PRIVATE 0x0004
+#define NWCC_OPEN_PUBLIC 0x0008
+#define NWCC_OPEN_EXISTING_HANDLE 0x0010
+#define NWCC_OPEN_NEAREST 0x0100
+#define NWCC_OPEN_IGNORE_CACHE 0x0200
+
+/* Scan connection information flags (nuint value) */
+#define NWCC_MATCH_NOT_EQUALS 0x0000
+#define NWCC_MATCH_EQUALS 0x0001
+#define NWCC_RETURN_PUBLIC 0x0002
+#define NWCC_RETURN_PRIVATE 0x0004
+#define NWCC_RETURN_LICENSED 0x0008
+#define NWCC_RETURN_UNLICENSED 0x0010
+
+/* Reserved Value */
+#define NWCC_RESERVED 0x0000
+
+/* Values used with Security Flags */
+/* NOTE:
+Two previously defined security flags have been redefined in order to be
+compliant with the ANSI standard maximum length of 31. Here is a list showing
+what the #define was previously, and what it has been redefined to be.
+PREVIOUSLY CURRENTLY
+NWCC_SECURITY_SIGNING_NOT_IN_USE NWCC_SECUR_SIGNING_NOT_IN_USE
+NWCC_SECURITY_LEVEL_SIGN_HEADERS NWCC_SECUR_LEVEL_SIGN_HEADERS
+*/
+#define NWCC_SECURITY_SIGNING_NOT_IN_USE 0x00000000
+#define NWCC_SECURITY_SIGNING_IN_USE 0x00000001
+#define NWCC_SECURITY_LEVEL_CHECKSUM 0x00000100
+#define NWCC_SECURITY_LEVEL_SIGN_HEADERS 0x00000200
+#define NWCC_SECURITY_LEVEL_SIGN_ALL 0x00000400
+#define NWCC_SECURITY_LEVEL_ENCRYPT 0x00000800
+
+/* Feature Codes */
+#define NWCC_FEAT_PRIV_CONN 0x0001
+#define NWCC_FEAT_REQ_AUTH 0x0002
+#define NWCC_FEAT_SECURITY 0x0003
+#define NWCC_FEAT_NDS 0x0004
+#define NWCC_FEAT_NDS_MTREE 0x0005
+#define NWCC_FEAT_PRN_CAPTURE 0x0006
+
+typedef struct tagNWCCTranAddr
+{
+ nuint32 type;
+ nuint32 len;
+ pnuint8 buffer;
+} NWCCTranAddr, N_FAR *pNWCCTranAddr;
+
+typedef struct tagNWCCVersion
+{
+ nuint major;
+ nuint minor;
+ nuint revision;
+}NWCCVersion, N_FAR *pNWCCVersion;
+
+/* Info Types */
+#define NWCC_INFO_NONE 0
+#define NWCC_INFO_AUTHENT_STATE 1
+#define NWCC_INFO_BCAST_STATE 2
+#define NWCC_INFO_CONN_REF 3
+#define NWCC_INFO_TREE_NAME 4
+#define NWCC_INFO_CONN_NUMBER 5
+#define NWCC_INFO_USER_ID 6
+#define NWCC_INFO_SERVER_NAME 7
+#define NWCC_INFO_NDS_STATE 8
+#define NWCC_INFO_MAX_PACKET_SIZE 9
+#define NWCC_INFO_LICENSE_STATE 10
+#define NWCC_INFO_DISTANCE 11
+#define NWCC_INFO_SERVER_VERSION 12
+#define NWCC_INFO_TRAN_ADDR 13 /* Version 2 */
+#define NWCC_INFO_IDENTITY_HANDLE 14 /* Version 3 */
+
+#define NWCC_INFO_RETURN_ALL 0xFFFF
+
+/* Current Info Version */
+#define NWCC_INFO_VERSION_1 0x0001
+#define NWCC_INFO_VERSION_2 0x0002
+#define NWCC_INFO_VERSION_3 0x0003
+
+/* Should use above definitions instead of this one */
+#define NWCC_INFO_VERSION NWCC_INFO_VERSION_1
+
+typedef struct tagNWCCConnInfo
+{
+ nuint authenticationState;
+ nuint broadcastState;
+ nuint32 connRef;
+ nstr treeName[NW_MAX_TREE_NAME_LEN];
+ nuint connNum;
+ nuint32 userID;
+ nstr serverName[NW_MAX_SERVER_NAME_LEN];
+ nuint NDSState;
+ nuint maxPacketSize;
+ nuint licenseState;
+ nuint distance;
+ NWCCVersion serverVersion;
+#ifdef NWCC_INFO_VERSION_2
+ pNWCCTranAddr tranAddr;
+#endif
+#ifdef NWCC_INFO_VERSION_3
+ nuint32 identityHandle;
+#endif
+}NWCCConnInfo, N_FAR *pNWCCConnInfo;
+
+typedef struct tagNWCCFrag
+{
+ nptr address;
+ nuint length;
+}NWCCFrag, N_FAR *pNWCCFrag;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCLXInit
+(
+ nptr reserved1,
+ nptr reserved2
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCLXTerm
+(
+ nptr reserved
+);
+
+N_EXTERN_LIBRARY( void )
+NWCCGetCLXVersion
+(
+ pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revisionLevel,
+ pnuint8 betaReleaseLevel
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCOpenConnByName
+(
+ NWCONN_HANDLE startConnHandle, /* in */
+ const nstr8 N_FAR * name, /* in */
+ nuint nameFormat, /* in */
+ nuint openState, /* in */
+ nuint tranType, /* in * use NWCC_RESERVED */
+ pNWCONN_HANDLE pConnHandle /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCOpenConnByAddr
+(
+ const NWCCTranAddr N_FAR * tranAddr, /* in */
+ nuint openState, /* in */
+ nuint reserved, /* in * use NWCC_RESERVED */
+ pNWCONN_HANDLE pConnHandle /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCOpenConnByRef
+(
+ nuint32 connRef, /* in */
+ nuint openState, /* in */
+ nuint reserved, /* in * use NWCC_RESERVED */
+ pNWCONN_HANDLE pConnHandle /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCCloseConn
+(
+ NWCONN_HANDLE connHandle /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCSysCloseConnRef
+(
+ nuint32 connRef /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCMakeConnPermanent
+(
+ NWCONN_HANDLE connHandle /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCLicenseConn
+(
+ NWCONN_HANDLE connHandle /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCUnlicenseConn
+(
+ NWCONN_HANDLE connHandle /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnRef
+(
+ NWCONN_HANDLE connHandle, /* in */
+ pnuint32 connRef /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetPrefServerName
+(
+ nuint len, /* in */
+ pnstr prefServer /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCSetPrefServerName
+(
+ const nstr N_FAR * prefServer /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetPrimConnRef
+(
+ pnuint32 connRef /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCSetPrimConn
+(
+ NWCONN_HANDLE connHandle /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCScanConnRefs
+(
+ pnuint32 scanIterator, /* in/out : initialize to 0 */
+ pnuint32 connRef /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnInfo
+(
+ NWCONN_HANDLE connHandle, /* in */
+ nuint infoType, /* in */
+ nuint len, /* in */
+ nptr buffer /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnRefInfo
+(
+ nuint32 connRef, /* in */
+ nuint infoType, /* in */
+ nuint len, /* in */
+ nptr buffer /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetAllConnInfo
+(
+ NWCONN_HANDLE connHandle, /* in */
+ /* connInfoVersion should always be set to NWCC_INFO_VERSION
+ or NWCC_INFO_VERSION_n */
+ nuint connInfoVersion, /* in */
+ pNWCCConnInfo connInfoBuffer /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetAllConnRefInfo
+(
+ nuint32 connRef, /* in */
+ /* connInfoVersion should always be set to NWCC_INFO_VERSION
+ or NWCC_INFO_VERSION_n */
+ nuint connInfoVersion, /* in */
+ pNWCCConnInfo connInfoBuffer /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCScanConnInfo
+(
+ pnuint32 scanIterator, /* in */
+ nuint scanInfoLevel, /* in */
+ const void N_FAR * scanConnInfo, /* in */
+ nuint scanFlags, /* in */
+ /* connInfoVersion should always be set to NWCC_INFO_VERSION
+ or NWCC_INFO_VERSION_n */
+ nuint connInfoVersion, /* in */
+ nuint returnInfoLevel, /* in */
+ nptr returnConnInfo, /* out */
+ pnuint32 connReference /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnAddressLength
+(
+ NWCONN_HANDLE connHandle, /* in */
+ pnuint32 addrLen /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnRefAddressLength
+(
+ nuint32 connRef, /* in */
+ pnuint32 addrLen /* out */
+);
+
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnAddress
+(
+ NWCONN_HANDLE connHandle, /* in */
+ nuint32 bufferLen, /* in */
+ pNWCCTranAddr tranAddr /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetConnRefAddress
+(
+ nuint32 connRef, /* in */
+ nuint32 bufferLen, /* in */
+ pNWCCTranAddr tranAddr /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCOpenConnByPref
+(
+ nuint tranType, /* in * NWCC_TRAN_TYPE_IPX */
+ nuint openState, /* in */
+ nuint reserved, /* in * use NWCC_RESERVED */
+ pNWCONN_HANDLE pConnHandle /* out */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCQueryFeature
+(
+ nuint featureCode /* in */
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetNumConns
+(
+ pnuint maxConns, /* out */
+ pnuint publicConns, /* out */
+ pnuint myPrivateConns /* out */
+);
+
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCGetSecurityFlags
+(
+ pnuint32 enabSecurityFlags,
+ pnuint32 prefSecurityFlags,
+ pnuint32 reqSecurityFlags
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCSetSecurityFlags
+(
+ nuint32 prefSecurityFlags,
+ nuint32 reqSecurityFlags
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCRenegotiateSecurityLevel
+(
+ NWCONN_HANDLE connHandle,
+ nuint32 securityFlags
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCResetRequester
+(
+ pnuint32 keepConnRef,
+ nuint connFlags,
+ pnstr firstLocalAlias
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCRequest
+(
+ NWCONN_HANDLE connHandle,
+ nuint function,
+ nuint numReqFrags,
+ const NWCCFrag N_FAR * reqFrags,
+ nuint numReplyFrags,
+ pNWCCFrag replyFrags,
+ pnuint actualReplyLen
+);
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCFragmentRequest
+(
+ NWCONN_HANDLE connHandle,
+ nuint function,
+ nuint verb,
+ nuint reserved,
+ nuint numReqFrags,
+ const NWCCFrag N_FAR * reqFrags,
+ nuint numReplyFrags,
+ pNWCCFrag replyFrags,
+ pnuint actualReplyLen
+);
+
+ /* The following functions are NLM CLIB specific and not supported in the
+ * NLM LibC x-plat libraries. The LibC stddef.h file defines
+ * __NOVELL_LIBC__
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+
+N_EXTERN_LIBRARY( NWRCODE )
+NWCCSetCurrentConnection
+(
+ NWCONN_HANDLE connHandle
+);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif /* NWCLXCON_INC */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwconfig.h b/LoginCapture/windows/external/xplatapi/include/nwconfig.h
new file mode 100644
index 00000000..3bece492
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwconfig.h
@@ -0,0 +1,102 @@
+/******************************************************************************
+
+ %name: nwconfig.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:24 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWCONFIG_H )
+#define NWCONFIG_H
+
+#include "npackon.h"
+
+#define T_OPTIONAL 0x80
+
+#define T_NUMBER 0x01
+#define T_INDEX 0x02
+#define T_STRING 0x03
+#define T_HEX_STRING 0x04
+#define T_HEX_NUMBER 0x05
+#define T_LONG_NUMBER 0x06
+#define T_LONG_HEX 0x07
+
+#define T_SET_1 0x10
+#define T_SET_2 0x11
+#define T_SET_3 0x12
+#define T_SET_4 0x13
+#define T_SET_5 0x14
+#define T_SET_6 0x15
+#define T_SET_7 0x16
+#define T_SET_8 0x17
+#define T_SET_9 0x18
+#define T_SET_10 0x19
+#define T_SET_11 0x1A
+#define T_SET_12 0x1B
+#define T_SET_13 0x1C
+#define T_SET_14 0x1D
+#define T_SET_15 0x1E
+#define T_SET_16 0x1F
+
+#define MAX_PARAMETERS 8
+#define MAX_SECTION_NAME_SIZE 32
+#define MAX_VALUE_SIZE 80
+#define MAX_SET_ELEMENTS 20
+
+typedef struct
+{
+ int numberOfElements;
+ int *elementCode;
+ char N_FAR * N_FAR *elementName;
+ int N_FAR *elementValue;
+} SetTableStruct;
+
+typedef struct
+{
+ int paramType;
+ long defaultValue;
+} TypeDefaultStruct;
+
+typedef union
+{
+ char N_FAR *string;
+ unsigned int number;
+ unsigned long longNumber;
+} PARAMETER_TABLE_TYPE;
+
+typedef struct
+{
+ int keywordCode;
+ char N_FAR *keyword;
+ void (N_FAR *function)(PARAMETER_TABLE_TYPE N_FAR *);
+ TypeDefaultStruct typeDefault[MAX_PARAMETERS];
+} GrammarTableStruct;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+N_EXTERN_LIBRARY( int )
+NWParseConfig(
+ PCHAR configFile,
+ PCHAR sectionName,
+ UINT sectionInstance,
+ UINT grammarTableSize,
+ GrammarTableStruct N_FAR *grammarTable,
+ SetTableStruct N_FAR *setTable);
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwconnec.h b/LoginCapture/windows/external/xplatapi/include/nwconnec.h
new file mode 100644
index 00000000..24f93d89
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwconnec.h
@@ -0,0 +1,159 @@
+/******************************************************************************
+
+ %name: nwconnec.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:26 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWCONNECT_H )
+#define NWCONNECT_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct tNWINET_ADDR
+{
+ nuint8 networkAddr[4];
+ nuint8 netNodeAddr[6];
+ nuint16 socket;
+ nuint16 connType; /* 3.11 and above only: 0=not in use, 2=NCP over IPX, 4=AFP */
+} NWINET_ADDR;
+
+#define CONNECTION_AVAILABLE 0x0001
+#define CONNECTION_PRIVATE 0x0002 /* obsolete */
+#define CONNECTION_LOGGED_IN 0x0004
+#define CONNECTION_LICENSED 0x0004
+#define CONNECTION_BROADCAST_AVAILABLE 0x0008
+#define CONNECTION_ABORTED 0x0010
+#define CONNECTION_REFUSE_GEN_BROADCAST 0x0020
+#define CONNECTION_BROADCASTS_DISABLED 0x0040
+#define CONNECTION_PRIMARY 0x0080
+#define CONNECTION_NDS 0x0100
+#define CONNECTION_PNW 0x4000 /* obsolete */
+#define CONNECTION_AUTHENTICATED 0x8000
+
+
+/* End of new connection model calls. */
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLockConnection
+(
+ NWCONN_HANDLE connHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetConnectionInformation
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 connNumber,
+ pnstr8 pObjName,
+ pnuint16 pObjType,
+ pnuint32 pObjID,
+ pnuint8 pLoginTime
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetInternetAddress
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 connNumber,
+ pnuint8 pInetAddr
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetInetAddr
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 connNum,
+ NWINET_ADDR N_FAR * pInetAddr
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearConnectionNumber
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 connNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDefaultConnRef
+(
+ pnuint32 pConnReference
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjectConnectionNumbers
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * pObjName,
+ nuint16 objType,
+ pnuint16 pNumConns,
+ pnuint16 pConnHandleList,
+ nuint16 maxConns
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetConnListFromObject
+(
+ NWCONN_HANDLE connHandle,
+ nuint32 objID,
+ nuint32 searchConnNum,
+ pnuint16 pConnListLen,
+ pnuint32 pConnList
+);
+
+#ifndef NWOS2
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPreferredServer
+(
+ NWCONN_HANDLE N_FAR * pConnHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetPreferredServer
+(
+ NWCONN_HANDLE connHandle
+);
+
+#else
+N_EXTERN_LIBRARY( NWCCODE )
+NWResetConnectionConfig
+(
+ nuint32 flags
+);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_connec.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif /* NWCONNECT_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdel.h b/LoginCapture/windows/external/xplatapi/include/nwdel.h
new file mode 100644
index 00000000..8070f6e7
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdel.h
@@ -0,0 +1,161 @@
+/******************************************************************************
+
+ %name: nwdel.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:28 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWDEL_H )
+#define NWDEL_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint32 sequence;
+ nuint32 parent;
+ nuint32 attributes;
+ nuint8 uniqueID;
+ nuint8 flags;
+ nuint8 nameSpace;
+ nuint8 nameLength;
+ nuint8 name [256];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 lastArchiveDateAndTime;
+ nuint32 lastArchiverID;
+ nuint32 updateDateAndTime;
+ nuint32 updatorID;
+ nuint32 fileSize;
+ nuint8 reserved[44];
+ nuint16 inheritedRightsMask;
+ nuint16 lastAccessDate;
+ nuint32 deletedTime;
+ nuint32 deletedDateAndTime;
+ nuint32 deletorID;
+ nuint8 reserved3 [16];
+} NWDELETED_INFO;
+
+typedef struct
+{
+ nuint32 sequence;
+ nuint32 parent;
+ nuint32 attributes;
+ nuint8 uniqueID;
+ nuint8 flags;
+ nuint8 nameSpace;
+ nuint16 nameLength;
+ nuint8 name [766];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 lastArchiveDateAndTime;
+ nuint32 lastArchiverID;
+ nuint32 updateDateAndTime;
+ nuint32 updatorID;
+ nuint32 fileSize;
+ nuint8 reserved[44];
+ nuint16 inheritedRightsMask;
+ nuint16 lastAccessDate;
+ nuint32 deletedTime;
+ nuint32 deletedDateAndTime;
+ nuint32 deletorID;
+ nuint8 reserved3 [16];
+} NWDELETED_INFO_EXT;
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWPurgeDeletedFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint32 iterHandle,
+ nuint32 volNum,
+ nuint32 dirBase,
+ const nstr8 N_FAR * fileName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRecoverDeletedFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint32 iterHandle,
+ nuint32 volNum,
+ nuint32 dirBase,
+ pnstr8 delFileName,
+ pnstr8 rcvrFileName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRecoverDeletedFileExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint32 iterHandle,
+ nuint32 volNum,
+ nuint32 dirBase,
+ pnstr8 delFileName,
+ pnstr8 rcvrFileName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanForDeletedFiles
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnuint32 iterHandle,
+ pnuint32 volNum,
+ pnuint32 dirBase,
+ NWDELETED_INFO N_FAR * entryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanForDeletedFilesExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnuint32 iterHandle,
+ pnuint32 volNum,
+ pnuint32 dirBase,
+ NWDELETED_INFO_EXT N_FAR * entryInfo
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_del.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif /* NWDEL_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdentry.h b/LoginCapture/windows/external/xplatapi/include/nwdentry.h
new file mode 100644
index 00000000..df9c6a1d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdentry.h
@@ -0,0 +1,316 @@
+/******************************************************************************
+
+ %name: nwdentry.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:30 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWDENTRY_H )
+#define NWDENTRY_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWDIRECT_H ) /* Needed to define TRUSTEE_INFO */
+#include "nwdirect.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nstr8 entryName[16];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 sequenceNumber;
+ TRUSTEE_INFO trusteeList[20];
+} NWET_INFO;
+
+typedef struct
+{
+ nstr8 entryName[16];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 sequenceNumber;
+ TRUSTEE_INFO trusteeList[100];
+} NWET_INFO_EXT;
+
+typedef struct
+{
+ nuint32 updateDateAndTime;
+ nuint32 updatorID;
+ nuint32 fileSize;
+ nuint8 reserved[44];
+ nuint16 inheritedRightsMask;
+ nuint16 lastAccessDate;
+ nuint8 reserved2[28];
+} NWFILE_INFO;
+typedef struct
+{
+ nuint32 lastModifyDateAndTime;
+ nuint32 nextTrusteeEntry;
+ nuint8 reserved[48];
+ nuint32 maximumSpace;
+ nuint16 inheritedRightsMask;
+ nuint8 reserved2[14];
+ nuint32 volObjectID;
+ nuint8 reserved3[8];
+} NWDIR_INFO;
+
+typedef struct
+{
+ nuint32 sequence;
+ nuint32 parent;
+ nuint32 attributes;
+ nuint8 uniqueID;
+ nuint8 flags;
+ nuint8 nameSpace;
+ nuint8 nameLength;
+ nuint8 name[12];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 lastArchiveDateAndTime;
+ nuint32 lastArchiverID;
+
+ union
+ {
+ NWFILE_INFO file;
+ NWDIR_INFO dir;
+ }info;
+
+} NWENTRY_INFO;
+
+typedef struct
+{
+ nuint32 sequence;
+ nuint32 parent;
+ nuint32 attributes;
+ nuint8 uniqueID;
+ nuint8 flags;
+ nuint8 nameSpace;
+ nuint8 nameLength;
+ nuint8 name [12];
+ nuint32 creationDateAndTime;
+ nuint32 ownerID;
+ nuint32 lastArchiveDateAndTime;
+ nuint32 lastArchiverID;
+ nuint32 updateDateAndTime;
+ nuint32 lastUpdatorID;
+ nuint32 dataForkSize; /* file size */
+ nuint32 dataForkFirstFAT;
+ nuint32 nextTrusteeEntry;
+ nuint8 reserved[36];
+ nuint16 inheritedRightsMask;
+ nuint16 lastAccessDate;
+ nuint32 deletedFileTime;
+ nuint32 deletedDateAndTime;
+ nuint32 deletorID;
+ nuint8 reserved2 [16];
+ nuint32 otherForkSize[2];
+} NW_EXT_FILE_INFO;
+
+#define TR_NONE 0x0000
+#define TR_READ 0x0001
+#define TR_WRITE 0x0002
+#define TR_OPEN 0x0004
+#define TR_DIRECTORY 0x0004
+#define TR_CREATE 0x0008
+#define TR_DELETE 0x0010
+#define TR_ERASE 0x0010
+#define TR_OWNERSHIP 0x0020
+#define TR_ACCESS_CTRL 0x0020
+#define TR_FILE_SCAN 0x0040
+#define TR_SEARCH 0x0040
+#define TR_FILE_ACCESS 0x0040
+#define TR_MODIFY 0x0080
+#define TR_ALL 0x01FB
+#define TR_SUPERVISOR 0x0100
+#define TR_NORMAL 0x00FB
+
+#ifndef MModifyNameBit
+#define MModifyNameBit 0x0001L
+#define MFileAttributesBit 0x0002L
+#define MCreateDateBit 0x0004L
+#define MCreateTimeBit 0x0008L
+#define MOwnerIDBit 0x0010L
+#define MLastArchivedDateBit 0x0020L
+#define MLastArchivedTimeBit 0x0040L
+#define MLastArchivedIDBit 0x0080L
+#define MLastUpdatedDateBit 0x0100L
+#define MLastUpdatedTimeBit 0x0200L
+#define MLastUpdatedIDBit 0x0400L
+#define MLastAccessedDateBit 0x0800L
+#define MInheritedRightsMaskBit 0x1000L
+#define MMaximumSpaceBit 0x2000L
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteTrustee
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ nuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteTrusteeExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ nuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAddTrustee
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 objID,
+ nuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAddTrusteeExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 objID,
+ nuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanDirEntryInfo
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint16 attrs,
+ pnuint32 iterHandle,
+ const nuint8 N_FAR * searchPattern,
+ NWENTRY_INFO N_FAR * entryInfo,
+ nuint16 augmentFlag
+);
+
+#define NWScanForTrustees(a, b, c, d, e, f) \
+ NWIntScanForTrustees(a, b, c, d, e, f, 0)
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanForTrustees
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint32 iterHandle,
+ pnuint16 numOfEntries,
+ NWET_INFO N_FAR * entryTrusteeInfo,
+ nuint16 augmentFlag
+);
+
+#define NWScanForTrusteesExt(a, b, c, d, e, f) \
+ NWIntScanForTrusteesExt(a, b, c, d, e, f, 0)
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanForTrusteesExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint32 iterHandle,
+ pnuint16 numOfEntries,
+ NWET_INFO_EXT N_FAR * entryTrusteeInfo,
+ nuint16 augmentFlag
+);
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntMoveDirEntry
+(
+ NWCONN_HANDLE conn,
+ nuint8 searchAttrs,
+ NWDIR_HANDLE srcDirHandle,
+ const nstr8 N_FAR * srcPath,
+ NWDIR_HANDLE dstDirHandle,
+ const nstr8 N_FAR * dstPath,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDirEntryInfo
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint8 searchAttrs,
+ nuint32 iterHandle,
+ nuint32 changeBits,
+ const NWENTRY_INFO N_FAR * newEntryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanExtendedInfo
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint8 attrs,
+ pnuint32 iterHandle,
+ const nstr8 N_FAR * searchPattern,
+ NW_EXT_FILE_INFO N_FAR * entryInfo,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEffectiveRights
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint16 effectiveRights
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEffectiveRightsExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint16 effectiveRights
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dentry.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdirect.h b/LoginCapture/windows/external/xplatapi/include/nwdirect.h
new file mode 100644
index 00000000..b9c1dc39
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdirect.h
@@ -0,0 +1,352 @@
+/******************************************************************************
+
+ %name: nwdirect.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:32 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWDIRECT_H )
+#define NWDIRECT_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWAPIDEF_H )
+#include "nwapidef.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint32 totalBlocks;
+ nuint32 availableBlocks;
+
+ nuint32 purgeableBlocks; /* set to zero if a dirHandle is present */
+ nuint32 notYetPurgeableBlocks;/*....when the NWGetDIrSpaceInfo() is called */
+
+ nuint32 totalDirEntries;
+ nuint32 availableDirEntries;
+ nuint32 reserved;
+ nuint8 sectorsPerBlock;
+ nuint8 volLen;
+ nuint8 volName[NW_MAX_VOLUME_NAME_LEN];
+} DIR_SPACE_INFO;
+
+/* Trustee Access Rights in a network directory */
+/* NOTE: TA_OPEN is obsolete in 3.x */
+#ifndef TA_NONE
+#define TA_NONE 0x00
+#define TA_READ 0x01
+#define TA_WRITE 0x02
+#define TA_OPEN 0x04
+#define TA_CREATE 0x08
+#define TA_DELETE 0x10
+#define TA_OWNERSHIP 0x20
+#define TA_SEARCH 0x40
+#define TA_MODIFY 0x80
+#define TA_ALL 0xFB
+#endif
+
+typedef struct
+{
+ nuint32 objectID;
+ nuint16 objectRights;
+} TRUSTEE_INFO;
+
+typedef struct
+{
+ nuint8 numEntries;
+ struct
+ {
+ nuint8 level;
+ nuint32 max;
+ nuint32 current;
+ } list[102];
+} NW_LIMIT_LIST;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAddTrusteeToDirectory
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 trusteeID,
+ nuint8 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteTrusteeFromDirectory
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEffectiveDirectoryRights
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint16 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWModifyMaximumRightsMask
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 revokeRightsMask,
+ nuint8 grantRightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanDirectoryForTrustees
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * searchPath,
+ pnuint16 iterHandle,
+ pnstr8 dirName,
+ pnuint32 dirDateTime,
+ pnuint32 ownerID,
+ pnuint32 trusteeIDs,
+ pnuint8 trusteeRights
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanDirectoryForTrustees2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * searchPath,
+ pnuint32 iterHandle,
+ pnstr8 dirName,
+ pnuint32 dirDateTime,
+ pnuint32 ownerID,
+ TRUSTEE_INFO N_FAR * trusteeList
+);
+
+#define NWScanDirectoryInformation(a, b, c, d, e, f, g, h) \
+ NWIntScanDirectoryInformation(a, b, c, d, e, f, g, h, 0)
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanDirectoryInformation
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * searchPath,
+ pnuint16 iterHandle,
+ pnstr8 dirName,
+ pnuint32 dirDateTime,
+ pnuint32 ownerID,
+ pnuint8 rightsMask,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanDirectoryInformation2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * searchPath,
+ pnuint8 sequence,
+ pnstr8 dirName,
+ pnuint32 dirDateTime,
+ pnuint32 ownerID,
+ pnuint8 rightsMask,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDirectoryInformation
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 dirDateTime,
+ nuint32 ownerID,
+ nuint8 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAllocPermanentDirectoryHandle
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ NWDIR_HANDLE N_FAR * newDirHandle,
+ pnuint8 effectiveRights
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAllocTemporaryDirectoryHandle
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ NWDIR_HANDLE N_FAR * newDirHandle,
+ pnuint8 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeallocateDirectoryHandle
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDirectoryHandlePath
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE sourceDirHandle,
+ const nstr8 N_FAR * dirPath,
+ NWDIR_HANDLE destDirHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirectoryHandlePath
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateDirectory
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ nuint8 accessMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteDirectory
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRenameDirectory
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * oldName,
+ const nstr8 N_FAR * newName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDirSpaceLimit
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint32 spaceLimit
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirSpaceLimitList
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnuint8 returnBuf
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirSpaceLimitList2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ NW_LIMIT_LIST N_FAR * limitList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirSpaceInfo
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint16 volNum,
+ DIR_SPACE_INFO N_FAR * spaceInfo
+);
+
+#ifndef TF_READ_ONLY
+#define TF_NORMAL 0x0000
+#define TF_READ_ONLY 0x0001L
+#define TF_HIDDEN 0x0002L
+#define TF_SYSTEM 0x0004L
+#define TF_EXECUTE_ONLY 0x0008L
+
+#define TF_DIRECTORY 0x0010L
+#define TF_NEEDS_ARCHIVED 0x0020L
+#define TF_EXECUTE_CONFIRM 0X0040L
+#define TF_SHAREABLE 0x0080L
+
+#define TF_LOW_SEARCH_BIT 0x0100L
+#define TF_MID_SEARCH_BIT 0x0200L
+#define TF_HI_SEARCH_BIT 0x0400L
+#define TF_PRIVATE 0x0800L
+
+#define TF_TRANSACTIONAL 0x1000L
+#define TF_INDEXED 0x2000L
+#define TF_READ_AUDIT 0x4000L
+#define TF_WRITE_AUDIT 0x8000L
+
+#define TF_PURGE 0x10000L
+#define TF_RENAME_INHIBIT 0x20000L
+#define TF_DELETE_INHIBIT 0x40000L
+#define TF_COPY_INHIBIT 0x80000L
+#define TF_AUDITING_BIT 0x00100000L
+#endif
+
+/* DIRECTORY ATTRIBUTES */
+
+#define TD_HIDDEN TF_HIDDEN
+#define TD_SYSTEM TF_SYSTEM
+#define TD_PURGE TF_PURGE
+#define TD_PRIVATE TF_PRIVATE
+#define TD_VISIBLE TF_PRIVATE
+#define TD_RENAME_INHIBIT TF_RENAME_INHIBIT
+#define TD_DELETE_INHIBIT TF_DELETE_INHIBIT
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_direct.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdpath.h b/LoginCapture/windows/external/xplatapi/include/nwdpath.h
new file mode 100644
index 00000000..8712a263
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdpath.h
@@ -0,0 +1,244 @@
+/******************************************************************************
+
+ %name: nwdpath.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:35 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWDPATH_H )
+#define NWDPATH_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* status values for NWGetDriveStatus */
+#define NW_UNMAPPED_DRIVE 0x0000
+#define NW_FREE_DRIVE 0x0000
+#define NW_CDROM_DRIVE 0x0400
+#define NW_LOCAL_FREE_DRIVE 0x0800
+#define NW_LOCAL_DRIVE 0x1000
+#define NW_NETWORK_DRIVE 0x2000
+#define NW_LITE_DRIVE 0x4000
+#define NW_PNW_DRIVE 0x4000
+#define NW_NETWARE_DRIVE 0x8000
+
+/* return error for NWGetDriveStatus */
+#define NW_INVALID_DRIVE 15
+
+/* defined for pathFormat parameter in NWGetDriveStatus */
+#define NW_FORMAT_NETWARE 0
+#define NW_FORMAT_SERVER_VOLUME 1
+#define NW_FORMAT_DRIVE 2
+#define NW_FORMAT_UNC 3
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDriveBase
+(
+ nuint16 driveNum,
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ nuint16 driveScope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetInitDrive
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetSearchDriveVector
+(
+ pnstr8 vectorBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetSearchDriveVector
+(
+ pnstr8 vectorBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteDriveBase
+(
+ nuint16 driveNum,
+ nuint16 driveScope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPathFromDirectoryBase /* 3.x & 4.x file servers */
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint32 dirBase,
+ nuint8 namSpc,
+ pnuint8 len,
+ pnstr8 pathName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPathFromDirectoryEntry /* 2.x file servers only */
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint16 dirEntry,
+ pnuint8 len,
+ pnstr8 pathName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDrivePathConnRef
+(
+ nuint16 driveNum,
+ nuint16 mode,
+ pnuint32 connRef,
+ pnstr8 basePath,
+ pnuint16 driveScope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDrivePath
+(
+ nuint16 driveNum,
+ nuint16 mode,
+ NWCONN_HANDLE N_FAR * conn,
+ pnstr8 basePath,
+ pnuint16 driveScope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDriveInformation
+(
+ nuint16 driveNum,
+ nuint16 mode,
+ NWCONN_HANDLE N_FAR * conn,
+ NWDIR_HANDLE N_FAR * dirHandle,
+ pnuint16 driveScope,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDriveInfoConnRef
+(
+ nuint16 driveNum,
+ nuint16 mode,
+ pnuint32 connRef,
+ NWDIR_HANDLE N_FAR * dirHandle,
+ pnuint16 driveScope,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDriveStatus
+(
+ nuint16 driveNum,
+ nuint16 pathFormat,
+ pnuint16 status,
+ NWCONN_HANDLE N_FAR * conn,
+ pnstr8 rootPath,
+ pnstr8 relPath,
+ pnstr8 fullPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDriveStatusConnRef
+(
+ nuint16 driveNum,
+ nuint16 pathFormat,
+ pnuint16 status,
+ pnuint32 connRef,
+ pnstr8 rootPath,
+ pnstr8 relPath,
+ pnstr8 fullPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFirstDrive
+(
+ pnuint16 firstDrive
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParseNetWarePath
+(
+ const nstr8 N_FAR * path,
+ NWCONN_HANDLE N_FAR * conn,
+ NWDIR_HANDLE N_FAR * dirHandle,
+ pnstr8 newPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParseNetWarePathConnRef
+(
+ const nstr8 N_FAR * path,
+ pnuint32 connRef,
+ NWDIR_HANDLE N_FAR * dirHandle,
+ pnstr8 newPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParsePathConnRef
+(
+ const nstr8 N_FAR * path,
+ pnstr8 serverName,
+ pnuint32 connRef,
+ pnstr8 volName,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParsePath
+(
+ const nstr8 N_FAR * path,
+ pnstr8 serverName,
+ NWCONN_HANDLE N_FAR * conn,
+ pnstr8 volName,
+ pnstr8 dirPath
+);
+
+N_EXTERN_LIBRARY( pnstr8 )
+NWStripServerOffPath
+(
+ const nstr8 N_FAR * path,
+ pnstr8 server
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateUNCPath
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnstr8 path,
+ pnstr8 UNCPath
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsacl.h b/LoginCapture/windows/external/xplatapi/include/nwdsacl.h
new file mode 100644
index 00000000..c6d1ec18
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsacl.h
@@ -0,0 +1,71 @@
+/******************************************************************************
+
+ %name: nwdsacl.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:37 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSACL_H )
+#define NWDSACL_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H ) /* Needed to defined pBuf_T */
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NWDSDC_H ) /* Needed to defined NWDSContextHandle */
+#include "nwdsdc.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetEffectiveRights
+(
+ NWDSContextHandle context,
+ pnstr8 subjectName,
+ pnstr8 objectName,
+ pnstr8 attrName,
+ pnuint32 privileges
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSListAttrsEffectiveRights
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 subjectName,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ pBuf_T privilegeInfo
+);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#include "npackoff.h"
+#endif /* NWDSACL_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsapi.h b/LoginCapture/windows/external/xplatapi/include/nwdsapi.h
new file mode 100644
index 00000000..45e3cb94
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsapi.h
@@ -0,0 +1,193 @@
+/******************************************************************************
+ Source module name:
+ Release Version:
+
+ %name: nwdsapi.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:39 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#ifndef __NWDSAPI_H__
+#define __NWDSAPI_H__
+#if defined( N_PLAT_NLM )
+
+/*
+ ===============================================================================
+ = WARNING: This header is obsolete and is only for backward compatibility
+ = with the legacy DSAPI.NLM. The equivalent functionality is available
+ = in NWNet.h. The NWNet.h header should be used.
+ ===============================================================================
+*/
+
+#include
+#if !defined(__NOVELL_LIBC__)
+#if ! defined ( _NWFATTR_H_ )
+#include
+#include
+#endif
+#undef FA_NORMAL
+#undef FA_HIDDEN
+#undef FA_SYSTEM
+#endif
+
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+
+/* nwalias.h defines NWCONN_TYPE, NWSTATUS, NWOBJ_TYPE for us */
+#if ! defined ( NWALIAS_H )
+# include "nwalias.h"
+#endif
+
+
+
+#ifndef USE_NW_WILD_MATCH
+#define USE_NW_WILD_MATCH 0
+#endif
+
+#ifndef USE_DOS_WILD_MATCH
+#define USE_DOS_WILD_MATCH 1
+#endif
+
+/* Scope specifiers */
+#define GLOBAL 0
+#define PRIVATE 1
+#define MY_SESSION 2
+#define ALL_SESSIONS 3
+
+
+/* nwdstype defines NWDSCODE for us */
+#if ! defined ( NWDSTYPE_H )
+# include "nwdstype.h"
+#endif
+
+#ifndef NWCONN_ID
+# define NWCONN_ID unsigned int
+#endif
+
+#ifndef NWCONN_NUM_BYTE
+# define NWCONN_NUM_BYTE unsigned char
+#endif
+
+#ifndef NWDSDEFS_H
+# include
+typedef enum EMAIL_ADDRESS_TYPE
+{
+ SMF70 = 1, SMF71, SMTP, X400, SNADS, PROFS
+} EMAIL_ADDRESS_TYPE;
+
+#define DS_TYPES_REQUIRED 0x0010
+#endif
+
+#ifndef __NWDSERR_H
+# include /* Not present in xplat */
+#endif
+
+#ifndef NWDSNAME_H
+# include
+#endif
+
+#ifndef NWDSFILT_H
+# include
+#endif
+
+#ifndef NWDSMISC_H
+# include
+#endif
+
+#ifndef NWDSACL_H
+# include
+#endif
+
+#ifndef NWDSAUD_H
+# include
+#endif
+
+#ifndef NWDSDSA_H
+# include
+#endif
+
+#ifndef NWDSSCH_H
+# include
+#endif
+
+#ifndef NWDSATTR_H
+# include
+#endif
+
+#ifndef NWDSASA_H
+# include
+# define GENERATE_CERTIFICATION_KP_F 1
+#endif
+
+#ifndef NWDSPART_H
+# include
+#endif
+
+#ifndef NWDSBUFT_H
+# include
+#endif
+
+#ifndef NWDSNMTP_H
+# include
+#endif
+
+#ifndef NUNICODE_H
+# include
+#define DONT_USE_NOMAP_CHAR 0L /* for 'noMapFlag' in NWLocalToUnicode() */
+#define USE_NOMAP_CHAR 1L /* and NWUnicodeToLocal() */
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_GLOBAL_LIBRARY( NWCCODE )
+NWDSLoginAsServer
+(
+ NWDSContextHandle context
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*==============================================================================
+** NLM-specific error codes which may be returned from Directory Services calls.
+** For principal Directory Services error codes, see file NWDSErr.h.
+**==============================================================================
+*/
+#define ERR_BAD_SERVICE_CONNECTION -400
+#define ERR_BAD_NETWORK -401
+#define ERR_BAD_ADDRESS -402
+#define ERR_SLOT_ALLOCATION -403
+#define ERR_BAD_BROADCAST -404
+#define ERR_BAD_SERVER_NAME -405
+#define ERR_BAD_USER_NAME -406
+#define ERR_NO_MEMORY -408
+
+#define ERR_BAD_SOCKET -410
+#define ERR_TAG_ALLOCATION -411
+#define ERR_CONNECTION_ABORTED -412
+#define ERR_TIMEOUT -413
+#define ERR_CHECKSUM -414
+#define ERR_NO_FRAGMENT_LIST -415
+
+#endif
+#endif
+
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsasa.h b/LoginCapture/windows/external/xplatapi/include/nwdsasa.h
new file mode 100644
index 00000000..2f7fceaa
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsasa.h
@@ -0,0 +1,181 @@
+/******************************************************************************
+
+ %name: nwdsasa.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:41 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSASA_H )
+#define NWDSASA_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h" /* for NWDSContextHandle typedef */
+#endif
+
+#include "npackon.h"
+
+#define SESSION_KEY_SIZE 16
+typedef nuint8 NWDS_Session_Key_T[SESSION_KEY_SIZE]; /* Optional session key */
+typedef NWDS_Session_Key_T N_FAR * pNWDS_Session_Key_T;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAuthenticateConn
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAuthenticateConnEx
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSChangeObjectPassword
+(
+ NWDSContextHandle context,
+ nflag32 pwdOption,
+ pnstr8 objectName,
+ pnstr8 oldPassword,
+ pnstr8 newPassword
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGenerateObjectKeyPair
+(
+ NWDSContextHandle contextHandle,
+ pnstr8 objectName,
+ pnstr8 objectPassword,
+ nflag32 pwdOption
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGenerateObjectKeyPair2
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 pseudoID,
+ nuint32 pwdLen,
+ pnstr8 pwdHash,
+ nuint32 optionsFlag
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSLogin
+(
+ NWDSContextHandle context,
+ nflag32 optionsFlag,
+ pnstr8 objectName,
+ pnstr8 password,
+ nuint32 validityPeriod
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSLogout
+(
+ NWDSContextHandle context
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSVerifyObjectPassword
+(
+ NWDSContextHandle context,
+ nflag32 optionsFlag,
+ pnstr8 objectName,
+ pnstr8 password
+);
+
+
+ /* The following APIs support extended and international characters in
+ * passwords - see nwdsdefs.h for a list of supported password
+ * formats
+ */
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGenerateKeyPairEx
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 pwdFormat,
+ nptr pwd,
+ nuint32 pwdOption
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSChangePwdEx
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 pwdFormat,
+ nptr oldPwd,
+ nptr newPwd,
+ nuint32 pwdOption
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSLoginEx
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 pwdFormat,
+ nptr pwd
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSVerifyPwdEx
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 pwdFormat,
+ nptr pwd
+);
+
+
+#if defined( N_PLAT_NLM )
+N_GLOBAL_LIBRARY( NWCCODE )
+NWDSLoginAsServer
+(
+ NWDSContextHandle context
+);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dsasa.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsattr.h b/LoginCapture/windows/external/xplatapi/include/nwdsattr.h
new file mode 100644
index 00000000..593e05b0
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsattr.h
@@ -0,0 +1,159 @@
+/******************************************************************************
+
+ %name: nwdsattr.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:44 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSATTR_H )
+#define NWDSATTR_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+#include "npackon.h"
+
+#define TIME_BITMAP_LEN 42
+#define NUM_POSTAL_ADDRESS_ELEMENTS 6
+
+typedef pnstr8 CE_String_T;
+typedef pnstr8 Class_Name_T;
+typedef pnstr8 CI_String_T;
+typedef pnstr8 CN_String_T;
+typedef pnstr8 DN_T;
+typedef nint32 Integer_T;
+typedef nuint8 Boolean_T;
+typedef pnstr8 NU_String_T;
+typedef pnstr8 Postal_Address_T[NUM_POSTAL_ADDRESS_ELEMENTS];
+typedef pnstr8 PR_String_T;
+typedef pnstr8 Secure_Name_T;
+typedef pnstr8 TN_String_T;
+typedef nuint32 Counter_T;
+
+typedef struct
+{
+ nuint32 remoteID;
+ pnstr8 objectName;
+} Back_Link_T, N_FAR *pBack_Link_T;
+
+typedef struct
+{
+ nuint32 numOfBits;
+ pnuint8 data;
+} Bit_String_T, N_FAR *pBit_String_T;
+
+typedef struct _ci_list
+{
+ struct _ci_list N_FAR *next;
+ pnstr8 s;
+} CI_List_T, N_FAR *pCI_List_T;
+
+typedef struct
+{
+ pnstr8 telephoneNumber;
+ Bit_String_T parameters;
+}Fax_Number_T, N_FAR *pFax_Number_T;
+
+typedef struct
+{
+ pnstr8 objectName;
+ nuint32 level;
+ nuint32 interval;
+} Typed_Name_T, N_FAR *pTyped_Name_T;
+
+typedef struct
+{
+ nuint32 addressType;
+ nuint32 addressLength;
+ pnuint8 address;
+} Net_Address_T, N_FAR *pNet_Address_T;
+
+typedef struct
+{
+ pnstr8 protectedAttrName;
+ pnstr8 subjectName;
+ nuint32 privileges;
+} Object_ACL_T, N_FAR *pObject_ACL_T;
+
+typedef struct
+{
+ nuint32 length;
+ pnuint8 data;
+} Octet_String_T, N_FAR *pOctet_String_T;
+
+typedef Octet_String_T Stream_T;
+typedef pOctet_String_T pStream_T;
+
+typedef struct _octet_list
+{
+ struct _octet_list N_FAR *next;
+ nuint32 length;
+ pnuint8 data;
+} Octet_List_T, N_FAR *pOctet_List_T;
+
+typedef struct
+{
+ pnstr8 objectName;
+ nuint32 amount;
+} Hold_T, N_FAR *pHold_T;
+
+typedef struct
+{
+ pnstr8 serverName;
+ nint32 replicaType;
+ nint32 replicaNumber;
+ nuint32 count;
+ Net_Address_T replicaAddressHint[1];
+} Replica_Pointer_T, N_FAR *pReplica_Pointer_T;
+
+typedef struct
+{
+ nuint32 type;
+ pnstr8 address;
+} EMail_Address_T, N_FAR *pEMail_Address_T;
+
+typedef struct
+{
+ nuint32 nameSpaceType;
+ pnstr8 volumeName;
+ pnstr8 path;
+} Path_T, N_FAR *pPath_T;
+
+typedef struct
+{
+ nuint32 wholeSeconds;
+ nuint32 eventID;
+} NWDS_TimeStamp_T, N_FAR *pNWDS_TimeStamp_T;
+
+typedef struct
+{
+ nuint32 wholeSeconds;
+ nuint16 replicaNum;
+ nuint16 eventID;
+} TimeStamp_T, N_FAR *pTimeStamp_T;
+
+typedef struct
+{
+ pnstr8 attrName;
+ nuint32 syntaxID;
+ nuint32 valueLen;
+ nptr value;
+} Unknown_Attr_T, N_FAR *pUnknown_Attr_T;
+
+#include "npackoff.h"
+#endif /* NWDSATTR_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsaud.h b/LoginCapture/windows/external/xplatapi/include/nwdsaud.h
new file mode 100644
index 00000000..6b1a6832
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsaud.h
@@ -0,0 +1,51 @@
+/******************************************************************************
+
+ %name: nwdsaud.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:46 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSAUD_H )
+#define NWDSAUD_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dsaud.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+
+#include "npackoff.h"
+#endif /* NWDSAUD_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsbuft.h b/LoginCapture/windows/external/xplatapi/include/nwdsbuft.h
new file mode 100644
index 00000000..ef67b7e9
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsbuft.h
@@ -0,0 +1,385 @@
+/******************************************************************************
+
+ %name : %
+ %version : %
+ %date_modified : %
+ $Copyright:
+
+ Copyright (c) 1989-1998 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSBUFT_H )
+#define NWDSBUFT_H
+
+#include
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+#if ! defined ( NWDSDEFS_H )
+#include "nwdsdefs.h"
+#endif
+
+#if ! defined ( NWDSATTR_H )
+#include "nwdsattr.h"
+#endif
+
+#include "npackon.h"
+
+#define INPUT_BUFFER 0x00000001
+
+typedef struct
+{
+ nuint32 operation;
+ nuint32 flags;
+ nuint32 maxLen;
+ nuint32 curLen;
+ pnuint8 lastCount;
+ pnuint8 curPos;
+ pnuint8 data;
+} Buf_T, N_FAR *pBuf_T, N_FAR * N_FAR *ppBuf_T;
+
+typedef struct
+{
+ nuint32 objectFlags;
+ nuint32 subordinateCount;
+ time_t modificationTime;
+ char baseClass[MAX_SCHEMA_NAME_BYTES + 2];
+} Object_Info_T, N_FAR *pObject_Info_T;
+
+typedef struct
+{
+ nuint32 length;
+ nuint8 data[MAX_ASN1_NAME];
+} Asn1ID_T, N_FAR *pAsn1ID_T;
+
+typedef struct
+{
+ nuint32 attrFlags;
+ nint32 attrSyntaxID;
+ nint32 attrLower;
+ nint32 attrUpper;
+ Asn1ID_T asn1ID;
+} Attr_Info_T, N_FAR *pAttr_Info_T;
+
+typedef struct
+{
+ nuint32 classFlags;
+ Asn1ID_T asn1ID;
+} Class_Info_T, N_FAR *pClass_Info_T;
+
+typedef struct
+{
+ nuint32 ID;
+ char defStr[MAX_SCHEMA_NAME_BYTES + 2];
+ nflag16 flags;
+} Syntax_Info_T, N_FAR *pSyntax_Info_T;
+
+#define NWDSPutClassName(c, b, n) NWDSPutClassItem(c, b, n)
+#define NWDSPutSyntaxName(c, b, n) NWDSPutClassItem(c, b, n)
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAllocBuf
+(
+ size_t size,
+ ppBuf_T buf
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSComputeAttrValSize
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ nuint32 syntaxID,
+ pnuint32 attrValSize
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSFreeBuf
+(
+ pBuf_T buf
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrCount
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 attrCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrDef
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 attrName,
+ pAttr_Info_T attrInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrName
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 attrName,
+ pnuint32 attrValCount,
+ pnuint32 syntaxID
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrVal
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ nuint32 syntaxID,
+ nptr attrVal
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrValModTime
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pTimeStamp_T timeStamp
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetAttrValFlags
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 valueFlags
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetClassDef
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 className,
+ pClass_Info_T classInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetClassDefCount
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 classDefCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetClassItem
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 itemName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetClassItemCount
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 itemCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetObjectCount
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 objectCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetObjectName
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 objectName,
+ pnuint32 attrCount,
+ pObject_Info_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetObjectNameAndInfo
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 objectName,
+ pnuint32 attrCount,
+ ppnstr8 objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetDSIInfo
+(
+ NWDSContextHandle context,
+ nptr buf,
+ nuint32 bufLen,
+ nuint32 infoFlag,
+ nptr data
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetPartitionInfo
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 partitionName,
+ pnuint32 replicaType
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetReplicaReferenceRootID
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 replicaRootID
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetServerName
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 serverName,
+ pnuint32 partitionCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetPartitionExtInfoPtr
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ ppnstr8 infoPtr,
+ ppnstr8 infoPtrEnd
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetPartitionExtInfo
+(
+ NWDSContextHandle context,
+ pnstr8 infoPtr,
+ pnstr8 limit,
+ nflag32 infoFlag,
+ pnuint32 length,
+ nptr data
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetSyntaxCount
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnuint32 syntaxCount
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetSyntaxDef
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 syntaxName,
+ pSyntax_Info_T syntaxDef
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSInitBuf
+(
+ NWDSContextHandle context,
+ nuint32 operation,
+ pBuf_T buf
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutAttrName
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 attrName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutAttrVal
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ nuint32 syntaxID,
+ nptr attrVal
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutAttrNameAndVal
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 attrName,
+ nuint32 syntaxID,
+ nptr attrVal
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutChange
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ nuint32 changeType,
+ pnstr8 attrName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutChangeAndVal
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ nuint32 changeType,
+ pnstr8 attrName,
+ nuint32 syntaxID,
+ nptr attrVal
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutClassItem
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pnstr8 itemName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSBeginClassItem
+(
+ NWDSContextHandle context,
+ pBuf_T buf
+);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#include "npackoff.h"
+#endif /* NWDSBUFT_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsconn.h b/LoginCapture/windows/external/xplatapi/include/nwdsconn.h
new file mode 100644
index 00000000..fe17c0f4
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsconn.h
@@ -0,0 +1,121 @@
+/******************************************************************************
+
+ %name: nwdsconn.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:51 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSCONN_H )
+#define NWDSCONN_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSOpenConnToNDSServer
+(
+ NWDSContextHandle context,
+ pnstr8 serverName,
+ pNWCONN_HANDLE connHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetDefNameContext
+(
+ NWDSContextHandle context,
+ nuint nameContextLen,
+ pnstr8 nameContext
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSetDefNameContext
+(
+ NWDSContextHandle context,
+ nuint nameContextLen,
+ pnstr8 nameContext
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetMonitoredConnRef
+(
+ NWDSContextHandle context,
+ pnuint32 connRef
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSOpenMonitoredConn
+(
+ NWDSContextHandle context,
+ pNWCONN_HANDLE connHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSScanConnsForTrees
+(
+ NWDSContextHandle context,
+ nuint numOfPtrs,
+ pnuint numOfTrees,
+ ppnstr8 treeBufPtrs
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSScanForAvailableTrees
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnstr scanFilter,
+ pnint32 scanIndex,
+ pnstr treeName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReturnBlockOfAvailableTrees
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnstr scanFilter,
+ pnstr lastBlocksString,
+ pnstr endBoundString,
+ nuint32 maxTreeNames,
+ ppnstr arrayOfNames,
+ pnuint32 numberOfTrees,
+ pnuint32 totalUniqueTrees
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCanDSAuthenticate
+(
+ NWDSContextHandle context
+);
+
+
+#ifdef __cplusplus
+ }
+#endif
+#endif /* NWDSCONN_H */
+
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsdc.h b/LoginCapture/windows/external/xplatapi/include/nwdsdc.h
new file mode 100644
index 00000000..405318fa
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsdc.h
@@ -0,0 +1,176 @@
+/******************************************************************************
+
+ %name: nwdsdc.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:53 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1997 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSDC_H )
+#define NWDSDC_H
+
+#if ! defined( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#include "npackon.h"
+
+/* Directory Context Key names */
+
+#define DCK_FLAGS 1
+#define DCK_CONFIDENCE 2
+#define DCK_NAME_CONTEXT 3
+#define DCK_TRANSPORT_TYPE 4
+#define DCK_REFERRAL_SCOPE 5
+#define DCK_LAST_CONNECTION 8
+#define DCK_LAST_SERVER_ADDRESS 9 /* CLIB NLM only */
+#define DCK_LAST_ADDRESS_USED 10 /* CLIB NLM only */
+#define DCK_TREE_NAME 11
+#define DCK_DSI_FLAGS 12
+#define DCK_NAME_FORM 13
+#define DCK_NAME_CACHE_DEPTH 15
+#define DCK_AUTHENTICATION_MODE 20
+
+/* DCK_FLAGS bit values key */
+
+#define DCV_DEREF_ALIASES 0x00000001L
+#define DCV_XLATE_STRINGS 0x00000002L
+#define DCV_TYPELESS_NAMES 0x00000004L
+#define DCV_ASYNC_MODE 0x00000008L
+#define DCV_CANONICALIZE_NAMES 0x00000010L
+#define DCV_DEREF_BASE_CLASS 0x00000040L
+#define DCV_DISALLOW_REFERRALS 0x00000080L
+#define DCV_ALWAYS_EVALUATE_REFERRALS 0x00000100L
+#define DCV_EXTERNAL_REFERENCES 0x00000200L
+
+
+/* values for DCK_CONFIDENCE key */
+#define DCV_LOW_CONF 0
+#define DCV_MED_CONF 1
+#define DCV_HIGH_CONF 2
+
+#define MAX_MESSAGE_LEN (0xFC00) /* (63*1024) */
+#define DEFAULT_MESSAGE_LEN (4*1024)
+
+/* values for DCK_REFERRAL_SCOPE key */
+#define DCV_ANY_SCOPE 0
+#define DCV_COUNTRY_SCOPE 1
+#define DCV_ORGANIZATION_SCOPE 2
+#define DCV_LOCAL_SCOPE 3
+
+/* values for DCK_DSI_FLAGS key */
+#define DSI_OUTPUT_FIELDS 0x00000001L
+#define DSI_ENTRY_ID 0x00000002L
+#define DSI_ENTRY_FLAGS 0x00000004L
+#define DSI_SUBORDINATE_COUNT 0x00000008L
+#define DSI_MODIFICATION_TIME 0x00000010L
+#define DSI_MODIFICATION_TIMESTAMP 0x00000020L
+#define DSI_CREATION_TIMESTAMP 0x00000040L
+#define DSI_PARTITION_ROOT_ID 0x00000080L
+#define DSI_PARENT_ID 0x00000100L
+#define DSI_REVISION_COUNT 0x00000200L
+#define DSI_REPLICA_TYPE 0x00000400L
+#define DSI_BASE_CLASS 0x00000800L
+#define DSI_ENTRY_RDN 0x00001000L
+#define DSI_ENTRY_DN 0x00002000L
+#define DSI_PARTITION_ROOT_DN 0x00004000L
+#define DSI_PARENT_DN 0x00008000L
+#define DSI_PURGE_TIME 0x00010000L
+#define DSI_DEREFERENCE_BASE_CLASS 0x00020000L
+#define DSI_REPLICA_NUMBER 0x00040000L
+#define DSI_REPLICA_STATE 0x00080000L
+#define DSI_FEDERATION_BOUNDARY 0x00100000L
+#define DSI_SCHEMA_BOUNDARY 0x00200000L
+
+
+/* values for DCK_NAME_FORM key */
+#define DCV_NF_PARTIAL_DOT 1
+#define DCV_NF_FULL_DOT 2
+#define DCV_NF_SLASH 3
+
+/* values for DCK_AUTHENTICATION_MODE key */
+#define DCV_PUBLIC_AUTHEN 1
+#define DCV_PRIVATE_AUTHEN 2
+
+
+typedef nuint32 NWDSContextHandle;
+
+
+#if defined(N_PLAT_NLM)
+typedef struct
+{
+ nuint32 addressType;
+ nuint32 addressLength;
+ nuint8 address[12];
+} NWDSIPXNetworkAddr;
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSFreeContext
+(
+ NWDSContextHandle context
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetContext
+(
+ NWDSContextHandle context,
+ nint key,
+ nptr value
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSetContext
+(
+ NWDSContextHandle context,
+ nint key,
+ nptr value
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCreateContextHandle
+(
+ NWDSContextHandle N_FAR *newHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSDuplicateContextHandle
+(
+ NWDSContextHandle srcContextHandle,
+ NWDSContextHandle N_FAR *destContextHandle
+);
+
+#ifdef __cplusplus
+ }
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dsdc.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+
+#endif /* NWDSDC_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsdefs.h b/LoginCapture/windows/external/xplatapi/include/nwdsdefs.h
new file mode 100644
index 00000000..a715b8bc
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsdefs.h
@@ -0,0 +1,480 @@
+/******************************************************************************
+
+ %name: nwdsdefs.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:55 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSDEFS_H )
+#define NWDSDEFS_H
+
+/* * Directory Services NCP verb and subverbs * */
+#define DS_NCP_VERB 104
+
+/* subverbs */
+#define DS_NCP_PING 1
+#define DS_NCP_FRAGMENT 2
+#define DS_NCP_FRAGMENT_CLOSE 3
+#define DS_NCP_BINDERY_CONTEXT 4
+#define DS_NCP_MONITOR_CONNECTION 5
+#define DS_NCP_GET_DS_STATISTICS 6
+#define DS_NCP_RESET_DS_COUNTERS 7
+#define DS_NCP_RELOAD 8
+#define DS_NCP_AUDITING 200 /* 200 - 255 reserved for auditing */
+
+/* Directory Services PING information FLAGS */
+/* ping input flags, these flag are order dependent and alignment dependent */
+#define DSPING_SUPPORTED_FIELDS 0x00000001L
+#define DSPING_DEPTH 0x00000002L
+#define DSPING_BUILD_NUMBER 0x00000004L
+#define DSPING_FLAGS 0x00000008L
+#define DSPING_VERIFICATION_FLAGS 0x00000010L
+#define DSPING_LETTER_VERSION 0x00000020L
+#define DSPING_OS_VERSION 0x00000040L
+#define DSPING_TIMESYNC_STATE 0x00000080L
+#define DSPING_LICENSE_FLAGS 0x00000100L
+#define DSPING_DS_TIME 0x00000200L
+
+/* String and values that depend on alignment. */
+#define DSPING_SAP_NAME 0x00010000L
+#define DSPING_TREE_NAME 0x00020000L
+#define DSPING_OS_NAME 0x00040000L
+#define DSPING_HARDWARE_NAME 0x00080000L
+#define DSPING_VENDOR_NAME 0x00100000L
+
+/* ping output flags */
+#define DSPONG_ROOT_MOST_MASTER 0x0001
+#define DSPONG_TIME_SYNCHRONIZED 0x0002
+
+/* ping verification flags */
+#define DSPING_VERIFICATION_CHECKSUM 0x00000001L
+#define DSPING_VERIFICATION_CRC32 0x00000002L
+
+/* ping license flags */
+#define DSPING_LICENSE_SCALE 0x00000001L
+
+/* * Directory Services Large Packet Verb Numbers * */
+#define DSV_UNUSED_0 0 /* 0x00 */
+#define DSV_RESOLVE_NAME 1 /* 0x01 */
+#define DSV_READ_ENTRY_INFO 2 /* 0x02 */
+#define DSV_READ 3 /* 0x03 */
+#define DSV_COMPARE 4 /* 0x04 */
+#define DSV_LIST 5 /* 0x05 */
+#define DSV_SEARCH 6 /* 0x06 */
+#define DSV_ADD_ENTRY 7 /* 0x07 */
+#define DSV_REMOVE_ENTRY 8 /* 0x08 */
+#define DSV_MODIFY_ENTRY 9 /* 0x09 */
+#define DSV_MODIFY_RDN 10 /* 0x0A */
+#define DSV_DEFINE_ATTR 11 /* 0x0B */
+#define DSV_READ_ATTR_DEF 12 /* 0x0C */
+#define DSV_REMOVE_ATTR_DEF 13 /* 0x0D */
+#define DSV_DEFINE_CLASS 14 /* 0x0E */
+#define DSV_READ_CLASS_DEF 15 /* 0x0F */
+#define DSV_MODIFY_CLASS_DEF 16 /* 0x10 */
+#define DSV_REMOVE_CLASS_DEF 17 /* 0x11 */
+#define DSV_LIST_CONTAINABLE_CLASSES 18 /* 0x12 */
+#define DSV_GET_EFFECTIVE_RIGHTS 19 /* 0x13 */
+#define DSV_ADD_PARTITION 20 /* 0x14 */
+#define DSV_REMOVE_PARTITION 21 /* 0x15 */
+#define DSV_LIST_PARTITIONS 22 /* 0x16 */
+#define DSV_SPLIT_PARTITION 23 /* 0x17 */
+#define DSV_JOIN_PARTITIONS 24 /* 0x18 */
+#define DSV_ADD_REPLICA 25 /* 0x19 */
+#define DSV_REMOVE_REPLICA 26 /* 0x1A */
+#define DSV_OPEN_STREAM 27 /* 0x1B */
+#define DSV_SEARCH_FILTER 28 /* 0x1C */
+/* NDS Internal 29 */ /* 0x1D */
+/* NDS Internal 30 */ /* 0x1E */
+#define DSV_CHANGE_REPLICA_TYPE 31 /* 0x1F */
+/* NDS Internal 32 */ /* 0x20 */
+/* NDS Internal 33 */ /* 0x21 */
+/* NDS Internal 34 */ /* 0x22 */
+/* NDS Internal 35 */ /* 0x23 */
+/* NDS Internal 36 */ /* 0x24 */
+#define DSV_UPDATE_REPLICA 37 /* 0x25 */
+#define DSV_SYNC_PARTITION 38 /* 0x26 */
+#define DSV_SYNC_SCHEMA 39 /* 0x27 */
+#define DSV_READ_SYNTAXES 40 /* 0x28 */
+#define DSV_GET_REPLICA_ROOT_ID 41 /* 0x29 */
+#define DSV_BEGIN_MOVE_ENTRY 42 /* 0x2A */
+#define DSV_FINISH_MOVE_ENTRY 43 /* 0x2B */
+#define DSV_RELEASE_MOVED_ENTRY 44 /* 0x2C */
+#define DSV_BACKUP_ENTRY 45 /* 0x2D */
+#define DSV_RESTORE_ENTRY 46 /* 0x2E */
+/* NDS Internal 47 */ /* 0x2F */
+/* NDS Internal 48 */ /* 0x30 */
+/* NDS Internal 49 */ /* 0x31 */
+#define DSV_CLOSE_ITERATION 50 /* 0x32 */
+#define DSV_MUTATE_ENTRY 51 /* 0x33 */
+/* NDS Internal 52 */ /* 0x34 */
+#define DSV_GET_SERVER_ADDRESS 53 /* 0x35 */
+#define DSV_SET_KEYS 54 /* 0x36 */
+#define DSV_CHANGE_PASSWORD 55 /* 0x37 */
+#define DSV_VERIFY_PASSWORD 56 /* 0x38 */
+#define DSV_BEGIN_LOGIN 57 /* 0x39 */
+#define DSV_FINISH_LOGIN 58 /* 0x3A */
+#define DSV_BEGIN_AUTHENTICATION 59 /* 0x3B */
+#define DSV_FINISH_AUTHENTICATION 60 /* 0x3C */
+#define DSV_LOGOUT 61 /* 0x3D */
+#define DSV_REPAIR_RING 62 /* 0x3E */
+#define DSV_REPAIR_TIMESTAMPS 63 /* 0x3F */
+/* NDS Internal 64 */ /* 0x40 */
+/* NDS Internal 65 */ /* 0x41 */
+/* NDS Internal 66 */ /* 0x42 */
+/* NDS Internal 67 */ /* 0x43 */
+/* NDS Internal 68 */ /* 0x44 */
+#define DSV_DESIGNATE_NEW_MASTER 69 /* 0x45 */
+/* NDS Internal 70 */ /* 0x46 */
+/* NDS Internal 71 */ /* 0x47 */
+#define DSV_CHECK_LOGIN_RESTRICTIONS 72 /* 0x48 */
+/* NDS Internal 73 */ /* 0x49 */
+/* NDS Internal 74 */ /* 0x4A */
+/* NDS Internal 75 */ /* 0x4B */
+#define DSV_ABORT_PARTITION_OPERATION 76 /* 0x4C */
+/* NDS Internal 77 */ /* 0x4D */
+/* NDS Internal 78 */ /* 0x4E */
+#define DSV_READ_REFERENCES 79 /* 0x4F */
+#define DSV_INSPECT_ENTRY 80 /* 0x50 */
+#define DSV_GET_REMOTE_ENTRY_ID 81 /* 0x51 */
+#define DSV_CHANGE_SECURITY 82 /* 0x52 */
+#define DSV_CHECK_CONSOLE_OPERATOR 83 /* 0x53 */
+/* NDS Internal 84 */ /* 0x54 */
+#define DSV_MOVE_TREE 85 /* 0x55 */
+/* NDS Internal 86 */ /* 0x56 */
+/* NDS Internal 87 */ /* 0x57 */
+#define DSV_CHECK_SEV 88 /* 0x58 */
+/* NDS Internal 89 */ /* 0x59 */
+/* NDS Internal 90 */ /* 0x5a */
+#define DSV_RESEND_ENTRY 91 /* 0x5b */
+/* NDS Internal 92 */ /* 0x5c */
+#define DSV_STATISTICS 93 /* 0x5d */
+#define DSV_PING 94 /* 0x5e */
+#define DSV_GET_BINDERY_CONTEXTS 95 /* 0x5f */
+#define DSV_MONITOR_CONNECTION 96 /* 0x60 */
+#define DSV_GET_DS_STATISTICS 97 /* 0x61 */
+#define DSV_RESET_DS_COUNTERS 98 /* 0x62 */
+#define DSV_CONSOLE 99 /* 0x63 */
+#define DSV_READ_STREAM 100 /* 0x64 */
+#define DSV_WRITE_STREAM 101 /* 0x65 */
+#define DSV_CREATE_ORPHAN_PARTITION 102 /* 0x66 */
+#define DSV_REMOVE_ORPHAN_PARTITION 103 /* 0x67 */
+/* NDS Internal 104 */ /* 0x68 */
+/* NDS Internal 105 */ /* 0x69 */
+#define DSV_GUID_CREATE 106 /* 0x6A */
+#define DSV_GUID_INFO 107 /* 0x6B */
+/* NDS Internal 108 */ /* 0x6C */
+/* NDS Internal 109 */ /* 0x6D */
+#define DSV_ITERATOR 110 /* 0x6E */
+/* unused 111 */ /* 0x6F */
+#define DSV_CLOSE_STREAM 112 /* 0x70 */
+/* unused 113 */ /* 0x61 */
+#define DSV_READ_STATUS 114 /* 0x72 */
+#define DSV_PARTITION_SYNC_STATUS 115 /* 0x73 */
+#define DSV_READ_REF_DATA 116 /* 0x74 */
+#define DSV_WRITE_REF_DATA 117 /* 0x75 */
+#define DSV_RESOURCE_EVENT 118 /* 0x76 */
+/* NDS Internal 119 */ /* 0x77 */
+/* NDS Internal 120 */ /* 0x78 */
+/* NDS Internal 121 */ /* 0x79 */
+#define DSV_CHANGE_ATTR_DEF 122 /* 0x7A */
+#define DSV_SCHEMA_IN_USE 123 /* 0x7B */
+
+
+/* maximum number of characters in names, not including terminator */
+#define MAX_RDN_CHARS 128
+#define MAX_DN_CHARS 256
+#define MAX_SCHEMA_NAME_CHARS 32
+#define MAX_TREE_NAME_CHARS 32
+#define MAX_SAP_NAME_CHARS 47
+
+/* maximum size of names, including terminator */
+#define MAX_RDN_BYTES (2*(MAX_RDN_CHARS + 1))
+#define MAX_DN_BYTES (2*(MAX_DN_CHARS + 1))
+#define MAX_SCHEMA_NAME_BYTES (2*(MAX_SCHEMA_NAME_CHARS + 1))
+
+#define MAX_ASN1_NAME 32
+#define MAX_VALUE (63U * 1024U)
+#define MAX_MESSAGE 0x00010000L
+#define NO_MORE_ITERATIONS 0xffffffffL
+
+/* delimiters in names */
+#define DELIM_VALUE '='
+#define DELIM_DV '+'
+#define DELIM_RDN '.'
+#define ESCAPE_CHAR '\\'
+
+/* special entry names in ACLs */
+#define DS_ROOT_NAME "[Root]"
+#define DS_PUBLIC_NAME "[Public]"
+#define DS_MASK_NAME "[Inheritance Mask]"
+#define DS_CREATOR_NAME "[Creator]" /* can only be used in AddEntry */
+#define DS_SELF_NAME "[Self]" /* can only be used in AddEntry */
+
+/* special attribute names in ACLs */
+#define DS_ALL_ATTRS_NAME "[All Attributes Rights]"
+#define DS_ENTRY_RIGHTS_NAME "[Entry Rights]"
+
+typedef enum SYNTAX
+{
+ SYN_UNKNOWN, /* 0 */
+ SYN_DIST_NAME, /* 1 */
+ SYN_CE_STRING, /* 2 */
+ SYN_CI_STRING, /* 3 */
+ SYN_PR_STRING, /* 4 */
+ SYN_NU_STRING, /* 5 */
+ SYN_CI_LIST, /* 6 */
+ SYN_BOOLEAN, /* 7 */
+ SYN_INTEGER, /* 8 */
+ SYN_OCTET_STRING, /* 9 */
+ SYN_TEL_NUMBER, /* 10 */
+ SYN_FAX_NUMBER, /* 11 */
+ SYN_NET_ADDRESS, /* 12 */
+ SYN_OCTET_LIST, /* 13 */
+ SYN_EMAIL_ADDRESS, /* 14 */
+ SYN_PATH, /* 15 */
+ SYN_REPLICA_POINTER, /* 16 */
+ SYN_OBJECT_ACL, /* 17 */
+ SYN_PO_ADDRESS, /* 18 */
+ SYN_TIMESTAMP, /* 19 */
+ SYN_CLASS_NAME, /* 20 */
+ SYN_STREAM, /* 21 */
+ SYN_COUNTER, /* 22 */
+ SYN_BACK_LINK, /* 23 */
+ SYN_TIME, /* 24 */
+ SYN_TYPED_NAME, /* 25 */
+ SYN_HOLD, /* 26 */
+ SYN_INTERVAL, /* 27 */
+ SYNTAX_COUNT /* 28 */
+} SYNTAX;
+
+typedef enum NAME_SPACE_TYPE
+{
+ DS_DOS, DS_MACINTOSH, DS_UNIX, DS_FTAM, DS_OS2
+} NAME_SPACE_TYPE;
+
+typedef enum REPLICA_TYPE
+{
+ RT_MASTER, RT_SECONDARY, RT_READONLY, RT_SUBREF,
+ RT_SPARSE_WRITE, RT_SPARSE_READ, RT_COUNT
+} REPLICA_TYPE;
+
+
+typedef enum REPLICA_STATE
+{
+ RS_ON, RS_NEW_REPLICA, RS_DYING_REPLICA,
+ RS_LOCKED, RS_CRT_0, RS_CRT_1,
+ RS_TRANSITION_ON, RS_DEAD_REPLICA, RS_BEGIN_ADD,
+ RS_MASTER_START = 11, RS_MASTER_DONE, RS_FEDERATED,
+ RS_SS_0 = 48, RS_SS_1,
+ RS_JS_0 = 64, RS_JS_1, RS_JS_2,
+ RS_MS_0 = 80, RS_MS_1,
+ RS_COUNT
+} REPLICA_STATE;
+
+#define GET_REPLICA_TYPE(rpt) ((rpt) & 0x0000FFFF)
+#define GET_REPLICA_STATE(rpt) ((rpt) >> 16)
+
+/* typedef enum NET_ADDRESS_TYPE */
+/* { */
+/* NT_IPX, NT_IP, NT_SDLC, NT_TOKENRING_ETHERNET, NT_OSI, NT_APPLETALK, NT_COUNT */
+/* } NET_ADDRESS_TYPE; */
+
+typedef enum NET_ADDRESS_TYPE
+{
+ NT_IPX, NT_IP, NT_SDLC, NT_TOKENRING_ETHERNET,
+ NT_OSI, NT_APPLETALK, NT_NETBEUI, NT_SOCKADDR,
+ NT_UDP, NT_TCP, NT_UDP6, NT_TCP6, NT_INTERNAL,
+ NT_URL, NT_COUNT
+} NET_ADDRESS_TYPE;
+
+typedef enum NCP_SERVER_STATUS
+{
+ DS_UNKNOWN, DS_DOWN, DS_UP
+} NCP_SERVER_STATUS;
+
+#define IPX_ADDRESS_LEN 12
+#define IP_ADDRESS_LEN 6
+#define IP6_ADDRESS_LEN 22
+
+/*Entry flag definitions used by DSV_LIST, DSV_READ_ENTRY_INFO, DSV_SEARCH. */
+#define DS_ALIAS_ENTRY 0x0001
+#define DS_PARTITION_ROOT 0x0002
+#define DS_CONTAINER_ENTRY 0x0004
+#define DS_CONTAINER_ALIAS 0x0008
+#define DS_MATCHES_LIST_FILTER 0x0010 /* only returned by DSV_LIST */
+#define DS_REFERENCE_ENTRY 0x0020
+#define DS_40X_REFERENCE_ENTRY 0x0040
+#define DS_BACKLINKED 0x0080
+#define DS_NEW_ENTRY 0x0100
+#define DS_TEMPORARY_REFERENCE 0x0200
+#define DS_AUDITED 0x0400
+#define DS_ENTRY_NOT_PRESENT 0x0800
+#define DS_ENTRY_VERIFY_CTS 0x1000
+#define DS_ENTRY_DAMAGED 0x2000
+
+/* * definitions used by DSV_MODIFY_ENTRY * */
+#define DS_ADD_ATTRIBUTE 0x00 /* add first value of attribute, error if it already exists */
+#define DS_REMOVE_ATTRIBUTE 0x01 /* remove all values, error if attribute does not exist */
+#define DS_ADD_VALUE 0x02 /* add first or additional value, error if duplicate */
+#define DS_REMOVE_VALUE 0x03 /* remove a value, error if it does not exist */
+#define DS_ADDITIONAL_VALUE 0x04 /* add additional value, error if duplicate or first */
+#define DS_OVERWRITE_VALUE 0x05 /* add first or additional value, overwrite if duplicate */
+#define DS_CLEAR_ATTRIBUTE 0x06 /* remove all values, no error if attribute does not exists */
+#define DS_CLEAR_VALUE 0x07 /* remove value, no error if value does not exists */
+
+/* * definitions used by DSV_READ, DSV_SEARCH * */
+#define DS_ATTRIBUTE_NAMES 0x00
+#define DS_ATTRIBUTE_VALUES 0x01
+#define DS_EFFECTIVE_PRIVILEGES 0x02
+#define DS_VALUE_INFO 0x03
+#define DS_ABBREVIATED_VALUE 0x04
+#define DS_EXPANDED_CLASS 0x08 /* Only good on schema class definitions */
+
+
+/* * definitions used by DSV_READ for value flags * */
+#define DS_NOT_PRESENT 0x0000
+#define DS_NAMING 0x0001
+#define DS_BASECLASS 0x0002
+#define DS_PRESENT 0x0004
+#define DS_VALUE_DAMAGED 0x0008
+#define DS_SUPERCLASS 0x0010
+#define DS_AUXILIARYCLASS 0x0020
+
+/* * definitions used by DSV_READ_ATTR_DEF * */
+#define DS_SINGLE_VALUED_ATTR 0x0001 /* also used by DSV_DEFINE_ATTR */
+#define DS_SIZED_ATTR 0x0002 /* also used by DSV_DEFINE_ATTR */
+#define DS_NONREMOVABLE_ATTR 0x0004
+#define DS_READ_ONLY_ATTR 0x0008
+#define DS_HIDDEN_ATTR 0x0010
+#define DS_STRING_ATTR 0x0020
+#define DS_SYNC_IMMEDIATE 0x0040 /* also used by DSV_DEFINE_ATTR */
+#define DS_PUBLIC_READ 0x0080 /* also used by DSV_DEFINE_ATTR */
+#define DS_SERVER_READ 0x0100
+#define DS_WRITE_MANAGED 0x0200 /* also used by DSV_DEFINE_ATTR */
+#define DS_PER_REPLICA 0x0400 /* also used by DSV_DEFINE_ATTR */
+#define DS_SCHEDULE_SYNC_NEVER 0x0800 /* also used by DSV_DEFINE_ATTR */
+#define DS_OPERATIONAL 0x1000 /* also used by DSV_DEFINE_ATTR */
+#define DS_SPARSE_REQUIRED_ATTR 0x2000
+#define DS_SPARSE_OPERATIONAL_ATTR 0x4000
+
+/* info types and union tags */
+#define DS_ATTR_DEF_NAMES 0
+#define DS_ATTR_DEFS 1
+
+/* * definitions used by DSV_DEFINE_CLASS and DSV_READ_CLASS_DEF * */
+#define DS_CONTAINER_CLASS 0x01
+#define DS_EFFECTIVE_CLASS 0x02
+#define DS_NONREMOVABLE_CLASS 0x04
+#define DS_AMBIGUOUS_NAMING 0x08
+#define DS_AMBIGUOUS_CONTAINMENT 0x10
+#define DS_AUXILIARY_CLASS 0x20
+#define DS_OPERATIONAL_CLASS 0x40
+#define DS_SPARSE_REQUIRED_CLASS 0x80 /* Read-only */
+#define DS_SPARSE_OPERATIONAL_CLASS 0x100 /* Read-only */
+
+/* info types and union tags */
+#define DS_CLASS_DEF_NAMES 0
+#define DS_CLASS_DEFS 1
+#define DS_EXPANDED_CLASS_DEFS 2
+#define DS_INFO_CLASS_DEFS 3
+#define DS_FULL_CLASS_DEFS 4
+
+/* * definitions used by DSV_SEARCH * */
+#define DS_SEARCH_ENTRY 0
+#define DS_SEARCH_SUBORDINATES 1
+#define DS_SEARCH_SUBTREE 2
+#define DS_SEARCH_PARTITION 3
+
+#define DS_ALIAS_REFERRAL 0
+#define DS_PARTITION_REFERRAL 1
+
+#define DS_SEARCH_ITEM 0
+#define DS_SEARCH_OR 1
+#define DS_SEARCH_AND 2
+#define DS_SEARCH_NOT 3
+
+#define DS_SEARCH_EQUAL 7
+#define DS_SEARCH_GREATER_OR_EQUAL 8
+#define DS_SEARCH_LESS_OR_EQUAL 9
+#define DS_SEARCH_APPROX 10
+#define DS_SEARCH_PRESENT 15
+#define DS_SEARCH_RDN 16
+#define DS_SEARCH_BASE_CLASS 17
+#define DS_SEARCH_MODIFICATION_GE 18
+#define DS_SEARCH_VALUE_TIME_GE 19
+#define DS_SEARCH_REFERENCES 20
+#define DS_SEARCH_DN_IN_VALUE 21
+#define DS_SEARCH_SCHEMA_IN_VALUE 22
+
+/* * definitions used by Access Control * */
+#define DS_DYNAMIC_ACL 0x40000000L
+
+#define DS_ENTRY_BROWSE 0x00000001L
+#define DS_ENTRY_ADD 0x00000002L
+#define DS_ENTRY_DELETE 0x00000004L
+#define DS_ENTRY_RENAME 0x00000008L
+#define DS_ENTRY_SUPERVISOR 0x00000010L
+#define DS_ENTRY_INHERIT_CTL 0x00000040L
+
+#define DS_ENTRY_MASK (DS_ENTRY_BROWSE | DS_ENTRY_ADD \
+ | DS_ENTRY_DELETE | DS_ENTRY_RENAME \
+ | DS_ENTRY_SUPERVISOR | DS_ENTRY_INHERIT_CTL \
+ | DS_DYNAMIC_ACL )
+
+#define DS_ATTR_COMPARE 0x00000001L
+#define DS_ATTR_READ 0x00000002L
+#define DS_ATTR_WRITE 0x00000004L
+#define DS_ATTR_SELF 0x00000008L
+#define DS_ATTR_SUPERVISOR 0x00000020L
+#define DS_ATTR_INHERIT_CTL 0x00000040L
+
+#define DS_ATTR_MASK (DS_ATTR_COMPARE | DS_ATTR_READ | DS_ATTR_WRITE \
+ | DS_ATTR_SELF | DS_ATTR_SUPERVISOR \
+ | DS_ATTR_INHERIT_CTL | DS_DYNAMIC_ACL)
+
+#define DS_READ_STREAM 0x00000001L
+#define DS_WRITE_STREAM 0x00000002L
+
+#define SF_DO_IMMEDIATE 0x00000001
+#define SF_TRANSITION 0x00000002
+#define SF_SEND_ALL 0x00000004
+
+/* NDS Interval definitions */
+#define DS_INTERVAL_OUTPUT_FIELDS 0x00000001L
+#define DS_INTERVAL_JANITOR 0x00000002L
+#define DS_INTERVAL_FLAT_CLEANER 0x00000004L
+#define DS_INTERVAL_BACKLINK 0x00000008L
+#define DS_INTERVAL_SKULK_ERROR 0x00000010L
+#define DS_INTERVAL_FAST_SYNC 0x00000020L
+#define DS_INTERVAL_SLOW_SYNC 0x00000040L
+#define DS_INTERVAL_HEARTBEAT_SKULK 0x00000080L
+
+/* Password flags */
+#define ALL_PASSWORDS 0x00000000
+#define NDS_PASSWORD 0x00000001
+#define NT_PASSWORD 0x00000002
+#define AD_PASSWORD 0x00000004
+
+
+/* Password format flags used with the apis which support
+ * extended and international characters in passwords
+*/
+#define PWD_UNICODE_STRING 1
+#define PWD_UTF8_STRING 2
+#define PWD_RAW_C_STRING 3 /* binary data terminated with NULL */
+
+/* flags for DSV_MUTATE_ENTRY */
+#define DSM_APPLY_ACL_TEMPLATES 0x0001
+
+#endif /* NWDSDEFS_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsdsa.h b/LoginCapture/windows/external/xplatapi/include/nwdsdsa.h
new file mode 100644
index 00000000..ef7c94fd
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsdsa.h
@@ -0,0 +1,471 @@
+/******************************************************************************
+
+ %name: nwdsdsa.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:07:58 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1997 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSDSA_H )
+#define NWDSDSA_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H )
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NWDSATTR_H )
+#include "nwdsattr.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NUNICODE_H )
+#include "nunicode.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAddObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnint32 iterationHandle,
+ nbool8 more,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSBackupObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnint32 iterationHandle,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCompare
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ pBuf_T buf,
+ pnbool8 matched
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetPartitionRoot
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 partitionRoot
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSList
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ pnint32 iterationHandle,
+ pBuf_T subordinates
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSListContainers
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ pnint32 iterationHandle,
+ pBuf_T subordinates
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSListByClassAndName
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 className,
+ pnstr8 subordinateName,
+ pnint32 iterationHandle,
+ pBuf_T subordinates
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetCountByClassAndName
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 className,
+ pnstr8 subordinateName,
+ pnint32 count
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSMapIDToName
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ nuint32 objectID,
+ pnstr8 object
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSMapNameToID
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnstr8 object,
+ pnuint32 objectID
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSModifyObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnint32 iterationHandle,
+ nbool8 more,
+ pBuf_T changes
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSModifyDN
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 newDN,
+ nbool8 deleteOldRDN
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSModifyRDN
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 newDN,
+ nbool8 deleteOldRDN
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSMoveObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 destParentDN,
+ pnstr8 destRDN
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRead
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadObjectInfo
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ pnstr8 distinguishedName,
+ pObject_Info_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadObjectDSIInfo
+(
+ NWDSContextHandle context,
+ pnstr8 object,
+ nuint32 infoLength,
+ nptr objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemoveObject
+(
+ NWDSContextHandle context,
+ pnstr8 object
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRestoreObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnint32 iterationHandle,
+ nbool8 more,
+ nuint32 size,
+ pnuint8 objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSearch
+(
+ NWDSContextHandle context,
+ pnstr8 baseObjectName,
+ nint scope,
+ nbool8 searchAliases,
+ pBuf_T filter,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ nint32 countObjectsToSearch,
+ pnint32 countObjectsSearched,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSOpenStream
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 attrName,
+ nflag32 flags,
+ NWFILE_HANDLE N_FAR *fileHandle
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSWhoAmI
+(
+ NWDSContextHandle context,
+ pnstr8 objectName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetServerDN
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnstr8 serverDN
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetServerAddresses2
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnuint32 countNetAddress,
+ pBuf_T netAddresses
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSInspectEntry
+(
+ NWDSContextHandle context,
+ pnstr8 serverName,
+ pnstr8 objectName,
+ pBuf_T errBuffer
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadReferences
+(
+ NWDSContextHandle context,
+ pnstr8 serverName,
+ pnstr8 objectName,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ nuint32 timeFilter,
+ pnint32 iterationHandle,
+ pBuf_T objectInfo
+);
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSExtSyncList
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 className,
+ pnstr8 subordinateName,
+ pnint32 iterationHandle,
+ pTimeStamp_T timeStamp,
+ nbool onlyContainers,
+ pBuf_T subordinates
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSExtSyncRead
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ pTimeStamp_T timeStamp,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSExtSyncSearch
+(
+ NWDSContextHandle context,
+ pnstr8 baseObjectName,
+ nint scope,
+ nbool8 searchAliases,
+ pBuf_T filter,
+ pTimeStamp_T timeStamp,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ nint32 countObjectsToSearch,
+ pnint32 countObjectsSearched,
+ pBuf_T objectInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemSecurityEquiv
+(
+ NWDSContextHandle context,
+ pnstr8 equalFrom,
+ pnstr8 equalTo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAddSecurityEquiv
+(
+ NWDSContextHandle context,
+ pnstr8 equalFrom,
+ pnstr8 equalTo
+);
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSMutateObject
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 newObjectClass,
+ nuint32 flags
+);
+
+/*----- NDS Register For Event Function Prototypes -----*/
+#if defined( N_PLAT_NLM )
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSERegisterForEvent
+(
+ nint priority,
+ nuint32 type,
+ nint (*handler)(nuint32 type, nuint size, nptr data)
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSERegisterForEventWithResult
+(
+ nint priority,
+ nuint32 type,
+ nint (*handler)(nuint32 type, nuint size, nptr data, nint result),
+ nint flags
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEUnRegisterForEvent
+(
+ nint priority,
+ nuint32 type,
+ nint (*handler)(nuint32 type, nuint size, nptr data)
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalEntryName
+(
+ NWDSContextHandle context,
+ nuint32 entryID,
+ pnstr objectName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEConvertEntryName
+(
+ NWDSContextHandle context,
+ const punicode DSEventName,
+ pnstr objectName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalAttrName
+(
+ NWDSContextHandle context,
+ nuint32 attrID,
+ pnstr name
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalClassName
+(
+ NWDSContextHandle context,
+ nuint32 classID,
+ pnstr name
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalAttrID
+(
+ NWDSContextHandle context,
+ const pnstr name,
+ pnuint32 id
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalClassID
+(
+ NWDSContextHandle context,
+ const pnstr name,
+ pnuint32 id
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSEGetLocalEntryID
+(
+ NWDSContextHandle context,
+ const pnstr objectName,
+ pnuint32 id
+);
+#endif /* N_PLAT_NLM */
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dsdsa.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+
+#include "npackoff.h"
+#endif /* NWDSDSA_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsevnt.h b/LoginCapture/windows/external/xplatapi/include/nwdsevnt.h
new file mode 100644
index 00000000..4967d8dd
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsevnt.h
@@ -0,0 +1,705 @@
+/******************************************************************************
+ Source module name: nwdsevnt.h
+ Release Version:
+
+ %name: nwdsevnt.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:00 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1998 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#ifndef _NWDSEVNT_HEADER_
+#define _NWDSEVNT_HEADER_
+
+/*---------------------------------------------------------------------------
+ * definitions and functions required to receive event reports
+ */
+typedef enum DSEventPriority {EP_INLINE, EP_JOURNAL, EP_WORK} DSEventPriority;
+
+/*---------------------------------------------------------------------------
+ * event types
+ */
+
+#define DSE_INLINE_ONLY 0x80000000
+#define DSE_EVENT_MASK 0x7FFFFFFF
+
+/* First 19 events in 4.10 release; events 20-25 added to IW2 */
+#define DSE_INVALID 0
+#define DSE_CREATE_ENTRY 1 /* data is DSEEntryInfo */
+#define DSE_DELETE_ENTRY 2 /* data is DSEEntryInfo */
+#define DSE_RENAME_ENTRY 3 /* data is DSEEntryInfo */
+#define DSE_MOVE_SOURCE_ENTRY 4 /* data is DSEEntryInfo */
+#define DSE_ADD_VALUE 5 /* data is DSEValueInfo */
+#define DSE_DELETE_VALUE 6 /* data is DSEValueInfo */
+#define DSE_CLOSE_STREAM 7 /* data is DSEValueInfo */
+#define DSE_DELETE_ATTRIBUTE 8 /* data is DSEValueInfo */
+#define DSE_SET_BINDERY_CONTEXT 9 /* no data */
+#define DSE_CREATE_BINDERY_OBJECT 10 /* data is DSEBinderyObjectInfo */
+#define DSE_DELETE_BINDERY_OBJECT 11 /* data is DSEBinderyObjectInfo */
+#define DSE_CHECK_SEV 12 /* data is DSESEVInfo */
+#define DSE_UPDATE_SEV 13 /* no data */
+#define DSE_MOVE_DEST_ENTRY 14 /* data is DSEEntryInfo */
+#define DSE_DELETE_UNUSED_EXTREF 15 /* data is DSEEntryInfo */
+#define DSE_REMOTE_SERVER_DOWN 17 /* data is DSENetAddress */
+#define DSE_NCP_RETRY_EXPENDED 18 /* data is DSENetAddress */
+#define DSE_REMOTE_CONN_CLEARED 19 /* data is DSENetAddress */
+#define DSE_PARTITION_OPERATION_EVENT 20 /* data is DSEEventData; used by SCALE */
+#define DSE_CHANGE_MODULE_STATE 21 /* data is DSEModuleState */
+#define DSE_RESERVED_2 22 /* reserved */
+#define DSE_RESERVED_3 23 /* reserved */
+#define DSE_RESERVED_4 24 /* reserved */
+#define DSE_RESERVED_5 25 /* reserved */
+
+/* Events added post 4.10 */
+ /* All the DSE_DB_... events are "debug" trace events, each event
+ * corresponds to one old DSTrace type TV_..., most have many messages
+ * using the same event ID. No attempt has been made to make these calls
+ * outside the NDS locks, so you must presume that all these calls come
+ * inside the locks. These all use the DSEDebugInfo data structure,
+ * and the result (error) field is always 0 for these events
+ */
+#define DSE_DB_AUTHEN 26 /* authentication */
+#define DSE_DB_BACKLINK 27 /* backlink */
+#define DSE_DB_BUFFERS 28 /* request buffer display */
+#define DSE_DB_COLL 29 /* collisions */
+#define DSE_DB_DSAGENT 30 /* low level DSA tracing */
+#define DSE_DB_EMU 31 /* bindery emulator */
+#define DSE_DB_FRAGGER 32 /* fragger */
+#define DSE_DB_INIT 33 /* initialization */
+#define DSE_DB_INSPECTOR 34 /* inspector */
+#define DSE_DB_JANITOR 35 /* janitor */
+#define DSE_DB_LIMBER 36 /* limber */
+#define DSE_DB_LOCKING 37 /* locking */
+#define DSE_DB_MOVE 38 /* move */
+#define DSE_DB_MIN 39 /* default dstrace messages (equivalent to ON) */
+#define DSE_DB_MISC 40 /* miscellaneous */
+#define DSE_DB_PART 41 /* partition operations */
+#define DSE_DB_RECMAN 42 /* record manager */
+#define DSE_DB_RESNAME 44 /* resolve name */
+#define DSE_DB_SAP 45 /* SAP */
+#define DSE_DB_SCHEMA 46 /* schema */
+#define DSE_DB_SKULKER 47 /* skulker */
+#define DSE_DB_STREAMS 48 /* streams */
+#define DSE_DB_SYNC_IN 49 /* incoming sync traffic */
+#define DSE_DB_THREADS 50 /* DS thread scheduling */
+#define DSE_DB_TIMEVECTOR 51 /* time vectors */
+#define DSE_DB_VCLIENT 52 /* virtual client */
+
+ /* Nearly all the following events use the same DSEEventData structure.
+ * Not all fields are filled in for each event. The data in the
+ * structure is shown for each event. Any unused fields are set to -1
+ * for the ids or values, or set to 0 for the pointers.
+ */
+#define DSE_AGENT_OPEN_LOCAL 53 /* d1-state(2-Audit, 1-start, 0-end), result-valid for end state only, not in locks */
+#define DSE_AGENT_CLOSE_LOCAL 54 /* d1-state(1-start, 0-end), not in locks */
+#define DSE_DS_ERR_VIA_BINDERY 55 /* d1-error code being returned via the bindery, not in locks */
+#define DSE_DSA_BAD_VERB 56 /* d1-bad verb number given to DSA Request (NCP 104, 2), not in locks */
+#define DSE_DSA_REQUEST_START 57 /* d1-verb number (NCP 104, 2), not in locks */
+#define DSE_DSA_REQUEST_END 58 /* d1-verb number, d2-primaryID, d3-request size, d4-reply size, not in locks */
+#define DSE_MOVE_SUBTREE 59 /* d1-source ID, d1-Dest ID, not in locks */
+#define DSE_NO_REPLICA_PTR 60 /* d1-partitionID of partition, inside locks */
+#define DSE_SYNC_IN_END 61 /* d1-ID of server sending changes, d2 - partition Root ID, p3-Number entries sent(if no error), not in locks */
+#define DSE_BKLINK_SEV 62 /* d1-ID of object being updated, not in locks */
+#define DSE_BKLINK_OPERATOR 63 /* d1-ID of object whose console operator privilegs were changes, d2-ID of server privileges changed on, not in locks */
+#define DSE_DELETE_SUBTREE 64 /* d1-ID of subtree root, d2-count of objects deleted, inside locks & transaction */
+#define DSE_SET_NEW_MASTER 65 /* d1-ID of partition being changed, not in locks */
+#define DSE_PART_STATE_CHG_REQ 66 /* d1-ID of partition, d2-partnerPartID, d3-(function<<16)|type, d4-state */
+#define DSE_REFERRAL 67 /* d1-ID of local entry, d2-ID of partition, d3-referral type */
+#define DSE_UPDATE_CLASS_DEF 68 /* uname-name of schema class updated (added), inside locks & transaction */
+#define DSE_UPDATE_ATTR_DEF 69 /* uname-name of schema attribute updated (added), inside locks & transaction */
+#define DSE_LOST_ENTRY 70 /* d1-parent ID of entry, d2-timestamp.seconds of entry, d3-timestamp.replicaNumber, d4-timestamp.event, uname-unicode name of entry, inside locks & transaction */
+#define DSE_PURGE_ENTRY_FAIL 71 /* d1-ID of entry that failed, inside lock & transaction */
+#define DSE_PURGE_START 72 /* d1-ID of partition being purged, d2-replica type, inside lock */
+#define DSE_PURGE_END 73 /* d1-ID of partition purged, d2-number entries purged, d3-number values purged, not in locks */
+#define DSE_FLAT_CLEANER_END 74 /* d1-number entries purged, d2-number values purged, not in locks */
+#define DSE_ONE_REPLICA 75 /* d1-ID of partition with only one replica, inside lock */
+#define DSE_LIMBER_DONE 76 /* d1-all initialized (boolean value), d2-found new RDN (boolean), not in lock */
+#define DSE_SPLIT_DONE 77 /* d1-ID of parent partition root, d2-ID of child partition root, not in lock */
+#define DSE_SYNC_SVR_OUT_START 78 /* d1-ID of server, d2-rootID, d3-replica number, d4-replica state&type&flags, not in locks */
+#define DSE_SYNC_SVR_OUT_END 79 /* d1-ID of server, d2-partition rootID, d3-objects sent, d4-values sent, not in locks */
+#define DSE_SYNC_PART_START 80 /* d1-partition ID, d2-partition state, d3-replica type, inside lock */
+#define DSE_SYNC_PART_END 81 /* d1-partition ID, d2-(boolean value=)AllProcessed, not in lock */
+#define DSE_MOVE_TREE_START 82 /* d1-ID of subtree root being moved, d2-destination (parent) ID, d3-server ID starting from, not in lock */
+#define DSE_MOVE_TREE_END 83 /* d1-ID of subtree root being moved, d2-server ID starting from, not in lock */
+#define DSE_RECERT_PUB_KEY 84 /* d1-ID of entry whose keys are being certified, inside locks & transaction */
+#define DSE_GEN_CA_KEYS 85 /* d1-ID of entry having CA Keys generated, inside locks & transaction */
+#define DSE_JOIN_DONE 86 /* d1-ID of parent partition root, d2-ID of child partition root, inside lock */
+#define DSE_PARTITION_LOCKED 87 /* d1-ID of partition being locked, not in locks */
+#define DSE_PARTITION_UNLOCKED 88 /* d1-ID of partition being unlocked, not in locks */
+#define DSE_SCHEMA_SYNC 89 /* d1-(boolean value=)allProcessed, not in locks */
+#define DSE_NAME_COLLISION 90 /* d1-ID of original entry, d2-ID of duplicate entry, inside locks & transaction */
+#define DSE_NLM_LOADED 91 /* d1-module handle of NLM that was loaded, not in locks */
+#define DSE_PARTITION_EVENT 92 /* ** Uses DSEPartitionData structure */
+#define DSE_SKULKER_EVENT 93 /* ** Uses DSESkulkData structure */
+#define DSE_LUMBER_DONE 94 /* no parameters, not in lock */
+#define DSE_BACKLINK_PROC_DONE 95 /* no parameters, not in lock */
+#define DSE_SERVER_RENAME 96 /* name-ascii new server name, inside locks */
+#define DSE_SYNTHETIC_TIME 97 /* d1-root entry ID of partition issuing timestamp, d2-partition id, d3-count of timestamps requested, inside locks & transaction */
+#define DSE_SERVER_ADDRESS_CHANGE 98 /* no parameters, in locks */
+#define DSE_DSA_READ 99 /* d1-ID of entry being read, not in locks */
+
+ /* The following section of events are primarily for auditing, and thus
+ * whenever possible, the event is inside a transaction, so they can
+ * return an error and abort the transaction if necessary
+ */
+#define DSE_LOGIN 100 /* d1-parent id, d2-entry id, d3-usedNullPassword(boolean), d4-bindery login(0) or NDS login (-1) */
+#define DSE_CHGPASS 101 /* d1-parent id, d2-entry id */
+#define DSE_LOGOUT 102 /* d1-parent id, d2-entry id */
+#define DSE_ADD_REPLICA 103 /* d1-partition root id, d2-server ID, d3-replicaType, uname-servername */
+#define DSE_REMOVE_REPLICA 104 /* d1-partition root id, d2-server ID, uname-servername */
+#define DSE_SPLIT_PARTITION 105 /* d1-parent partition root id, d2-new partition root id, uname-new partition entry name */
+#define DSE_JOIN_PARTITIONS 106 /* d1-parent partition root id, d2-child partition root id */
+#define DSE_CHANGE_REPLICA_TYPE 107 /* d1-partition root id, d2-target server ID, d3-old type, d4-new type*/
+#define DSE_REMOVE_ENTRY 108 /* d1-parent id, d2-entry id, uname-entry name */
+#define DSE_ABORT_PARTITION_OP 109 /* d1-parent id, d2-entry id */
+#define DSE_RECV_REPLICA_UPDATES 110 /* d1-replica root id */
+#define DSE_REPAIR_TIME_STAMPS 111 /* d1-replica root id */
+#define DSE_SEND_REPLICA_UPDATES 112 /* d1-replica root id */
+#define DSE_VERIFY_PASS 113 /* d1-parent id, d2-entry id */
+#define DSE_BACKUP_ENTRY 114 /* d1-entry id */
+#define DSE_RESTORE_ENTRY 115 /* d1-parent id, name-entry rdn */
+#define DSE_DEFINE_ATTR_DEF 116 /* uname-attribute name*/
+#define DSE_REMOVE_ATTR_DEF 117 /* d1-attr id, d2-schema root ID, uname-attribute name */
+#define DSE_REMOVE_CLASS_DEF 118 /* d1-class id, d2-schema root ID, uname-class name */
+#define DSE_DEFINE_CLASS_DEF 119 /* uname-class name*/
+#define DSE_MODIFY_CLASS_DEF 120 /* d1-class id, d2-schema root ID, uname-class name */
+#define DSE_RESET_DS_COUNTERS 121 /* d2-server ID */
+#define DSE_REMOVE_ENTRY_DIR 122 /* d1-parent id, d2-entry id, uname-entry name*/
+#define DSE_COMPARE_ATTR_VALUE 123 /* d1-parent id, d2-entry id, uname-attribute name*/
+#define DSE_STREAM 124 /* d1-DSE_ST_OPEN, d2-entry id, d3-attr id, d4-requested rights */
+ /* d1-DSE_ST_CLOSE, d2-entry id, d3-attr id */
+#define DSE_LIST_SUBORDINATES 125 /* d1-parent id, d2-entry id, uname-entry name */
+#define DSE_LIST_CONT_CLASSES 126 /* d1-parent id, d2-entry id, uname-entry name */
+#define DSE_INSPECT_ENTRY 127 /* d1-parent id, d2-entry id */
+#define DSE_RESEND_ENTRY 128 /* d1-parent id, d2-entry id */
+#define DSE_MUTATE_ENTRY 129 /* d1-entry id, d2-new class id, uname-new class name */
+#define DSE_MERGE_ENTRIES 130 /* d1-winner parent id, d2-winner entry id, uname-loser entry name*/
+#define DSE_MERGE_TREE 131 /* d1-root entry id */
+#define DSE_CREATE_SUBREF 132 /* d1-sub ref id */
+#define DSE_LIST_PARTITIONS 133 /* d1-partition root entry id */
+#define DSE_READ_ATTR 134 /* d1-entry id, d2-attribute id */
+#define DSE_READ_REFERENCES 135 /* d1-entry id */
+#define DSE_UPDATE_REPLICA 136 /* d1-partition root id, d2-entry id, uname-entry name */
+#define DSE_START_UPDATE_REPLICA 137 /* d1-partition root id */
+#define DSE_END_UPDATE_REPLICA 138 /* d1-parititon root id */
+#define DSE_SYNC_PARTITION 139 /* d1-partition root id */
+#define DSE_SYNC_SCHEMA 140 /* d1-tree root id */
+#define DSE_CREATE_BACKLINK 141 /* d1-tree root id, d2-server ID request came from, d3-local entry ID, d4-remote entry ID */
+#define DSE_CHECK_CONSOLE_OPERATOR 142 /* d1-tree root id, d2-server ID, d3-isOperator boolean, d4-object ID being checked */
+#define DSE_CHANGE_TREE_NAME 143 /* d1-tree root id, uname-new tree name */
+#define DSE_START_JOIN 144 /* d1-parent partition root id, d2-child partition root id */
+#define DSE_ABORT_JOIN 145 /* d1-parent partition root id, d2-child partition root id */
+#define DSE_UPDATE_SCHEMA 146 /* d1-tree root id, d2-server id, inside locks & transaction */
+#define DSE_START_UPDATE_SCHEMA 147 /* d1-tree root id, d2-server id */
+#define DSE_END_UPDATE_SCHEMA 148 /* d1-tree root id, d2-server id */
+#define DSE_MOVE_TREE 149 /* d1-source parent id, d2-dest. parent id, d3-type (0|1), uname-(0=source DN)|(1=newName) */
+#define DSE_RELOAD_DS 150 /* d1-tree root id */
+#define DSE_ADD_PROPERTY 151 /* d1-object id, d3-security, d4-flags, name-object name */
+#define DSE_DELETE_PROPERTY 152 /* d1-object id, name-object name */
+#define DSE_ADD_MEMBER 153 /* d1-object id, d3-member id, name-property name */
+#define DSE_DELETE_MEMBER 154 /* d1-object id, d3-member id, name-property name */
+#define DSE_CHANGE_PROP_SECURITY 155 /* d1-object id, d3-new security, name-property name */
+#define DSE_CHANGE_OBJ_SECURITY 156 /* d1-object parent id, d2-object id, d3-new security */
+#define DSE_READ_OBJ_INFO 157 /* d1-parent id, d2-entry id */
+#define DSE_CONNECT_TO_ADDRESS 158 /* d1-task id, d3-address type, d4-address size, name-address data */
+#define DSE_SEARCH 159 /* d1-base object id, d2-scope, d3-nodes to search (not used currently) d4-infoType */
+#define DSE_PARTITION_STATE_CHG 160 /* d1-partitionRootID, d2-partnerPartID, d3-(function<<16)|type, d4-state */
+#define DSE_REMOVE_BACKLINK 161 /* d1-object ID affected, d2-serverID of removed backlink, d3-remoteID of removed backlink */
+#define DSE_LOW_LEVEL_JOIN 162 /* d1-parent partition Root ID, d2-child partition Root ID, not in lock */
+#define DSE_CREATE_NAMEBASE 163 /* no data, not in lock */
+#define DSE_CHANGE_SECURITY_EQUALS 164 /* d1-object ID, d2-equiv ID, d3-0=delete,1=add equivalence, inside locks & transaction */
+#define DSE_DB_NCPENG 166
+#define DSE_CRC_FAILURE 167 /* d1-CRC failure type (0=server | 1=client) d2-server | client CRC error count */
+#define DSE_ADD_ENTRY 168 /* d1-parent id, d2-object id, (success DSE_DATATYPE_STRUCT1) */
+#define DSE_MODIFY_ENTRY 169 /* d1-parent id, d2-object id, (success DSE_DATATYPE_STRUCT1) */
+#define DSE_OPEN_BINDERY 171 /* d1-tree root id */
+#define DSE_CLOSE_BINDERY 172 /* d1-tree root id */
+#define DSE_CHANGE_CONN_STATE 173 /* data is DSEChangeConnState */
+#define DSE_NEW_SCHEMA_EPOCH 174 /* d1-tree root id */
+#define DSE_DB_AUDIT 175 /* auditing debug messages */
+#define DSE_DB_AUDIT_NCP 176 /* audit ncp debug messages */
+#define DSE_DB_AUDIT_SKULK 177 /* audit skulking debug messages */
+#define DSE_MODIFY_RDN 178 /* d1-parentID, d2-entry ID, uname-oldRDN */
+#define DSE_DB_LDAP 179 /* ldap trace messages */
+#define DSE_ORPHAN_PARTITION 180 /* d1-DSE_OP_CREATE, d2-newPartitionID, d3-targetPartitionID */
+ /* d1-DSE_OP_REMOVE, d2-partitionID */
+ /* d1-DSE_OP_LINK, d2-partitionID, d3-targetPartitionID, d4-targetServerID */
+ /* d1-DSE_OP_UNLINK, d2-partitionID, d3-targetPartitionID */
+#define DSE_ENTRYID_SWAP 181 /* d1-srcID, d2-destID */
+
+#define DSE_DB_NCP_REQUEST 182 /* no data - used by lock check */
+#define DSE_DB_LOST_ENTRY 183 /* uses DSEDebugInfo */
+#define DSE_DB_CHANGE_CACHE 184 /* uses DSEDebugInfo */
+#define DSE_LOW_LEVEL_SPLIT 185 /* d1-parent partition Root ID, d2-child partition Root ID, not in lock */
+#define DSE_DB_PURGE 186 /* uses DSEDebugInfo */
+#define DSE_END_NAMEBASE_TRANSACTION 187 /* no data */
+#define DSE_ALLOW_LOGIN 188 /* d1-entryID, d2-flags */
+#define DSE_DB_CLIENT_BUFFERS 189 /* uses DSEDebugInfo, request buffer display */
+
+ /* The following section of events are primarily for WAN Traffic Manager,
+ * and thus are expected to be used as inline events so that the policy
+ * results can be returned to DS.
+ */
+
+#define DSE_DB_WANMAN 190 /* uses DSEDebugInfo */
+#define DSE_WTM_NDS_BACKLINKS 191 /* DSEWtmInfo */
+#define DSE_WTM_NDS_SCHEMA_SYNC 192 /* DSEWtmInfo */
+#define DSE_WTM_NDS_LIMBER 193 /* DSEWtmInfo */
+#define DSE_WTM_NDS_LOGIN_RESTRICTIONS 194 /* DSEWtmInfo */
+#define DSE_WTM_NDS_JANITOR 195 /* DSEWtmInfo */
+#define DSE_WTM_NDS_OPEN_CONNECTION 196 /* DSEWtmOpenInfo */
+
+#define DSE_LOCAL_REPLICA_CHANGE 197 /* d1-DSE_LRC_* opcode, d2-replicaRootID */
+#define DSE_DB_DRL 198 /* reference link debug messages */
+#define DSE_MOVE_ENTRY_SOURCE 199 /* d1-parentID, d2-dest parentID, d3-sourceID, uname-name */
+#define DSE_MOVE_ENTRY_DEST 200 /* d1-parentID, d2-dest parentID, d3-sourceID, uname-newName */
+#define DSE_NOTIFY_REF_CHANGE 201 /* d1-entryID used by obituary added to */
+#define DSE_DB_ALLOC 202 /* uses DSEDebugInfo */
+#define DSE_CONSOLE_OPERATION 203 /* d1-opCode - DSC_* flag */
+#define DSE_DB_SERVER_PACKET 204 /* uses DSEDebugInfo */
+#define DSE_START_DIB_CHECK 205 /* RecMan DIB validation */
+#define DSE_END_DIB_CHECK 206 /* RecMan DIB validation, d1-error status */
+#define DSE_DB_OBIT 207 /* uses DSEDebugInfo */
+#define DSE_REPLICA_IN_TRANSITION 208 /* d1-partition root ID, d2-last ID */
+#define DSE_DB_SYNC_DETAIL 209 /* uses DSEDebugInfo */
+#define DSE_DB_CONN_TRACE 210 /* uses DSEDebugInfo */
+#define DSE_BEGIN_NAMEBASE_TRANSACTION 211 /* no data */
+#define DSE_DB_VIRTUAL_REPLICA 212 /* uses DSEDebugInfo */
+#define DSE_VR_DRIVER_STATE_CHANGE 213 /* used DSEEntryInfo */
+#define DSE_CHANGE_CONFIG_PARM 214 /* uses DSEChangeConfigParm */
+
+#define DSE_MAX_EVENTS 215
+
+/*---------------------------------------------------------------------------
+ * data structures used for the data associated with events
+ */
+
+/* DSE_STREAM operation definitions */
+#define DSE_ST_OPEN 0x0001
+#define DSE_ST_CLOSE 0x0002
+
+/* DSE_ORPHAN_PARTITION operation definitions */
+#define DSE_OP_CREATE 0x0001
+#define DSE_OP_REMOVE 0x0002
+#define DSE_OP_LINK 0x0003
+#define DSE_OP_UNLINK 0x0004
+
+typedef struct
+{
+ nuint32 seconds;
+ nuint16 replicaNumber;
+ nuint16 event;
+} DSETimeStamp;
+
+typedef struct
+{
+ nuint8 data[16];
+} DSEGUID;
+
+/* newDN used for DSE_MOVE_SOURCE_ENTRY and DSE_RENAME_ENTRY,
+ * otherwise it is 0
+ */
+
+/* NetWare 4.x returns DSEntryInfo structure, NetWare 5.x returns
+ * DSEntryInfo2 structure
+*/
+typedef struct
+{
+ nuint32 perpetratorID;
+ nuint32 verb;
+ nuint32 entryID;
+ nuint32 parentID;
+ nuint32 classID;
+ nuint32 flags;
+ DSETimeStamp creationTime;
+ const unicode *dn;
+ const unicode *newDN;
+ char data[1]; /* used to store data for dn and newDN fields */
+} DSEEntryInfo;
+
+typedef struct
+{
+ nuint32 perpetratorID;
+ nuint32 verb;
+ nuint32 entryID;
+ nuint32 parentID;
+ nuint32 classID;
+ nuint32 flags;
+ DSETimeStamp creationTime;
+ const unicode *dn;
+ const unicode *newDN;
+ nuint32 connID;
+ char data[1]; /* used to store data for dn and newDN fields */
+} DSEEntryInfo2;
+
+
+/* DSEEntryInfo flag definitions */
+#define DSEF_PARTITION_ROOT 0x0001
+#define DSEF_EXTREF 0x0002
+#define DSEF_ALIAS 0x0004
+
+typedef struct
+{
+ nuint32 perpetratorID;
+ nuint32 verb;
+ nuint32 entryID;
+ nuint32 attrID;
+ nuint32 syntaxID;
+ nuint32 classID;
+ DSETimeStamp timeStamp;
+ nuint size;
+ char data[1]; /* see DSEVal... structures for meanings of this field */
+} DSEValueInfo;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 parentID;
+ nuint32 type;
+ nuint32 emuObjFlags;
+ nuint32 security;
+ char name[48];
+} DSEBinderyObjectInfo;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 retryCount;
+ nuint32 valueID;
+ unicode valueDN[MAX_DN_CHARS + 1];
+ char referral[1];
+} DSESEVInfo;
+
+typedef struct
+{
+ nuint32 type;
+ nuint32 length;
+ nuint8 data[1];
+} DSENetAddress;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 attrID[2];
+} DSESkulkData;
+
+/* DSE_LOCAL_REPLICA_CHANGE flag definitions */
+#define DSE_LRC_ADD 0x0001
+#define DSE_LRC_REMOVE 0x0002
+#define DSE_LRC_MODIFY 0x0003
+
+/* DSE_PARTITION_OPERATION_EVENT flag definitions */
+#define DSE_PF_STATE_CHANGE 0x0001
+#define DSE_PF_ADD 0x0002
+#define DSE_PF_PURGE 0x0004
+#define DSE_PF_JOIN 0x0008
+#define DSE_PF_SPLIT 0x0010
+
+/* DSE_CHANGE_CONN_STATE flag definitions */
+#define DSE_CONN_VALID 0x0001
+#define DSE_CONN_AUTHENTIC 0x0002
+#define DSE_CONN_SUPERVISOR 0x0004
+#define DSE_CONN_OPERATOR 0x0008
+#define DSE_CONN_LICENSED 0x0010
+#define DSE_CONN_SEV_IS_STALE 0x0020
+#define DSE_CONN_IS_NCP 0x0040
+#define DSE_CONN_CHECKSUMMING 0x0080
+#define DSE_CONN_OPERATIONAL_FLAGS 0x00FF
+#define DSE_CONN_SIGNATURES 0x0100
+#define DSE_CONN_CSIGNATURES 0x0200
+#define DSE_CONN_ENCRYPTION 0x0400
+#define DSE_CONN_SECURITY_FLAGS 0x0700
+
+typedef struct
+{
+ nuint32 connID;
+ nuint32 entryID;
+ nuint32 oldFlags;
+ nuint32 newFlags;
+} DSEChangeConnState;
+
+/* DSEChangeConfigState parameter values */
+#define DSE_CFG_UNSPECIFIED 0
+#define DSE_CFG_RESPOND_TO_GET_NEAREST 1
+#define DSE_CFG_SERVER_NAME 2
+
+typedef struct
+{
+ nuint32 configParm;
+} DSEChangeConfigParm;
+
+/* DSEModuleState flags, the CHANGING flag is combined with LOADED
+ * to show starting to load or starting to unload.
+ */
+#define DSE_MOD_CHANGING 0x01
+#define DSE_MOD_LOADED 0x02
+#define DSE_MOD_AUTOLOAD 0x04
+#define DSE_MOD_HIDDEN 0x08
+#define DSE_MOD_ENGINE 0x10
+#define DSE_MOD_AUTOMATIC 0x20
+#define DSE_MOD_DISABLED 0x40
+#define DSE_MOD_MANUAL 0x80
+#define DSE_MOD_SYSTEM 0x100 /* This is entries with PRELOAD_MODULE */
+#define DSE_MOD_WAITING 0x200 /* state change is queued */
+
+#define DSE_MAX_MODULE_NAME_CHARS 32
+
+typedef struct DSEModuleState
+{
+ nuint32 connID;
+ nuint32 flags;
+ long handle;
+ unicode name[DSE_MAX_MODULE_NAME_CHARS];
+} DSEModuleState;
+
+/*---------------------------------------------------------------------------
+ * data structures used for contents of the data member of the
+ * DSEValueInfo structure.
+ */
+
+typedef struct
+{
+ nuint32 nameSpaceType;
+ nuint32 volumeEntryID;
+ nuint32 length;
+ unicode data[1];
+} DSEPath;
+
+typedef struct
+{
+ nuint32 serverID;
+ nuint32 type;
+ nuint32 number;
+ nuint32 replicaRootID; /* partition root ID on server where replica resides */
+ char referral[1]; /* transport address data in wire format */
+} DSEReplicaPointer;
+
+typedef struct
+{
+ nuint32 serverID;
+ nuint32 remoteID;
+} DSEBackLink;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 attrID;
+ nuint32 privileges;
+} DSEACL;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 level;
+ nuint32 interval;
+} DSETypedName;
+
+typedef struct
+{
+ nuint32 entryID;
+ nuint32 amount;
+} DSEHold;
+
+typedef struct
+{
+ nuint32 type; /* SMF70, SMF71, SMTP, X400, SNADS, PROFS */
+ nuint32 length; /* length of address unicode string */
+ unicode address[1/*or more*/]; /* null terminated unicode string */
+} DSEEmailAddress;
+
+typedef struct
+{
+ nuint32 numOfBits;
+ nuint32 numOfBytes;
+ char data;
+} DSEBitString;
+
+typedef struct
+{
+ nuint32 length; /* length of telephone number unicode string */
+ unicode telephoneNumber[1/*or more*/]; /* null terminated unicode string */
+ /* The following field is dword aligned after unicode NULL:
+ DSEBitString parameters;
+ */
+} DSEFaxNumber;
+
+typedef struct
+{
+ nuint32 numOfStrings; /* number of uint32 length proceeded, null terminated,
+ dword aligned unicode strings to follow */
+ nuint32 length1; /* length of first unicode string */
+ unicode string1[1]; /* 1st unicode string */
+} DSECIList;
+
+typedef struct
+{
+ nuint32 numOfStrings; /* number of null terminated, dword aligned byte
+ strings to follow */
+ nuint8 string1[1]; /* 1st octet string */
+} DSEOctetList;
+
+typedef union
+{
+ /* used for SYN_CE_STRING, SYN_CI_STRING, SYN_PR_STRING,
+ * SYN_NU_STRING, and SYN_TEL_NUMBER
+ */
+ unicode string[1/*or more*/]; /* null terminated unicode string */
+ nuint32 num; /* used for SYN_INTEGER, SYN_COUNTER, SYN_TIME, SYN_INTERVAL */
+ nuint32 entryID; /* used for SYN_DIST_NAME */
+ nuint32 classID; /* used for SYN_CLASS_NAME */
+ nuint8 boolean; /* used for SYN_BOOLEAN */
+ DSENetAddress netAddress; /* used for SYN_NET_ADDRESS */
+ DSEPath path; /* used for SYN_PATH */
+ DSEReplicaPointer replica; /* used for SYN_REPLICA_POINTER */
+ DSEACL acl; /* used for SYN_OBJECT_ACL */
+ DSETimeStamp timeStamp; /* used for SYN_TIMESTAMP */
+ DSEBackLink backLink; /* used for SYN_BACK_LINK */
+ DSETypedName typedName; /* used for SYN_TYPED_NAME */
+ DSEHold hold; /* used for SYN_HOLD */
+ DSEEmailAddress emailAddress; /* used for SYN_EMAIL_ADDRESS */
+ DSEFaxNumber faxNumber; /* used for SYN_FAX_NUMBER */
+ DSECIList ciList; /* used for SYN_CI_LIST, SYN_PO_ADDRESS */
+ nuint8 octetString[1]; /* used for SYN_OCTET_STRING, SYN_STREAM */
+ DSEOctetList octetList; /* used for SYN_OCTET_LIST */
+} DSEValData;
+
+
+#define MAX_EVENT_PARMS 32
+typedef struct
+{
+ nuint32 dstime; /* time event occurred */
+ nuint32 milliseconds;
+ nuint32 curThread; /* thread running when event occurs */
+ nuint32 connID; /* connection number that caused this event */
+ nuint32 perpetratorID; /* "user" id that owns the connection */
+ char *fmtStr; /* sprintf type format string describing parms */
+ char *parms[MAX_EVENT_PARMS];/* pseudo stack of parameters for va_list */
+ char data[1]; /* variable size, holds fmtStr & non-integer parm data */
+} DSEDebugInfo;
+
+#define DSE_DATATYPE_CHAR 1
+#define DSE_DATATYPE_UNICODE 2
+#define DSE_DATATYPE_STRUCT_1 3
+
+typedef struct
+{
+ nuint32 attrID;
+ nuint32 flags;
+ nint len;
+ void *data;
+} DSES1data;
+
+typedef struct
+{
+ nuint32 count;
+ DSES1data value[1];
+} DSEStruct1;
+
+typedef struct
+{
+ nuint32 dstime; /* time event occurred */
+ nuint32 milliseconds;
+ nuint32 curProcess; /* process running when event occurred */
+ nuint32 connID; /* connection number that caused this event */
+ nuint32 verb; /* verb */
+ nuint32 perpetratorID; /* "user" id that owns the connection */
+ nuint32 d1; /* remaining fields vary depending on event number */
+ nuint32 d2;
+ nuint32 d3;
+ nuint32 d4;
+ nuint32 dataType;
+ const void *dataPtr;
+ char data[1]; /* variable size, holds either name or uname data */
+} DSEEventData;
+
+typedef struct /* use for WAN Traffic Manager Events */
+{
+ nuint32 lastTime;
+ nint32 version;
+ nint checkEachNewOpen;
+ nint checkEachAlreadyOpen;
+ nuint32 expirationInterval;
+ nuint32 nextTime;
+ nuint32 result;
+ nint send;
+ nuint32 trafficTypeSubClass;
+} DSEWtmInfo;
+
+typedef struct /* used for WAN Traffic Manager Open Events */
+{
+ nint32 version;
+ nuint32 expirationInterval;
+ nint connIsAlreadyOpen;
+ nuint32 lastAccessTime;
+ nuint32 trafficType;
+ char *trafficTypeName;
+ nint send;
+ nint dstAdrType;
+ nuint dstAdrSize;
+ void *dstAdrData;
+ char *localReferral;
+ nuint32 lastSyncTime;
+ nuint32 trafficTypeSubClass;
+} DSEWtmOpenInfo;
+
+ /*
+ * End data structures used for contents of the data member of the
+ * DSEValueInfo structure.
+ *-------------------------------------------------------------------------*/
+
+/* define trace vector category numbers */
+#define TV_ON 0x00000001L /* if set, tracing is enabled */
+#define TV_AUDIT 0x00000002L /* auditing */
+#define TV_INIT 0x00000004L /* initialization */
+#define TV_FRAGGER 0x00000008L /* fragger */
+#define TV_MISC 0x00000010L /* miscellaneous */
+#define TV_RESNAME 0x00000020L /* resolve name */
+#define TV_STREAMS 0x00000040L /* streams */
+#define TV_LIMBER 0x00000080L /* limber */
+#define TV_JANITOR 0x00000100L /* janitor */
+#define TV_BACKLINK 0x00000200L /* backlink */
+#define TV_MERGE 0x00000400L /* merge */
+#define TV_SKULKER 0x00000800L /* skulker */
+#define TV_LOCKING 0x00001000L /* locking */
+#define TV_SAP 0x00002000L /* SAP */
+#define TV_SCHEMA 0x00004000L /* schema */
+#define TV_COLL 0x00008000L /* collisions */
+#define TV_INSPECTOR 0x00010000L /* inspector */
+#define TV_ERRORS 0x00020000L /* errors */
+#define TV_PART 0x00040000L /* partition operations */
+#define TV_EMU 0x00080000L /* bindery emulator */
+#define TV_VCLIENT 0x00100000L /* virtual client */
+#define TV_AUTHEN 0x00200000L /* authentication */
+#define TV_RECMAN 0x00400000L /* record manager */
+#define TV_TIMEVECTOR 0x00800000L /* time vectors */
+#define TV_REPAIR 0x01000000L /* ds_repair */
+#define TV_DSAGENT 0x02000000L /* low level DSA tracing */
+#define TV_ERRET 0x04000000L /* ERRET and ERRTRACE */
+#define TV_SYNC_IN 0x08000000L /* incoming sync traffic */
+#define TV_THREADS 0x10000000L /* DS thread scheduling */
+#define TV_MIN 0x20000000L /* default dstrace messages */
+#define TV_CHECK_BIT 0x80000000L /* all TV_ values must have this bit */
+#define TV_ALL 0xBFFFFFFEL /* All vectors--default for DSTrace */
+
+/*===========================================================================*/
+
+/* Event handler flags - for NWDSERegisterForEventWithResult.
+ */
+#define HF_ALL 0x0000 /* Invoke handler regardless of event status */
+#define HF_SUCCESS_ONLY 0x0004 /* Invoke handler if event is successful */
+#define HF_FAIL_ONLY 0x0008 /* Invoke handler if event fails */
+
+
+#endif
+
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsfilt.h b/LoginCapture/windows/external/xplatapi/include/nwdsfilt.h
new file mode 100644
index 00000000..7cf5949c
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsfilt.h
@@ -0,0 +1,151 @@
+/******************************************************************************
+
+ %name: nwdsfilt.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:03 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSFILT_H )
+#define NWDSFILT_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSDC_H ) /* Need to defined NWDSContextHandle */
+#include "nwdsdc.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H ) /* Needed to defined pBuf_T */
+#include "nwdsbuft.h"
+#endif
+
+#include "npackon.h"
+
+typedef struct _filter_node
+{
+ struct _filter_node N_FAR *parent;
+ struct _filter_node N_FAR *left;
+ struct _filter_node N_FAR *right;
+ nptr value;
+ nuint32 syntax;
+ nuint16 token;
+} Filter_Node_T, N_FAR *pFilter_Node_T;
+
+#define FTOK_END 0
+#define FTOK_OR 1
+#define FTOK_AND 2
+#define FTOK_NOT 3
+#define FTOK_LPAREN 4
+#define FTOK_RPAREN 5
+#define FTOK_AVAL 6
+#define FTOK_EQ 7
+#define FTOK_GE 8
+#define FTOK_LE 9
+#define FTOK_APPROX 10
+#define FTOK_ANAME 14
+#define FTOK_PRESENT 15
+#define FTOK_RDN 16
+#define FTOK_BASECLS 17
+#define FTOK_MODTIME 18
+#define FTOK_VALTIME 19
+
+#define FBIT_END (1L << FTOK_END)
+#define FBIT_OR (1L << FTOK_OR)
+#define FBIT_AND (1L << FTOK_AND)
+#define FBIT_NOT (1L << FTOK_NOT)
+#define FBIT_LPAREN (1L << FTOK_LPAREN)
+#define FBIT_RPAREN (1L << FTOK_RPAREN)
+#define FBIT_AVAL (1L << FTOK_AVAL)
+#define FBIT_EQ (1L << FTOK_EQ)
+#define FBIT_GE (1L << FTOK_GE)
+#define FBIT_LE (1L << FTOK_LE)
+#define FBIT_APPROX (1L << FTOK_APPROX)
+#define FBIT_ANAME (1L << FTOK_ANAME)
+#define FBIT_PRESENT (1L << FTOK_PRESENT)
+#define FBIT_RDN (1L << FTOK_RDN)
+#define FBIT_BASECLS (1L << FTOK_BASECLS)
+#define FBIT_MODTIME (1L << FTOK_MODTIME)
+#define FBIT_VALTIME (1L << FTOK_VALTIME)
+
+#define FBIT_OPERAND (FBIT_LPAREN | FBIT_NOT | FBIT_PRESENT | FBIT_RDN \
+ | FBIT_BASECLS | FBIT_ANAME | FBIT_MODTIME | FBIT_VALTIME)
+#define FBIT_RELOP (FBIT_EQ | FBIT_GE | FBIT_LE | FBIT_APPROX)
+#define FBIT_BOOLOP (FBIT_AND | FBIT_OR)
+
+typedef struct
+{
+ pFilter_Node_T fn;
+ nuint16 level;
+ nuint32 expect;
+} Filter_Cursor_T, N_FAR *pFilter_Cursor_T, N_FAR * N_FAR *ppFilter_Cursor_T;
+
+#define FTAG_ITEM 0
+#define FTAG_OR 1
+#define FTAG_AND 2
+#define FTAG_NOT 3
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAddFilterToken
+(
+ pFilter_Cursor_T cur,
+ nuint16 tok,
+ nptr val,
+ nuint32 syntax
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAllocFilter
+(
+ ppFilter_Cursor_T cur
+);
+
+N_EXTERN_LIBRARY (void)
+NWDSFreeFilter
+(
+ pFilter_Cursor_T cur,
+ void (N_FAR N_CDECL *freeVal)(nuint32 syntax, nptr val)
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPutFilter
+(
+ NWDSContextHandle context,
+ pBuf_T buf,
+ pFilter_Cursor_T cur,
+ void (N_FAR N_CDECL *freeVal)(nuint32 syntax, nptr val)
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSDelFilterToken
+(
+ pFilter_Cursor_T cur,
+ void (N_FAR N_CDECL *freeVal)(nuint32 syntax, nptr val)
+);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#include "npackoff.h"
+#endif /* NWDSFILT_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsmisc.h b/LoginCapture/windows/external/xplatapi/include/nwdsmisc.h
new file mode 100644
index 00000000..e421487b
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsmisc.h
@@ -0,0 +1,277 @@
+/******************************************************************************
+
+ %name: nwdsmisc.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:05 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1998 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSMISC_H )
+#define NWDSMISC_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H )
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NUNICODE_H )
+#include "nunicode.h"
+#endif
+
+#include "npackon.h"
+
+#define DS_SYNTAX_NAMES 0
+#define DS_SYNTAX_DEFS 1
+
+#define DS_STRING 0x0001 /* string, can be used in names */
+#define DS_SINGLE_VALUED 0x0002
+#define DS_SUPPORTS_ORDER 0x0004
+#define DS_SUPPORTS_EQUAL 0x0008
+#define DS_IGNORE_CASE 0x0010 /* Ignore case */
+#define DS_IGNORE_SPACE 0x0020 /* Ignore white space */
+#define DS_IGNORE_DASH 0x0040 /* Ignore dashes */
+#define DS_ONLY_DIGITS 0x0080
+#define DS_ONLY_PRINTABLE 0x0100
+#define DS_SIZEABLE 0x0200
+#define DS_BITWISE_EQUAL 0x0400
+
+typedef struct
+{
+ nuint32 statsVersion;
+ nuint32 noSuchEntry;
+ nuint32 localEntry;
+ nuint32 typeReferral;
+ nuint32 aliasReferral;
+ nuint32 requestCount;
+ nuint32 requestDataSize;
+ nuint32 replyDataSize;
+ nuint32 resetTime;
+ nuint32 transportReferral;
+ nuint32 upReferral;
+ nuint32 downReferral;
+} NDSStatsInfo_T, N_FAR *pNDSStatsInfo_T;
+
+
+/* the following structure is used by NWDSGetNDSInfo() */
+typedef struct
+{
+ nuint32 major;
+ nuint32 minor;
+ nuint32 revision;
+} NDSOSVersion_T, N_FAR *pNDSOSVersion_T;
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCloseIteration
+(
+ NWDSContextHandle context,
+ nint32 iterationHandle,
+ nuint32 operation
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetSyntaxID
+(
+ NWDSContextHandle context,
+ pnstr8 attrName,
+ pnuint32 syntaxID
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadSyntaxes
+(
+ NWDSContextHandle context,
+ nuint32 infoType,
+ nbool8 allSyntaxes,
+ pBuf_T syntaxNames,
+ pnint32 iterationHandle,
+ pBuf_T syntaxDefs
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadSyntaxDef
+(
+ NWDSContextHandle context,
+ nuint32 syntaxID,
+ pSyntax_Info_T syntaxDef
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReplaceAttrNameAbbrev
+(
+ NWDSContextHandle context,
+ pnstr8 inStr,
+ pnstr8 outStr
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetObjectHostServerAddress
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 serverName,
+ pBuf_T netAddresses
+);
+
+N_EXTERN_LIBRARY (void)
+NWGetNWNetVersion
+(
+ nuint8 N_FAR *majorVersion,
+ nuint8 N_FAR *minorVersion,
+ nuint8 N_FAR *revisionLevel,
+ nuint8 N_FAR *betaReleaseLevel
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWIsDSServer
+(
+ NWCONN_HANDLE conn,
+ pnstr8 treeName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetBinderyContext
+(
+ NWDSContextHandle context,
+ NWCONN_HANDLE connHandle,
+ pnuint8 BinderyEmulationContext
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRepairTimeStamps
+(
+ NWDSContextHandle context,
+ pnstr8 partitionRoot
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWGetFileServerUTCTime
+(
+ NWCONN_HANDLE conn,
+ pnuint32 time
+);
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetDSVerInfo
+(
+ NWCONN_HANDLE conn,
+ pnuint32 dsVersion,
+ pnuint32 rootMostEntryDepth,
+ pnstr8 sapName,
+ pnuint32 flags,
+ punicode treeName
+);
+
+N_EXTERN_LIBRARY( NWDSCCODE )
+NWDSGetNDSInfo
+(
+ NWDSContextHandle context,
+ pBuf_T resultBuffer,
+ nflag32 requestedField,
+ nptr data
+);
+
+N_EXTERN_LIBRARY( NWDSCCODE )
+NWDSReadNDSInfo
+(
+ NWCONN_HANDLE connHandle,
+ nflag32 requestedFields,
+ pBuf_T resultBuffer
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSyncReplicaToServer
+(
+ NWDSContextHandle context,
+ pnstr8 serverName,
+ pnstr8 partitionRootName,
+ pnstr8 destServerName,
+ nuint32 actionFlags,
+ nuint32 delaySeconds
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReloadDS
+(
+ NWDSContextHandle context,
+ pnstr8 serverName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWNetInit
+(
+ nptr reserved1,
+ nptr reserved2
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWNetTerm
+(
+ nptr reserved
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetNDSStatistics
+(
+ NWDSContextHandle context,
+ pnstr8 serverName,
+ nuint statsInfoLen,
+ pNDSStatsInfo_T statsInfo
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSResetNDSStatistics
+(
+ NWDSContextHandle context,
+ pnstr8 serverName
+);
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSGetNDSIntervals
+(
+ NWCONN_HANDLE connHandle, /* IN */
+ nflag32 reqIntervalFlags, /* IN */
+ pnflag32 repIntervalFlags, /* OUT */
+ pnuint32 intervals /* OUT */
+);
+
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSetNDSIntervals
+(
+ NWCONN_HANDLE connHandle, /* IN */
+ nflag32 intervalFlags, /* IN */
+ nuint numIntervals, /* IN */
+ pnuint32 intervals /* IN */
+);
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsname.h b/LoginCapture/windows/external/xplatapi/include/nwdsname.h
new file mode 100644
index 00000000..5bf129e8
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsname.h
@@ -0,0 +1,88 @@
+/******************************************************************************
+
+ %name: nwdsname.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:07 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSNAME_H )
+#define NWDSNAME_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAbbreviateName
+(
+ NWDSContextHandle context,
+ pnstr8 inName,
+ pnstr8 abbreviatedName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCanonicalizeName
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ pnstr8 canonName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemoveAllTypes
+(
+ NWDSContextHandle context,
+ pnstr8 name,
+ pnstr8 typelessName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSResolveName
+(
+ NWDSContextHandle context,
+ pnstr8 objectName,
+ NWCONN_HANDLE N_FAR *conn,
+ pnuint32 objectID
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSCIStringsMatch
+(
+ NWDSContextHandle context,
+ pnstr8 string1,
+ pnstr8 string2,
+ pnint matches
+);
+
+#ifdef __cplusplus
+ }
+#endif
+#endif /* NWDSNAME_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdsnmtp.h b/LoginCapture/windows/external/xplatapi/include/nwdsnmtp.h
new file mode 100644
index 00000000..eabbee3e
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdsnmtp.h
@@ -0,0 +1,497 @@
+/******************************************************************************
+
+ %name: nwdsnmtp.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:09 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSNMTP_H )
+#define NWDSNMTP_H
+
+#define C_AFP_SERVER "AFP Server"
+#define C_ALIAS "Alias"
+#define C_AUDIT_FILE_OBJECT "Audit:File Object"
+#define C_BINDERY_OBJECT "Bindery Object"
+#define C_BINDERY_QUEUE "Bindery Queue"
+#define C_COMMEXEC "CommExec"
+#define C_COMPUTER "Computer"
+#define C_COUNTRY "Country"
+#define C_DEVICE "Device"
+#define C_DIRECTORY_MAP "Directory Map"
+#define C_ENTRUST_CRLDISTRIBUTIONPOINT "Entrust:CRLDistributionPoint"
+#define C_EXTERNAL_ENTITY "External Entity"
+#define C_GROUP "Group"
+#define C_LDAP_GROUP "LDAP Group"
+#define C_LDAP_SERVER "LDAP Server"
+#define C_LIST "List"
+#define C_LOCALITY "Locality"
+#define C_MASV_SECURITY_POLICY "MASV:Security Policy"
+#define C_MESSAGE_ROUTING_GROUP "Message Routing Group"
+#define C_MESSAGING_ROUTING_GROUP "Messaging Routing Group"
+#define C_MESSAGING_SERVER "Messaging Server"
+#define C_NCP_SERVER "NCP Server"
+#define C_NDPS_BROKER "NDPS Broker"
+#define C_NDPS_MANAGER "NDPS Manager"
+#define C_NDPS_PRINTER "NDPS Printer"
+#define C_NDSCAT_CATALOG "NDSCat:Catalog"
+#define C_NDSCAT_MASTER_CATALOG "NDSCat:Master Catalog"
+#define C_NDSCAT_SLAVE_CATALOG "NDSCat:Slave Catalog"
+#define C_NDSPKI_CERTIFICATE_AUTHORITY "NDSPKI:Certificate Authority"
+#define C_NDSPKI_KEY_MATERIAL "NDSPKI:Key Material"
+#define C_NETSVC "NetSvc"
+#define C_NLS_LICENSE_CERTIFICATE "NLS:License Certificate"
+#define C_NLS_LICENSE_SERVER "NLS:License Server"
+#define C_NLS_PRODUCT_CONTAINER "NLS:Product Container"
+#define C_NSCP_GROUPOFUNIQUENAMES5 "NSCP:groupOfUniqueNames5"
+#define C_NSCP_MAILGROUP5 "NSCP:mailGroup5"
+#define C_NSCP_NETSCAPEMAILSERVER5 "NSCP:NetscapeMailServer5"
+#define C_NSCP_NETSCAPESERVER5 "NSCP:NetscapeServer5"
+#define C_NSCP_NGINFO "NSCP:Nginfo"
+#define C_NSCP_NGINFO2 "NSCP:Nginfo2"
+#define C_ORGANIZATION "Organization"
+#define C_ORGANIZATIONAL_PERSON "Organizational Person"
+#define C_ORGANIZATIONAL_ROLE "Organizational Role"
+#define C_ORGANIZATIONAL_UNIT "Organizational Unit"
+#define C_PARTITION "Partition"
+#define C_PERSON "Person"
+#define C_PRINT_SERVER "Print Server"
+#define C_PRINTER "Printer"
+#define C_PROFILE "Profile"
+#define C_QUEUE "Queue"
+#define C_RESOURCE "Resource"
+#define C_SAS_SECURITY "SAS:Security"
+#define C_SAS_SERVICE "SAS:Sevice"
+#define C_SERVER "Server"
+#define C_SLP_SCOPE_UNIT "SLP Scope Unit"
+#define C_SLP_DIRECTORY_AGENT "SLP Directory Agent"
+#define C_SLP_SERVICE "SLP Service"
+#define C_SMDR "SLP SMDR"
+#define C_TEMPLATE "Template"
+#define C_TOP "Top"
+#define C_TREE_ROOT "Tree Root"
+#define C_UNKNOWN "Unknown"
+#define C_USER "User"
+#define C_VOLUME "Volume"
+#define C_WANMAN_LAN_Area "WANMAN:LAN Area"
+
+#define A_ACCOUNT_BALANCE "Account Balance"
+#define A_ACL "ACL"
+#define A_ALIASED_OBJECT_NAME "Aliased Object Name"
+#define A_ALLOW_UNLIMITED_CREDIT "Allow Unlimited Credit"
+#define A_AUDIT_A_ENCRYPTION_KEY "Audit:A Encryption Key"
+#define A_AUDIT_B_ENCRYPTION_KEY "Audit:B Encryption Key"
+#define A_AUDIT_CONTENTS "Audit:Contents"
+#define A_AUDIT_CURRENT_ENCRYPTION_KEY "Audit:Current Encryption Key"
+#define A_AUDIT_FILE_LINK "Audit:File Link"
+#define A_AUDIT_LINK_LIST "Audit:Link List"
+#define A_AUDIT_PATH "Audit:Path"
+#define A_AUDIT_POLICY "Audit:Policy"
+#define A_AUDIT_TYPE "Audit:Type"
+#define A_AUTHORITY_REVOCATION "Authority Revocation"
+#define A_BACK_LINK "Back Link"
+#define A_BINDERY_OBJECT_RESTRICTION "Bindery Object Restriction"
+#define A_BINDERY_PROPERTY "Bindery Property"
+#define A_BINDERY_RESTRICTION_LEVEL "Bindery Restriction Level"
+#define A_BINDERY_TYPE "Bindery Type"
+#define A_CA_PRIVATE_KEY "CA Private Key"
+#define A_CA_PUBLIC_KEY "CA Public Key"
+#define A_CARTRIDGE "Cartridge"
+#define A_CERTIFICATE_REVOCATION "Certificate Revocation"
+#define A_CERTIFICATE_VALIDITY_INTERVAL "Certificate Validity Interval"
+#define A_CLIENT_INSTALL_CANDIDATE "Client Install Candidate"
+#define A_COLOR_SUPPORTED "Color Supported"
+#define A_COMMON_NAME "CN"
+#define A_CONVERGENCE "Convergence"
+#define A_COUNTRY_NAME "C"
+#define A_CROSS_CERTIFICATE_PAIR "Cross Certificate Pair"
+#define A_DATABASE_DIR_PATH "Database Dir Path"
+#define A_DATABASE_VOLUME_NAME "Database Volume Name"
+#define A_DATAPOOL_LOCATION "Datapool Location"
+#define A_DATAPOOL_LOCATIONS "Datapool Locations"
+#define A_DEFAULT_QUEUE "Default Queue"
+#define A_DELIVERY_METHODS_INSTALLED "Delivery Methods Installed"
+#define A_DESCRIPTION "Description"
+#define A_DETECT_INTRUDER "Detect Intruder"
+#define A_DEVICE "Device"
+#define A_DISTINGUISHED_NAME "dn"
+#define A_DS_REVISION "DS Revision"
+#define A_EMAIL_ADDRESS "EMail Address"
+#define A_EMPLOYEE_ID "Employee ID"
+#define A_ENTRUST_ATTRIBUTECERTIFICATE "Entrust:AttributeCertificate"
+#define A_ENTRUST_USER "Entrust:User"
+#define A_EQUIVALENT_TO_ME "Equivalent To Me"
+#define A_EXTERNAL_NAME "External Name"
+#define A_EXTERNAL_SYNCHRONIZER "External Synchronizer"
+#define A_FACSIMILE_TELEPHONE_NUMBER "Facsimile Telephone Number"
+#define A_FULL_NAME "Full Name"
+#define A_GENERATIONAL_QUALIFIER "Generational Qualifier"
+#define A_GID "GID"
+#define A_GIVEN_NAME "Given Name"
+#define A_GROUP_MEMBERSHIP "Group Membership"
+#define A_GUID "GUID"
+#define A_GW_API_GATEWAY_DIRECTORY_PATH "GW API Gateway Directory Path"
+#define A_GW_API_GATEWAY_DIRECTORY_VOL "GW API Gateway Directory Volume"
+#define A_HIGH_SYNC_INTERVAL "High Convergence Sync Interval"
+#define A_HIGHER_PRIVILEGES "Higher Privileges"
+#define A_HOME_DIRECTORY "Home Directory"
+#define A_HOME_DIRECTORY_RIGHTS "Home Directory Rights"
+#define A_HOST_DEVICE "Host Device"
+#define A_HOST_RESOURCE_NAME "Host Resource Name"
+#define A_HOST_SERVER "Host Server"
+#define A_INHERITED_ACL "Inherited ACL"
+#define A_INITIALS "Initials"
+#define A_INTERNET_EMAIL_ADDRESS "Internet EMail Address"
+#define A_INTRUDER_ATTEMPT_RESET_INTRVL "Intruder Attempt Reset Interval"
+#define A_INTRUDER_LOCKOUT_RESET_INTRVL "Intruder Lockout Reset Interval"
+#define A_IPP_URI "IPP URI"
+#define A_IPP_URI_SECURITY_SCHEME "IPP URI Security Scheme"
+#define A_LOCALITY_NAME "L"
+#define A_LANGUAGE "Language"
+#define A_LAST_LOGIN_TIME "Last Login Time"
+#define A_LAST_REFERENCED_TIME "Last Referenced Time"
+#define A_LDAP_ACL_V11 "LDAP ACL v11"
+#define A_LDAP_ALLOW_CLEAR_TEXT_PWD "LDAP Allow Clear Text Password"
+#define A_LDAP_ANONYMOUS_IDENTITY "LDAP Anonymous Identity"
+#define A_LDAP_ATTRIBUTE_MAP_V11 "LDAP Attribute Map v11"
+#define A_LDAP_BACKUP_LOG_FILENAME "LDAP Backup Log Filename"
+#define A_LDAP_CLASS_MAP "LDAP Class Map"
+#define A_LDAP_CLASS_MAP_V11 "LDAP Class Map v11"
+#define A_LDAP_ENABLE_SSL "LDAP Enable SSL"
+#define A_LDAP_ENABLE_TCP "LDAP Enable TCP"
+#define A_LDAP_ENABLE_UDP "LDAP Enable UDP"
+#define A_LDAP_GROUP "LDAP Group"
+#define A_LDAP_HOST_SERVER "LDAP Host Server"
+#define A_LDAP_LOG_FILENAME "LDAP Log Filename"
+#define A_LDAP_LOG_LEVEL "LDAP Log Level"
+#define A_LDAP_LOG_SIZE_LIMIT "LDAP Log Size Limit"
+#define A_LDAP_REFERRAL "LDAP Referral"
+#define A_LDAP_SCREEN_LEVEL "LDAP Screen Level"
+#define A_LDAP_SEARCH_SIZE_LIMIT "LDAP Search Size Limit"
+#define A_LDAP_SEARCH_TIME_LIMIT "LDAP Search Time Limit"
+#define A_LDAP_SERVER "LDAP Server"
+#define A_LDAP_SERVER_BIND_LIMIT "LDAP Server Bind Limit"
+#define A_LDAP_SERVER_IDLE_TIMEOUT "LDAP Server Idle Timeout"
+#define A_LDAP_SERVER_LIST "LDAP Server List"
+#define A_LDAP_SSL_PORT "LDAP SSL Port"
+#define A_LDAP_SUFFIX "LDAP Suffix"
+#define A_LDAP_TCP_PORT "LDAP TCP Port"
+#define A_LDAP_UDP_PORT "LDAP UDP Port"
+#define A_LDAPUSERCERTIFICATE "LDAPUserCertificate"
+#define A_LDAP_ARL "LDAP:ARL"
+#define A_LDAP_BINDCATALOG "LDAP:bindCatalog"
+#define A_LDAP_BINDCATALOGUSAGE "LDAP:bindCatalogUsage"
+#define A_LDAP_CACERTIFICATE "LDAP:caCertificate"
+#define A_LDAP_CRL "LDAP:CRL"
+#define A_LDAP_CROSSCERTIFICATEPAIR "LDAP:crossCertificatePair"
+#define A_LDAP_KEYMATERIALNAME "LDAP:keyMaterialName"
+#define A_LDAP_SEARCHCATALOG "LDAP:searchCatalog"
+#define A_LDAP_SEARCHCATALOGUSAGE "LDAP:searchCatalogUsage"
+#define A_LOCKED_BY_INTRUDER "Locked By Intruder"
+#define A_LOCKOUT_AFTER_DETECTION "Lockout After Detection"
+#define A_LOGIN_ALLOWED_TIME_MAP "Login Allowed Time Map"
+#define A_LOGIN_DISABLED "Login Disabled"
+#define A_LOGIN_EXPIRATION_TIME "Login Expiration Time"
+#define A_LOGIN_GRACE_LIMIT "Login Grace Limit"
+#define A_LOGIN_GRACE_REMAINING "Login Grace Remaining"
+#define A_LOGIN_INTRUDER_ADDRESS "Login Intruder Address"
+#define A_LOGIN_INTRUDER_ATTEMPTS "Login Intruder Attempts"
+#define A_LOGIN_INTRUDER_LIMIT "Login Intruder Limit"
+#define A_LOGIN_INTRUDER_RESET_TIME "Login Intruder Reset Time"
+#define A_LOGIN_MAXIMUM_SIMULTANEOUS "Login Maximum Simultaneous"
+#define A_LOGIN_SCRIPT "Login Script"
+#define A_LOGIN_TIME "Login Time"
+#define A_LOW_RESET_TIME "Low Convergence Reset Time"
+#define A_LOW_SYNC_INTERVAL "Low Convergence Sync Interval"
+#define A_MAILBOX_ID "Mailbox ID"
+#define A_MAILBOX_LOCATION "Mailbox Location"
+#define A_MASV_AUTHORIZED_RANGE "MASV:Authorized Range"
+#define A_MASV_DEFAULT_RANGE "MASV:Default Range"
+#define A_MASV_DOMAIN_POLICY "MASV:Domain Policy"
+#define A_MASV_LABEL "MASV:Label"
+#define A_MASV_PROPOSED_LABEL "MASV:Proposed Label"
+#define A_MAXIMUM_SPEED "Maximum Speed"
+#define A_MAXIMUM_SPEED_UNITS "Maximum Speed Units"
+#define A_MEMBER "Member"
+#define A_MEMBERS_OF_TEMPLATE "Members Of Template"
+#define A_MEMORY "Memory"
+#define A_MESSAGE_ROUTING_GROUP "Message Routing Group"
+#define A_MESSAGE_SERVER "Message Server"
+#define A_MESSAGING_DATABASE_LOCATION "Messaging Database Location"
+#define A_MESSAGING_ROUTING_GROUP "Messaging Routing Group"
+#define A_MESSAGING_SERVER "Messaging Server"
+#define A_MESSAGING_SERVER_TYPE "Messaging Server Type"
+#define A_MHS_SEND_DIRECTORY_PATH "MHS Send Directory Path"
+#define A_MHS_SEND_DIRECTORY_VOLUME "MHS Send Directory Volume"
+#define A_MINIMUM_ACCOUNT_BALANCE "Minimum Account Balance"
+#define A_NDPS_ACCOUNTANT_ROLE "NDPS Accountant Role"
+#define A_NDPS_CONTROL_FLAGS "NDPS Control Flags"
+#define A_NDPS_DATABASE_SAVED_TIMESTAMP "NDPS Database Saved Timestamp"
+#define A_NDPS_DATABASE_SAVED_DATA_IMG "NDPS Database Saved Data Image"
+#define A_NDPS_DATABASE_SAVED_INDEX_IMG "NDPS Database Saved Index Image"
+#define A_NDPS_DEFAULT_PRINTER "NDPS Default Printer"
+#define A_NDPS_DEFAULT_PUBLIC_PRINTER "NDPS Default Public Printer"
+#define A_NDPS_JOB_CONFIGURATION "NDPS Job Configuration"
+#define A_NDPS_MANAGER_STATUS "NDPS Manager Status"
+#define A_NDPS_OPERATOR_ROLE "NDPS Operator Role"
+#define A_NDPS_PRINTER_INSTALL_LIST "NDPS Printer Install List"
+#define A_NDPS_PRINTER_INST_TIMESTAMP "NDPS Printer Install Timestamp"
+#define A_NDPS_PRINTER_QUEUE_LIST "NDPS Printer Queue List"
+#define A_NDPS_PRINTER_SIBLINGS "NDPS Printer Siblings"
+#define A_NDPS_PUBLIC_PRINTER_INST_LIST "NDPS Public Printer Install List"
+#define A_NDPS_REPLACE_ALL_CLIENT_PRINT "NDPS Replace All Client Printers"
+#define A_NDPS_SMTP_SERVER "NDPS SMTP Server"
+#define A_NDPS_USER_ROLE "NDPS User Role"
+#define A_NDSCAT_ACTUAL_ALL_ATTRIBUTES "NDSCat:Actual All Attributes"
+#define A_NDSCAT_ACTUAL_ATTRIBUTE_COUNT "NDSCat:Actual Attribute Count"
+#define A_NDSCAT_ACTUAL_ATTRIBUTES "NDSCat:Actual Attributes"
+#define A_NDSCAT_ACTUAL_BASE_OBJECT "NDSCat:Actual Base Object"
+#define A_NDSCAT_ACTUAL_CATALOG_SIZE "NDSCat:Actual Catalog Size"
+#define A_NDSCAT_ACTUAL_END_TIME "NDSCat:Actual End Time"
+#define A_NDSCAT_ACTUAL_FILTER "NDSCat:Actual Filter"
+#define A_NDSCAT_ACTUAL_OBJECT_COUNT "NDSCat:Actual Object Count"
+#define A_NDSCAT_ACTUAL_RETURN_CODE "NDSCat:Actual Return Code"
+#define A_NDSCAT_ACTUAL_SCOPE "NDSCat:Actual Scope"
+#define A_NDSCAT_ACTUAL_SEARCH_ALIASES "NDSCat:Actual Search Aliases"
+#define A_NDSCAT_ACTUAL_START_TIME "NDSCat:Actual Start Time"
+#define A_NDSCAT_ACTUAL_VALUE_COUNT "NDSCat:Actual Value Count"
+#define A_NDSCAT_ALL_ATTRIBUTES "NDSCat:All Attributes"
+#define A_NDSCAT_ATTRDEFTBL "NDSCat:AttrDefTbl"
+#define A_NDSCAT_ATTRIBUTES "NDSCat:Attributes"
+#define A_NDSCAT_AUTO_DREDGE "NDSCat:Auto Dredge"
+#define A_NDSCAT_BASE_OBJECT "NDSCat:Base Object"
+#define A_NDSCAT_CATALOGDB "NDSCat:CatalogDB"
+#define A_NDSCAT_CATALOG_LIST "NDSCat:Catalog List"
+#define A_NDSCAT_DREDGE_INTERVAL "NDSCat:Dredge Interval"
+#define A_NDSCAT_FILTER "NDSCat:Filter"
+#define A_NDSCAT_INDEXDEFTBL "NDSCat:IndexDefTbl"
+#define A_NDSCAT_INDEXES "NDSCat:Indexes"
+#define A_NDSCAT_LABEL "NDSCat:Label"
+#define A_NDSCAT_LOG "NDSCat:Log"
+#define A_NDSCAT_MASTER_CATALOG "NDSCat:Master Catalog"
+#define A_NDSCAT_MAX_LOG_SIZE "NDSCat:Max Log Size"
+#define A_NDSCAT_MAX_RETRIES "NDSCat:Max Retries"
+#define A_NDSCAT_MAX_THREADS "NDSCat:Max Threads"
+#define A_NDSCAT_RETRY_INTERVAL "NDSCat:Retry Interval"
+#define A_NDSCAT_SCOPE "NDSCat:Scope"
+#define A_NDSCAT_SEARCH_ALIASES "NDSCat:Search Aliases"
+#define A_NDSCAT_SLAVE_CATALOG_LIST "NDSCat:Slave Catalog List"
+#define A_NDSCAT_START_TIME "NDSCat:Start Time"
+#define A_NDSCAT_SYNCH_INTERVAL "NDSCat:Synch Interval"
+#define A_NDSPKI_CERTIFICATE_CHAIN "NDSPKI:Certificate Chain"
+#define A_NDSPKI_GIVEN_NAME "NDSPKI:Given Name"
+#define A_NDSPKI_KEY_FILE "NDSPKI:Key File"
+#define A_NDSPKI_Key_Material_DN "NDSPKI:Key Material DN"
+#define A_NDSPKI_PARENT_CA "NDSPKI:Parent CA"
+#define A_NDSPKI_PARENT_CA_DN "NDSPKI:Parent CA DN"
+#define A_NDSPKI_PRIVATE_KEY "NDSPKI:Private Key"
+#define A_NDSPKI_PUBLIC_KEY "NDSPKI:Public Key"
+#define A_NDSPKI_PUBLIC_KEY_CERTIFICATE "NDSPKI:Public Key Certificate"
+#define A_NDSPKI_SUBJECT_NAME "NDSPKI:Subject Name"
+#define A_NDSPKI_TREE_CA_DN "NDSPKI:Tree CA DN"
+#define A_NETWORK_ADDRESS "Network Address"
+#define A_NETWORK_ADDRESS_RESTRICTION "Network Address Restriction"
+#define A_NEW_OBJECTS_DS_RIGHTS "New Object's DS Rights"
+#define A_NEW_OBJECTS_FS_RIGHTS "New Object's FS Rights"
+#define A_NEW_OBJECTS_SELF_RIGHTS "New Object's Self Rights"
+#define A_NLS_COMMON_CERTIFICATE "NLS:Common Certificate"
+#define A_NLS_CURRENT_INSTALLED "NLS:Current Installed"
+#define A_NLS_CURRENT_PEAK_INSTALLED "NLS:Current Peak Installed"
+#define A_NLS_CURRENT_PEAK_USED "NLS:Current Peak Used"
+#define A_NLS_CURRENT_USED "NLS:Current Used"
+#define A_NLS_HOURLY_DATA_SIZE "NLS:Hourly Data Size"
+#define A_NLS_LICENSE_DATABASE "NLS:License Database"
+#define A_NLS_LICENSE_ID "NLS:License ID"
+#define A_NLS_LICENSE_SERVICE_PROVIDER "NLS:License Service Provider"
+#define A_NLS_LSP_REVISION "NLS:LSP Revision"
+#define A_NLS_OWNER "NLS:Owner"
+#define A_NLS_PEAK_INSTALLED_DATA "NLS:Peak Installed Data"
+#define A_NLS_PEAK_USED_DATA "NLS:Peak Used Data"
+#define A_NLS_PRODUCT "NLS:Product"
+#define A_NLS_PUBLISHER "NLS:Publisher"
+#define A_NLS_REVISION "NLS:Revision"
+#define A_NLS_SEARCH_TYPE "NLS:Search Type"
+#define A_NLS_SUMMARY_UPDATE_TIME "NLS:Summary Update Time"
+#define A_NLS_SUMMARY_VERSION "NLS:Summary Version"
+#define A_NLS_TRANSACTION_DATABASE "NLS:Transaction Database"
+#define A_NLS_TRANSACTION_LOG_NAME "NLS:Transaction Log Name"
+#define A_NLS_TRANSACTION_LOG_SIZE "NLS:Transaction Log Size"
+#define A_NLS_VERSION "NLS:Version"
+#define A_NNS_DOMAIN "NNS Domain"
+#define A_NOTIFICATION_CONSUMERS "Notification Consumers"
+#define A_NOTIFICATION_PROFILE "Notification Profile"
+#define A_NOTIFICATION_SERVICE_ENABLED "Notification Service Enabled"
+#define A_NOTIFICATION_SRVC_NET_ADDR "Notification Srvc Net Addr"
+#define A_NOTIFICATION_SRVC_NET_ADDRESS "Notification Srvc Net Address"
+#define A_NOTIFY "Notify"
+#define A_NRD_REGISTRY_DATA "NRD:Registry Data"
+#define A_NRD_REGISTRY_INDEX "NRD:Registry Index"
+#define A_NSCP_ADMINISTRATORCONTACTINFO "NSCP:administratorContactInfo"
+#define A_NSCP_ADMINURL "NSCP:adminURL"
+#define A_NSCP_INSTALLATIONTIMESTAMP "NSCP:installationTimeStamp"
+#define A_NSCP_MAILACCESSDOMAIN "NSCP:mailAccessDomain"
+#define A_NSCP_MAILALTERNATEADDRESS "NSCP:mailAlternateAddress"
+#define A_NSCP_MAILAUTOREPLYMODE "NSCP:mailAutoReplyMode"
+#define A_NSCP_MAILAUTOREPLYTEXT "NSCP:mailAutoReplyText"
+#define A_NSCP_MAILDELIVERYOPTION "NSCP:mailDeliveryOption"
+#define A_NSCP_MAILFORWARDINGADDRESS "NSCP:mailForwardingAddress"
+#define A_NSCP_MAILHOST "NSCP:mailHost"
+#define A_NSCP_MAILMESSAGESTORE "NSCP:mailMessageStore"
+#define A_NSCP_MAILPROGRAMDELIVERYINFO "NSCP:mailProgramDeliveryInfo"
+#define A_NSCP_MAILQUOTA "NSCP:mailQuota"
+#define A_NSCP_MGRPRFC822MAILMEMBER "NSCP:mgrpRFC822mailmember"
+#define A_NSCP_NGCOMPONENT "NSCP:ngComponent"
+#define A_NSCP_NSACLROLE "NSCP:nsaclrole"
+#define A_NSCP_NSCREATOR "NSCP:nscreator"
+#define A_NSCP_NSFLAGS "NSCP:nsflags"
+#define A_NSCP_NSLICENSEDENDTIME "NSCP:nsLicensedEndTime"
+#define A_NSCP_NSLICENSEDFOR "NSCP:nsLicensedFor"
+#define A_NSCP_NSLICENSEDSTARTTIME "NSCP:nsLicensedStartTime"
+#define A_NSCP_NSNEWSACL "NSCP:nsnewsACL"
+#define A_NSCP_NSPRETTYNAME "NSCP:nsprettyname"
+#define A_NSCP_SERVERHOSTNAME "NSCP:serverHostName"
+#define A_NSCP_SERVERPRODUCTNAME "NSCP:serverProductName"
+#define A_NSCP_SERVERROOT "NSCP:serverRoot"
+#define A_NSCP_SERVERVERSIONNUMBER "NSCP:serverVersionNumber"
+#define A_NSCP_SUBTREEACI "NSCP:subtreeACI"
+#define A_OBITUARY "Obituary"
+#define A_OBITUARY_NOTIFY "Obituary Notify"
+#define A_ORGANIZATION_NAME "O"
+#define A_OBJECT_CLASS "Object Class"
+#define A_OPERATOR "Operator"
+#define A_OTHER_GUID "Other GUID"
+#define A_ORGANIZATIONAL_UNIT_NAME "OU"
+#define A_OWNER "Owner"
+#define A_PAGE_DESCRIPTION_LANGUAGE "Page Description Language"
+#define A_PAGE_DESCRIPTION_LANGUAGES "Page Description Languages"
+#define A_PARTITION_CONTROL "Partition Control"
+#define A_PARTITION_CREATION_TIME "Partition Creation Time"
+#define A_PARTITION_STATUS "Partition Status"
+#define A_PASSWORD_ALLOW_CHANGE "Password Allow Change"
+#define A_PASSWORD_EXPIRATION_INTERVAL "Password Expiration Interval"
+#define A_PASSWORD_EXPIRATION_TIME "Password Expiration Time"
+#define A_PASSWORD_MANAGEMENT "Password Management"
+#define A_PASSWORD_MINIMUM_LENGTH "Password Minimum Length"
+#define A_PASSWORD_REQUIRED "Password Required"
+#define A_PASSWORD_UNIQUE_REQUIRED "Password Unique Required"
+#define A_PASSWORDS_USED "Passwords Used"
+#define A_PATH "Path"
+#define A_PERMANENT_CONFIG_PARMS "Permanent Config Parms"
+#define A_PHYSICAL_DELIVERY_OFFICE_NAME "Physical Delivery Office Name"
+#define A_POSTAL_ADDRESS "Postal Address"
+#define A_POSTAL_CODE "Postal Code"
+#define A_POSTAL_OFFICE_BOX "Postal Office Box"
+#define A_POSTMASTER "Postmaster"
+#define A_PRIMARY_NOTIFICATION_SERVICE "Primary Notification Service"
+#define A_PRIMARY_RESOURCE_SERVICE "Primary Resource Service"
+#define A_PRINT_JOB_CONFIGURATION "Print Job Configuration"
+#define A_PRINT_SERVER "Print Server"
+#define A_PRINTER "Printer"
+#define A_PRINTER_AGENT_NAME "Printer Agent Name"
+#define A_PRINTER_CONFIGURATION "Printer Configuration"
+#define A_PRINTER_CONTROL "Printer Control"
+#define A_PRINTER_MANUFACTURER "Printer Manufacturer"
+#define A_PRINTER_MECHANISM_TYPES "Printer Mechanism Types"
+#define A_PRINTER_MODEL "Printer Model"
+#define A_PRINTER_STATUS "Printer Status"
+#define A_PRINTER_TO_PA_ID_MAPPINGS "Printer to PA ID Mappings"
+#define A_PRIVATE_KEY "Private Key"
+#define A_PROFILE "Profile"
+#define A_PROFILE_MEMBERSHIP "Profile Membership"
+#define A_PSM_NAME "PSM Name"
+#define A_PUBLIC_KEY "Public Key"
+#define A_PURGE_VECTOR "Purge Vector"
+#define A_QUEUE "Queue"
+#define A_QUEUE_DIRECTORY "Queue Directory"
+#define A_RECEIVED_UP_TO "Received Up To"
+#define A_REFERENCE "Reference"
+#define A_REGISTRY_ADVERTISING_NAME "Registry Advertising Name"
+#define A_REGISTRY_SERVICE_ENABLED "Registry Service Enabled"
+#define A_REGISTRY_SRVC_NET_ADDR "Registry Srvc Net Addr"
+#define A_REGISTRY_SRVC_NET_ADDRESS "Registry Srvc Net Address"
+#define A_REPLICA "Replica"
+#define A_REPLICA_UP_TO "Replica Up To"
+#define A_RESOLUTION "Resolution"
+#define A_RESOURCE "Resource"
+#define A_RESOURCE_MGMT_SRVC_NET_ADDR "Resource Mgmt Srvc Net Addr"
+#define A_RESOURCE_MGMT_SRVC_NET_ADDRES "Resource Mgmt Srvc Net Address"
+#define A_RESOURCE_MGMT_SERVICE_ENABLED "Resource Mgmt Service Enabled"
+#define A_RESOURCE_MGR_DATABASE_PATH "Resource Mgr Database Path"
+#define A_RESOURCE_MGR_DATABASE_VOLUME "Resource Mgr Database Volume"
+#define A_REVISION "Revision"
+#define A_ROLE_OCCUPANT "Role Occupant"
+#define A_RUNF_SETUP_SCRIPT "Run Setup Script"
+#define A_STATE_OR_PROVINCE_NAME "S"
+#define A_STREET_ADDRESS "SA"
+#define A_SAP_NAME "SAP Name"
+#define A_SAS_SECURITY_DN "SAS:Security DN"
+#define A_SAS_SERVICE_DN "SAS:Service DN"
+#define A_SECURITY_EQUALS "Security Equals"
+#define A_SECURITY_FLAGS "Security Flags"
+#define A_SEE_ALSO "See Also"
+#define A_SERIAL_NUMBER "Serial Number"
+#define A_SERVER "Server"
+#define A_SERVER_HOLDS "Server Holds"
+#define A_SET_PASSWORD_AFTER_CREATE "Set Password After Create"
+#define A_SETUP_SCRIPT "Setup Script"
+#define A_SIDES_SUPPORTED "Sides Supported"
+#define A_SLP_ATTRIBUTE "SLP Attribute"
+#define A_SLP_CACHE_LIMIT "SLP Cache Limit"
+#define A_SLP_DA_BACK_LINK "SLP DA Back Link"
+#define A_SLP_DIRECTORY_AGENT_DN "SLP Directory Agent DN"
+#define A_SLP_LANGUAGE "SLP Language"
+#define A_SLP_LIFETIME "SLP Lifetime"
+#define A_SLP_SCOPE_NAME "SLP Scope Name"
+#define A_SLP_SCOPE_UNIT_DN "SLP Scope Unit DN"
+#define A_SLP_START_PURGE_HOUR "SLP Start Purge Hour"
+#define A_SLP_STATUS "SLP Status"
+#define A_SLP_SU_BACK_LINK "SLP SU Back Link"
+#define A_SLP_SU_TYPE "SLP SU Type"
+#define A_SLP_TYPE "SLP Type"
+#define A_SLP_URL "SLP URL"
+#define A_SMS_PROTOCOL_ADDRESS "SMS Protocol Address"
+#define A_SMS_REGISTERED_SERVICE "SMS Registered Service"
+#define A_STATUS "Status"
+#define A_SU "SU"
+#define A_SUPPORTED_CONNECTIONS "Supported Connections"
+#define A_SUPPORTED_GATEWAY "Supported Gateway"
+#define A_SUPPORTED_SERVICES "Supported Services"
+#define A_SUPPORTED_TYPEFACES "Supported Typefaces"
+#define A_SURNAME "Surname"
+#define A_SVCINFO "SvcInfo"
+#define A_SVCTYPE "SvcType"
+#define A_SVCTYPEID "SvcTypeID"
+#define A_SYNCHRONIZATION_TOLERANCE "Synchronization Tolerance"
+#define A_IN_SYNC_UP_TO "Synchronized Up To"
+#define A_TELEPHONE_NUMBER "Telephone Number"
+#define A_TIMEZONE "Timezone"
+#define A_TITLE "Title"
+#define A_TRANSITIVE_VECTOR "Transitive Vector"
+#define A_TRUSTEES_OF_NEW_OBJECT "Trustees Of New Object"
+#define A_TREE_NAME "T"
+#define A_TYPE_CREATOR_MAP "Type Creator Map"
+#define A_UID "UID"
+#define A_UNKNOWN "Unknown"
+#define A_UNKNOWN_BASE_CLASS "Unknown Base Class"
+#define A_USED_BY "Used By"
+#define A_USER "User"
+#define A_USES "Uses"
+#define A_VERSION "Version"
+#define A_VOLUME "Volume"
+#define A_VOLUME_SPACE_RESTRICTIONS "Volume Space Restrictions"
+#define A_WANMAN_COST "WANMAN:Cost"
+#define A_WANMAN_DEFAULT_COST "WANMAN:Default Cost"
+#define A_WANMAN_LAN_AREA_MEMBERSHIP "WANMAN:LAN Area Membership"
+#define A_WANMAN_WAN_POLICY "WANMAN:WAN Policy"
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdspart.h b/LoginCapture/windows/external/xplatapi/include/nwdspart.h
new file mode 100644
index 00000000..b40d4560
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdspart.h
@@ -0,0 +1,174 @@
+/******************************************************************************
+
+ %name: nwdspart.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:12 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSPART_H )
+#define NWDSPART_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H )
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+#include "npackon.h"
+
+/*---------------------------------------------------------------------------
+ * flags which specify partition info output of
+ * DSV_LIST_PARTITIONS
+ */
+#define DSP_OUTPUT_FIELDS 0x00000001L
+#define DSP_PARTITION_ID 0x00000002L
+#define DSP_REPLICA_STATE 0x00000004L
+#define DSP_MODIFICATION_TIMESTAMP 0x00000008L
+#define DSP_PURGE_TIME 0x00000010L
+#define DSP_LOCAL_PARTITION_ID 0x00000020L
+#define DSP_PARTITION_DN 0x00000040L
+#define DSP_REPLICA_TYPE 0x00000080L
+#define DSP_PARTITION_BUSY 0x00000100L
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAddReplica
+(
+ NWDSContextHandle context,
+ pnstr8 server,
+ pnstr8 partitionRoot,
+ nuint32 replicaType
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSChangeReplicaType
+(
+ NWDSContextHandle context,
+ pnstr8 replicaName,
+ pnstr8 server,
+ nuint32 newReplicaType
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSJoinPartitions
+(
+ NWDSContextHandle context,
+ pnstr8 subordinatePartition,
+ nflag32 flags
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSListPartitions
+(
+ NWDSContextHandle context,
+ pnint32 iterationHandle,
+ pnstr8 server,
+ pBuf_T partitions
+);
+
+N_GLOBAL_LIBRARY (NWDSCCODE)
+NWDSListPartitionsExtInfo
+(
+ NWDSContextHandle context,
+ pnint32 iterationHandle,
+ pnstr8 server,
+ nflag32 DSPFlags,
+ pBuf_T partitions
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemovePartition
+(
+ NWDSContextHandle context,
+ pnstr8 partitionRoot
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemoveReplica
+(
+ NWDSContextHandle context,
+ pnstr8 server,
+ pnstr8 partitionRoot
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSplitPartition
+(
+ NWDSContextHandle context,
+ pnstr8 subordinatePartition,
+ nflag32 flags
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPartitionReceiveAllUpdates
+(
+ NWDSContextHandle context,
+ pnstr8 partitionRoot,
+ pnstr8 serverName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSPartitionSendAllUpdates
+(
+ NWDSContextHandle context,
+ pnstr8 partitionRoot,
+ pnstr8 serverName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSyncPartition
+(
+ NWDSContextHandle context,
+ pnstr8 server,
+ pnstr8 partition,
+ nuint32 seconds
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSAbortPartitionOperation
+(
+ NWDSContextHandle context,
+ pnstr8 partitionRoot
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_dspart.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif /* NWDSPART_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdssch.h b/LoginCapture/windows/external/xplatapi/include/nwdssch.h
new file mode 100644
index 00000000..402c5deb
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdssch.h
@@ -0,0 +1,124 @@
+/******************************************************************************
+
+ %name: nwdssch.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:14 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSSCH_H )
+#define NWDSSCH_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H )
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NWDSATTR_H )
+#include "nwdsattr.h"
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSDefineAttr
+(
+ NWDSContextHandle context,
+ pnstr8 attrName,
+ pAttr_Info_T attrDef
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSDefineClass
+(
+ NWDSContextHandle context,
+ pnstr8 className,
+ pClass_Info_T classInfo,
+ pBuf_T classItems
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSListContainableClasses
+(
+ NWDSContextHandle context,
+ pnstr8 parentObject,
+ pnint32 iterationHandle,
+ pBuf_T containableClasses
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSModifyClassDef
+(
+ NWDSContextHandle context,
+ pnstr8 className,
+ pBuf_T optionalAttrs
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadAttrDef
+(
+ NWDSContextHandle context,
+ nuint32 infoType,
+ nbool8 allAttrs,
+ pBuf_T attrNames,
+ pnint32 iterationHandle,
+ pBuf_T attrDefs
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSReadClassDef
+(
+ NWDSContextHandle context,
+ nuint32 infoType,
+ nbool8 allClasses,
+ pBuf_T classNames,
+ pnint32 iterationHandle,
+ pBuf_T classDefs
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemoveAttrDef
+(
+ NWDSContextHandle context,
+ pnstr8 attrName
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSRemoveClassDef
+(
+ NWDSContextHandle context,
+ pnstr8 className
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSSyncSchema
+(
+ NWDSContextHandle context,
+ pnstr8 server,
+ nuint32 seconds
+);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* NWDSSCH_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwdstype.h b/LoginCapture/windows/external/xplatapi/include/nwdstype.h
new file mode 100644
index 00000000..a4c79281
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwdstype.h
@@ -0,0 +1,55 @@
+/******************************************************************************
+
+ %name: nwdstype.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:16 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWDSTYPE_H )
+#define NWDSTYPE_H
+
+#ifndef NWDSCCODE
+#define NWDSCCODE int
+#endif
+
+/*******************************************************************/
+/* */
+/* !!!!! The following types have been obsoleted !!!!!!!!! */
+/* */
+/* The following have been obsoleted - use types found in */
+/* ntypes.h */
+/* */
+/* ntypes.h contains equivalent types for each of the typedefs */
+/* listed below. For example "uint32" is "nuint32" in ntypes.h */
+/* */
+/* These typedefs also conflicted with defines in the WinSock2 */
+/* headers on NetWare. The decision was made to obsolete these */
+/* types to eliminate conflicts. */
+/*******************************************************************/
+#ifdef INCLUDE_OBSOLETE
+
+typedef unsigned long uint32;
+typedef signed long int32;
+typedef unsigned short uint16;
+typedef signed short int16;
+typedef unsigned char uint8;
+typedef signed char int8;
+
+#ifndef NWUNSIGNED
+#define NWUNSIGNED unsigned
+#endif
+
+#endif /* #ifdef INCLUDE_OBSOLETE */
+
+#endif /* NWDSTYPE_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwea.h b/LoginCapture/windows/external/xplatapi/include/nwea.h
new file mode 100644
index 00000000..770f353b
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwea.h
@@ -0,0 +1,256 @@
+/******************************************************************************
+
+ %name: nwea.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:19 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWEA_H )
+#define NWEA_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWNAMSPC_H ) /* Needed top defined NW_IDX */
+#include "nwnamspc.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EA_EOF 1
+#define EA_DONE 1
+
+#define EA_READWRITE 0
+#define EA_CREATE 1
+
+#define MISSING_EA_KEY 200 /* 0xC8 */
+#define EA_NOT_FOUND 201 /* 0xC9 */
+#define INVALID_EA_HANDLE_TYPE 202 /* 0xCA */
+#define EA_NO_KEY_NO_DATA 203 /* 0xCB */
+#define EA_NUMBER_MISMATCH 204 /* 0xCC */
+#define EXTENT_NUMBER_OUT_OF_RANGE 205 /* 0xCD */
+#define EA_BAD_DIR_NUM 206 /* 0xCE */
+#define INVALID_EA_HANDLE 207 /* 0xCF */
+#define EA_POSITION_OUT_OF_RANGE 208 /* 0xD0 */
+#define EA_ACCESS_DENIED 209 /* 0xD1 */
+#define DATA_PAGE_ODD_SIZE 210 /* 0xD2 */
+#define EA_VOLUME_NOT_MOUNTED 211 /* 0xD3 */
+#define BAD_PAGE_BOUNDARY 212 /* 0xD4 */
+#define INSPECT_FAILURE 213 /* 0xD5 */
+#define EA_ALREADY_CLAIMED 214 /* 0xD6 */
+#define ODD_BUFFER_SIZE 215 /* 0xD7 */
+#define NO_SCORECARDS 216 /* 0xD8 */
+#define BAD_EDS_SIGNATURE 217 /* 0xD9 */
+#define EA_SPACE_LIMIT 218 /* 0xDA */
+#define EA_KEY_CORRUPT 219 /* 0xDB */
+#define EA_KEY_LIMIT 220 /* 0xDC */
+#define TALLY_CORRUPT 221 /* 0xDD */
+
+typedef struct
+{
+ NWCONN_HANDLE connID;
+ nuint32 rwPosition;
+ nuint32 EAHandle;
+ nuint32 volNumber;
+ nuint32 dirBase;
+ nuint8 keyUsed;
+ nuint16 keyLength;
+ nuint8 key[256];
+} NW_EA_HANDLE;
+
+typedef struct
+{
+ NWCONN_HANDLE connID;
+ nuint32 rwPosition;
+ nuint32 EAHandle;
+ nuint32 volNumber;
+ nuint32 dirBase;
+ nuint8 keyUsed;
+ nuint16 keyLength;
+ nuint8 key[766];
+} NW_EA_HANDLE_EXT;
+
+typedef struct
+{
+ NWCONN_HANDLE connID;
+ nuint16 nextKeyOffset;
+ nuint16 nextKey;
+ nuint32 numKeysRead;
+ nuint32 totalKeys;
+ nuint32 EAHandle;
+ nuint16 sequence;
+ nuint16 numKeysInBuffer;
+ nuint8 enumBuffer[512];
+} NW_EA_FF_STRUCT;
+
+typedef struct
+{
+ NWCONN_HANDLE connID;
+ nuint16 nextKeyOffset;
+ nuint16 nextKey;
+ nuint32 numKeysRead;
+ nuint32 totalKeys;
+ nuint32 EAHandle;
+ nuint16 sequence;
+ nuint16 numKeysInBuffer;
+ nuint8 enumBuffer[1530];
+} NW_EA_FF_STRUCT_EXT;
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseEA
+(
+ const NW_EA_HANDLE N_FAR * EAHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseEAExt
+(
+ const NW_EA_HANDLE_EXT N_FAR * EAHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFindFirstEA
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ NW_EA_FF_STRUCT N_FAR * ffStruct,
+ NW_EA_HANDLE N_FAR * EAHandle,
+ pnstr8 EAName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFindFirstEAExt
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ NW_EA_FF_STRUCT_EXT N_FAR * ffStruct,
+ NW_EA_HANDLE_EXT N_FAR * EAHandle,
+ pnstr8 EAName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFindNextEA
+(
+ NW_EA_FF_STRUCT N_FAR * ffStruct,
+ NW_EA_HANDLE N_FAR * EAHandle,
+ pnstr8 EAName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFindNextEAExt
+(
+ NW_EA_FF_STRUCT_EXT N_FAR * ffStruct,
+ NW_EA_HANDLE_EXT N_FAR * EAHandle,
+ pnstr8 EAName
+);
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadEA
+(
+ NW_EA_HANDLE N_FAR * EAHandle,
+ nuint32 bufferSize,
+ pnuint8 buffer,
+ pnuint32 totalEASize,
+ pnuint32 amountRead
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadEAExt
+(
+ NW_EA_HANDLE_EXT N_FAR * EAHandle,
+ nuint32 bufferSize,
+ pnuint8 buffer,
+ pnuint32 totalEASize,
+ pnuint32 amountRead
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteEA
+(
+ NW_EA_HANDLE N_FAR * EAHandle,
+ nuint32 totalWriteSize,
+ nuint32 bufferSize,
+ const nuint8 N_FAR * buffer,
+ pnuint32 amountWritten
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteEAExt
+(
+ NW_EA_HANDLE_EXT N_FAR * EAHandle,
+ nuint32 totalWriteSize,
+ nuint32 bufferSize,
+ const nuint8 N_FAR * buffer,
+ pnuint32 amountWritten
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEAHandleStruct
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * EAName,
+ const NW_IDX N_FAR * idxStruct,
+ NW_EA_HANDLE N_FAR * EAHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEAHandleStructExt
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * EAName,
+ const NW_IDX N_FAR * idxStruct,
+ NW_EA_HANDLE_EXT N_FAR * EAHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenEA
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnstr8 EAName,
+ nuint8 nameSpace,
+ NW_EA_HANDLE N_FAR * EAHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenEAExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnstr8 EAName,
+ nuint8 nameSpace,
+ NW_EA_HANDLE_EXT N_FAR * EAHandle
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwerror.h b/LoginCapture/windows/external/xplatapi/include/nwerror.h
new file mode 100644
index 00000000..5ef100cf
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwerror.h
@@ -0,0 +1,657 @@
+#ifndef __nwerror_h__
+#define __nwerror_h__
+/*============================================================================
+= Novell Kernel Services for NLMs
+=
+= Copyright (C) Unpublished Work of Novell, Inc. All Rights Reserved.
+=
+= This work is an unpublished work and contains confidential, proprietary and
+= trade secret information of Novell, Inc. Access to this work is restricted
+= to (i) Novell, Inc. employees who have a need to know how to perform tasks
+= within the scope of their assignments and (ii) entities other than Novell,
+= Inc. who have entered into appropriate license agreements. No part of this
+= work may be used, practiced, performed, copied, distributed, revised, modi-
+= fied, translated, abridged, condensed, expanded, collected, compiled, link-
+= ed, recast, transformed or adapted without the prior written consent of
+= Novell, Inc. Any use or exploitation of this work without authorization
+= could subject the perpetrator to criminal and civil liability.
+=
+= nwerror.c by Tom Buckley, March 1999
+==============================================================================
+*/
+
+#ifndef SUCCESS
+#define SUCCESS 0
+#endif
+
+// Network errors
+// Decimal values at end of line are 32768 lower than actual
+
+#define SHELL_ERROR 0x8800
+#define VLM_ERROR 0x8800
+#define ALREADY_ATTACHED 0x8800 // 0 - Attach attempted to server with valid, existing connection
+#define INVALID_CONNECTION 0x8801 // 1 - Request attempted with invalid or non-attached connection handle
+#define DRIVE_IN_USE 0x8802 // 2 - OS/2 only (NOT USED)
+#define CANT_ADD_CDS 0x8803 // 3 - Map drive attempted but unable to add new current directory structure
+#define DRIVE_CANNOT_MAP 0x8803
+#define BAD_DRIVE_BASE 0x8804 // 4 - Map drive attempted with invalid path specification
+#define NET_READ_ERROR 0x8805 // 5 - Attempt to receive from the selected transport failed
+#define NET_RECV_ERROR 0x8805 // 5
+#define UNKNOWN_NET_ERROR 0x8806 // 6 - Network send attempted with an un-specific network error
+#define SERVER_INVALID_SLOT 0x8807 // 7 - Server request attempted with invalid server connection slot
+#define BAD_SERVER_SLOT 0x8807 // 7
+#define NO_SERVER_SLOTS 0x8808 // 8 - Attach attempted to server with no connection slots available
+#define NET_WRITE_ERROR 0x8809 // 9 - Attempt to send on the selected transport failed
+#define CONNECTION_IN_ERROR_STATE 0x8809 // Client-32
+#define NET_SEND_ERROR 0x8809 // 9
+#define SERVER_NO_ROUTE 0x880A // 10 - Attempted to find route to server where no route exists
+#define BAD_LOCAL_TARGET 0x880B // 11 - OS/2 only
+#define TOO_MANY_REQ_FRAGS 0x880C // 12 - Attempted request with too many request fragments specified
+#define CONNECT_LIST_OVERFLOW 0x880D // 13
+#define BUFFER_OVERFLOW 0x880E // 14 - Attempt to receive more data than the reply buffer had room for
+#define MORE_DATA_ERROR 0x880E // Client-32
+#define NO_CONN_TO_SERVER 0x880F // 15
+#define NO_CONNECTION_TO_SERVER 0x880F // 15 - Attempt to get connection for a server not connected
+#define NO_ROUTER_FOUND 0x8810 // 16 - OS/2 only
+#define BAD_FUNC_ERROR 0x8811 // 17
+#define INVALID_SHELL_CALL 0x8811 // 17 - Attempted function call to non- existent or illegal function
+#define SCAN_COMPLETE 0x8812
+#define LIP_RESIZE_ERROR 0x8812 // Client-32
+#define UNSUPPORTED_NAME_FORMAT_TYPE 0x8813
+#define INVALID_DIR_HANDLE 0x8813 // Client-32
+#define HANDLE_ALREADY_LICENSED 0x8814
+#define OUT_OF_CLIENT_MEMORY 0x8814 // Client-32
+#define HANDLE_ALREADY_UNLICENSED 0x8815
+#define PATH_NOT_OURS 0x8815 // Client-32
+#define INVALID_NCP_PACKET_LENGTH 0x8816
+#define PATH_IS_PRINT_DEVICE 0x8816 // Client-32
+#define SETTING_UP_TIMEOUT 0x8817
+#define PATH_IS_EXCLUDED_DEVICE 0x8817 // Client-32
+#define SETTING_SIGNALS 0x8818
+#define PATH_IS_INVALID 0x8818 // Client-32
+#define SERVER_CONNECTION_LOST 0x8819
+#define NOT_SAME_DEVICE 0x8819 // Client-32
+#define OUT_OF_HEAP_SPACE 0x881A
+#define INVALID_SERVICE_REQUEST 0x881B
+#define INVALID_SEARCH_HANDLE 0x881B // Client-32
+#define INVALID_TASK_NUMBER 0x881C
+#define INVALID_DEVICE_HANDLE 0x881C // Client-32
+#define INVALID_MESSAGE_LENGTH 0x881D
+#define INVALID_SEM_HANDLE 0x881D // Client-32
+#define EA_SCAN_DONE 0x881E
+#define INVALID_CFG_HANDLE 0x881E // Client-32
+#define BAD_CONNECTION_NUMBER 0x881F
+#define INVALID_MOD_HANDLE 0x881F // Client-32
+#define ASYN_FIRST_PASS 0x8820
+#define INVALID_DEVICE_INDEX 0x8821
+#define INVALID_CONN_HANDLE 0x8822
+#define INVALID_QUEUE_ID 0x8823
+#define INVALID_PDEVICE_HANDLE 0x8824
+#define INVALID_JOB_HANDLE 0x8825
+#define INVALID_ELEMENT_ID 0x8826
+#define ALIAS_NOT_FOUND 0x8827
+#define RESOURCE_SUSPENDED 0x8828
+#define INVALID_QUEUE_SPECIFIED 0x8829
+#define DEVICE_ALREADY_OPEN 0x882A
+#define JOB_ALREADY_OPEN 0x882B
+#define QUEUE_NAME_ID_MISMATCH 0x882C
+#define JOB_ALREADY_STARTED 0x882D
+#define SPECT_DAA_TYPE_NOT_SUPPORTED 0x882E
+#define INVALID_ENVIR_HANDLE 0x882F
+#define NOT_SAME_CONNECTION 0x8830 // 48 - Internal server request attempted accross different server connections
+#define PRIMARY_CONNECTION_NOT_SET 0x8831 // 49 - Attempt to retrieve default connection with no primary connection set
+#define NO_PRIMARY_SET 0x8831 // 49
+#define KEYWORD_NOT_FOUND 0x8832 // Client-32
+#define PRINT_CAPTURE_NOT_IN_PROGRESS 0x8832 // Client-32
+#define NO_CAPTURE_SET 0x8832 // 50
+#define NO_CAPTURE_IN_PROGRESS 0x8832 // 50 - Capture information requested on port with no capture in progress
+#define BAD_BUFFER_LENGTH 0x8833 // 51
+#define INVALID_BUFFER_LENGTH 0x8833 // 51 - Used to indicate length which caller requested on a GetDNC or SetDNC was too large
+#define NO_USER_NAME 0x8834 // 52
+#define NO_NETWARE_PRINT_SPOOLER 0x8835 // 53 - Capture requested without having the local print spooler installed
+#define INVALID_PARAMETER 0x8836 // 54 - Attempted function with an invalid function parameter specified
+#define CONFIG_FILE_OPEN_FAILED 0x8837 // 55 - OS/2 only
+#define NO_CONFIG_FILE 0x8838 // 56 - OS/2 only
+#define CONFIG_FILE_READ_FAILED 0x8839 // 57 - OS/2 only
+#define CONFIG_LINE_TOO_LONG 0x883A // 58 - OS/2 only
+#define CONFIG_LINES_IGNORED 0x883B // 59 - OS/2 only
+#define NOT_MY_RESOURCE 0x883C // 60 - Attempted request made with a parameter using foriegn resource
+#define DAEMON_INSTALLED 0x883D // 61 - OS/2 only
+#define SPOOLER_INSTALLED 0x883E // 62 - Attempted load of print spooler with print spooler already installed
+#define CONN_TABLE_FULL 0x883F // 63
+#define CONNECTION_TABLE_FULL 0x883F // 63 - Attempted to allocate a connection handle with no more local connection table entries
+#define CONFIG_SECTION_NOT_FOUND 0x8840 // 64 - OS/2 only
+#define BAD_TRAN_TYPE 0x8841 // 65
+#define INVALID_TRANSPORT_TYPE 0x8841 // 65 - Attempted function on a connection with an invalid transport selected
+#define TDS_TAG_IN_USE 0x8842 // 66 - OS/2 only
+#define TDS_OUT_OF_MEMORY 0x8843 // 67 - OS/2 only
+#define TDS_INVALID_TAG 0x8844 // 68 - Attempted TDS function with invalid tag
+#define TDS_WRITE_TRUNCATED 0x8845 // 69 - Attempted TDS write with buffer that exceeded buffer
+#define NO_CONNECTION_TO_DS 0x8846 // Client-32
+#define NO_DIRECTORY_SERVICE_CONNECTION 0x8846 // 70
+#define SERVICE_BUSY 0x8846 // 70 - Attempted request made to partially asynchronous function in busy state
+#define NO_SERVER_ERROR 0x8847 // 71 - Attempted connect failed to find any servers responding
+#define BAD_VLM_ERROR 0x8848 // 72 - Attempted function call to non-existant or not-loaded overlay
+#define NETWORK_DRIVE_IN_USE 0x8849 // 73 - Attempted map to network drive that was already mapped
+#define LOCAL_DRIVE_IN_USE 0x884A // 74 - Attempted map to local drive that was in use
+#define NO_DRIVES_AVAILABLE 0x884B // 75 - Attempted map to next available drive when none were available
+#define DEVICE_NOT_REDIRECTED 0x884C // 76 - The device is not redirected
+#define NO_MORE_SFT_ENTRIES 0x884D // 77 - Maximum number of files was reached
+#define UNLOAD_ERROR 0x884E // 78 - Attempted unload failed
+#define IN_USE_ERROR 0x884F // 79 - Attempted re-use of already in use connection entry
+#define TOO_MANY_REP_FRAGS 0x8850 // 80 - Attempted request with too many reply fragments specified
+#define TABLE_FULL 0x8851 // 81 - Attempted to add a name into the name table after it was full
+#ifndef SOCKET_NOT_OPEN
+#define SOCKET_NOT_OPEN 0x8852 // 82 - Listen was posted on unopened socket
+#endif
+#define MEM_MGR_ERROR 0x8853 // 83 - Attempted enhanced memory operation failed
+#define SFT3_ERROR 0x8854 // 84 - An SFT3 switch occured mid-transfer
+#define PREFERRED_NOT_FOUND 0x8855 // 85 - the preferred directory server was not established but another directory server was returned
+#define DEVICE_NOT_RECOGNIZED 0x8856 // 86 - used to determine if the device is not used by VISE so pass it on to the next redirector, if any.
+#define BAD_NET_TYPE 0x8857 // 87 - the network type (Bind/NDS) does not match the server version
+#define ERROR_OPENING_FILE 0x8858 // 88 - generic open failure error, invalid path, access denied, etc..
+#define NO_PREFERRED_SPECIFIED 0x8859 // 89 - no preferred name specified
+#define ERROR_OPENING_SOCKET 0x885A // 90 - error opening a socket
+#define REQUESTER_FAILURE 0x885A // Client-32
+#define RESOURCE_ACCESS_DENIED 0x885B // Client-32
+#define SIGNATURE_LEVEL_CONFLICT 0x8861
+#define NO_LOCK_FOUND 0x8862 // OS/2 - process lock on conn handle failed, process ID not recognized
+#define LOCK_TABLE_FULL 0x8863 // OS/2 - process lock on conn handle failed, process lock table full
+#define INVALID_MATCH_DATA 0x8864
+#define MATCH_FAILED 0x8865
+#define NO_MORE_ENTRIES 0x8866
+#define INSUFFICIENT_RESOURCES 0x8867
+#define STRING_TRANSLATION 0x8868
+#define STRING_TRANSLATION_NEEDED 0x8868 // Client-32
+#define ACCESS_VIOLATION 0x8869
+#define NOT_AUTHENTICATED 0x886A
+#define INVALID_LEVEL 0x886B
+#define RESOURCE_LOCK_ERROR 0x886C
+#define INVALID_NAME_FORMAT 0x886D
+#define OBJECT_EXISTS 0x886E
+#define OBJECT_NOT_FOUND 0x886F
+#define UNSUPPORTED_TRAN_TYPE 0x8870
+#define INVALID_STRING_TYPE 0x8871
+#define INVALID_OWNER 0x8872
+#define UNSUPPORTED_AUTHENTICATOR 0x8873
+#define IO_PENDING 0x8874
+#define INVALID_DRIVE_NUM 0x8875
+#define SHELL_FAILURE 0x88FF
+#define VLM_FAILURE 0x88FF
+
+#define SVC_ALREADY_REGISTERED 0x8880 // Client-32
+#define SVC_REGISTRY_FULL 0x8881 // Client-32
+#define SVC_NOT_REGISTERED 0x8882 // Client-32
+#define OUT_OF_RESOURCES 0x8883 // Client-32
+#define RESOLVE_SVC_FAILED 0x8884 // Client-32
+#define CONNECT_FAILED 0x8885 // Client-32
+#define PROTOCOL_NOT_BOUND 0x8886 // Client-32
+#define AUTHENTICATION_FAILED 0x8887 // Client-32
+#define INVALID_AUTHEN_HANDLE 0x8888 // Client-32
+#define AUTHEN_HANDLE_ALREADY_EXISTS 0x8889 // Client-32
+
+#define DIFF_OBJECT_ALREADY_AUTHEN 0x8890 // Client-32
+#define REQUEST_NOT_SERVICEABLE 0x8891 // Client-32
+#define AUTO_RECONNECT_SO_REBUILD 0x8892 // Client-32
+#define AUTO_RECONNECT_RETRY_REQUEST 0x8893 // Client-32
+#define ASYNC_REQUEST_IN_USE 0x8894 // Client-32
+#define ASYNC_REQUEST_CANCELED 0x8895 // Client-32
+#define SESS_SVC_ALREADY_REGISTERED 0x8896 // Client-32
+#define SESS_SVC_NOT_REGISTERED 0x8897 // Client-32
+#define PREVIOUSLY_AUTHENTICATED 0x8899 // Client-32
+#define RESOLVE_SVC_PARTIAL 0x889A // Client-32
+#define NO_DEFAULT_SPECIFIED 0x889B // Client-32
+#define HOOK_REQUEST_NOT_HANDLED 0x889C // Client-32
+#define HOOK_REQUEST_BUSY 0x889D // Client-32
+#define HOOK_REQUEST_QUEUED 0x889D // Client-32
+#define AUTO_RECONNECT_SO_IGNORE 0x889E // Client-32
+#define ASYNC_REQUEST_NOT_IN_USE 0x889F // Client-32
+#define AUTO_RECONNECT_FAILURE 0x88A0 // Client-32
+#define NET_ERROR_ABORT_APPLICATION 0x88A1 // Client-32
+#define NET_ERROR_SUSPEND_APPLICATION 0x88A2 // Client-32
+#define NET_ERROR_ABORTED_PROCESS_GROUP 0x88A3 // Client-32
+#define NET_ERROR_PASSWORD_HAS_EXPIRED 0x88A5 // Client-32
+#define NET_ERROR_NETWORK_INACTIVE 0x88A6 // Client-32
+#define REPLY_TRUNCATED 0x88E6 // 230 NLM
+#define UTF8_CONVERSION_FAILED 0x88F0 // NWCALLS
+
+
+// Server Errors
+
+#define ERR_INSUFFICIENT_SPACE 0x8901 // 001
+#define NLM_INVALID_CONNECTION 0x890A // 010
+#define ERR_TIMEOUT 0x8910 // 016 - nlm connection timeout
+#define ERR_NO_MORE_ENTRY 0x8914 // 020
+#define ERR_BUFFER_TOO_SMALL 0x8977 // 119
+#define ERR_VOLUME_FLAG_NOT_SET 0x8978 // 120 the service requested, not avail. on the selected vol.
+#define ERR_NO_ITEMS_FOUND 0x8979 // 121
+#define ERR_CONN_ALREADY_TEMP 0x897A // 122
+#define ERR_CONN_ALREADY_LOGGED_IN 0x897B // 123
+#define ERR_CONN_NOT_AUTHENTICATED 0x897C // 124
+#define ERR_CONN_NOT_LOGGED_IN 0x897D // 125
+#define NCP_BOUNDARY_CHECK_FAILED 0x897E // 126
+#define ERR_LOCK_WAITING 0x897F // 127
+#define ERR_LOCK_FAIL 0x8980 // 128
+#define FILE_IN_USE_ERROR 0x8980 // 128
+#define NO_MORE_FILE_HANDLES 0x8981 // 129
+#define NO_OPEN_PRIVILEGES 0x8982 // 130
+#define IO_ERROR_NETWORK_DISK 0x8983 // 131
+#define ERR_AUDITING_HARD_IO_ERROR 0x8983 // 131
+#define NO_CREATE_PRIVILEGES 0x8984 // 132
+#define ERR_AUDITING_NOT_SUPV 0x8984 // 132
+#define NO_CREATE_DELETE_PRIVILEGES 0x8985 // 133
+#define CREATE_FILE_EXISTS_READ_ONLY 0x8986 // 134
+#define WILD_CARDS_IN_CREATE_FILE_NAME 0x8987 // 135
+#define CREATE_FILENAME_ERROR 0x8987 // 135
+#define INVALID_FILE_HANDLE 0x8988 // 136
+#define NO_SEARCH_PRIVILEGES 0x8989 // 137
+#define NO_DELETE_PRIVILEGES 0x898A // 138
+#define NO_RENAME_PRIVILEGES 0x898B // 139
+#define NO_MODIFY_PRIVILEGES 0x898C // 140
+#define SOME_FILES_AFFECTED_IN_USE 0x898D // 141
+#define NO_FILES_AFFECTED_IN_USE 0x898E // 142
+#define SOME_FILES_AFFECTED_READ_ONLY 0x898F // 143
+#define NO_FILES_AFFECTED_READ_ONLY 0x8990 // 144
+#define SOME_FILES_RENAMED_NAME_EXISTS 0x8991 // 145
+#define NO_FILES_RENAMED_NAME_EXISTS 0x8992 // 146
+#define NO_READ_PRIVILEGES 0x8993 // 147
+#define NO_WRITE_PRIVILEGES_OR_READONLY 0x8994 // 148
+#define FILE_DETACHED 0x8995 // 149
+#define SERVER_OUT_OF_MEMORY 0x8996 // 150
+#define ERR_TARGET_NOT_A_SUBDIRECTORY 0x8996 // 150 can be changed later (note written by server people).
+#define NO_DISK_SPACE_FOR_SPOOL_FILE 0x8997 // 151
+#define ERR_AUDITING_NOT_ENABLED 0x8997 // 151
+#define VOLUME_DOES_NOT_EXIST 0x8998 // 152
+#define DIRECTORY_FULL 0x8999 // 153
+#define RENAMING_ACROSS_VOLUMES 0x899A // 154
+#define BAD_DIRECTORY_HANDLE 0x899B // 155
+#define INVALID_PATH 0x899C // 156
+#define NO_MORE_TRUSTEES 0x899C // 156
+#define NO_MORE_DIRECTORY_HANDLES 0x899D // 157
+#define INVALID_FILENAME 0x899E // 158
+#define DIRECTORY_ACTIVE 0x899F // 159
+#define DIRECTORY_NOT_EMPTY 0x89A0 // 160
+#define DIRECTORY_IO_ERROR 0x89A1 // 161
+#define READ_FILE_WITH_RECORD_LOCKED 0x89A2 // 162
+#define ERR_TRANSACTION_RESTARTED 0x89A3 // 163
+#define ERR_RENAME_DIR_INVALID 0x89A4 // 164
+#define ERR_INVALID_OPENCREATE_MODE 0x89A5 // 165
+#define ERR_ALREADY_IN_USE 0x89A6 // 166
+#define ERR_AUDITING_ACTIVE 0x89A6 // 166
+#define ERR_INVALID_RESOURCE_TAG 0x89A7 // 167
+#define ERR_ACCESS_DENIED 0x89A8 // 168
+#define ERR_AUDITING_NO_RIGHTS 0x89A8 // 168
+#define INVALID_DATA_TYPE 0x89A9 // 169
+#define INVALID_DATA_STREAM 0x89BE // 190
+#define INVALID_NAME_SPACE 0x89BF // 191
+#define NO_ACCOUNTING_PRIVILEGES 0x89C0 // 192
+#define LOGIN_DENIED_NO_ACCOUNT_BALANCE 0x89C1 // 193
+#define LOGIN_DENIED_NO_CREDIT 0x89C2 // 194
+#define ERR_AUDITING_RECORD_SIZE 0x89C2 // 194
+#define ERR_TOO_MANY_HOLDS 0x89C3 // 195
+#define ACCOUNTING_DISABLED 0x89C4 // 196
+#define INTRUDER_DETECTION_LOCK 0x89C5 // 197
+#define NO_CONSOLE_OPERATOR 0x89C6 // 198
+#define NO_CONSOLE_PRIVILEGES 0x89C6 // 198
+#define ERR_Q_IO_FAILURE 0x89D0 // 208
+#define ERR_NO_QUEUE 0x89D1 // 209
+#define ERR_NO_Q_SERVER 0x89D2 // 210
+#define ERR_NO_Q_RIGHTS 0x89D3 // 211
+#define ERR_Q_FULL 0x89D4 // 212
+#define ERR_NO_Q_JOB 0x89D5 // 213
+#define ERR_NO_Q_JOB_RIGHTS 0x89D6 // 214
+#define ERR_Q_IN_SERVICE 0x89D7 // 215
+#define PASSWORD_NOT_UNIQUE 0x89D7 // 215
+#define ERR_Q_NOT_ACTIVE 0x89D8 // 216
+#define PASSWORD_TOO_SHORT 0x89D8 // 216
+#define ERR_Q_STN_NOT_SERVER 0x89D9 // 217
+#define LOGIN_DENIED_NO_CONNECTION 0x89D9 // 217
+#define ERR_MAXIMUM_LOGINS_EXCEEDED 0x89D9 // 217
+#define ERR_Q_HALTED 0x89DA // 218
+#define UNAUTHORIZED_LOGIN_TIME 0x89DA // 218
+#define UNAUTHORIZED_LOGIN_STATION 0x89DB // 219
+#define ERR_Q_MAX_SERVERS 0x89DB // 219
+#define ACCOUNT_DISABLED 0x89DC // 220
+#define PASSWORD_HAS_EXPIRED_NO_GRACE 0x89DE // 222
+#define PASSWORD_HAS_EXPIRED 0x89DF // 223
+#define E_NO_MORE_USERS 0x89E7 // 231
+#define NOT_ITEM_PROPERTY 0x89E8 // 232
+#define WRITE_PROPERTY_TO_GROUP 0x89E8 // 232
+#define MEMBER_ALREADY_EXISTS 0x89E9 // 233
+#define NO_SUCH_MEMBER 0x89EA // 234
+#define NOT_GROUP_PROPERTY 0x89EB // 235
+#define NO_SUCH_SEGMENT 0x89EC // 236
+#define PROPERTY_ALREADY_EXISTS 0x89ED // 237
+#define OBJECT_ALREADY_EXISTS 0x89EE // 238
+#define INVALID_NAME 0x89EF // 239
+#define WILD_CARD_NOT_ALLOWED 0x89F0 // 240
+#define INVALID_BINDERY_SECURITY 0x89F1 // 241
+#define NO_OBJECT_READ_PRIVILEGE 0x89F2 // 242
+#define NO_OBJECT_RENAME_PRIVILEGE 0x89F3 // 243
+#define NO_OBJECT_DELETE_PRIVILEGE 0x89F4 // 244
+#define NO_OBJECT_CREATE_PRIVILEGE 0x89F5 // 245
+#define NO_PROPERTY_DELETE_PRIVILEGE 0x89F6 // 246
+#define NO_PROPERTY_CREATE_PRIVILEGE 0x89F7 // 247
+#define NO_PROPERTY_WRITE_PRIVILEGE 0x89F8 // 248
+#define NO_FREE_CONNECTION_SLOTS 0x89F9 // 249
+#define NO_PROPERTY_READ_PRIVILEGE 0x89F9 // 249
+#define NO_MORE_SERVER_SLOTS 0x89FA // 250
+#define TEMP_REMAP_ERROR 0x89FA // 250
+#define INVALID_PARAMETERS 0x89FB // 251
+#define NO_SUCH_PROPERTY 0x89FB // 251
+#define ERR_NCP_NOT_SUPPORTED 0x89FB // 251
+#define INTERNET_PACKET_REQT_CANCELED 0x89FC // 252
+#define UNKNOWN_FILE_SERVER 0x89FC // 252
+#define MESSAGE_QUEUE_FULL 0x89FC // 252
+#define NO_SUCH_OBJECT 0x89FC // 252
+#define LOCK_COLLISION 0x89FD // 253
+#define BAD_STATION_NUMBER 0x89FD // 253
+#define INVALID_PACKET_LENGTH 0x89FD // 253
+#define UNKNOWN_REQUEST 0x89FD // 253
+#define BINDERY_LOCKED 0x89FE // 254
+#define TRUSTEE_NOT_FOUND 0x89FE // 254
+#define DIRECTORY_LOCKED 0x89FE // 254
+#define INVALID_SEMAPHORE_NAME_LENGTH 0x89FE // 254
+#define PACKET_NOT_DELIVERABLE 0x89FE // 254
+#define SERVER_BINDERY_LOCKED 0x89FE // 254
+#define SOCKET_TABLE_FULL 0x89FE // 254
+#define SPOOL_DIRECTORY_ERROR 0x89FE // 254
+#define SUPERVISOR_HAS_DISABLED_LOGIN 0x89FE // 254
+#define TIMEOUT_FAILURE 0x89FE // 254
+#define BAD_PRINTER_ERROR 0x89FF // 255
+#define BAD_RECORD_OFFSET 0x89FF // 255
+#define CLOSE_FCB_ERROR 0x89FF // 255
+#define FILE_EXTENSION_ERROR 0x89FF // 255
+#define FILE_NAME_ERROR 0x89FF // 255
+#define HARDWARE_FAILURE 0x89FF // 255
+#define INVALID_DRIVE_NUMBER 0x89FF // 255
+#define DOS_INVALID_DRIVE 0x000F // 255
+#define INVALID_INITIAL_SEMAPHORE_VALUE 0x89FF // 255
+#define INVALID_SEMAPHORE_HANDLE 0x89FF // 255
+#define IO_BOUND_ERROR 0x89FF // 255
+#define NO_FILES_FOUND_ERROR 0x89FF // 255
+#define NO_RESPONSE_FROM_SERVER 0x89FF // 255
+#define NO_SUCH_OBJECT_OR_BAD_PASSWORD 0x89FF // 255
+#define PATH_NOT_LOCATABLE 0x89FF // 255
+#define QUEUE_FULL_ERROR 0x89FF // 255
+#define REQUEST_NOT_OUTSTANDING 0x89FF // 255
+#ifndef SOCKET_ALREADY_OPEN
+#define SOCKET_ALREADY_OPEN 0x89FF // 255
+#endif
+#define LOCK_ERROR 0x89FF // 255
+#ifndef FAILURE
+#define FAILURE 0x89FF // 255 Generic Failure
+#endif
+
+// #define NOT_SAME_LOCAL_DRIVE 0x89F6
+// #define TARGET_DRIVE_NOT_LOCAL 0x89F7
+// #define ALREADY_ATTACHED_TO_SERVER 0x89F8 // 248
+// #define NOT_ATTACHED_TO_SERVER 0x89F8
+
+///// Network errors /////
+// Decimal values at end of line are 32768 lower than actual
+
+#define NWE_ALREADY_ATTACHED 0x8800 // 0 - Attach attempted to server with valid, existing connection
+#define NWE_CONN_INVALID 0x8801 // 1 - Request attempted with invalid or non-attached connection handle
+#define NWE_DRIVE_IN_USE 0x8802 // 2 - OS/2 only (NOT USED)
+#define NWE_DRIVE_CANNOT_MAP 0x8803 // 3 - Map drive attempted but unable to add new current directory structure
+#define NWE_DRIVE_BAD_PATH 0x8804 // 4 - Map drive attempted with invalid path specification
+#define NWE_NET_RECEIVE 0x8805 // 5 - Attempt to receive from the selected transport failed
+#define NWE_NET_UNKNOWN 0x8806 // 6 - Network send attempted with an un-specific network error
+#define NWE_SERVER_BAD_SLOT 0x8807 // 7 - Server request attempted with invalid server connection slot
+#define NWE_SERVER_NO_SLOTS 0x8808 // 8 - Attach attempted to server with no connection slots available
+#define NWE_NET_SEND 0x8809 // 9 - Attempt to send on the selected transport failed
+#define NWE_SERVER_NO_ROUTE 0x880A // 10 - Attempted to find route to server where no route exists
+#define NWE_BAD_LOCAL_TARGET 0x880B // 11 - OS/2 only
+#define NWE_REQ_TOO_MANY_REQ_FRAGS 0x880C // 12 - Attempted request with too many request fragments specified
+#define NWE_CONN_LIST_OVERFLOW 0x880D // 13
+#define NWE_BUFFER_OVERFLOW 0x880E // 14 - Attempt to receive more data than the reply buffer had room for
+#define NWE_SERVER_NO_CONN 0x880F // 15 - Attempt to get connection for a server not connected
+#define NWE_NO_ROUTER_FOUND 0x8810 // 16 - OS/2 only
+#define NWE_FUNCTION_INVALID 0x8811 // 17 - Attempted function call to non- existent or illegal function
+#define NWE_SCAN_COMPLETE 0x8812
+#define NWE_UNSUPPORTED_NAME_FORMAT_TYP 0x8813
+#define NWE_HANDLE_ALREADY_LICENSED 0x8814
+#define NWE_HANDLE_ALREADY_UNLICENSED 0x8815
+#define NWE_INVALID_NCP_PACKET_LENGTH 0x8816
+#define NWE_SETTING_UP_TIMEOUT 0x8817
+#define NWE_SETTING_SIGNALS 0x8818
+#define NWE_SERVER_CONNECTION_LOST 0x8819
+#define NWE_OUT_OF_HEAP_SPACE 0x881A
+#define NWE_INVALID_SERVICE_REQUEST 0x881B
+#define NWE_INVALID_TASK_NUMBER 0x881C
+#define NWE_INVALID_MESSAGE_LENGTH 0x881D
+#define NWE_EA_SCAN_DONE 0x881E
+#define NWE_BAD_CONNECTION_NUMBER 0x881F
+#define NWE_MULT_TREES_NOT_SUPPORTED 0x8820 // 32 - Attempt to open a connection to a DS tree other than the default tree
+#define NWE_CONN_NOT_SAME 0x8830 // 48 - Internal server request attempted across different server connections
+#define NWE_CONN_PRIMARY_NOT_SET 0x8831 // 49 - Attempt to retrieve default connection with no primary connection set
+#define NWE_PRN_CAPTURE_NOT_IN_PROGRESS 0x8832 // 50 - Capture information requested on port with no capture in progress
+#define NWE_BUFFER_INVALID_LEN 0x8833 // 51 - Used to indicate length which caller requested on a GetDNC or SetDNC was too large
+#define NWE_USER_NO_NAME 0x8834 // 52
+#define NWE_PRN_NO_LOCAL_SPOOLER 0x8835 // 53 - Capture requested without having the local print spooler installed
+#define NWE_PARAM_INVALID 0x8836 // 54 - Attempted function with an invalid function parameter specified
+#define NWE_CFG_OPEN_FAILED 0x8837 // 55 - OS/2 only
+#define NWE_CFG_NO_FILE 0x8838 // 56 - OS/2 only
+#define NWE_CFG_READ_FAILED 0x8839 // 57 - OS/2 only
+#define NWE_CFG_LINE_TOO_LONG 0x883A // 58 - OS/2 only
+#define NWE_CFG_LINES_IGNORED 0x883B // 59 - OS/2 only
+#define NWE_RESOURCE_NOT_OWNED 0x883C // 60 - Attempted request made with a parameter using foriegn resource
+#define NWE_DAEMON_INSTALLED 0x883D // 61 - OS/2 only
+#define NWE_PRN_SPOOLER_INSTALLED 0x883E // 62 - Attempted load of print spooler with print spooler already installed
+#define NWE_CONN_TABLE_FULL 0x883F // 63 - Attempted to allocate a connection handle with no more local connection table entries
+#define NWE_CFG_SECTION_NOT_FOUND 0x8840 // 64 - OS/2 only
+#define NWE_TRAN_INVALID_TYPE 0x8841 // 65 - Attempted function on a connection with an invalid transport selected
+#define NWE_TDS_TAG_IN_USE 0x8842 // 66 - OS/2 only
+#define NWE_TDS_OUT_OF_MEMORY 0x8843 // 67 - OS/2 only
+#define NWE_TDS_INVALID_TAG 0x8844 // 68 - Attempted TDS function with invalid tag
+#define NWE_TDS_WRITE_TRUNCATED 0x8845 // 69 - Attempted TDS write with buffer that exceeded buffer
+#define NWE_DS_NO_CONN 0x8846 // 70
+#define NWE_SERVICE_BUSY 0x8846 // 70 - Attempted request made to partially asynchronous function in busy state
+#define NWE_SERVER_NOT_FOUND 0x8847 // 71 - Attempted connect failed to find any servers responding
+#define NWE_VLM_INVALID 0x8848 // 72 - Attempted function call to non-existant or not-loaded overlay
+#define NWE_DRIVE_ALREADY_MAPPED 0x8849 // 73 - Attempted map to network drive that was already mapped
+#define NWE_DRIVE_LOCAL_IN_USE 0x884A // 74 - Attempted map to local drive that was in use
+#define NWE_DRIVE_NONE_AVAILABLE 0x884B // 75 - Attempted map to next available drive when none were available
+#define NWE_DEVICE_NOT_REDIRECTED 0x884C // 76 - The device is not redirected
+#define NWE_FILE_MAX_REACHED 0x884D // 77 - Maximum number of files was reached
+#define NWE_UNLOAD_FAILED 0x884E // 78 - Attempted unload failed
+#define NWE_CONN_IN_USE 0x884F // 79 - Attempted re-use of already in use connection entry
+#define NWE_REQ_TOO_MANY_REP_FRAGS 0x8850 // 80 - Attempted request with too many reply fragments specified
+#define NWE_NAME_TABLE_FULL 0x8851 // 81 - Attempted to add a name into the name table after it was full
+#define NWE_SOCKET_NOT_OPEN 0x8852 // 82 - Listen was posted on unopened socket
+#define NWE_MEMORY_MGR_ERROR 0x8853 // 83 - Attempted enhanced memory operation failed
+#define NWE_SFT3_ERROR 0x8854 // 84 - An SFT3 switch occured mid-transfer
+#define NWE_DS_PREFERRED_NOT_FOUND 0x8855 // 85 - the preferred directory server was not established but another directory server was returned
+#define NWE_DEVICE_NOT_RECOGNIZED 0x8856 // 86 - used to determine if the device is not used by VISE so pass it on to the next redirector, if any.
+#define NWE_NET_INVALID_TYPE 0x8857 // 87 - the network type (Bind/NDS) does not match the server version
+#define NWE_FILE_OPEN_FAILED 0x8858 // 88 - generic open failure error, invalid path, access denied, etc..
+#define NWE_DS_PREFERRED_NOT_SPECIFIED 0x8859 // 89 - no preferred name specified
+#define NWE_SOCKET_OPEN_FAILED 0x885A // 90 - error opening a socket
+#define NWE_SIGNATURE_LEVEL_CONFLICT 0x8861
+#define NWE_NO_LOCK_FOUND 0x8862 // OS/2 - process lock on conn handle failed, process ID not recognized
+#define NWE_LOCK_TABLE_FULL 0x8863 // OS/2 - process lock on conn handle failed, process lock table full
+#define NWE_INVALID_MATCH_DATA 0x8864
+#define NWE_MATCH_FAILED 0x8865
+#define NWE_NO_MORE_ENTRIES 0x8866
+#define NWE_INSUFFICIENT_RESOURCES 0x8867
+#define NWE_STRING_TRANSLATION 0x8868
+#define NWE_ACCESS_VIOLATION 0x8869
+#define NWE_NOT_AUTHENTICATED 0x886A
+#define NWE_INVALID_LEVEL 0x886B
+#define NWE_RESOURCE_LOCK 0x886C
+#define NWE_INVALID_NAME_FORMAT 0x886D
+#define NWE_OBJECT_EXISTS 0x886E
+#define NWE_OBJECT_NOT_FOUND 0x886F
+#define NWE_UNSUPPORTED_TRAN_TYPE 0x8870
+#define NWE_INVALID_STRING_TYPE 0x8871
+#define NWE_INVALID_OWNER 0x8872
+#define NWE_UNSUPPORTED_AUTHENTICATOR 0x8873
+#define NWE_IO_PENDING 0x8874
+#define NWE_INVALID_DRIVE_NUMBER 0x8875
+#define NWE_REPLY_TRUNCATED 0x88e6 // 230 NLM
+#define NWE_REQUESTER_FAILURE 0x88FF
+
+// Server Errors
+
+#define NWE_INSUFFICIENT_SPACE 0x8901 // 001
+#define NWE_INVALID_CONNECTION 0x890a // 010 - nlm invalid connection
+#define NWE_TIMEOUT 0x8910 // 016 - nlm connection timeout
+#define NWE_NO_MORE_ENTRY 0x8914 // 020
+#define NWE_BUFFER_TOO_SMALL 0x8977 // 119
+#define NWE_VOL_FLAG_NOT_SET 0x8978 // 120 the service requested, not avail. on the selected vol.
+#define NWE_NO_ITEMS_FOUND 0x8979 // 121
+#define NWE_CONN_ALREADY_TEMP 0x897a // 122
+#define NWE_CONN_ALREADY_LOGGED_IN 0x897b // 123
+#define NWE_CONN_NOT_AUTHENTICATED 0x897c // 124
+#define NWE_CONN_NOT_LOGGED_IN 0x897d // 125
+#define NWE_NCP_BOUNDARY_CHECK_FAILED 0x897e // 126
+#define NWE_LOCK_WAITING 0x897f // 127
+#define NWE_LOCK_FAIL 0x8980 // 128
+#define NWE_FILE_IN_USE 0x8980 // 128
+#define NWE_FILE_NO_HANDLES 0x8981 // 129
+#define NWE_FILE_NO_OPEN_PRIV 0x8982 // 130
+#define NWE_DISK_IO_ERROR 0x8983 // 131
+#define NWE_AUDITING_HARD_IO_ERROR 0x8983 // 131
+#define NWE_FILE_NO_CREATE_PRIV 0x8984 // 132
+#define NWE_AUDITING_NOT_SUPV 0x8984 // 132
+#define NWE_FILE_NO_CREATE_DEL_PRIV 0x8985 // 133
+#define NWE_FILE_EXISTS_READ_ONLY 0x8986 // 134
+#define NWE_FILE_WILD_CARDS_IN_NAME 0x8987 // 135
+#define NWE_FILE_INVALID_HANDLE 0x8988 // 136
+#define NWE_FILE_NO_SRCH_PRIV 0x8989 // 137
+#define NWE_FILE_NO_DEL_PRIV 0x898A // 138
+#define NWE_FILE_NO_RENAME_PRIV 0x898B // 139
+#define NWE_FILE_NO_MOD_PRIV 0x898C // 140
+#define NWE_FILE_SOME_IN_USE 0x898D // 141
+#define NWE_FILE_NONE_IN_USE 0x898E // 142
+#define NWE_FILE_SOME_READ_ONLY 0x898F // 143
+#define NWE_FILE_NONE_READ_ONLY 0x8990 // 144
+#define NWE_FILE_SOME_RENAMED_EXIST 0x8991 // 145
+#define NWE_FILE_NONE_RENAMED_EXIST 0x8992 // 146
+#define NWE_FILE_NO_READ_PRIV 0x8993 // 147
+#define NWE_FILE_NO_WRITE_PRIV 0x8994 // 148
+#define NWE_FILE_READ_ONLY 0x8994 // 148
+#define NWE_FILE_DETACHED 0x8995 // 149
+#define NWE_SERVER_OUT_OF_MEMORY 0x8996 // 150
+#define NWE_DIR_TARGET_INVALID 0x8996 // 150
+#define NWE_DISK_NO_SPOOL_SPACE 0x8997 // 151
+#define NWE_AUDITING_NOT_ENABLED 0x8997 // 151
+#define NWE_VOL_INVALID 0x8998 // 152
+#define NWE_DIR_FULL 0x8999 // 153
+#define NWE_VOL_RENAMING_ACROSS 0x899A // 154
+#define NWE_DIRHANDLE_INVALID 0x899B // 155
+#define NWE_PATH_INVALID 0x899C // 156
+#define NWE_TRUSTEES_NO_MORE 0x899C // 156
+#define NWE_DIRHANDLE_NO_MORE 0x899D // 157
+#define NWE_FILE_NAME_INVALID 0x899E // 158
+#define NWE_DIR_ACTIVE 0x899F // 159
+#define NWE_DIR_NOT_EMPTY 0x89A0 // 160
+#define NWE_DIR_IO_ERROR 0x89A1 // 161
+#define NWE_FILE_IO_LOCKED 0x89A2 // 162
+#define NWE_TTS_RANSACTION_RESTARTED 0x89A3 // 163
+#define NWE_TTS_TRANSACTION_RESTARTED 0x89A3 // 163
+#define NWE_DIR_RENAME_INVALID 0x89A4 // 164
+#define NWE_FILE_OPENCREAT_MODE_INVALID 0x89A5 // 165
+#define NWE_ALREADY_IN_USE 0x89A6 // 166
+#define NWE_AUDITING_ACTIVE 0x89A6 // 166
+#define NWE_RESOURCE_TAG_INVALID 0x89A7 // 167
+#define NWE_ACCESS_DENIED 0x89A8 // 168
+#define NWE_AUDITING_NO_RIGHTS 0x89A8 // 168
+#define NWE_DATA_STREAM_INVALID 0x89BE // 190
+#define NWE_NAME_SPACE_INVALID 0x89BF // 191
+#define NWE_ACCTING_NO_PRIV 0x89C0 // 192
+#define NWE_ACCTING_NO_BALANCE 0x89C1 // 193
+#define NWE_ACCTING_NO_CREDIT 0x89C2 // 194
+#define NWE_AUDITING_RECORD_SIZE 0x89C2 // 194
+#define NWE_ACCTING_TOO_MANY_HOLDS 0x89C3 // 195
+#define NWE_ACCTING_DISABLED 0x89C4 // 196
+#define NWE_LOGIN_LOCKOUT 0x89C5 // 197
+#define NWE_CONSOLE_NO_PRIV 0x89C6 // 198
+#define NWE_Q_IO_FAILURE 0x89D0 // 208
+#define NWE_Q_NONE 0x89D1 // 209
+#define NWE_Q_NO_SERVER 0x89D2 // 210
+#define NWE_Q_NO_RIGHTS 0x89D3 // 211
+#define NWE_Q_FULL 0x89D4 // 212
+#define NWE_Q_NO_JOB 0x89D5 // 213
+#define NWE_Q_NO_JOB_RIGHTS 0x89D6 // 214
+#define NWE_PASSWORD_UNENCRYPTED 0x89D6 // 214
+#define NWE_Q_IN_SERVICE 0x89D7 // 215
+#define NWE_PASSWORD_NOT_UNIQUE 0x89D7 // 215
+#define NWE_Q_NOT_ACTIVE 0x89D8 // 216
+#define NWE_PASSWORD_TOO_SHORT 0x89D8 // 216
+#define NWE_Q_STN_NOT_SERVER 0x89D9 // 217
+#define NWE_LOGIN_NO_CONN 0x89D9 // 217
+#define NWE_LOGIN_MAX_EXCEEDED 0x89D9 // 217
+#define NWE_Q_HALTED 0x89DA // 218
+#define NWE_LOGIN_UNAUTHORIZED_TIME 0x89DA // 218
+#define NWE_LOGIN_UNAUTHORIZED_STATION 0x89DB // 219
+#define NWE_Q_MAX_SERVERS 0x89DB // 219
+#define NWE_ACCT_DISABLED 0x89DC // 220
+#define NWE_PASSWORD_INVALID 0x89DE // 222
+#define NWE_PASSWORD_EXPIRED 0x89DF // 223
+#define NWE_LOGIN_NO_CONN_AVAIL 0x89E0 // 224
+#define NWE_E_NO_MORE_USERS 0x89E7 // 231
+#define NWE_BIND_NOT_ITEM_PROP 0x89E8 // 232
+#define NWE_BIND_WRITE_TO_GROUP_PROP 0x89E8 // 232
+#define NWE_BIND_MEMBER_ALREADY_EXISTS 0x89E9 // 233
+#define NWE_BIND_NO_SUCH_MEMBER 0x89EA // 234
+#define NWE_BIND_NOT_GROUP_PROP 0x89EB // 235
+#define NWE_BIND_NO_SUCH_SEGMENT 0x89EC // 236
+#define NWE_BIND_PROP_ALREADY_EXISTS 0x89ED // 237
+#define NWE_BIND_OBJ_ALREADY_EXISTS 0x89EE // 238
+#define NWE_BIND_NAME_INVALID 0x89EF // 239
+#define NWE_BIND_WILDCARD_INVALID 0x89F0 // 240
+#define NWE_BIND_SECURITY_INVALID 0x89F1 // 241
+#define NWE_BIND_OBJ_NO_READ_PRIV 0x89F2 // 242
+#define NWE_BIND_OBJ_NO_RENAME_PRIV 0x89F3 // 243
+#define NWE_BIND_OBJ_NO_DELETE_PRIV 0x89F4 // 244
+#define NWE_BIND_OBJ_NO_CREATE_PRIV 0x89F5 // 245
+#define NWE_BIND_PROP_NO_DELETE_PRIV 0x89F6 // 246
+#define NWE_BIND_PROP_NO_CREATE_PRIV 0x89F7 // 247
+#define NWE_BIND_PROP_NO_WRITE_PRIV 0x89F8 // 248
+#define NWE_BIND_PROP_NO_READ_PRIV 0x89F9 // 249
+#define NWE_NO_FREE_CONN_SLOTS 0x89F9 // 249
+#define NWE_NO_MORE_SERVER_SLOTS 0x89FA // 250
+#define NWE_TEMP_REMAP_ERROR 0x89FA // 250
+#define NWE_PARAMETERS_INVALID 0x89FB // 251
+#define NWE_BIND_NO_SUCH_PROP 0x89FB // 251
+#define NWE_NCP_NOT_SUPPORTED 0x89FB // 251
+#define NWE_INET_PACKET_REQ_CANCELED 0x89FC // 252
+#define NWE_SERVER_UNKNOWN 0x89FC // 252
+#define NWE_MSG_Q_FULL 0x89FC // 252
+#define NWE_BIND_NO_SUCH_OBJ 0x89FC // 252
+#define NWE_LOCK_COLLISION 0x89FD // 253
+#define NWE_CONN_NUM_INVALID 0x89FD // 253
+#define NWE_PACKET_LEN_INVALID 0x89FD // 253
+#define NWE_UNKNOWN_REQ 0x89FD // 253
+#define NWE_BIND_LOCKED 0x89FE // 254
+#define NWE_TRUSTEE_NOT_FOUND 0x89FE // 254
+#define NWE_DIR_LOCKED 0x89FE // 254
+#define NWE_SEM_INVALID_NAME_LEN 0x89FE // 254
+#define NWE_PACKET_NOT_DELIVERABLE 0x89FE // 254
+#define NWE_SOCKET_TABLE_FULL 0x89FE // 254
+#define NWE_SPOOL_DIR_ERROR 0x89FE // 254
+#define NWE_LOGIN_DISABLED_BY_SUPER 0x89FE // 254
+#define NWE_TIMEOUT_FAILURE 0x89FE // 254
+#define NWE_FILE_EXT 0x89FF // 255
+#define NWE_FILE_NAME 0x89FF // 255
+#define NWE_HARD_FAILURE 0x89FF // 255
+#define NWE_FCB_CLOSE 0x89FF // 255
+#define NWE_IO_BOUND 0x89FF // 255
+#define NWE_BAD_SPOOL_PRINTER 0x89FF // 255
+#define NWE_BAD_RECORD_OFFSET 0x89FF // 255
+#define NWE_DRIVE_INVALID_NUM 0x89FF // 255
+#define NWE_SEM_INVALID_INIT_VAL 0x89FF // 255
+#define NWE_SEM_INVALID_HANDLE 0x89FF // 255
+#define NWE_NO_FILES_FOUND_ERROR 0x89FF // 255
+#define NWE_NO_RESPONSE_FROM_SERVER 0x89FF // 255
+#define NWE_NO_OBJ_OR_BAD_PASSWORD 0x89FF // 255
+#define NWE_PATH_NOT_LOCATABLE 0x89FF // 255
+#define NWE_Q_FULL_ERROR 0x89FF // 255
+#define NWE_REQ_NOT_OUTSTANDING 0x89FF // 255
+#define NWE_SOCKET_ALREADY_OPEN 0x89FF // 255
+#define NWE_LOCK_ERROR 0x89FF // 255
+#define NWE_FAILURE 0x89FF // 255 Generic Failure
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwfile.h b/LoginCapture/windows/external/xplatapi/include/nwfile.h
new file mode 100644
index 00000000..c639acf6
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwfile.h
@@ -0,0 +1,659 @@
+/******************************************************************************
+
+ %name: nwfile.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:23 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1997 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWFILE_H )
+#define NWFILE_H
+
+#if ! defined ( NTYPES_H )
+# include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef FILE_LOCKS_ONLY
+
+typedef struct NW_FILE_INFO
+{
+ nstr8 fileName[14];
+ nuint8 fileAttributes;
+ nuint8 extendedFileAttributes;
+ nuint32 fileSize;
+ nuint16 creationDate;
+ nuint16 lastAccessDate;
+ nuint32 lastUpdateDateAndTime;
+ nuint32 fileOwnerID;
+ nuint32 lastArchiveDateAndTime;
+} NW_FILE_INFO;
+
+typedef struct NW_FILE_INFO2
+{
+ nuint8 fileAttributes;
+ nuint8 extendedFileAttributes;
+ nuint32 fileSize;
+ nuint16 creationDate;
+ nuint16 lastAccessDate;
+ nuint32 lastUpdateDateAndTime;
+ nuint32 fileOwnerID;
+ nuint32 lastArchiveDateAndTime;
+ nstr8 fileName[260];
+} NW_FILE_INFO2;
+
+typedef struct NW_FILE_INFO2_EXT
+{
+ nuint8 fileAttributes;
+ nuint8 extendedFileAttributes;
+ nuint32 fileSize;
+ nuint16 creationDate;
+ nuint16 lastAccessDate;
+ nuint32 lastUpdateDateAndTime;
+ nuint32 fileOwnerID;
+ nuint32 lastArchiveDateAndTime;
+ nstr8 fileName[766]; /* 255*3 + 1 */
+} NW_FILE_INFO2_EXT;
+
+typedef struct SEARCH_FILE_INFO
+{
+ nuint16 sequenceNumber;
+ nuint16 reserved;
+ nstr8 fileName[15];
+ nuint8 fileAttributes;
+ nuint8 fileMode;
+ nuint32 fileLength;
+ nuint16 createDate;
+ nuint16 accessDate;
+ nuint16 updateDate;
+ nuint16 updateTime;
+} SEARCH_FILE_INFO;
+
+typedef struct SEARCH_DIR_INFO
+{
+ nuint16 sequenceNumber;
+ nuint16 reserved1;
+ nstr8 directoryName[15];
+ nuint8 directoryAttributes;
+ nuint8 directoryAccessRights;
+ nuint16 createDate;
+ nuint16 createTime;
+ nuint32 owningObjectID;
+ nuint16 reserved2;
+ nuint16 directoryStamp;
+} SEARCH_DIR_INFO;
+
+typedef struct
+{
+ nuint8 taskNumber;
+ nuint8 lockType;
+ nuint8 accessControl;
+ nuint8 lockFlag;
+ nuint8 volNumber;
+ nuint16 dirEntry;
+ nstr8 fileName[14];
+} CONN_OPEN_FILE;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint8 connCount;
+ CONN_OPEN_FILE connInfo[22];
+} CONN_OPEN_FILES;
+
+typedef struct
+{
+ nuint16 taskNumber;
+ nuint8 lockType;
+ nuint8 accessControl;
+ nuint8 lockFlag;
+ nuint8 volNumber;
+ nuint32 parent;
+ nuint32 dirEntry;
+ nuint8 forkCount;
+ nuint8 nameSpace;
+ nuint8 nameLen;
+ nstr8 fileName[255];
+} OPEN_FILE_CONN;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 openCount;
+ nuint8 buffer[512];
+ nuint16 curRecord;
+} OPEN_FILE_CONN_CTRL;
+
+typedef struct
+{
+ nuint16 connNumber;
+ nuint16 taskNumber;
+ nuint8 lockType;
+ nuint8 accessControl;
+ nuint8 lockFlag;
+} CONN_USING_FILE;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 useCount;
+ nuint16 openCount;
+ nuint16 openForReadCount;
+ nuint16 openForWriteCount;
+ nuint16 denyReadCount;
+ nuint16 denyWriteCount;
+ nuint8 locked;
+ nuint8 forkCount;
+ nuint16 connCount;
+ CONN_USING_FILE connInfo[70];
+} CONNS_USING_FILE;
+
+#define SEEK_FROM_BEGINNING 1
+#define SEEK_FROM_CURRENT_OFFSET 2
+#define SEEK_FROM_END 3
+
+/* The following flags are to be used in the createFlag parameter of
+ the NWCreateFile call. */
+
+#define NWCREATE_NEW_FILE 1
+#define NWOVERWRITE_FILE 2
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetCompressedFileSize
+(
+ NWCONN_HANDLE conn,
+ NWFILE_HANDLE fileHandle,
+ nuint32 reqFileSize,
+ pnuint32 resFileSize
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFileServerFileCopy
+(
+ NWFILE_HANDLE srcFileHandle,
+ NWFILE_HANDLE dstFileHandle,
+ nuint32 srcOffset,
+ nuint32 dstOffset,
+ nuint32 bytesToCopy,
+ pnuint32 bytesCopied
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileConnectionID
+(
+ NWFILE_HANDLE fileHandle,
+ NWCONN_HANDLE N_FAR * conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileConnRef
+(
+ NWFILE_HANDLE fileHandle,
+ pnuint32 connRef
+);
+
+N_GLOBAL_LIBRARY( NWCCODE )
+NWFileSearchInitialize
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint8 volNum,
+ pnuint16 dirID,
+ pnuint16 iterhandle,
+ pnuint8 accessRights
+);
+
+#define NWIntFileSearchInitialize(a, b, c, d, e, f, g, h) \
+ NWFileSearchInitialize(a, b, c, d, e, f, g)
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntFileSearchContinue
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint16 dirID,
+ nuint16 searchContext,
+ nuint8 searchAttr,
+ const nstr8 N_FAR * searchPath,
+ pnuint8 retBuf,
+ nuint16 augmentFlag
+);
+
+#define NWScanFileInformation(a, b, c, d, e, f) \
+ NWIntScanFileInformation(a, b, c, d, e, f, 0)
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanFileInformation
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * filePattern,
+ nuint8 searchAttr,
+ pnint16 iterhandle,
+ NW_FILE_INFO N_FAR * info,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetFileInformation
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint8 searchAttrs,
+ NW_FILE_INFO N_FAR * info
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetFileInformation2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint8 searchAttrs,
+ NW_FILE_INFO2 N_FAR * info
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanFileInformation2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * filePattern,
+ nuint8 searchAttrs,
+ pnuint8 iterHandle,
+ NW_FILE_INFO2 N_FAR * info,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntScanFileInformation2Ext
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * filePattern,
+ nuint8 searchAttrs,
+ pnuint8 iterHandle,
+ NW_FILE_INFO2_EXT N_FAR * info,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetFileAttributes
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint8 searchAttrs,
+ nuint8 newAttrs
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetExtendedFileAttributes2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint8 extAttrs
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanConnectionsUsingFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * filePath,
+ pnint16 iterhandle,
+ CONN_USING_FILE N_FAR * fileUse,
+ CONNS_USING_FILE N_FAR * fileUsed
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanOpenFilesByConn2
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ pnint16 iterHandle,
+ OPEN_FILE_CONN_CTRL N_FAR * openCtrl,
+ OPEN_FILE_CONN N_FAR * openFile
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanOpenFilesByConn
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ pnint16 iterHandle,
+ CONN_OPEN_FILE N_FAR * openFile,
+ CONN_OPEN_FILES N_FAR * openFiles
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetExtendedFileAttributes2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 extAttrs
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRenameFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE oldDirHandle,
+ const nstr8 N_FAR * oldFileName,
+ nuint8 searchAttrs,
+ NWDIR_HANDLE newDirHandle,
+ const nstr8 N_FAR * newFileName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIntEraseFiles
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 searchAttrs,
+ nuint16 augmentFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetSparseFileBitMap
+(
+ NWCONN_HANDLE conn,
+ nuint32 fileHandle,
+ nint16 flag,
+ nuint32 offset,
+ pnuint32 blockSize,
+ pnuint8 bitMap
+);
+
+#endif
+
+#define NWLOCKS_INCLUDED
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLogPhysicalRecord
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 recStartOffset,
+ nuint32 recLength,
+ nuint8 lockFlags,
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLockPhysicalRecordSet
+(
+ nuint8 lockFlags,
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleasePhysicalRecordSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearPhysicalRecordSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleasePhysicalRecord
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 recStartOffset,
+ nuint32 recSize
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearPhysicalRecord
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 recStartOffset,
+ nuint32 recSize
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLockFileLockSet
+(
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleaseFileLockSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearFileLockSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearFileLock2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleaseFileLock2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLogFileLock2
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 lockFlags,
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLogLogicalRecord
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * logRecName,
+ nuint8 lockFlags,
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLockLogicalRecordSet
+(
+ nuint8 lockFlags,
+ nuint16 timeOut
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleaseLogicalRecordSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearLogicalRecordSet
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReleaseLogicalRecord
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * logRecName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWClearLogicalRecord
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * logRecName
+);
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseFile
+(
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnstr8 fileName,
+ nuint8 fileAttrs,
+ NWFILE_HANDLE N_FAR * fileHandle,
+ nflag32 createFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnstr8 fileName,
+ nuint16 searchAttr,
+ nuint8 accessRights,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadFile
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 bytesToRead,
+ pnuint32 bytesActuallyRead,
+ pnuint8 data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteFile
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 bytesToWrite,
+ pnuint8 data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCommitFile
+(
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetEOF
+(
+ NWFILE_HANDLE fileHandle,
+ pnuint32 getEOF
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetEOF
+(
+ NWFILE_HANDLE fileHandle,
+ nuint32 setEOF
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFilePos
+(
+ NWFILE_HANDLE fileHandle,
+ pnuint32 filePos
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetFilePos
+(
+ NWFILE_HANDLE fileHandle,
+ nuint mode,
+ nuint32 filePos
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileDirEntryNumber
+(
+ NWFILE_HANDLE fileHandle,
+ pnuint32 volumeNum,
+ pnuint32 directoryEntry,
+ pnuint32 DOSDirectoryEntry,
+ pnuint32 nameSpace,
+ pnuint32 dataStream,
+ pnuint32 parentDirEntry,
+ pnuint32 parentDOSDirEntry
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirectoryEntryNumber
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ pnuint32 volumeNum,
+ pnuint32 directoryEntry,
+ pnuint32 DOSDirectoryEntry,
+ pnuint32 nameSpace,
+ pnuint32 parentDirEntry,
+ pnuint32 parentDOSDirEntry
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSFileDirEntryNumber
+(
+ NWFILE_HANDLE fileHandle,
+ nuint8 nameSpace,
+ pnuint32 volumeNum,
+ pnuint32 directoryEntry,
+ pnuint32 dataStream
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_file.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwfse.h b/LoginCapture/windows/external/xplatapi/include/nwfse.h
new file mode 100644
index 00000000..ff7d8104
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwfse.h
@@ -0,0 +1,1849 @@
+/******************************************************************************
+
+ %name: nwfse.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:26 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWFSE_H )
+#define NWFSE_H
+
+#if ! defined ( NTYPES_H )
+# include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint32 currentServerTime;
+ nuint8 vconsoleVersion;
+ nuint8 vconsoleRevision;
+} SERVER_AND_VCONSOLE_INFO;
+
+/* Get Cache Information */
+
+typedef struct
+{
+ nuint32 readExistingBlockCount;
+ nuint32 readExistingWriteWaitCount;
+ nuint32 readExistingPartialReadCount;
+ nuint32 readExistingReadErrorCount;
+ nuint32 writeBlockCount;
+ nuint32 writeEntireBlockCount;
+ nuint32 getDiskCount;
+ nuint32 getDiskNeedToAllocCount;
+ nuint32 getDiskSomeoneBeatMeCount;
+ nuint32 getDiskPartialReadCount;
+ nuint32 getDiskReadErrorCount;
+ nuint32 getAsyncDiskCount;
+ nuint32 getAsyncDiskNeedToAlloc;
+ nuint32 getAsyncDiskSomeoneBeatMe;
+ nuint32 errorDoingAsyncReadCount;
+ nuint32 getDiskNoReadCount;
+ nuint32 getDiskNoReadAllocCount;
+ nuint32 getDiskNoReadSomeoneBeatMeCount;
+ nuint32 diskWriteCount;
+ nuint32 diskWriteAllocCount;
+ nuint32 diskWriteSomeoneBeatMeCount;
+ nuint32 writeErrorCount;
+ nuint32 waitOnSemaphoreCount;
+ nuint32 allocBlockWaitForSomeoneCount;
+ nuint32 allocBlockCount;
+ nuint32 allocBlockWaitCount;
+} CACHE_COUNTERS;
+
+typedef struct
+{
+ nuint32 originalNumOfCacheBuffers;
+ nuint32 currentNumOfCacheBuffers;
+ nuint32 cacheDirtyBlockThreshold;
+ nuint32 waitNodeCount;
+ nuint32 waitNodeAllocFailureCount;
+ nuint32 moveCacheNodeCount;
+ nuint32 moveCacheNodeFromAvailCount;
+ nuint32 accelerateCacheNodeWriteCount;
+ nuint32 removeCacheNodeCount;
+ nuint32 removeCacheNodeFromAvailCount;
+} CACHE_MEM_COUNTERS;
+
+typedef struct
+{
+ nuint32 numCacheChecks;
+ nuint32 numCacheHits;
+ nuint32 numDirtyCacheChecks;
+ nuint32 numDirtyCacheHits;
+ nuint32 cacheUsedWhileChecking;
+ nuint32 waitForDirtyBlocksDecreaseCount;
+ nuint32 allocBlockFromAvailCount;
+ nuint32 allocBlockFromLRUCount;
+ nuint32 allocBlockAlreadyWaiting;
+ nuint32 LRUSittingTime;
+} CACHE_TREND_COUNTERS;
+
+typedef struct
+{
+ nuint32 maxByteCount;
+ nuint32 minNumOfCacheBuffers;
+ nuint32 minCacheReportThreshold;
+ nuint32 allocWaitingCount;
+ nuint32 numDirtyBlocks;
+ nuint32 cacheDirtyWaitTime;
+ nuint32 cacheMaxConcurrentWrites;
+ nuint32 maxDirtyTime;
+ nuint32 numOfDirCacheBuffers;
+ nuint32 cacheByteToBlockShiftFactor;
+} CACHE_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ CACHE_COUNTERS cacheCounters;
+ CACHE_MEM_COUNTERS cacheMemCounters;
+ CACHE_TREND_COUNTERS cacheTrendCounters;
+ CACHE_INFO cacheInformation;
+} NWFSE_CACHE_INFO;
+
+/* Get File Server Information */
+
+typedef struct
+{
+ nuint32 replyCanceledCount;
+ nuint32 writeHeldOffCount;
+ nuint32 writeHeldOffWithDupRequest;
+ /* writeHeldOffWithDuplicateRequest */
+ nuint32 invalidRequestTypeCount;
+ nuint32 beingAbortedCount;
+ nuint32 alreadyDoingReallocCount;
+ nuint32 deAllocInvalidSlotCount;
+ nuint32 deAllocBeingProcessedCount;
+ nuint32 deAllocForgedPacketCount;
+ nuint32 deAllocStillTransmittingCount;
+ nuint32 startStationErrorCount;
+ nuint32 invalidSlotCount;
+ nuint32 beingProcessedCount;
+ nuint32 forgedPacketCount;
+ nuint32 stillTransmittingCount;
+ nuint32 reExecuteRequestCount;
+ nuint32 invalidSequenceNumCount;
+ nuint32 duplicateIsBeingSentAlreadyCnt;
+ nuint32 sentPositiveAcknowledgeCount;
+ nuint32 sentDuplicateReplyCount;
+ nuint32 noMemForStationCtrlCount;
+ nuint32 noAvailableConnsCount;
+ nuint32 reallocSlotCount;
+ nuint32 reallocSlotCameTooSoonCount;
+} FSE_SERVER_INFO;
+
+typedef struct
+{
+ nuint16 tooManyHops;
+ nuint16 unknownNetwork;
+ nuint16 noSpaceForService;
+ nuint16 noReceiveBuffers;
+ nuint16 notMyNetwork;
+ nuint32 netBIOSProgatedCount;
+ nuint32 totalPacketsServiced;
+ nuint32 totalPacketsRouted;
+} FILE_SERVER_COUNTERS;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 NCPStationsInUseCount;
+ nuint32 NCPPeakStationsInUseCount;
+ nuint32 numOfNCPRequests;
+ nuint32 serverUtilization;
+ FSE_SERVER_INFO ServerInfo;
+ FILE_SERVER_COUNTERS fileServerCounters;
+} NWFSE_FILE_SERVER_INFO;
+
+/* Netware File Systems Information */
+
+typedef struct
+{
+ nuint32 FATMovedCount;
+ nuint32 FATWriteErrorCount;
+ nuint32 someoneElseDidItCount0;
+ nuint32 someoneElseDidItCount1;
+ nuint32 someoneElseDidItCount2;
+ nuint32 iRanOutSomeoneElseDidItCount0;
+ nuint32 iRanOutSomeoneElseDidItCount1;
+ nuint32 iRanOutSomeoneElseDidItCount2;
+ nuint32 turboFATBuildScrewedUpCount;
+ nuint32 extraUseCountNodeCount;
+ nuint32 extraExtraUseCountNodeCount;
+ nuint32 errorReadingLastFATCount;
+ nuint32 someoneElseUsingThisFileCount;
+} FSE_FILE_SYSTEM_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ FSE_FILE_SYSTEM_INFO fileSystemInfo;
+} NWFSE_FILE_SYSTEM_INFO;
+
+/* User Information */
+
+/* status */
+#define FSE_LOGGED_IN 0x00000001
+#define FSE_BEING_ABORTED 0x00000002
+#define FSE_AUDITED 0x00000004
+#define FSE_NEEDS_SECURITY_CHANGE 0x00000008
+#define FSE_MAC_STATION 0x00000010
+#define FSE_AUTHENTICATED_TEMPORARY 0x00000020
+#define FSE_AUDIT_CONNECTION_RECORDED 0x00000040
+#define FSE_DSAUDIT_CONNECTION_RECORDED 0x00000080
+
+/* fileWriteFlags */
+#define FSE_WRITE 1
+#define FSE_WRITE_ABORTED 2
+
+/* fileWriteState */
+#define FSE_NOT_WRITING 0
+#define FSE_WRITE_IN_PROGRESS 1
+#define FSE_WRITE_BEING_STOPPED 2
+
+typedef struct
+{
+ nuint32 connNum;
+ nuint32 useCount;
+ nuint8 connServiceType;
+ nuint8 loginTime[ 7 ];
+ nuint32 status;
+ nuint32 expirationTime;
+ nuint32 objType;
+ nuint8 transactionFlag;
+ nuint8 logicalLockThreshold;
+ nuint8 recordLockThreshold;
+ nuint8 fileWriteFlags; /* Includes active and stop bits */
+ nuint8 fileWriteState;
+ nuint8 filler;
+ nuint16 fileLockCount;
+ nuint16 recordLockCount;
+ nuint8 totalBytesRead[ 6 ];
+ nuint8 totalBytesWritten[ 6 ];
+ nuint32 totalRequests;
+ nuint32 heldRequests;
+ nuint8 heldBytesRead[ 6 ];
+ nuint8 heldBytesWritten[ 6 ];
+} USER_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ USER_INFO userInfo;
+} NWFSE_USER_INFO;
+
+/* Packet Burst Information */
+
+typedef struct
+{
+ nuint32 bigInvalidSlotCount;
+ nuint32 bigForgedPacketCount;
+ nuint32 bigInvalidPacketCount;
+ nuint32 bigStillTransmittingCount;
+ nuint32 stillDoingTheLastRequestCount;
+ nuint32 invalidCtrlRequestCount;
+ nuint32 ctrlInvalidMessageNumCount;
+ nuint32 ctrlBeingTornDownCount;
+ nuint32 bigRepeatTheFileReadCount;
+ nuint32 bigSendExtraCCCount;
+ nuint32 bigReturnAbortMessageCount;
+ nuint32 bigReadInvalidMessageNumCount;
+ nuint32 bigReadDoItOverCount;
+ nuint32 bigReadBeingTornDownCount;
+ nuint32 previousCtrlPacketCount;
+ nuint32 sendHoldOffMessageCount;
+ nuint32 bigReadNoDataAvailableCount;
+ nuint32 bigReadTryingToReadTooMuchCount;
+ nuint32 asyncReadErrorCount;
+ nuint32 bigReadPhysicalReadErrorCount;
+ nuint32 ctrlBadACKFragmentListCount;
+ nuint32 ctrlNoDataReadCount;
+ nuint32 writeDuplicateRequestCount;
+ nuint32 shouldntBeACKingHereCount;
+ nuint32 writeInconsistentPktLengthsCnt;
+ nuint32 firstPacketIsntAWriteCount;
+ nuint32 writeTrashedDuplicateRequestCnt;
+ nuint32 bigWriteInvalidMessageNumCount;
+ nuint32 bigWriteBeingTornDownCount;
+ nuint32 bigWriteBeingAbortedCount;
+ nuint32 zeroACKFragmentCountCount;
+ nuint32 writeCurrentlyTransmittingCount;
+ nuint32 tryingToWriteTooMuchCount;
+ nuint32 writeOutOfMemForCtrlNodesCount;
+ nuint32 writeDidntNeedThisFragmentCount;
+ nuint32 writeTooManyBuffsCheckedOutCnt;
+ /* writeTooManyBuffersCheckedOutCount */
+ nuint32 writeTimeOutCount;
+ nuint32 writeGotAnACKCount;
+ nuint32 writeGotAnACKCount1;
+ nuint32 pollerAbortedTheConnCount;
+ nuint32 maybeHadOutOfOrderWritesCount;
+ nuint32 hadAnOutOfOrderWriteCount;
+ nuint32 movedTheACKBitDownCount;
+ nuint32 bumpedOutOfOrderWriteCount;
+ nuint32 pollerRemovedOldOutOfOrderCount;
+ nuint32 writeDidntNeedButRequestACKCnt;
+ /* writeDidntNeedButRequestedACKCount */
+ nuint32 writeTrashedPacketCount;
+ nuint32 tooManyACKFragmentsCount;
+ nuint32 savedAnOutOfOrderPacketCount;
+ nuint32 connBeingAbortedCount;
+} PACKET_BURST_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ PACKET_BURST_INFO packetBurstInfo;
+} NWFSE_PACKET_BURST_INFO;
+
+/* IPX SPX Information */
+
+typedef struct
+{
+ nuint32 IPXSendPacketCount;
+ nuint16 IPXMalformPacketCount;
+ nuint32 IPXGetECBRequestCount;
+ nuint32 IPXGetECBFailCount;
+ nuint32 IPXAESEventCount;
+ nuint16 IPXPostponedAESCount;
+ nuint16 IPXMaxConfiguredSocketCount;
+ nuint16 IPXMaxOpenSocketCount;
+ nuint16 IPXOpenSocketFailCount;
+ nuint32 IPXListenECBCount;
+ nuint16 IPXECBCancelFailCount;
+ nuint16 IPXGetLocalTargetFailCount;
+} IPX_INFO;
+
+typedef struct
+{
+ nuint16 SPXMaxConnsCount;
+ nuint16 SPXMaxUsedConns;
+ nuint16 SPXEstConnReq;
+ nuint16 SPXEstConnFail;
+ nuint16 SPXListenConnectReq;
+ nuint16 SPXListenConnectFail;
+ nuint32 SPXSendCount;
+ nuint32 SPXWindowChokeCount;
+ nuint16 SPXBadSendCount;
+ nuint16 SPXSendFailCount;
+ nuint16 SPXAbortedConn;
+ nuint32 SPXListenPacketCount;
+ nuint16 SPXBadListenCount;
+ nuint32 SPXIncomingPacketCount;
+ nuint16 SPXBadInPacketCount;
+ nuint16 SPXSuppressedPackCount;
+ nuint16 SPXNoSesListenECBCount;
+ nuint16 SPXWatchDogDestSesCount;
+} SPX_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ IPX_INFO IPXInfo;
+ SPX_INFO SPXInfo;
+} NWFSE_IPXSPX_INFO;
+
+/* Garbage Collection Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 failedAllocRequestCount;
+ nuint32 numOfAllocs;
+ nuint32 noMoreMemAvailableCount;
+ nuint32 numOfGarbageCollections;
+ nuint32 garbageFoundSomeMem;
+ nuint32 garbageNumOfChecks;
+} NWFSE_GARBAGE_COLLECTION_INFO;
+
+/* CPU Information */
+
+#define FSE_CPU_STR_MAX 16
+#define FSE_COPROCESSOR_STR_MAX 48
+#define FSE_BUS_STR_MAX 32
+
+typedef struct
+{
+ nuint32 pageTableOwnerFlag;
+ nuint32 CPUTypeFlag;
+ nuint32 coProcessorFlag;
+ nuint32 busTypeFlag;
+ nuint32 IOEngineFlag;
+ nuint32 FSEngineFlag;
+ nuint32 nonDedicatedFlag;
+} CPU_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numOfCPUs;
+ CPU_INFO CPUInfo;
+} NWFSE_CPU_INFO;
+
+/* Volume Switch Information */
+
+typedef struct
+{
+ nuint32 readFile;
+ nuint32 writeFile;
+ nuint32 deleteFile;
+ nuint32 renMove;
+ nuint32 openFile;
+ nuint32 createFile;
+ nuint32 createAndOpenFile;
+ nuint32 closeFile;
+ nuint32 scanDeleteFile;
+ nuint32 salvageFile;
+ nuint32 purgeFile;
+ nuint32 migrateFile;
+ nuint32 deMigrateFile;
+ nuint32 createDir;
+ nuint32 deleteDir;
+ nuint32 directoryScans;
+ nuint32 mapPathToDirNum;
+ nuint32 modifyDirEntry;
+ nuint32 getAccessRights;
+ nuint32 getAccessRightsFromIDs;
+ nuint32 mapDirNumToPath;
+ nuint32 getEntryFromPathStrBase;
+ nuint32 getOtherNSEntry;
+ nuint32 getExtDirInfo;
+ nuint32 getParentDirNum;
+ nuint32 addTrusteeR;
+ nuint32 scanTrusteeR;
+ nuint32 delTrusteeR;
+ nuint32 purgeTrust;
+ nuint32 findNextTrustRef;
+ nuint32 scanUserRestNodes;
+ nuint32 addUserRest;
+ nuint32 deleteUserRest;
+ nuint32 rtnDirSpaceRest;
+ nuint32 getActualAvailDskSp;
+ nuint32 cntOwnedFilesAndDirs;
+ nuint32 migFileInfo;
+ nuint32 volMigInfo;
+ nuint32 readMigFileData;
+ nuint32 getVolUsageStats;
+ nuint32 getActualVolUsageStats;
+ nuint32 getDirUsageStats;
+ nuint32 NMFileReadsCount;
+ nuint32 NMFileWritesCount;
+ /* nuint32 mapPathToDirectoryNumberOrPhantom; */
+ nuint32 mapPathToDirNumOrPhantom;
+ /* nuint32 stationHasAccessRightsGrantedBelow; */
+ nuint32 stationHasAccessRgtsGntedBelow;
+ /* nuint32 getDataStreamLengthsFromPathStringBase; */
+ nuint32 gtDataStreamLensFromPathStrBase;
+ nuint32 checkAndGetDirectoryEntry;
+ nuint32 getDeletedEntry;
+ nuint32 getOriginalNameSpace;
+ nuint32 getActualFileSize;
+ nuint32 verifyNameSpaceNumber;
+ nuint32 verifyDataStreamNumber;
+ nuint32 checkVolumeNumber;
+ nuint32 commitFile;
+ nuint32 VMGetDirectoryEntry;
+ nuint32 createDMFileEntry;
+ nuint32 renameNameSpaceEntry;
+ nuint32 logFile;
+ nuint32 releaseFile;
+ nuint32 clearFile;
+ nuint32 setVolumeFlag;
+ nuint32 clearVolumeFlag;
+ nuint32 getOriginalInfo;
+ nuint32 createMigratedDir;
+ nuint32 F3OpenCreate;
+ nuint32 F3InitFileSearch;
+ nuint32 F3ContinueFileSearch;
+ nuint32 F3RenameFile;
+ nuint32 F3ScanForTrustees;
+ nuint32 F3ObtainFileInfo;
+ nuint32 F3ModifyInfo;
+ nuint32 F3EraseFile;
+ nuint32 F3SetDirHandle;
+ nuint32 F3AddTrustees;
+ nuint32 F3DeleteTrustees;
+ nuint32 F3AllocDirHandle;
+ nuint32 F3ScanSalvagedFiles;
+ nuint32 F3RecoverSalvagedFiles;
+ nuint32 F3PurgeSalvageableFile;
+ nuint32 F3GetNSSpecificInfo;
+ nuint32 F3ModifyNSSpecificInfo;
+ nuint32 F3SearchSet;
+ nuint32 F3GetDirBase;
+ nuint32 F3QueryNameSpaceInfo;
+ nuint32 F3GetNameSpaceList;
+ nuint32 F3GetHugeInfo;
+ nuint32 F3SetHugeInfo;
+ nuint32 F3GetFullPathString;
+ nuint32 F3GetEffectiveDirectoryRights;
+} VOLUME_SWITCH_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 totalLFSCounters;
+ nuint32 CurrentLFSCounters;
+ nuint32 LFSCounters[ 128 ]; /* 512 / sizeof(nuint32) */
+ /* VOLUME_SWITCH_INFO volumeSwitchInfo; */ /* Cant return all counters */
+} NWFSE_VOLUME_SWITCH_INFO;
+
+/* Get NLM Loaded List */
+
+#define FSE_NLM_NUMS_RETURNED_MAX 128
+#define FSE_NLM_NUMS_MAX 130
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberNLMsLoaded;
+ nuint32 NLMsInList;
+ nuint32 NLMNums[ FSE_NLM_NUMS_RETURNED_MAX ];
+} NWFSE_NLM_LOADED_LIST;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberNLMsLoaded;
+ nuint32 NLMsInList;
+ nuint32 NLMNums[ FSE_NLM_NUMS_MAX ];
+} NWFSE_NLM_LOADED_LIST_LG;
+
+/* NLM Information */
+
+/* 1 is added for the NULL */
+
+#define FSE_NLM_FILENAME_LEN_MAX 37
+#define FSE_NLM_NAMELEN_MAX 129
+#define FSE_NLM_COPYRIGHTLEN_MAX 256
+
+typedef struct
+{
+ nuint32 identificationNum;
+ nuint32 flags;
+ nuint32 type;
+ nuint32 parentID;
+ nuint32 majorVersion;
+ nuint32 minorVersion;
+ nuint32 revision;
+ nuint32 year;
+ nuint32 month;
+ nuint32 day;
+ nuint32 allocAvailableBytes;
+ nuint32 allocFreeCount;
+ nuint32 lastGarbageCollection;
+ nuint32 messageLanguage;
+ nuint32 numOfReferencedPublics;
+} NLM_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ NLM_INFO NLMInfo;
+} NWFSE_NLM_INFO;
+
+/* Get Directory Cache Information */
+
+typedef struct
+{
+ nuint32 minTimeSinceFileDelete;
+ nuint32 absMinTimeSinceFileDelete;
+ nuint32 minNumOfDirCacheBuffers;
+ nuint32 maxNumOfDirCacheBuffers;
+ nuint32 numOfDirCacheBuffers;
+ nuint32 dCMinNonReferencedTime;
+ nuint32 dCWaitTimeBeforeNewBuffer;
+ nuint32 dCMaxConcurrentWrites;
+ nuint32 dCDirtyWaitTime;
+ nuint32 dCDoubleReadFlag;
+ nuint32 mapHashNodeCount;
+ nuint32 spaceRestrictionNodeCount;
+ nuint32 trusteeListNodeCount;
+ nuint32 percentOfVolumeUsedByDirs;
+} DIR_CACHE_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ DIR_CACHE_INFO dirCacheInfo;
+} NWFSE_DIR_CACHE_INFO;
+
+/* Get Operating System Version Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint8 OSMajorVersion;
+ nuint8 OSMinorVersion;
+ nuint8 OSRevisionNum;
+ nuint8 accountingVersion;
+ nuint8 VAPVersion;
+ nuint8 queueingVersion;
+ nuint8 securityRestrictionsLevel;
+ nuint8 bridgingSupport;
+ nuint32 maxNumOfVolumes;
+ nuint32 numOfConnSlots;
+ nuint32 maxLoggedInConns;
+ nuint32 maxNumOfNameSpaces;
+ nuint32 maxNumOfLans;
+ nuint32 maxNumOfMediaTypes;
+ nuint32 maxNumOfProtocols;
+ nuint32 maxMaxSubdirTreeDepth;
+ nuint32 maxNumOfDataStreams;
+ nuint32 maxNumOfSpoolPrinters;
+ nuint32 serialNum;
+ nuint16 applicationNum;
+} NWFSE_OS_VERSION_INFO;
+
+/* Get Active Connection List by Type */
+
+/* Connection service type */
+/* NOTE: type 1 is reserved by CLIB for backward compatability */
+
+#define FSE_NCP_CONNECTION_TYPE 2
+#define FSE_NLM_CONNECTION_TYPE 3
+#define FSE_AFP_CONNECTION_TYPE 4
+#define FSE_FTAM_CONNECTION_TYPE 5
+#define FSE_ANCP_CONNECTION_TYPE 6
+#define FSE_ACP_CONNECTION_TYPE 7
+#define FSE_SMB_CONNECTION_TYPE 8
+#define FSE_WINSOCK_CONNECTION_TYPE 9
+#define FSE_HTTP_CONNECTION_TYPE 10
+#define FSE_UDP_CONNECTION_TYPE 11
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint8 activeConnBitList[ 512 ];
+} NWFSE_ACTIVE_CONN_LIST;
+
+/* Get NLM's Resource Tag List */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 totalNumOfResourceTags;
+ nuint32 packetResourceTags;
+ nuint8 resourceTagBuf[ 512 ];
+ /* This packed structure consisting of:
+ **
+ ** nuint32 number,
+ ** nuint32 signature,
+ ** nuint32 count,
+ ** nuint8 name[] */
+} NWFSE_NLMS_RESOURCE_TAG_LIST;
+
+/* Active LAN Board List --- 20 */
+
+#define FSE_MAX_NUM_OF_LANS 64
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 MaxNumOfLANs;
+ nuint32 LANLoadedCount;
+ nuint32 boardNums[ FSE_MAX_NUM_OF_LANS ];
+} NWFSE_ACTIVE_LAN_BOARD_LIST;
+
+/* LAN Configuration Information */
+
+typedef struct
+{
+ nuint8 DriverCFG_MajorVersion;
+ nuint8 DriverCFG_MinorVersion;
+ nuint8 DriverNodeAddress[ 6 ];
+ nuint16 DriverModeFlags;
+ nuint16 DriverBoardNum;
+ nuint16 DriverBoardInstance;
+ nuint32 DriverMaxSize;
+ nuint32 DriverMaxRecvSize;
+ nuint32 DriverRecvSize;
+ nuint32 Reserved1[3];
+ nuint16 DriverCardID;
+ nuint16 DriverMediaID;
+ nuint16 DriverTransportTime;
+ nuint8 DriverReserved[ 16 ];
+ nuint8 DriverMajorVersion;
+ nuint8 DriverMinorVersion;
+ nuint16 DriverFlags;
+ nuint16 DriverSendRetries;
+ nuint32 DriverLink;
+ nuint16 DriverSharingFlags;
+ nuint16 DriverSlot;
+ nuint16 DriverIOPortsAndLengths[ 4 ];
+ nuint32 DriverMemDecode0;
+ nuint16 DriverLength0;
+ nuint32 DriverMemDecode1;
+ nuint16 DriverLength1;
+ nuint8 DriverInterrupt[ 2 ];
+ nuint8 DriverDMAUsage[ 2 ];
+ nuint32 Reserved2[3];
+ nuint8 DriverLogicalName[ 18 ];
+ nuint32 DriverLinearMem[ 2 ];
+ nuint16 DriverChannelNum;
+ nuint8 DriverIOReserved[ 6 ];
+} LAN_CONFIG_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ LAN_CONFIG_INFO LANConfigInfo;
+} NWFSE_LAN_CONFIG_INFO;
+
+/* LAN Common Counters Information */
+
+typedef struct
+{
+ nuint32 notSupportedMask;
+ nuint32 totalTxPacketCount;
+ nuint32 totalRxPacketCount;
+ nuint32 noECBAvailableCount;
+ nuint32 packetTxTooBigCount;
+ nuint32 packetTxTooSmallCount;
+ nuint32 packetRxOverflowCount;
+ nuint32 packetRxTooBigCount;
+ nuint32 packetRxTooSmallCount;
+ nuint32 packetTxMiscErrorCount;
+ nuint32 packetRxMiscErrorCount;
+ nuint32 retryTxCount;
+ nuint32 checksumErrorCount;
+ nuint32 hardwareRxMismatchCount;
+ nuint32 reserved[50];
+} LAN_COMMON_INFO;
+
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint8 statisticsMajorVersion;
+ nuint8 statisticsMinorVersion;
+ nuint32 numberOfGenericCounters;
+ nuint32 numberOfCounterBlocks;
+ nuint32 customVariableCount;
+ nuint32 NextCounterBlock;
+ LAN_COMMON_INFO LANCommonInfo;
+} NWFSE_LAN_COMMON_COUNTERS_INFO;
+
+/* LAN Custom Counters Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numCustomVar;
+ nuint8 customInfo[ 512 ]; /* (nint32, nuint8[])[] - nuint8[] is a length preceded
+ ** non-null terminated string. */
+} NWFSE_LAN_CUSTOM_INFO;
+
+/* LSL Information */
+
+typedef struct
+{
+ nuint32 rxBufs;
+ nuint32 rxBufs75PerCent;
+ nuint32 rxBufsCheckedOut;
+ nuint32 rxBufMaxSize;
+ nuint32 maxPhysicalSize;
+ nuint32 lastTimeRxBufAllocated;
+ nuint32 maxNumsOfProtocols;
+ nuint32 maxNumsOfMediaTypes;
+ nuint32 totalTXPackets;
+ nuint32 getECBBfrs;
+ nuint32 getECBFails;
+ nuint32 AESEventCounts;
+ nuint32 postponedEvents;
+ nuint32 ECBCxlFails;
+ nuint32 validBfrsReused;
+ nuint32 enqueuedSendCount;
+ nuint32 totalRXPackets;
+ nuint32 unclaimedPackets;
+ nuint8 StatisticsTableMajorVersion;
+ nuint8 StatisticsTableMinorVersion;
+} LSL_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ LSL_INFO LSLInfo;
+} NWFSE_LSL_INFO;
+
+/* LSL Logical Board Statistics */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved0;
+ nuint32 LogTtlTxPackets;
+ nuint32 LogTtlRxPackets;
+ nuint32 LogUnclaimedPackets;
+ nuint32 reserved1;
+} NWFSE_LSL_LOGICAL_BOARD_STATS;
+
+/* objtype */
+
+#define FSE_ADAPTER_OBJECT 0
+#define FSE_CHANGER_OBJECT 1
+#define FSE_DEVICE_OBJECT 2
+#define FSE_MEDIA_OBJECT 4
+#define FSE_PARTITION_OBJECT 5
+#define FSE_SLOT_OBJECT 6
+#define FSE_HOTFIX_OBJECT 7
+#define FSE_MIRROR_OBJECT 8
+#define FSE_PARITY_OBJECT 9
+#define FSE_VOLUME_SEG_OBJECT 10
+#define FSE_VOLUME_OBJECT 11
+#define FSE_CLONE_OBJECT 12
+#define FSE_MAGAZINE_OBJECT 14
+#define FSE_VIRTUAL_DEVICE_OBJECT 15
+#define FSE_MAX_OBJECTS 128
+
+#define FSE_UNKNOWN_OBJECT 0xFFFF
+#define FSE_UNKNOWN_OBJECT_TYPE 0xFFFF
+
+
+/* mediatype */
+
+#define FSE_HARD_DISK 0
+#define FSE_CDROM_DISK 1
+#define FSE_WORM_DISK 2
+#define FSE_TAPE_DEVICE 3
+#define FSE_MAGNETO_OPTICAL 4
+
+/* cartridgetype */
+
+#define FSE_FIXED_MEDIA 0x00000000
+#define FSE_FLOPPY_5_25 0x00000001
+#define FSE_FLOPPY_3_5 0x00000002
+#define FSE_OPTICAL_5_25 0x00000003
+#define FSE_OPTICAL_3_5 0x00000004
+#define FSE_TAPE_0_5 0x00000005
+#define FSE_TAPE_0_25 0x00000006
+#define FSE_TAPE_8_MM 0x00000007
+#define FSE_TAPE_4_MM 0x00000008
+#define FSE_BERNOULLI_DISK 0x00000009
+
+/* type */
+/* same as defined below for object types */
+
+/* status bits */
+
+#define FSE_OBJECT_ACTIVATED 0x00000001
+#define FSE_OBJECT_CREATED 0x00000002
+#define FSE_OBJECT_SCRAMBLED 0x00000004
+#define FSE_OBJECT_RESERVED 0x00000010
+#define FSE_OBJECT_BEING_IDENTIFIED 0x00000020
+#define FSE_OBJECT_MAGAZINE_LOADED 0x00000040
+#define FSE_OBJECT_FAILURE 0x00000080
+#define FSE_OBJECT_REMOVABLE 0x00000100
+#define FSE_OBJECT_READ_ONLY 0x00000200
+#define FSE_OBJECT_IN_DEVICE 0x00010000
+#define FSE_OBJECT_ACCEPTS_MAGAZINES 0x00020000
+#define FSE_OBJECT_IS_IN_A_CHANGER 0x00040000
+#define FSE_OBJECT_LOADABLE 0x00080000
+#define FSE_OBJECT_BEING_LOADED 0x00080000
+#define FSE_OBJECT_DEVICE_LOCK 0x01000000
+#define FSE_OBJECT_CHANGER_LOCK 0x02000000
+#define FSE_OBJECT_REMIRRORING 0x04000000
+#define FSE_OBJECT_SELECTED 0x08000000
+
+/* functionmask */
+
+#define FSE_RANDOM_READ 0x0001
+#define FSE_RANDOM_WRITE 0x0002
+#define FSE_RANDOM_WRITE_ONCE 0x0004
+#define FSE_SEQUENTIAL_READ 0x0008
+#define FSE_SEQUENTIAL_WRITE 0x0010
+#define FSE_RESET_END_OF_TAPE 0x0020
+#define FSE_SINGLE_FILE_MARK 0x0040
+#define FSE_MULTIPLE_FILE_MARK 0x0080
+#define FSE_SINGLE_SET_MARK 0x0100
+#define FSE_MULTIPLE_SET_MARK 0x0200
+#define FSE_SPACE_DATA_BLOCKS 0x0400
+#define FSE_LOCATE_DATA_BLOCKS 0x0800
+#define FSE_POSITION_PARTITION 0x1000
+#define FSE_POSITION_MEDIA 0x2000
+
+/* controlmask */
+
+#define FSE_ACTIVATE_DEACTIVE 0x0001
+#define FSE_MOUNT_DISMOUNT 0x0002
+#define FSE_SELECT_UNSELECT 0x0004
+#define FSE_LOCK_UNLOCK 0x0008
+#define FSE_EJECT 0x0010
+#define FSE_MOVE 0x0020
+
+typedef struct
+{
+ nuint8 label[ 64 ];
+ nuint32 identificationType;
+ nuint32 identificationTimeStamp;
+} MEDIA_INFO_DEF;
+
+typedef struct
+{
+ MEDIA_INFO_DEF MediaInfo;
+ nuint32 mediaType;
+ nuint32 cartridgeType;
+ nuint32 unitSize;
+ nuint32 blockSize;
+ nuint32 capacity;
+ nuint32 preferredUnitSize;
+ nuint8 name[ 64 ];
+ nuint32 type;
+ nuint32 status;
+ nuint32 functionMask;
+ nuint32 controlMask;
+ nuint32 parentCount;
+ nuint32 siblingCount;
+ nuint32 childCount;
+ nuint32 specificInfoSize;
+ nuint32 objectUniqueID;
+ nuint32 mediaSlot;
+} FSE_MM_OBJ_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ FSE_MM_OBJ_INFO fseMMObjInfo;
+} NWFSE_MEDIA_MGR_OBJ_INFO;
+
+/* Get Media Manager Objects List
+ Get Media Manager Object Children's List */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 nextStartObjNum;
+ nuint32 objCount;
+ nuint32 objs[ FSE_MAX_OBJECTS ];
+} NWFSE_MEDIA_MGR_OBJ_LIST;
+
+/* Get Volume Segment List */
+
+#define FSE_MAX_NUM_SEGS_RETURNED 43
+
+typedef struct
+{
+ nuint32 volumeSegmentDeviceNum;
+ nuint32 volumeSegmentOffset;
+ nuint32 volumeSegmentSize;
+} VOLUME_SEGMENT;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numOfVolumeSegments; /* segment info follows */
+ VOLUME_SEGMENT volumeSegment[ 42 ]; /* VOLUME_SEGMENT structures are packed */
+} NWFSE_VOLUME_SEGMENT_LIST;
+
+/* Volume Information by Level */
+
+typedef struct {
+ nuint32 volumeType;
+ nuint32 statusFlagBits;
+ nuint32 sectorSize;
+ nuint32 sectorsPerCluster;
+ nuint32 volumeSizeInClusters;
+ nuint32 freedClusters;
+ nuint32 subAllocFreeableClusters;
+ nuint32 freeableLimboSectors;
+ nuint32 nonFreeableLimboSectors;
+ nuint32 nonFreeableAvailSubAllocSectors;
+ nuint32 notUsableSubAllocSectors;
+ nuint32 subAllocClusters;
+ nuint32 dataStreamsCount;
+ nuint32 limboDataStreamsCount;
+ nuint32 oldestDeletedFileAgeInTicks;
+ nuint32 compressedDataStreamsCount;
+ nuint32 compressedLimboDataStreamsCount;
+ nuint32 unCompressableDataStreamsCount;
+ nuint32 preCompressedSectors;
+ nuint32 compressedSectors;
+ nuint32 migratedFiles;
+ nuint32 migratedSectors;
+ nuint32 clustersUsedByFAT;
+ nuint32 clustersUsedByDirectories;
+ nuint32 clustersUsedByExtendedDirs;
+ nuint32 totalDirectoryEntries;
+ nuint32 unUsedDirectoryEntries;
+ nuint32 totalExtendedDirectoryExtants;
+ nuint32 unUsedExtendedDirectoryExtants;
+ nuint32 extendedAttributesDefined;
+ nuint32 extendedAttributeExtantsUsed;
+ nuint32 directoryServicesObjectID;
+ nuint32 volumeLastModifiedDateAndTime;
+} VOLUME_INFO_BY_LEVEL_DEF;
+
+typedef struct
+{
+ nuint32 volumeActiveCount;
+ nuint32 volumeUseCount;
+ nuint32 mACRootIDs;
+ nuint32 volumeLastModifiedDateAndTime;
+ nuint32 volumeReferenceCount;
+ nuint32 compressionLowerLimit;
+ nuint32 outstandingIOs;
+ nuint32 outstandingCompressionIOs;
+ nuint32 compressionIOsLimit;
+} VOLUME_INFO_BY_LEVEL_DEF2;
+
+typedef union
+{
+ VOLUME_INFO_BY_LEVEL_DEF volInfoDef;
+ VOLUME_INFO_BY_LEVEL_DEF2 volInfoDef2;
+} VOLUME_INFO_BY_LEVEL;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 infoLevel;
+ VOLUME_INFO_BY_LEVEL volumeInfo;
+} NWFSE_VOLUME_INFO_BY_LEVEL;
+
+
+/* Active Protocol Stacks */
+
+#define FSE_MAX_NUM_OF_STACKINFO 25
+
+typedef struct
+{
+ nuint32 StackNum;
+ nuint8 StackShortName[ 16 ];
+} STACK_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 maxNumOfStacks;
+ nuint32 stackCount;
+ nuint32 nextStartNum;
+ STACK_INFO stackInfo[ FSE_MAX_NUM_OF_STACKINFO ];
+} NWFSE_ACTIVE_STACKS;
+
+/* Get Protocol Stack Configuration Information */
+
+#define FSE_STK_FULL_NAME_STR_LEN_MAX 256
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint8 configMajorVersionNum;
+ nuint8 configMinorVersionNum;
+ nuint8 stackMajorVersionNum;
+ nuint8 stackMinorVersionNum;
+ nuint8 stackShortName[ 16 ];
+} NWFSE_PROTOCOL_STK_CONFIG_INFO;
+
+/* Get Protocol Stack Statistics Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint8 statMajorVersionNum;
+ nuint8 statMinorVersionNum;
+ nuint16 commonCounters; /* always set to 3? */
+ nuint32 validCountersMask;
+ nuint32 totalTxPackets;
+ nuint32 totalRxPackets;
+ nuint32 ignoredRxPackets;
+ nuint16 numCustomCounters;
+} NWFSE_PROTOCOL_STK_STATS_INFO;
+
+/* Get Protocol Stack Custom Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved0;
+ nuint32 customCount;
+ nuint8 customStruct[ 512 ]; /* (nint32, nuint8[])[] - nuint8[] is a length preceded
+ ** non-null terminated string. */
+} NWFSE_PROTOCOL_CUSTOM_INFO;
+
+#define FSE_STACK_IDS_MAX 128
+
+#define FSE_NO_FRAME_ID_MAC 0
+#define FSE_APPLE_LOCALTALK 1
+#define FSE_ETHERNETII_DEC 2
+#define FSE_ETHERNET_802_3_USING_802_2 3
+#define FSE_TRING_802_5_USING_802_2 4
+#define FSE_IPX_802_3 5
+#define FSE_TOKEN_PASSING_BUS 6
+#define FSE_IBM_PC_NETWORK_II 7
+#define FSE_GATEWAY_GNET 8
+#define FSE_PROTEON_PRONET 9
+#define FSE_ENET_802_3_USING_802_2_SNAP 10
+#define FSE_TRING_802_5_USE_802_2_SNAP 11
+#define FSE_RACORE_FRAME 12
+#define FSE_ISDN_FRAME 13
+#define FSE_NOVELL_ARCNET 14
+#define FSE_IBM_PCN2_USING_802_2 15
+#define FSE_IBM_PCN2_USING_802_2_SNAP 16
+#define FSE_CORVUS_FRAME 17
+#define FSE_HARRIS_ADACOM_FRAME 18
+#define FSE_IP_TUNNEL_FRAME 19
+#define FSE_FDDI_USING_802_2 20
+#define FSE_COMMTEX_FRAME 21
+#define FSE_DATACO_FRAME 22
+#define FSE_FDDI_USING_802_2_SMAP 23
+#define FSE_SDLC_TUNNEL 24
+#define FSE_PC_OFFICE_FRAME 25
+#define FSE_HYPERCOMMUNICATIONS 26
+#define FSE_NOVELL_FRAME 27
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 stackIDCount;
+ nuint32 stackIDs[ FSE_STACK_IDS_MAX ];
+} NWFSE_PROTOCOL_ID_NUMS;
+
+/* Get Media Name by Media Number */
+
+#define FSE_MEDIA_NAME_LEN_MAX 81
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+} NWFSE_MEDIA_NAME_LIST;
+
+/* Get Loaded Media Number List */
+
+#define FSE_MEDIA_LIST_MAX 32
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 maxMediaTypes;
+ nuint32 mediaListCount;
+ nuint32 mediaList[ FSE_MEDIA_LIST_MAX ];
+} NWFSE_LOADED_MEDIA_NUM_LIST;
+
+/* Get General Router And SAP Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 internalRIPSocket;
+ nuint32 internalRouterDownFlag;
+ nuint32 trackOnFlag;
+ nuint32 externalRouterActiveFlag;
+ nuint32 internalSAPSocketNumber;
+ nuint32 replyToNearestServerFlag;
+} NWFSE_GENERAL_ROUTER_SAP_INFO;
+
+/* Get Network Router Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 NetIDNumber;
+ nuint16 HopsToNet;
+ nuint16 NetStatus;
+ nuint16 TimeToNet;
+} NWFSE_NETWORK_ROUTER_INFO;
+
+/* Get Network Routers Information */
+
+typedef struct
+{
+ nuint8 nodeAddress[ 6 ];
+ nuint32 connectedLAN;
+ nuint16 routeHops;
+ nuint16 routeTime;
+} ROUTERS_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 NumberOfEntries;
+ ROUTERS_INFO routersInfo[ 36 ]; /* 512 / sizeof( ROUTERS_INFO ) */
+} NWFSE_NETWORK_ROUTERS_INFO;
+
+/* Get Known Networks Information */
+
+#define FSE_LOCALBIT 0x01
+#define FSE_NETSTARBIT 0x02
+#define FSE_NETRELIABLEBIT 0x04
+#define FSE_NETWANBIT 0x10
+
+typedef struct
+{
+ nuint32 netIDNumber;
+ nuint16 hopsToNet;
+ nuint16 netStatus;
+ nuint16 timeToNet;
+} KNOWN_NET_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberOfEntries;
+ KNOWN_NET_INFO knownNetInfo[ 51 ]; /* 512 / sizeof( KNOWN_NET_INFO ) */
+} NWFSE_KNOWN_NETWORKS_INFO;
+
+/* Get Server Information */
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint8 serverAddress[ 12 ];
+ nuint16 hopsToServer;
+} NWFSE_SERVER_INFO;
+
+/* Get Server Sources Information */
+
+typedef struct
+{
+ nuint8 serverNode[ 6 ];
+ nuint32 connectedLAN;
+ nuint16 sourceHops;
+} SERVERS_SRC_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberOfEntries;
+ SERVERS_SRC_INFO serversSrcInfo[ 42 ]; /* 512 / sizeof( SERVERS_SRC_INFO ) */
+} NWFSE_SERVER_SRC_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberOfEntries;
+ nuint8 data[ 512 ];
+} NWFSE_KNOWN_SERVER_INFO;
+
+#define FSE_TYPE_NUMBER 0
+#define FSE_TYPE_BOOLEAN 1
+#define FSE_TYPE_TICKS 2
+#define FSE_TYPE_BLOCK_SHIFT 3 /* 512 * number */
+#define FSE_TYPE_TIME_OFFSET 4 /* [+|-]hh:mm:ss converted to seconds */
+#define FSE_TYPE_STRING 5
+#define FSE_TYPE_TRIGGER 6 /* The following show the types of triggers */
+#define FSE_TYPE_TRIGGER_OFF 0x00
+#define FSE_TYPE_TRIGGER_ON 0x01
+#define FSE_TYPE_TRIGGER_PENDING 0x10
+#define FSE_TYPE_TRIGGER_SUCCESS 0x20
+#define FSE_TYPE_TRIGGER_FAILED 0x30
+
+/* setCmdFlags */
+
+#define FSE_STARTUP_ONLY 0x01
+#define FSE_HIDE 0x02
+#define FSE_ADVANCED 0x04
+#define FSE_STARTUP_OR_LATER 0x08
+#define FSE_NOT_SECURED_CONSOLE 0x10 /* Can't be performed on secured console*/
+
+/* setCmdCategory */
+
+#define FSE_COMMUNICATIONS 0
+#define FSE_MEMORY 1
+#define FSE_FILE_CACHE 2
+#define FSE_DIR_CACHE 3
+#define FSE_FILE_SYSTEM 4
+#define FSE_LOCKS 5
+#define FSE_TRANSACTION_TRACKING 6
+#define FSE_DISK 7
+#define FSE_TIME 8
+#define FSE_NCP 9
+#define FSE_MISCELLANEOUS 10
+#define FSE_ERRORS 11
+#define FSE_DIRECTORY_SERVICES 12
+#define FSE_MULTIPROCESSOR 13
+#define FSE_SERVICE_LOCATION_PROTOCOL 14
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberOfSetCommands;
+ nuint32 nextSequenceNumber;
+ nuint32 setCmdType;
+ nuint32 setCmdCategory;
+ nuint32 setCmdFlags;
+ /* The setNameAndValueInfo contains ASCIIZ strings in the following layout:
+ ** nuint8 setCmdName[ ];
+ ** nuint8 setCmdValue[ ]; */
+ nuint8 setNameAndValueInfo[ 500 ];
+} NWFSE_SERVER_SET_CMDS_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint16 reserved;
+ nuint32 numberOfSetCategories;
+ nuint32 nextSequenceNumber;
+ nuint8 categoryName[ 512 ]; /* Len preceded string which is not NULL terminated */
+} NWFSE_SERVER_SET_CATEGORIES;
+
+/* MLID Board Info */
+
+#define FSE_MAX_NUM_BOARD_INFO 18
+
+typedef struct
+{
+ nuint32 protocolBoardNum;
+ nuint16 protocolNumber;
+ nuint8 protocolID[6];
+ nuint8 protocolName[16];
+} MLID_BOARD_INFO;
+
+typedef struct
+{
+ SERVER_AND_VCONSOLE_INFO serverTimeAndVConsoleInfo;
+ nuint8 reserved;
+ nuint8 numberProtocols;
+ MLID_BOARD_INFO MLIDBoardInfo[FSE_MAX_NUM_BOARD_INFO];
+} NWFSE_MLID_BOARD_INFO;
+
+/* Enumerate Network Addresses */
+typedef struct
+{
+ nuint8 GUID[16];
+} NW_GUID;
+
+typedef struct
+{
+ nuint32 addressType;
+ nuint32 addressSize;
+ pnuint8 address;
+} NWFSE_NETWORK_ADDRESS;
+
+/* retInfoMask for NWEnumServerConnInfo */
+#define CONN_INFO_TRANS_MASK 0x00000001
+#define CONN_INFO_LOGIN_TIME_MASK 0x00000002
+#define CONN_INFO_LOGIN_NAME_MASK 0x00000004
+#define CONN_INFO_LOCK_MASK 0x00000008
+#define CONN_INFO_PRINT_MASK 0x00000010
+#define CONN_INFO_STATS_MASK 0x00000020
+#define CONN_INFO_ACCT_MASK 0x00000040
+#define CONN_INFO_AUTH_MASK 0x00000080
+#define CONN_INFO_ALL_MASK 0xffffffff
+
+/* some structs for NWEnumServerConnInfo */
+typedef struct
+{
+ nuint8 loginTime[7];
+ nuint32 loginExpirationTime;
+} NWFSE_LOGIN_TIME;
+
+typedef struct
+{
+ nuint32 loginObjectType;
+ nuint8 loginNameLen;
+ pnuint8 loginName;
+} NWFSE_LOGIN_NAME;
+
+typedef struct
+{
+ nuint8 logicalLockThreshold;
+ nuint8 recordLockThreshold;
+ nuint16 fileLockCount;
+ nuint16 recordLockCount;
+} NWFSE_LOCK_INFO;
+
+typedef struct
+{
+ nuint8 printFlags;
+ nuint8 tabSize;
+ nuint8 numberCopies;
+ nuint8 printToFileFlag;
+ nuint8 bannerFileName[14];
+ nuint8 targetServerID;
+ nuint8 formType;
+} NWFSE_PRINT_INFO;
+
+typedef struct
+{
+ nuint8 totalBytesRead[6];
+ nuint8 totalBytesWritten[6];
+ nuint32 totalRequests;
+} NWFSE_STATS_INFO;
+
+typedef struct
+{
+ nuint32 holdTime;
+ nuint32 holdAmt;
+ nuint32 chargeAmt;
+ nuint32 heldConnectTimeInMinutes;
+ nuint32 heldRequests;
+ nuint8 heldBytesRead[6];
+ nuint8 heldBytesWritten[6];
+} NWFSE_ACCT_INFO;
+
+typedef struct
+{
+ nuint32 loginStatus;
+ nuint32 loginPrivileges;
+} NWFSE_AUTH_INFO;
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetCacheInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_CACHE_INFO N_FAR * fseCacheInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_FILE_SERVER_INFO N_FAR * fseFileServerInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNetWareFileSystemsInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_FILE_SYSTEM_INFO N_FAR * fseFileSystemInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetUserInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 connNum,
+ pnstr8 userName,
+ NWFSE_USER_INFO N_FAR * fseUserInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPacketBurstInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_PACKET_BURST_INFO N_FAR * fsePacketBurstInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetIPXSPXInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_IPXSPX_INFO N_FAR * fseIPXSPXInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetGarbageCollectionInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_GARBAGE_COLLECTION_INFO N_FAR * fseGarbageCollectionInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetCPUInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 CPUNum,
+ pnstr8 CPUName,
+ pnstr8 numCoprocessor,
+ pnstr8 bus,
+ NWFSE_CPU_INFO N_FAR * fseCPUInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeSwitchInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_VOLUME_SWITCH_INFO N_FAR * fseVolumeSwitchInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNLMLoadedList
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_NLM_LOADED_LIST N_FAR * fseNLMLoadedList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNLMInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 NLMNum,
+ pnstr8 fileName,
+ pnstr8 NLMname,
+ pnstr8 copyright,
+ NWFSE_NLM_INFO N_FAR * fseNLMInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirCacheInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_DIR_CACHE_INFO N_FAR * fseDirCacheInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetOSVersionInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_OS_VERSION_INFO N_FAR * fseOSVersionInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetActiveConnListByType
+(
+ NWCONN_HANDLE conn,
+ nuint32 startConnNum,
+ nuint32 connType,
+ NWFSE_ACTIVE_CONN_LIST N_FAR * fseActiveConnListByType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNLMsResourceTagList
+(
+ NWCONN_HANDLE conn,
+ nuint32 NLMNum,
+ nuint32 startNum,
+ NWFSE_NLMS_RESOURCE_TAG_LIST N_FAR * fseNLMsResourceTagList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetActiveLANBoardList
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_ACTIVE_LAN_BOARD_LIST N_FAR * fseActiveLANBoardList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLANConfigInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 boardNum,
+ NWFSE_LAN_CONFIG_INFO N_FAR * fseLANConfigInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLANCommonCountersInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 boardNum,
+ nuint32 blockNum,
+ NWFSE_LAN_COMMON_COUNTERS_INFO N_FAR * fseLANCommonCountersInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLANCustomCountersInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 boardNum,
+ nuint32 startingNum,
+ NWFSE_LAN_CUSTOM_INFO N_FAR * fseLANCustomInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLSLInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_LSL_INFO N_FAR * fseLSLInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLSLLogicalBoardStats
+(
+ NWCONN_HANDLE conn,
+ nuint32 LANBoardNum,
+ NWFSE_LSL_LOGICAL_BOARD_STATS N_FAR * fseLSLLogicalBoardStats
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMediaMgrObjInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 objNum,
+ NWFSE_MEDIA_MGR_OBJ_INFO N_FAR * fseMediaMgrObjInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMediaMgrObjList
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ nuint32 objType,
+ NWFSE_MEDIA_MGR_OBJ_LIST N_FAR * fseMediaMgrObjList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMediaMgrObjChildrenList
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ nuint32 objType,
+ nuint32 parentObjNum,
+ NWFSE_MEDIA_MGR_OBJ_LIST N_FAR * fseMediaMgrObjList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeSegmentList
+(
+ NWCONN_HANDLE conn,
+ nuint32 volNum,
+ NWFSE_VOLUME_SEGMENT_LIST N_FAR * fseVolumeSegmentList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeInfoByLevel
+(
+ NWCONN_HANDLE conn,
+ nuint32 volNum,
+ nuint32 infoLevel,
+ NWFSE_VOLUME_INFO_BY_LEVEL N_FAR * fseVolumeInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetActiveProtocolStacks
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_ACTIVE_STACKS N_FAR * fseActiveStacks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetProtocolStackConfigInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 stackNum,
+ pnstr8 stackFullName,
+ NWFSE_PROTOCOL_STK_CONFIG_INFO N_FAR * fseProtocolStkConfigInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetProtocolStackStatsInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 stackNum,
+ NWFSE_PROTOCOL_STK_STATS_INFO N_FAR * fseProtocolStkStatsInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetProtocolStackCustomInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 stackNum,
+ nuint32 customStartNum,
+ NWFSE_PROTOCOL_CUSTOM_INFO N_FAR * fseProtocolStackCustomInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetProtocolStkNumsByMediaNum
+(
+ NWCONN_HANDLE conn,
+ nuint32 mediaNum,
+ NWFSE_PROTOCOL_ID_NUMS N_FAR * fseProtocolStkIDNums
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetProtocolStkNumsByLANBrdNum
+(
+ NWCONN_HANDLE conn,
+ nuint32 LANBoardNum,
+ NWFSE_PROTOCOL_ID_NUMS N_FAR * fseProtocolStkIDNums
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMediaNameByMediaNum
+(
+ NWCONN_HANDLE conn,
+ nuint32 mediaNum,
+ pnstr8 mediaName,
+ NWFSE_MEDIA_NAME_LIST N_FAR * fseMediaNameList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLoadedMediaNumList
+(
+ NWCONN_HANDLE conn,
+ NWFSE_LOADED_MEDIA_NUM_LIST N_FAR * fseLoadedMediaNumList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetGeneralRouterAndSAPInfo
+(
+ NWCONN_HANDLE conn,
+ NWFSE_GENERAL_ROUTER_SAP_INFO N_FAR * fseGeneralRouterSAPInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNetworkRouterInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 networkNum,
+ NWFSE_NETWORK_ROUTER_INFO N_FAR * fseNetworkRouterInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNetworkRoutersInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 networkNum,
+ nuint32 startNum,
+ NWFSE_NETWORK_ROUTERS_INFO N_FAR * fseNetworkRoutersInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetKnownNetworksInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_KNOWN_NETWORKS_INFO N_FAR * fseKnownNetworksInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetServerInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 serverType,
+ const nstr8 N_FAR * serverName,
+ NWFSE_SERVER_INFO N_FAR * fseServerInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetServerSourcesInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ nuint32 serverType,
+ const nstr8 N_FAR * serverName,
+ NWFSE_SERVER_SRC_INFO N_FAR * fseServerSrcInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetKnownServersInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ nuint32 serverType,
+ NWFSE_KNOWN_SERVER_INFO N_FAR * fseKnownServerInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetServerSetCommandsInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_SERVER_SET_CMDS_INFO N_FAR * fseServerSetCmdsInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetServerSetCategories
+(
+ NWCONN_HANDLE conn,
+ nuint32 startNum,
+ NWFSE_SERVER_SET_CATEGORIES N_FAR * fseServerSetCategories
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMLIDBoardInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 MLIDBoardNum,
+ NWFSE_MLID_BOARD_INFO N_FAR * fseMLIDBoardInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEnumNetAddresses
+(
+ NWCONN_HANDLE conn,
+ pnuint32 searchNumber,
+ SERVER_AND_VCONSOLE_INFO N_FAR * serverTimeAndVConsoleInfo,
+ pnuint16 reserved,
+ NW_GUID N_FAR * fseServerGUID,
+ nuint32 itemsInArray,
+ pnuint32 itemsReturned,
+ NWFSE_NETWORK_ADDRESS N_FAR * fseNetworkAddresses
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGenerateGUIDs
+(
+ NWCONN_HANDLE connHandle,
+ nuint32 GUIDSize,
+ NW_GUID N_FAR * GUIDList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetServerConnInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 retInfoMask,
+ nuint32 connectionNumber,
+ SERVER_AND_VCONSOLE_INFO N_FAR * serverTimeAndVConsoleInfo,
+ pnuint16 reserved,
+ NWFSE_NETWORK_ADDRESS N_FAR * networkAddress,
+ NWFSE_LOGIN_TIME N_FAR * loginTime,
+ NWFSE_LOGIN_NAME N_FAR * loginName,
+ NWFSE_LOCK_INFO N_FAR * lockInfo,
+ NWFSE_PRINT_INFO N_FAR * printInfo,
+ NWFSE_STATS_INFO N_FAR * statsInfo,
+ NWFSE_ACCT_INFO N_FAR * acctInfo,
+ NWFSE_AUTH_INFO N_FAR * authInfo
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwitr.h b/LoginCapture/windows/external/xplatapi/include/nwitr.h
new file mode 100644
index 00000000..e5b6ed05
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwitr.h
@@ -0,0 +1,119 @@
+/******************************************************************************
+
+ %name: nwitr.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:28 2005 %
+ $Copyright:
+
+ Copyright (c) 1998 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+/* Public include file for Large Virtual List Iterator */
+
+#if !defined( NWITR_H )
+#define NWITR_H
+
+#include "ntypes.h"
+#include "nwdsbuft.h"
+
+#define DS_ITR_FIRST 0 /* First entry position in list */
+#define DS_ITR_LAST 1000 /* Last entry position in list */
+#define DS_ITR_EOF 1001 /* End-of-file position. */
+
+#define DS_ITR_UNICODE_STRING 0 /* Indicates a unicode string */
+#define DS_ITR_BYTE_STRING 2 /* Indicates a byte string */
+
+#define DS_ITR_PREFER_SCALABLE 0 /* If can't get scalable, emulate [not supported in FCS] */
+#define DS_ITR_REQUIRE_SCALABLE 1 /* If can't get scalable, return error */
+#define DS_ITR_FORCE_EMULATION 2 /* Always force emulation mode */
+#define DS_ITR_ANY_SERVER 3 /* Get any server */
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrCreateList
+(
+ NWDSContextHandle context,
+ pnstr8 baseObjectName, /* Starting object to search */
+ pnstr8 className, /* Class name if List operation */
+ pnstr8 subordinateName, /* RDN if List operation */
+ nuint32 scalability, /* Require or prefer SKADS server */
+ nuint32 timeout, /* Timeout in milliseconds */
+ pnuint32 pIterator /* Returned Iterator Ptr */
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrCreateSearch
+(
+ NWDSContextHandle context,
+ pnstr8 baseObjectName, /* Starting object to search */
+ nint scope, /* Object, immed subord or subtree */
+ nbool8 searchAliases, /* True to follow aliases */
+ pBuf_T filter, /* Search filter */
+ pTimeStamp_T pTimeFilter, /* Filter on modification time */
+ nuint32 infoType, /* Names only, or names and attrib */
+ nbool8 allAttrs, /* True = return all attributes */
+ pBuf_T attrNames, /* List of attributes to return */
+ pnstr8 indexSelect, /* Index selection string */
+ pnstr8 sortKey, /* Attributes to sort on */
+ nuint32 scalability, /* Require or prefer SKADS server */
+ nuint32 timeout, /* Timeout in milliseconds */
+ pnuint32 pIterator /* Returned Iterator Ptr */
+);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrDestroy(nuint32 Iterator);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrClone(nuint32 Iterator, pnuint32 pNewIterator);
+
+N_EXTERN_LIBRARY (nbool8)
+NWDSItrAtFirst(nuint32 Iterator);
+
+N_EXTERN_LIBRARY (nbool8)
+NWDSItrAtEOF(nuint32 Iterator);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrGetInfo(nuint32 Iterator, pnbool8 pIsScalable, pnbool8 pIisPositionable);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrGetPosition(nuint32 Iterator, pnuint32 pPosition, nuint32 timeout);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrSetPosition(nuint32 Iterator, nuint32 position, nuint32 timeout);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrSetPositionFromIterator(nuint32 Iterator, nuint32 srcIterator,
+ nuint32 timeout);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrTypeDown(nuint32 Iterator, pnstr8 attrString, pnstr8 value,
+ nuint32 byteUniFlag, nuint32 timeout);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrSkip(nuint32 Iterator, nint32 numToSkip, nuint32 timeout,
+ pnint32 pNumSkipped);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrGetNext(nuint32 Iterator, nuint32 numEntries, nuint32 timeout,
+ pnint32 pIterationHandle, pBuf_T pData);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrGetPrev(nuint32 Iterator, nuint32 numEntries, nuint32 timeout,
+ pnint32 pIterationHandle, pBuf_T pData);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrGetCurrent(nuint32 Iterator, pnint32 pIterationHandle, pBuf_T pData);
+
+N_EXTERN_LIBRARY (NWDSCCODE)
+NWDSItrCount(nuint32 Iterator, nuint32 timeout, nuint32 maxCount,
+ nbool8 updatePosition, pnuint32 pCount);
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwlocale.h b/LoginCapture/windows/external/xplatapi/include/nwlocale.h
new file mode 100644
index 00000000..11fbc45a
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwlocale.h
@@ -0,0 +1,473 @@
+
+/*--------------------------------------------------------------------------
+
+ %name: nwlocale.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:30 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+--------------------------------------------------------------------------*/
+
+
+#if !defined( NWLOCALE_H )
+#define NWLOCALE_H
+
+
+/* make sure size_t is defined */
+#include
+
+/* make sure va_list is defined */
+#include
+
+#ifndef NTYPES_H
+# include "ntypes.h"
+#endif
+
+#include "npackon.h"
+
+
+#if defined N_PLAT_DOS
+# define NWLCODE nuint
+#endif
+
+#define NUMBER_TYPE nint32
+
+/* (in imitation of stdlib.h) */
+
+#define L_MB_LEN_MAX 2 /* (in imitation of limits.h) */
+#define MERIDLEN 5
+#define NWSINGLE_BYTE 1
+#define NWDOUBLE_BYTE 2
+
+#ifndef NLC_ALL
+# define NLC_ALL 0
+#endif
+#ifndef LC_ALL
+# define LC_ALL NLC_ALL
+#endif
+
+#ifndef NLC_COLLATE
+# define NLC_COLLATE 1
+#endif
+#ifndef LC_COLLATE
+# define LC_COLLATE NLC_COLLATE
+#endif
+
+#ifndef NLC_CTYPE
+# define NLC_CTYPE 2
+#endif
+#ifndef LC_CTYPE
+# define LC_CTYPE NLC_CTYPE
+#endif
+
+#ifndef NLC_MONETARY
+# define NLC_MONETARY 3
+#endif
+#ifndef LC_MONETARY
+# define LC_MONETARY NLC_MONETARY
+#endif
+
+#ifndef NLC_NUMERIC
+# define NLC_NUMERIC 4
+#endif
+#ifndef LC_NUMERIC
+# define LC_NUMERIC NLC_NUMERIC
+#endif
+
+#ifndef NLC_TIME
+# define NLC_TIME 5
+#endif
+#ifndef LC_TIME
+# define LC_TIME NLC_TIME
+#endif
+
+#ifndef NLC_TOTAL
+# define NLC_TOTAL 6
+#endif
+#ifndef LC_TOTAL
+# define LC_TOTAL NLC_TOTAL
+#endif
+
+
+/* -------------------------------------------------------------------------
+ * country definitions
+ * -------------------------------------------------------------------------
+ */
+
+#define ARABIC 785
+#define WBAHRAIN 973
+#define WCYPRUS 357 /* ??? */
+#define WEGYPT 20
+#define WETHIOPIA 251
+#define WIRAN 98
+#define WIRAQ 964
+#define WJORDAN 962
+#define WKUWAIT 965
+#define WLIBYA 218
+#define WMALTA 356 /* ??? */
+#define WMOROCCO 212 /* SHOULD THIS BE FRENCH?? */
+#define WPAKISTAN 92
+#define WQATAR 974 /* ??? */
+#define WSAUDI 966
+#define WTANZANIA 255 /* ??? */
+#define WTUNISIA 216 /* ??? */
+#define WTURKEY 90 /* ??? */
+#define WUAE 971
+#define WYEMEN 967 /* ??? */
+#define AUSTRALIA 61
+#define BELGIUM 32
+#define CANADA_FR 2
+#define CANADA 2
+#define DENMARK 45
+#define FINLAND 358
+#define FRANCE 33
+#define GERMANY 49
+#define GERMANYE 37
+#define HEBREW 972
+#define IRELAND 353
+#define ITALY 39
+#define LATIN_AMERICA 3
+#define WARGENTINA 54
+#define WBOLIVIA 591
+#define WCHILE 56
+#define WCOLOMBIA 57
+#define WCOSTARICA 506
+#define WECUADOR 593
+#define WELSALVADOR 503
+#define WGUATEMALA 502
+#define WHONDURAS 504
+#define WMEXICO 52
+#define WNICARAGUA 505
+#define WPANAMA 507
+#define WPARAGUAY 595
+#define WPERU 51
+#define WURUGUAY 598
+#define WVENEZUELA 58
+#define NETHERLANDS 31
+#define NORWAY 47
+#define PORTUGAL 351
+#define SPAIN 34
+#define SWEDEN 46
+#define SWITZERLAND 41
+#define UK 44
+#define USA 1
+#define JAPAN 81
+#define KOREA 82
+#define PRC 86
+#define TAIWAN 886
+#define TAIWAN2 88
+#define WTAIWAN 886
+#define ASIAN_ENGLISH 99
+#define NEWZEALAND 64
+
+
+/* -------------------------------------------------------------------------
+ * typedef Llconv
+ * -------------------------------------------------------------------------
+ */
+
+typedef struct Llconv
+ {
+ char decimal_point[4]; /* non-monetary decimal point */
+ char thousands_sep[4]; /* non-monetary separator for digits
+ left of the decimal-point */
+ char grouping[4]; /* String indicating size of groups
+ of digits*/
+ /*
+ The international currency symbol applicable to
+ the current locale. The first three characters
+ contain the alphabetic international currency
+ symbol in accordance with those specified in ISO
+ 4217 "codes for the representation of currency
+ and funds." The fourth character is the character
+ used to separate the international currency
+ symbol from the monetary quantity.
+ */
+ char int_curr_symbol[8];
+ char currency_symbol[4]; /* Currency symbol for current locale */
+ char mon_decimal_point[4]; /* monetary decimal point */
+ char mon_thousands_sep[4]; /* monetary separator for digits left
+ of the decimal-point */
+ char mon_grouping[8]; /* String indicating size of
+ groups of digits */
+ char positive_sign[4]; /* String indicating positive
+ monetary value */
+ char negative_sign[4]; /* String indicating negative
+ monetary value */
+ char int_frac_digits; /* Num of fractional digits in
+ monetary display */
+ char frac_digits; /* Num of fractional digits in
+ non-monetary display*/
+ char p_cs_precedes; /* 1=precede or 0=succeeds
+ (pos currency symbol)*/
+ char p_sep_by_space; /* 1=space separator or
+ 0=no space separator
+ (currency symbol) */
+ char n_cs_precedes; /* location of currency_symbol
+ for neg monetary quantity */
+ char n_sep_by_space; /* separation of currency symbol
+ in neg monetary quantity */
+ char p_sign_posn; /* value indicating position of
+ positive_sign for positive
+ monetary quantity */
+ char n_sign_posn; /* value indicating position of
+ negative_sign for negative
+ monetary quantity.*/
+
+ /* Novell Additions to the ANSI definition:*/
+ nint code_page;
+ nint country_id;
+ char data_list_separator[2];
+ char date_separator[2];
+ char time_separator[2];
+ char time_format;
+ nint date_format;
+ char am[MERIDLEN];
+ char pm[MERIDLEN];
+ char reserved[40];
+} LCONV;
+
+
+/* -------------------------------------------------------------------------
+ * function prototypes
+ * -------------------------------------------------------------------------
+ */
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY(LCONV N_FAR *) NWLlocaleconv(LCONV N_FAR *lconvPtr);
+
+N_EXTERN_LIBRARY(nint) NWLmblen(const nstr N_FAR * string, size_t maxBytes);
+
+N_EXTERN_LIBRARY(pnstr) NWLsetlocale(nint category, const nstr N_FAR *locale);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrchr(const nstr N_FAR * string, nint find);
+
+N_EXTERN_LIBRARY(nint) NWLstricmp
+(
+ const nstr N_FAR *str1,
+ const nstr N_FAR *str2
+);
+
+/* NWLstrcoll (see below) */
+
+N_EXTERN_LIBRARY(size_t) NWLstrcspn
+(
+ const nstr N_FAR *string1,
+ const nstr N_FAR *string2
+);
+
+#if !defined NWL_EXCLUDE_TIME
+N_EXTERN_LIBRARY(size_t) NWLstrftime
+(
+ pnstr dst,
+ size_t max,
+ const nstr N_FAR *fmt,
+ const struct tm N_FAR *ptm
+);
+#endif
+
+N_EXTERN_LIBRARY(pnstr) NWLstrpbrk(pnstr string1, const nstr N_FAR *string2);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrrchr(const nstr N_FAR * string, nint find);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrrev(pnstr string1, pnstr string2);
+
+N_EXTERN_LIBRARY(size_t) NWLstrspn
+(
+ const nstr N_FAR *string1,
+ const nstr N_FAR *string2
+);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrstr(const nstr N_FAR * string,
+ const nstr N_FAR * searchString);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrtok(pnstr parse, const nstr N_FAR * delim);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrtok_r(pnstr parse,
+ const nstr N_FAR * delim,
+ ppnstr last);
+
+/* NWLstrupr ( see below )*/
+
+N_EXTERN_LIBRARY(pnstr) NWIncrement(const nstr N_FAR * string,
+ size_t numChars);
+
+N_EXTERN_LIBRARY(pnstr) NWstrImoney(pnstr buffer, NUMBER_TYPE Value);
+
+N_EXTERN_LIBRARY(pnstr) NWstrmoney(pnstr buffer, NUMBER_TYPE Value);
+
+N_EXTERN_LIBRARY(nint) NWstrncoll(const nstr N_FAR * string1,
+ const nstr N_FAR * string2,
+ size_t maxChars);
+
+N_EXTERN_LIBRARY(pnstr) NWstrncpy(pnstr target_string,
+ const nstr N_FAR * source_string,
+ nint numChars);
+
+N_EXTERN_LIBRARY(pnstr) NWLstrbcpy
+(
+ pnstr dest,
+ const nstr N_FAR *src,
+ size_t maxlen
+);
+
+N_EXTERN_LIBRARY(pnstr) NWstrnum(pnstr buffer, NUMBER_TYPE Value);
+
+N_EXTERN_LIBRARY(nint) NWstrlen
+(
+ const nstr N_FAR *string
+);
+
+N_EXTERN_LIBRARY(size_t) NWLmbslen
+(
+ const nuint8 N_FAR *string
+);
+
+N_EXTERN_LIBRARY(nint) NWLTruncateString(pnchar8 pStr, nint iMaxLen);
+
+N_EXTERN_LIBRARY(nint) NWLInsertChar(pnstr src,
+ const nstr N_FAR * insertableChar);
+
+N_EXTERN_LIBRARY_C(nint)
+NWprintf(const nstr N_FAR *format, ...);
+
+#ifndef NWL_EXCLUDE_FILE
+# ifdef N_PLAT_DOS
+N_EXTERN_LIBRARY_C(nint) NWfprintf
+(
+ FILE N_FAR *stream,
+ const nstr N_FAR *format,
+ ...
+);
+# endif
+#endif
+
+#if defined N_PLAT_MSW && defined N_ARCH_32
+# if !defined(__BORLANDC__)
+# define NWsprintf _NWsprintf
+# endif
+#elif defined N_PLAT_MSW && defined N_ARCH_16
+# define NWsprintf NWSPRINTF
+#endif
+N_EXTERN_LIBRARY_C(nint) NWsprintf
+(
+ pnstr buffer,
+ const nstr N_FAR *format,
+ ...
+);
+
+/*
+ * NWwsprintf has been set as obsolete. These prototypes and macros are
+ * scheduled for removal by September 1999.
+ */
+#if defined N_PLAT_MSW && defined N_ARCH_32
+# if !defined(__BORLANDC__)
+# define NWwsprintf _NWwsprintf
+# endif
+#elif defined N_PLAT_MSW && defined N_ARCH_16
+# define NWwsprintf NWWSPRINTF
+#endif
+
+N_EXTERN_LIBRARY_C(nint) NWwsprintf(pnstr buffer, pnstr format, ...);
+
+
+/* Functions using variable parameter lists have the pointer to the */
+/* variable list declared as void instead of va_list to enable the user to */
+/* compile without including stdarg.h in every module. */
+
+N_EXTERN_LIBRARY(nint)
+NWvprintf(const nstr N_FAR *format, va_list arglist);
+
+#ifndef NWL_EXCLUDE_FILE
+# ifdef N_PLAT_DOS
+N_EXTERN_LIBRARY(nint) NWvfprintf
+(
+ FILE N_FAR *stream,
+ const nstr N_FAR *format,
+ va_list arglist
+);
+# endif
+#endif
+
+N_EXTERN_LIBRARY(nint)
+NWvsprintf(pnstr buffer, const nstr N_FAR *format, va_list arglist);
+
+N_EXTERN_LIBRARY(nint) NWatoi(const nstr N_FAR * string);
+
+N_EXTERN_LIBRARY(pnstr) NWitoa(nint value, pnstr string, nuint radix);
+N_EXTERN_LIBRARY(pnstr) NWutoa(nuint value, pnstr string, nuint radix);
+N_EXTERN_LIBRARY(pnstr) NWltoa(nint32 value, pnstr buf, nuint radix);
+N_EXTERN_LIBRARY(pnstr) NWultoa(nuint32 value, pnstr buf, nuint radix);
+
+N_EXTERN_LIBRARY(nint) NWisalpha(nuint ch);
+N_EXTERN_LIBRARY(nint) NWisalnum(nuint ch);
+N_EXTERN_LIBRARY(nint) NWisdigit(nuint ch);
+N_EXTERN_LIBRARY(nint) NWisxdigit(nuint ch);
+
+N_EXTERN_LIBRARY(void) NWGetNWLOCALEVersion(pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revisionLevel,
+ pnuint8 betaReleaseLevel);
+
+#if defined N_PLAT_DOS && !defined N_LOC_NO_OLD_FUNCS
+N_EXTERN_LIBRARY(NWLCODE) NWGetShortMachineName(pnstr shortMachineName);
+#endif
+
+/* This call is not needed for Windows */
+N_EXTERN_LIBRARY(nint) NWGetCollateTable(pnstr retCollateTable, size_t maxLen);
+
+#if (defined N_PLAT_MSW && defined N_ARCH_16) && !defined N_LOC_NO_OLD_MACROS
+# define NWNextChar(s) AnsiNext(s)
+# define NWPrevChar(t, s) AnsiPrev(t, s)
+# define NWLstrupr(s) AnsiUpper(s)
+# define NWLstrcoll(s1, s2) lstrcmp(s1, s2)
+# define NWLstrxfrm(s1, s2, t) strxfrm(s1, s2, t)
+# define NWCharUpr(c) (nint)(LOWORD((DWORD)AnsiUpper((LPSTR)(DWORD)c)))
+#else
+N_EXTERN_LIBRARY(pnstr) NWNextChar(const nstr N_FAR *string);
+N_EXTERN_LIBRARY(pnstr) NWPrevChar(const nstr N_FAR *string, pnstr position);
+N_EXTERN_LIBRARY(pnstr) NWLstrupr(pnstr string);
+N_EXTERN_LIBRARY(nint) NWLstrcoll(const nstr N_FAR * string1,
+ const nstr N_FAR * string2);
+N_EXTERN_LIBRARY(size_t) NWLstrxfrm(pnstr string1,
+ const nstr N_FAR * string2,
+ size_t numBytes);
+N_EXTERN_LIBRARY(nint) NWCharUpr(nint chr);
+#endif /* (N_PLAT_MSW && N_ARCH_16) && !N_LOC_NO_OLD_MACROS */
+
+N_EXTERN_LIBRARY(pnstr) NWLstrlwr(pnstr string);
+N_EXTERN_LIBRARY(nint) NWCharLwr(nint chr);
+
+N_EXTERN_LIBRARY(nint) NWCharType(nint ch);
+N_EXTERN_LIBRARY(nint) NWCharVal(const nstr N_FAR *string);
+
+N_EXTERN_LIBRARY(nint) NWLIsAnsi();
+N_EXTERN_LIBRARY(void) NWLOemToAnsi(const nstr8 N_FAR * oemStr, pnstr8 ansiStr);
+N_EXTERN_LIBRARY(void) NWLAnsiToOem(const nstr8 N_FAR * ansiStr, pnstr8 oemStr);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#ifdef INCLUDE_OBSOLETE
+# include "obsolete/o_locale.h"
+#endif
+
+#include "npackoff.h"
+
+#endif /* NWLOCALE_H */
+
+
diff --git a/LoginCapture/windows/external/xplatapi/include/nwmigrat.h b/LoginCapture/windows/external/xplatapi/include/nwmigrat.h
new file mode 100644
index 00000000..3667f5b1
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwmigrat.h
@@ -0,0 +1,176 @@
+/******************************************************************************
+
+ %name: nwmigrat.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:32 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWMIGRAT_H )
+#define NWMIGRAT_H
+
+#if ! defined ( NTYPES_H )
+# include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_NUM_OF_DATA_STREAMS 3
+#define MAX_SIZE_OF_SM_STRING 128
+#define MAX_SIZE_OF_SM_INFO 128
+#define MAX_NUM_OF_SM 32
+
+#define ERR_INVALID_SM_ID 240
+#define ERR_SM_ALREADY_REGISTERED 241
+#define ERR_SM_CREATE_FAILED 242
+#define ERR_SM_CLOSE_FAILED 243
+#define ERR_SM_WRITE_NO_SPACE 244
+#define ERR_SM_WRITE_IO_ERROR 245
+#define ERR_SM_READ_IO_ERROR 246
+#define ERR_SM_OPEN_FAILED 247
+#define ERR_SM_DELETE_FAILED 248
+
+typedef struct
+{
+ nuint32 IOStatus;
+ nuint32 InfoBlockSize;
+ nuint32 AvailSpace;
+ nuint32 UsedSpace;
+ /* A length preceded string is followed by SMInfo data */
+ nuint8 SMInfo[MAX_SIZE_OF_SM_STRING + MAX_SIZE_OF_SM_INFO];
+} SUPPORT_MODULE_INFO;
+
+typedef struct
+{
+ nuint32 numberOfSMs;
+ nuint32 SMIDs[MAX_NUM_OF_SM];
+} SUPPORT_MODULE_IDS;
+
+#if defined( N_PLAT_NLM )
+ #define NWMoveFileToDM NWMoveFileToDM2
+ #define NWMoveFileFromDM NWMoveFileFromDM2
+ #define NWGetDMFileInfo NWGetDMFileInfo2
+ #define NWGetDMVolumeInfo NWGetDMVolumeInfo2
+ #define NWGetDefaultSupportModule NWGetDefaultSupportModule2
+ #define NWSetDefaultSupportModule NWSetDefaultSupportModule2
+ #define NWGetDataMigratorInfo NWGetDataMigratorInfo2
+ #define NWGetSupportModuleInfo NWGetSupportModuleInfo2
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWMoveFileToDM
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 nameSpace,
+ nuint32 supportModuleID,
+ nuint32 saveKeyFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWMoveFileFromDM
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 nameSpace
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDMFileInfo
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 nameSpace,
+ pnuint32 supportModuleID,
+ pnuint32 restoreTime,
+ pnuint32 dataStreams
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDMVolumeInfo
+(
+ NWCONN_HANDLE conn,
+ nuint16 volume,
+ nuint32 supportModuleID,
+ pnuint32 numberOfFilesMigrated,
+ pnuint32 totalMigratedSize,
+ pnuint32 spaceUsedOnDM,
+ pnuint32 limboSpaceUsedOnDM,
+ pnuint32 spaceMigrated,
+ pnuint32 filesInLimbo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetSupportModuleInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 infomationLevel,
+ nuint32 supportModuleID,
+ pnuint8 returnInfo,
+ pnuint32 returnInfoLen
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDataMigratorInfo
+(
+ NWCONN_HANDLE conn,
+ pnuint32 DMPresentFlag,
+ pnuint32 majorVersion,
+ pnuint32 minorVersion,
+ pnuint32 DMSMRegistered
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDefaultSupportModule
+(
+ NWCONN_HANDLE conn,
+ pnuint32 supportModuleID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetDefaultSupportModule
+(
+ NWCONN_HANDLE conn,
+ pnuint32 supportModuleID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetSupportModuleCapacity
+(
+ NWCONN_HANDLE conn,
+ nuint32 luSupportModuleID,
+ nuint32 luVolume,
+ nuint32 luDirectoryBase,
+ pnuint32 pluSMBlockSizeInSectors,
+ pnuint32 pluSMTotalBlocks,
+ pnuint32 pluSMUsedBlocks
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwmisc.h b/LoginCapture/windows/external/xplatapi/include/nwmisc.h
new file mode 100644
index 00000000..d7d9db2d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwmisc.h
@@ -0,0 +1,461 @@
+/******************************************************************************
+
+ %name: nwmisc.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:35 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWMISC_H )
+#define NWMISC_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef NW_SHORT_NAME_SERVER
+# define NW_SHORT_NAME_SERVER 0
+#endif
+
+#ifndef NW_LONG_NAME_SERVER
+# define NW_LONG_NAME_SERVER 1
+#endif
+
+#ifndef NW_ENCP_SERVER
+#define NW_ENCP_SERVER 1
+#endif
+
+#ifndef NW_EXTENDED_NCP_SERVER
+#define NW_EXTENDED_NCP_SERVER 1
+#endif
+
+#ifndef _NETX_COM
+#define _NETX_COM 0x0001
+#define _NETX_VLM 0x0002
+#define _REDIR_LOADED 0x4000
+#define _VLM_LOADED 0x8000
+#endif
+
+#ifdef N_PLAT_UNIX
+#define NWWordSwap(x) ((nuint16) ( \
+ (((nuint16)((x) & 0x00FF)) << 8) | \
+ (((nuint16)((x) & 0xFF00)) >> 8) ))
+#define NWLongSwap(x) ((nuint32) ( \
+ (((nuint32)((x) & 0x000000FFL)) << 24) | \
+ (((nuint32)((x) & 0x0000FF00L)) << 8) | \
+ (((nuint32)((x) & 0x00FF0000L)) >> 8) | \
+ (((nuint32)((x) & 0xFF000000L)) >> 24) ))
+#endif
+
+typedef struct
+{
+ nuint8 day;
+ nuint8 month;
+ nuint16 year;
+} NW_DATE;
+
+/* hours is a nuint16 so that this structure will be the same length as a dword */
+typedef struct
+{
+ nuint8 seconds;
+ nuint8 minutes;
+ nuint16 hours;
+} NW_TIME;
+
+typedef enum
+{
+ NW_LONG_NAME_REQUESTER,
+ NW_SHORT_NAME_REQUESTER,
+ NW_ERROR_ON_REQUESTER_TYPE
+} NW_REQUESTER_TYPE;
+
+#ifndef NW_FRAGMENT_DEFINED
+#define NW_FRAGMENT_DEFINED
+typedef struct
+{
+ nptr fragAddress;
+#if defined(N_PLAT_NLM) || defined(WIN32)
+ nuint32 fragSize;
+#else
+ nuint16 fragSize;
+#endif
+} NW_FRAGMENT;
+#endif
+
+typedef struct
+{
+ nuint16 taskNumber;
+ nuint8 taskState;
+} CONN_TASK;
+
+typedef struct
+{
+ nuint16 serverVersion; /* use NW_ constants from nwserver.h */
+ nuint8 lockState;
+ nuint16 waitingTaskNumber;
+ nuint32 recordStart;
+ nuint32 recordEnd;
+ nuint8 volNumber;
+ nuint32 dirEntry; /* this field is only valid in 3.11 */
+ nuint8 nameSpace; /* this field is only valid in 3.11 */
+ nuint16 dirID; /* this field is only valid in 2.x */
+ nstr8 lockedName[256];
+ nuint8 taskCount;
+ CONN_TASK tasks[256];
+} CONN_TASK_INFO;
+
+typedef struct
+{
+ nuint8 volNumber;
+ nuint32 dirEntry;
+} DIR_ENTRY;
+
+N_EXTERN_LIBRARY( void )
+NWUnpackDateTime
+(
+ nuint32 dateTime,
+ NW_DATE N_FAR * sDate,
+ NW_TIME N_FAR * sTime
+);
+
+N_EXTERN_LIBRARY( void )
+NWUnpackDate
+(
+ nuint16 date,
+ NW_DATE N_FAR * sDate
+);
+
+N_EXTERN_LIBRARY( void )
+NWUnpackTime
+(
+ nuint16 time,
+ NW_TIME N_FAR * sTime
+);
+
+N_EXTERN_LIBRARY( nuint32 )
+NWPackDateTime
+(
+ const NW_DATE N_FAR * sDate,
+ const NW_TIME N_FAR * sTime
+);
+
+N_EXTERN_LIBRARY( nuint16 )
+NWPackDate
+(
+ const NW_DATE N_FAR * sDate
+);
+
+N_EXTERN_LIBRARY( nuint16 )
+NWPackTime
+(
+ const NW_TIME N_FAR * sTime
+);
+
+/* Avoid using the following three NWConvert{Date/Time} functions,
+ they just call the NWUnpack{Date/Time} functions. They are here for
+ compatibility reasons only. */
+N_EXTERN_LIBRARY( void )
+NWConvertDateTime
+(
+ nuint32 dateTime,
+ NW_DATE N_FAR * sDate,
+ NW_TIME N_FAR * sTime
+);
+
+N_EXTERN_LIBRARY( void )
+NWConvertDate
+(
+ nuint16 date,
+ NW_DATE N_FAR * sDate
+);
+
+N_EXTERN_LIBRARY( void )
+NWConvertTime
+(
+ nuint16 time,
+ NW_TIME N_FAR * sTime
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRequest
+(
+ NWCONN_HANDLE conn,
+ nuint16 function,
+ nuint16 numReqFrags,
+ const NW_FRAGMENT N_FAR * reqFrags,
+ nuint16 numReplyFrags,
+ NW_FRAGMENT N_FAR * replyFrags
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+_NWGetRequesterType
+(
+ NW_REQUESTER_TYPE N_FAR * type
+);
+
+#ifndef N_PLAT_UNIX
+
+N_EXTERN_LIBRARY( nuint16 )
+NWWordSwap
+(
+ nuint16 swapWord
+);
+
+N_EXTERN_LIBRARY( nuint32 )
+NWLongSwap
+(
+ nuint32 swapLong
+);
+
+#endif
+
+N_EXTERN_LIBRARY( nint16 )
+NWInitDBCS
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWConvertPathToDirEntry
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ DIR_ENTRY N_FAR * dirEntry
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetTaskInformationByConn
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ CONN_TASK_INFO N_FAR * taskInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetRequesterVersion
+(
+ pnuint8 majorVer,
+ pnuint8 minorVer,
+ pnuint8 revision
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIsLNSSupportedOnVolume
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWConvertFileHandle
+(
+ NWFILE_HANDLE fileHandle,
+ nuint16 handleType,
+ pnuint8 NWHandle,
+ NWCONN_HANDLE N_FAR * conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWConvertFileHandleConnRef
+(
+ NWFILE_HANDLE fileHandle,
+ nuint16 handleType,
+ pnuint8 NWHandle,
+ pnuint32 connRef
+);
+
+N_EXTERN_LIBRARY( void )
+_NWConvert4ByteTo6ByteHandle
+(
+ pnuint8 NW4ByteHandle,
+ pnuint8 NW6ByteHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEndOfJob
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCallsInit
+(
+ nptr reserved1,
+ nptr reserved2
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCallsTerm
+(
+ nptr reserved
+);
+
+N_EXTERN_LIBRARY( nuint16 )
+NWGetClientType
+(
+ void
+);
+
+#ifndef WIN32
+N_EXTERN_LIBRARY( nuint16 )
+__NWGetNWCallsState
+(
+ void
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetNetWareErrorMode
+(
+ nuint8 errorMode,
+ pnuint8 prevMode
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetEndOfJobStatus
+(
+ nuint8 endOfJobStatus,
+ pnuint8 prevStatus
+);
+#else
+N_EXTERN_LIBRARY( NWCCODE )
+NWFSRequest
+(
+ nuint32 request,
+ nptr inBuf,
+ nuint16 inLen,
+ nptr outBuf,
+ nuint16 outLen
+);
+#endif
+
+N_EXTERN_LIBRARY( void )
+NWGetNWCallsVersion
+(
+ pnuint8 majorVer,
+ pnuint8 minorVer,
+ pnuint8 revLevel,
+ pnuint8 betaLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWConvertHandle
+(
+ NWCONN_HANDLE conn,
+ nuint8 accessMode,
+ const void N_FAR * NWHandle,
+ nuint16 handleSize,
+ nuint32 fileSize,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+/* The stuff below this line may NOT be documented. Use with care. */
+#if !defined(NWOS2) && !defined(WIN32)
+#ifndef _REGISTERS_DEF
+#define _REGISTERS_DEF
+
+typedef struct
+{
+ nuint16 si;
+ nuint16 ds;
+ nuint16 di;
+ nuint16 es;
+ nuint8 al, ah;
+ nuint8 bl, bh;
+ nuint8 cl, ch;
+ nuint8 dl, dh;
+} BYTE_REGISTERS;
+
+typedef struct
+{
+ nuint16 si;
+ nuint16 ds;
+ nuint16 di;
+ nuint16 es;
+ nuint16 ax;
+ nuint16 bx;
+ nuint16 cx;
+ nuint16 dx;
+ nuint16 bp;
+ nuint16 flags;
+} WORD_REGISTERS;
+
+typedef struct
+{
+ nptr requestBuffer;
+ nptr replyBuffer;
+} PTR_REGISTERS;
+
+typedef struct
+{
+ nptr ds_si;
+ nptr es_di;
+} SEG_OFF_REGISTERS;
+
+typedef union
+{
+ WORD_REGISTERS w;
+ BYTE_REGISTERS b;
+ PTR_REGISTERS p;
+ SEG_OFF_REGISTERS s;
+} REGISTERS;
+#endif
+
+#ifndef USE_DS
+#define USE_DS 1
+#define USE_ES 2
+#define USE_DOS 0x80
+#endif
+
+N_EXTERN_LIBRARY( nint )
+NWShellRequest
+(
+ REGISTERS N_FAR * ,
+ nuint16
+);
+
+
+N_EXTERN_LIBRARY( nuint16 )
+NWVLMRequest
+(
+ nuint16 callerID,
+ nuint16 destID,
+ nuint16 destFunc,
+ REGISTERS N_FAR * regs,
+ nuint16 mask
+);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_misc.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwmsg.h b/LoginCapture/windows/external/xplatapi/include/nwmsg.h
new file mode 100644
index 00000000..9ec69d62
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwmsg.h
@@ -0,0 +1,97 @@
+/******************************************************************************
+
+ %name: nwmsg.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:37 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWMSG_H )
+#define NWMSG_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDisableBroadcasts
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEnableBroadcasts
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSendBroadcastMessage
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * message,
+ nuint16 connCount,
+ const nuint16 N_FAR * connList,
+ pnuint8 resultList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetBroadcastMessage
+(
+ NWCONN_HANDLE conn,
+ pnstr8 message
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetBroadcastMode
+(
+ NWCONN_HANDLE conn,
+ nuint16 mode
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWBroadcastToConsole
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * message
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSendConsoleBroadcast
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * message,
+ nuint16 connCount,
+ pnuint16 connList
+);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_msg.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwnamspc.h b/LoginCapture/windows/external/xplatapi/include/nwnamspc.h
new file mode 100644
index 00000000..76de14c0
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwnamspc.h
@@ -0,0 +1,865 @@
+/******************************************************************************
+
+ %name: nwnamspc.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:40 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWNAMSPC_H )
+#define NWNAMSPC_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWDIRECT_H )
+#include "nwdirect.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SUCCESSFUL
+#define SUCCESSFUL 0
+#endif
+
+#define MORE_NS_TO_READ 0
+#define NO_EXTENDED_NS_INFO 9
+#define NS_EOF 0x8910
+
+#define NW_NS_DOS 0
+#define NW_NS_MAC 1
+#define NW_NS_NFS 2
+#define NW_NS_FTAM 3
+#define NW_NS_OS2 4
+#define NW_NS_LONG 4
+
+#define NW_DS_DOS 0
+#define NW_DS_MAC 1
+#define NW_DS_FTAM 2
+
+typedef struct
+{
+ nuint8 volNumber;
+ nuint8 srcNameSpace;
+ nuint32 srcDirBase;
+ nuint8 dstNameSpace;
+ nuint32 dstDirBase;
+} NW_IDX;
+
+typedef struct NWNSINFO
+{
+ nuint32 NSInfoBitMask;
+ nuint32 fixedBitMask;
+ nuint32 reservedBitMask;
+ nuint32 extendedBitMask;
+ nuint16 fixedBitsDefined;
+ nuint16 reservedBitsDefined;
+ nuint16 extendedBitsDefined;
+ nuint32 fieldsLenTable[32];
+ nuint8 hugeStateInfo[16];
+ nuint32 hugeDataLength;
+} NW_NS_INFO;
+
+typedef struct
+{
+ nuint32 spaceAlloc;
+ nuint32 attributes;
+ nuint16 flags;
+ nuint32 dataStreamSize;
+ nuint32 totalStreamSize;
+ nuint16 numberOfStreams;
+ nuint16 creationTime;
+ nuint16 creationDate;
+ nuint32 creatorID;
+ nuint16 modifyTime;
+ nuint16 modifyDate;
+ nuint32 modifierID;
+ nuint16 lastAccessDate;
+ nuint16 archiveTime;
+ nuint16 archiveDate;
+ nuint32 archiverID;
+ nuint16 inheritedRightsMask;
+ nuint32 dirEntNum;
+ nuint32 DosDirNum;
+ nuint32 volNumber;
+ nuint32 EADataSize;
+ nuint32 EAKeyCount;
+ nuint32 EAKeySize;
+ nuint32 NSCreator;
+ nuint8 nameLength;
+ nstr8 entryName[256];
+} NW_ENTRY_INFO;
+
+typedef struct
+{
+ nuint32 spaceAlloc;
+ nuint32 attributes;
+ nuint16 flags;
+ nuint32 dataStreamSize;
+ nuint32 totalStreamSize;
+ nuint16 numberOfStreams;
+ nuint16 creationTime;
+ nuint16 creationDate;
+ nuint32 creatorID;
+ nuint16 modifyTime;
+ nuint16 modifyDate;
+ nuint32 modifierID;
+ nuint16 lastAccessDate;
+ nuint16 archiveTime;
+ nuint16 archiveDate;
+ nuint32 archiverID;
+ nuint16 inheritedRightsMask;
+ nuint32 dirEntNum;
+ nuint32 DosDirNum;
+ nuint32 volNumber;
+ nuint32 EADataSize;
+ nuint32 EAKeyCount;
+ nuint32 EAKeySize;
+ nuint32 NSCreator;
+ nuint16 nameLength;
+ nstr8 entryName[766]; /* 255*3 + 1 */
+} NW_ENTRY_INFO_EXT;
+
+typedef struct
+{
+ nuint32 dataStreamNumber;
+ nuint32 dataStreamFATBlocksSize;
+} NW_DATA_STREAM_FAT_INFO;
+
+typedef struct
+{
+ nuint32 dataStreamNumber;
+ nuint32 dataStreamSize;
+} NW_DATA_STREAM_SIZE_INFO;
+
+typedef struct
+{
+ nuint32 MACCreateTime;
+ nuint32 MACBackupTime;
+} NW_MAC_TIME;
+
+typedef struct
+{
+ nuint32 spaceAlloc;
+ nuint32 attributes;
+ nuint16 flags;
+ nuint32 dataStreamSize;
+ nuint32 totalStreamSize;
+ nuint16 numberOfStreams;
+ nuint32 EADataSize;
+ nuint32 EAKeyCount;
+ nuint32 EAKeySize;
+ nuint16 archiveTime;
+ nuint16 archiveDate;
+ nuint32 archiverID;
+ nuint16 modifyTime;
+ nuint16 modifyDate;
+ nuint32 modifierID;
+ nuint16 lastAccessDate;
+ nuint16 creationTime;
+ nuint16 creationDate;
+ nuint32 creatorID;
+ nuint32 NSCreator;
+ nuint32 dirEntNum;
+ nuint32 DosDirNum;
+ nuint32 volNumber;
+ nuint16 inheritedRightsMask;
+ nuint16 currentReferenceID;
+ nuint32 NSFileAttributes;
+ nuint32 numberOfDataStreamFATInfo;
+ NW_DATA_STREAM_FAT_INFO dataStreamFATInfo[3];
+ nuint32 numberOfDataStreamSizeInfo;
+ NW_DATA_STREAM_SIZE_INFO dataStreamSizeInfo[3];
+ nint32 secondsRelativeToTheYear2000;
+ nuint8 DOSNameLen;
+ nstr8 DOSName[13];
+ nuint32 flushTime;
+ nuint32 parentBaseID;
+ nuint8 MacFinderInfo[32];
+ nuint32 siblingCount;
+ nuint32 effectiveRights;
+ NW_MAC_TIME MacTime;
+ nuint16 lastAccessedTime;
+ nuint8 nameLength;
+ nstr8 entryName[256];
+} NW_ENTRY_INFO2;
+
+
+typedef struct _MODIFY_DOS_INFO
+{
+ nuint32 attributes;
+ nuint16 createDate;
+ nuint16 createTime;
+ nuint32 creatorID;
+ nuint16 modifyDate;
+ nuint16 modifyTime;
+ nuint32 modifierID;
+ nuint16 archiveDate;
+ nuint16 archiveTime;
+ nuint32 archiverID;
+ nuint16 lastAccessDate;
+ nuint16 inheritanceGrantMask;
+ nuint16 inheritanceRevokeMask;
+ nuint32 maximumSpace;
+} MODIFY_DOS_INFO;
+
+typedef struct
+{
+ nuint8 volNumber;
+ nuint32 dirNumber;
+ nuint32 searchDirNumber;
+} SEARCH_SEQUENCE;
+
+typedef struct
+{
+ pnstr8 srcPath;
+ pnstr8 dstPath;
+ nuint16 dstPathSize;
+} NW_NS_PATH;
+
+typedef struct
+{
+ nuint8 openCreateMode;
+ nuint16 searchAttributes;
+ nuint32 reserved;
+ nuint32 createAttributes;
+ nuint16 accessRights;
+ nuint32 NetWareHandle;
+ nuint8 openCreateAction;
+} NW_NS_OPENCREATE, NW_NS_OPEN;
+
+
+/* open/create modes */
+#define OC_MODE_OPEN 0x01
+#define OC_MODE_TRUNCATE 0x02
+#define OC_MODE_REPLACE 0x02
+#define OC_MODE_CREATE 0x08
+
+/* open/create results */
+#define OC_ACTION_NONE 0x00
+#define OC_ACTION_OPEN 0x01
+#define OC_ACTION_CREATE 0x02
+#define OC_ACTION_TRUNCATE 0x04
+#define OC_ACTION_REPLACE 0x04
+
+/* return info mask */
+#define IM_NAME 0x0001L
+#define IM_ENTRY_NAME 0x0001L
+#define IM_SPACE_ALLOCATED 0x0002L
+#define IM_ATTRIBUTES 0x0004L
+#define IM_SIZE 0x0008L
+#define IM_TOTAL_SIZE 0x0010L
+#define IM_EA 0x0020L
+#define IM_ARCHIVE 0x0040L
+#define IM_MODIFY 0x0080L
+#define IM_CREATION 0x0100L
+#define IM_OWNING_NAMESPACE 0x0200L
+#define IM_DIRECTORY 0x0400L
+#define IM_RIGHTS 0x0800L
+#define IM_ALMOST_ALL 0x0FEDL
+#define IM_ALL 0x0FFFL
+#define IM_REFERENCE_ID 0x1000L
+#define IM_NS_ATTRIBUTES 0x2000L
+#define IM_DATASTREAM_SIZES 0x4000L
+#define IM_DATASTREAM_ACTUAL 0x4000L
+#define IM_DATASTREAM_LOGICAL 0x8000L
+#define IM_LASTUPDATEDINSECONDS 0x00010000L
+#define IM_DOSNAME 0x00020000L
+#define IM_FLUSHTIME 0x00040000L
+#define IM_PARENTBASEID 0x00080000L
+#define IM_MACFINDER 0x00100000L
+#define IM_SIBLINGCOUNT 0x00200000L
+#define IM_EFECTIVERIGHTS 0x00400000L
+#define IM_MACTIME 0x00800000L
+#define IM_LASTACCESSEDTIME 0x01000000L
+#define IM_EXTENDED_ALL 0x01FFF000L
+#define IM_NSS_LARGE_SIZES 0x40000000L
+#define IM_COMPRESSED_INFO 0x80000000L
+#define IM_NS_SPECIFIC_INFO 0x80000000L
+
+/* access rights attributes */
+#ifndef AR_READ_ONLY
+#define AR_READ 0x0001
+#define AR_WRITE 0x0002
+#define AR_READ_ONLY 0x0001
+#define AR_WRITE_ONLY 0x0002
+#define AR_DENY_READ 0x0004
+#define AR_DENY_WRITE 0x0008
+#define AR_COMPATIBILITY 0x0010
+#define AR_WRITE_THROUGH 0x0040
+#define AR_OPEN_COMPRESSED 0x0100
+#endif
+
+/* Trustee Access Rights in a network directory */
+/* NOTE: TA_OPEN is obsolete in 3.x */
+#ifndef TA_NONE
+#define TA_NONE 0x00
+#define TA_READ 0x01
+#define TA_WRITE 0x02
+#define TA_CREATE 0x08
+#define TA_DELETE 0x10
+#define TA_ACCESSCONTROL 0x20
+#define TA_SEEFILES 0x40
+#define TA_MODIFY 0x80
+#define TA_ALL 0xFB
+/* Old names for rights */
+#define TA_OPEN 0x04
+#define TA_OWNERSHIP 0x20
+#define TA_SEARCH 0x40
+/* Misc defines */
+#define TA_SUPERVISOR 0x0100
+#define TA_ALL_16 0x01FB
+#endif
+
+/* search attributes */
+#ifndef SA_HIDDEN
+#define SA_NORMAL 0x0000
+#define SA_HIDDEN 0x0002
+#define SA_SYSTEM 0x0004
+#define SA_SUBDIR_ONLY 0x0010
+#define SA_SUBDIR_FILES 0x8000
+#define SA_ALL 0x8006
+#endif
+
+#define NW_TYPE_FILE 0x8000
+#define NW_TYPE_SUBDIR 0x0010
+
+#define NW_NAME_CONVERT 0x03
+#define NW_NO_NAME_CONVERT 0x04
+
+/* modify mask - use with MODIFY_DOS_INFO structure */
+#define DM_FILENAME 0x0001L
+#define DM_ATTRIBUTES 0x0002L
+#define DM_CREATE_DATE 0x0004L
+#define DM_CREATE_TIME 0x0008L
+#define DM_CREATOR_ID 0x0010L
+#define DM_ARCHIVE_DATE 0x0020L
+#define DM_ARCHIVE_TIME 0x0040L
+#define DM_ARCHIVER_ID 0x0080L
+#define DM_MODIFY_DATE 0x0100L
+#define DM_MODIFY_TIME 0x0200L
+#define DM_MODIFIER_ID 0x0400L
+#define DM_LAST_ACCESS_DATE 0x0800L
+#define DM_INHERITED_RIGHTS_MASK 0x1000L
+#define DM_MAXIMUM_SPACE 0x2000L
+
+#if defined( N_PLAT_NLM )
+ #define NWGetNSLoadedList NWGetNSLoadedList2
+ #define NWGetNSInfo NWGetNSInfo2
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirectoryBase
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 dstNamSpc,
+ NW_IDX N_FAR * idxStruct
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDirectoryBaseExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 dstNamSpc,
+ NW_IDX N_FAR * idxStruct
+);
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNSEntryInfo
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ nuint16 attrs,
+ SEARCH_SEQUENCE N_FAR * sequence,
+ const nstr8 N_FAR * searchPattern,
+ nuint32 retInfoMask,
+ NW_ENTRY_INFO N_FAR * entryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNSEntryInfoExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ nuint16 attrs,
+ SEARCH_SEQUENCE N_FAR * sequence,
+ const nstr8 N_FAR * searchPattern,
+ nuint32 retInfoMask,
+ NW_ENTRY_INFO_EXT N_FAR * entryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNSEntryInfo2
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ nuint16 attrs,
+ SEARCH_SEQUENCE N_FAR * sequence,
+ const nstr8 N_FAR * searchPattern,
+ nuint32 retInfoMask,
+ NW_ENTRY_INFO2 N_FAR * entryInfo2
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSLoadedList
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint8 maxListLen,
+ pnuint8 NSLoadedList,
+ pnuint8 actualListLen
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetOwningNameSpace
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint8 namSpc
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenCreateNSEntry
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ const nstr8 N_FAR * path,
+ NW_NS_OPENCREATE N_FAR * NSOpenCreate,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenCreateNSEntryExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ const nstr8 N_FAR * path,
+ NW_NS_OPENCREATE N_FAR * NSOpenCreate,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenNSEntry
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ nuint8 dataStream,
+ const nstr8 N_FAR * path,
+ NW_NS_OPEN N_FAR * NSOpen,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenNSEntryExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ nuint8 dataStream,
+ const nstr8 N_FAR * path,
+ NW_NS_OPEN N_FAR * NSOpen,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetLongName
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ const nstr8 N_FAR * dstPath,
+ nuint16 dstType,
+ const nstr8 N_FAR * longName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLongName
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ pnstr8 longName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLongNameExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ pnstr8 longName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSInfo
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ NW_NS_INFO N_FAR * NSInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteNSInfo
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ const NW_NS_INFO N_FAR * NSInfo,
+ const nuint8 N_FAR * data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteNSInfoExt
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ const NW_NS_INFO N_FAR * NSInfo,
+ const nuint8 N_FAR * data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWriteExtendedNSInfo
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ NW_NS_INFO N_FAR * NSInfo,
+ const nuint8 N_FAR * data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadNSInfo
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ const NW_NS_INFO N_FAR * NSInfo,
+ pnuint8 data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadNSInfoExt
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ const NW_NS_INFO N_FAR * NSInfo,
+ pnuint8 data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadExtendedNSInfo
+(
+ NWCONN_HANDLE conn,
+ const NW_IDX N_FAR * idxStruct,
+ NW_NS_INFO N_FAR * NSInfo,
+ pnuint8 data
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSPath
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint16 fileFlag,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ NW_NS_PATH N_FAR *NSPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSPathExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint16 fileFlag,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ NW_NS_PATH N_FAR *NSPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAllocTempNSDirHandle2
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 namSpc,
+ pnuint8 newDirHandle,
+ nuint8 newNamSpc
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAllocTempNSDirHandle2Ext
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 namSpc,
+ pnuint8 newDirHandle,
+ nuint8 newNamSpc
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSEntryInfo
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ nuint16 searchAttrs,
+ nuint32 retInfoMask,
+ NW_ENTRY_INFO N_FAR * entryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNSEntryInfoExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 srcNamSpc,
+ nuint8 dstNamSpc,
+ nuint16 searchAttrs,
+ nuint32 retInfoMask,
+ NW_ENTRY_INFO_EXT N_FAR * entryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWNSGetMiscInfo
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 dstNameSpace,
+ NW_IDX N_FAR * idxStruct
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenDataStream
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint16 dataStream,
+ nuint16 attrs,
+ nuint16 accessMode,
+ pnuint32 NWHandle,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWNSRename
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ const nstr8 N_FAR * oldName,
+ nuint16 oldType,
+ const nstr8 N_FAR * newName,
+ nuint8 renameFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWNSRenameExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ nuint8 namSpc,
+ const nstr8 N_FAR * oldName,
+ nuint16 oldType,
+ const nstr8 N_FAR * newName,
+ nuint8 renameFlag
+);
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetNSEntryDOSInfo
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 namSpc,
+ nuint16 searchAttrs,
+ nuint32 modifyDOSMask,
+ MODIFY_DOS_INFO N_FAR * dosInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetNSEntryDOSInfoExt
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 namSpc,
+ nuint16 searchAttrs,
+ nuint32 modifyDOSMask,
+ MODIFY_DOS_INFO N_FAR * dosInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFullPath
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint32 dirBase,
+ nuint16 handleFlag,
+ nint srcNamSpc,
+ nint dstNamSpc,
+ nuint16 maxPathLen,
+ pnstr8 path,
+ pnuint16 pathType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteNSEntry
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint8 nameSpace,
+ nuint16 searchAttr
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteNSEntryExt
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * fileName,
+ nuint8 nameSpace,
+ nuint16 searchAttr
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWNSGetDefaultNS
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ pnuint8 pbuDefaultNameSpace
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNSEntryInfoSet
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ nuint8 buNameSpace,
+ nuint16 suAttr,
+ SEARCH_SEQUENCE N_FAR * pIterHnd,
+ const nstr8 N_FAR * pbstrSrchPattern,
+ nuint32 luRetMask,
+ pnuint8 pbuMoreEntriesFlag,
+ pnuint16 psuNumReturned,
+ nuint16 suNumItems,
+ NW_ENTRY_INFO N_FAR * pEntryInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAddTrusteeToNSDirectory
+(
+ NWCONN_HANDLE conn,
+ nuint8 namSpc,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint32 trusteeID,
+ nuint8 rightsMask
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDeleteTrusteeFromNSDirectory
+(
+ NWCONN_HANDLE conn,
+ nuint8 namSpc,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * dirPath,
+ nuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNSDirectoryForTrustees
+(
+ NWCONN_HANDLE conn,
+ nuint8 namSpc,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * pbstrSrchPath,
+ pnuint32 pluIterHnd,
+ pnstr8 pbstrDirName,
+ pnuint32 pluDirDateTime,
+ pnuint32 pluOwnerID,
+ TRUSTEE_INFO N_FAR * trusteeList
+);
+
+#ifdef NWDOS
+#define __NWGetCurNS(a, b, c) NW_NS_DOS
+#else
+N_EXTERN_LIBRARY( nuint16 )
+__NWGetCurNS
+(
+ NWCONN_HANDLE conn,
+ nuint8 dirHandle,
+ pnstr8 path
+);
+#endif
+
+#if defined N_PLAT_NLM
+N_EXTERN_LIBRARY( nuint8 )
+SetCurrentNameSpace
+(
+ nuint8 newNameSpace
+);
+
+N_EXTERN_LIBRARY( nuint8 )
+SetTargetNameSpace
+(
+ nuint8 newNameSpace
+);
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_namspc.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwncpext.h b/LoginCapture/windows/external/xplatapi/include/nwncpext.h
new file mode 100644
index 00000000..61b27bf2
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwncpext.h
@@ -0,0 +1,184 @@
+/******************************************************************************
+
+ %name: nwncpext.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:42 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWNCPEXT_H )
+#define NWNCPEXT_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWMISC_H ) /* Needed to defined NWFRAGMENT */
+# include "nwmisc.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BEGIN_SCAN_NCP_EXTENSIONS 0xFFFFFFFF
+#define NW_NCPX_BEGIN_SCAN 0xFFFFFFFF
+#define MAX_NCP_EXTENSION_NAME_BYTES 33
+
+#if defined( N_PLAT_NLM )
+ #define NWGetNCPExtensionInfo NWGetNCPExtensionInfo2
+ #define NWScanNCPExtensions NWScanNCPExtensions2
+
+N_EXTERN_LIBRARY_C( nint )
+NWDeRegisterNCPExtension
+(
+ nptr queryData
+);
+
+N_EXTERN_LIBRARY( nint )
+NWRegisterNCPExtension
+(
+ nstr8 NCPExtensionName,
+ nuint8 (*NCPExtensionHandler)(
+ struct NCPExtensionClient *NCPExtensionClient,
+ nptr requestData,
+ nuint32 requestDataLen,
+ nptr replyData,
+ pnuint32 replyDataLen),
+ void (*ConnectionEventHandler)(
+ nuint32 connection,
+ nuint32 eventType),
+ void (*ReplyBufferManager)(
+ struct NCPExtensionClient *NCPExtensionClient,
+ nptr replyBuffer),
+ nuint8 majorVersion,
+ nuint8 minorVersion,
+ nuint8 revision,
+ pnptr queryData
+);
+
+typedef struct NCPExtensionClient NCPExtensionClient;
+
+struct NCPExtensionClient {
+ nuint32 connection;
+ nuint32 task;
+};
+
+N_EXTERN_LIBRARY( nint )
+NWRegisterNCPExtensionByID
+(
+ nuint32 NCPExtensionID,
+ nstr8 NCPExtensionName,
+ nuint8 (*NCPExtensionHandler)(
+ struct NCPExtensionClient *NCPExtensionClient,
+ nptr requestData,
+ nuint32 requestDataLen,
+ nptr replyData,
+ pnuint32 replyDataLen),
+ void (*ConnectionEventHandler)(
+ nuint32 connection,
+ nuint32 eventType),
+ void (*ReplyBufferManager)(
+ struct NCPExtensionClient *NCPExtensionClient,
+ nptr replyBuffer),
+ nuint8 majorVersion,
+ nuint8 minorVersion,
+ nuint8 revision,
+ pnptr queryData
+);
+
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNCPExtensionInfo
+(
+ NWCONN_HANDLE conn,
+ nuint32 NCPExtensionID,
+ pnstr8 NCPExtensionName,
+ pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revision,
+ pnuint8 queryData
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWNCPExtensionRequest
+(
+ NWCONN_HANDLE conn,
+ nuint32 NCPExtensionID,
+ const void N_FAR * requestData,
+ nuint16 requestDataLen,
+ nptr replyData,
+ pnuint16 replyDataLen
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFragNCPExtensionRequest
+(
+ NWCONN_HANDLE conn,
+ nuint32 NCPExtensionID,
+ nuint16 reqFragCount,
+ NW_FRAGMENT N_FAR * reqFragList,
+ nuint16 replyFragCount,
+ NW_FRAGMENT N_FAR * replyFragList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanNCPExtensions
+(
+ NWCONN_HANDLE conn,
+ pnuint32 NCPExtensionID,
+ pnstr8 NCPExtensionName,
+ pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revision,
+ pnuint8 queryData
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNCPExtensionInfoByName
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * NCPExtensionName,
+ pnuint32 NCPExtensionID,
+ pnuint8 majorVersion,
+ pnuint8 minorVersion,
+ pnuint8 revision,
+ pnuint8 queryData
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNCPExtensionsList
+(
+ NWCONN_HANDLE conn,
+ pnuint32 startNCPExtensionID,
+ pnuint16 itemsInList,
+ pnuint32 NCPExtensionIDList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNumberNCPExtensions
+(
+ NWCONN_HANDLE conn,
+ pnuint32 numNCPExtensions
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwndscon.h b/LoginCapture/windows/external/xplatapi/include/nwndscon.h
new file mode 100644
index 00000000..28ae80be
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwndscon.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+
+ %name: nwndscon.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:44 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWNDSCON_H )
+#define NWNDSCON_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#define NWNDS_CONNECTION 0x0001
+#define NWNDS_LICENSED 0x0002
+#define NWNDS_AUTHENTICATED 0x0004
+#define NWNDS_PACKET_BURST_AVAIL 0x0001
+#define NWNDS_NEEDED_MAX_IO 0x0040
+#define SYSTEM_LOCK 0x0
+#define TASK_LOCK 0x4
+#define SYSTEM_DISCONNECT 0x0
+#define TASK_DISCONNECT 0x1
+
+#define ALLREADY_ATTACHED 0x1
+#define ATTACHED_NOT_AUTH 0X2
+#define ATTACHED_AND_AUTH 0X4
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+N_EXTERN_LIBRARY (NWCCODE)
+NWSetPreferredDSTree
+(
+ nuint16 length,
+ pnuint8 treeName
+);
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_ndscon.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#endif /* NWNDSCON_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwnet.h b/LoginCapture/windows/external/xplatapi/include/nwnet.h
new file mode 100644
index 00000000..64a9fc05
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwnet.h
@@ -0,0 +1,110 @@
+/******************************************************************************
+
+ %name: nwnet.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:47 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWNET_H )
+#define NWNET_H
+
+#if ! defined ( NWDSTYPE_H )
+#include "nwdstype.h"
+#endif
+
+#if ! defined ( NWALIAS_H )
+#include "nwalias.h"
+#endif
+
+#if ! defined ( NWDSDEFS_H )
+#include "nwdsdefs.h"
+#endif
+
+#if ! defined ( NWDSERR_H )
+#include "nwdserr.h"
+#endif
+
+#if ! defined ( NWDSNAME_H )
+#include "nwdsname.h"
+#endif
+
+#if ! defined ( NWDSFILT_H )
+#include "nwdsfilt.h"
+#endif
+
+#if ! defined ( NWDSDC_H )
+#include "nwdsdc.h"
+#endif
+
+#if ! defined ( NWDSMISC_H )
+#include "nwdsmisc.h"
+#endif
+
+#if ! defined ( NWDSACL_H )
+#include "nwdsacl.h"
+#endif
+
+#if ! defined ( NWDSAUD_H )
+#include "nwdsaud.h"
+#endif
+
+#if ! defined ( NWDSDSA_H )
+#include "nwdsdsa.h"
+#endif
+
+#if ! defined ( NWDSSCH_H )
+#include "nwdssch.h"
+#endif
+
+#if ! defined ( NWDSATTR_H )
+#include "nwdsattr.h"
+#endif
+
+#if ! defined ( NWDSASA_H )
+#include "nwdsasa.h"
+#endif
+
+#if ! defined ( NWDSPART_H )
+#include "nwdspart.h"
+#endif
+
+#if ! defined ( NWDSBUFT_H )
+#include "nwdsbuft.h"
+#endif
+
+#if ! defined ( NWDSNMTP_H )
+#include "nwdsnmtp.h"
+#endif
+
+#if ! defined ( NUNICODE_H )
+#include "nunicode.h"
+#endif
+
+#if ! defined ( NWAUDIT_H )
+#include "nwaudit.h"
+#endif
+
+#if ! defined ( NWNDSCON_H )
+#include "nwndscon.h"
+#endif
+
+#if ! defined ( NWDSCONN_H )
+#include "nwdsconn.h"
+#endif
+
+#if !defined( NWITR_H )
+#include "nwitr.h"
+#endif
+
+#endif /* NWNET_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwprint.h b/LoginCapture/windows/external/xplatapi/include/nwprint.h
new file mode 100644
index 00000000..49d7f07d
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwprint.h
@@ -0,0 +1,503 @@
+/******************************************************************************
+
+ %name: nwprint.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:49 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWPRINT_H )
+#define NWPRINT_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LPT1 1
+#define LPT2 2
+#define LPT3 3
+#define LPT4 4
+#define LPT5 5
+#define LPT6 6
+#define LPT7 7
+#define LPT8 8
+#define LPT9 9
+
+#define START_CAPTURE 1
+#define END_CAPTURE 2
+#define CANCEL_CAPTURE 3
+#define GET_PRINT_JOB_FLAGS 4
+#define SET_PRINT_JOB_FLAGS 5
+#define GET_BANNER_USER_NAME 6
+#define SET_BANNER_USER_NAME 7
+#define GET_PRINTER_SETUP_STRING 8
+#define SET_PRINTER_SETUP_STRING 9
+#define GET_PRINTER_RESET_STRING 10
+#define SET_PRINTER_RESET_STRING 11
+
+typedef struct
+{
+ nuint8 clientStation;
+ nuint8 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint16 jobNumber;
+ nuint16 formType;
+ nuint8 jobPosition;
+ nuint8 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint8 jobFileHandle[6];
+ nuint8 servicingServerStation;
+ nuint8 servicingServerTask;
+ nuint32 servicingServerID;
+ nuint8 jobDescription[50];
+ nuint8 clientJobInfoVer;
+ nuint8 tabSize;
+ nuint16 numberCopies;
+ nuint16 printFlags;
+ nuint16 maxLines;
+ nuint16 maxChars;
+ nuint8 formName[16];
+ nuint8 reserved[6]; /* must be set to zeros */
+ nuint8 bannerUserName[13];
+ nuint8 bannerFileName[13];
+ nuint8 bannerHeaderFileName[14];
+ nuint8 filePathName[80];
+} PrintJobStruct;
+
+typedef struct
+{
+ nuint32 clientStation;
+ nuint32 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint32 jobNumber;
+ nuint16 formType;
+ nuint16 jobPosition;
+ nuint16 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint32 jobFileHandle;
+ nuint32 servicingServerStation;
+ nuint32 servicingServerTask;
+ nuint32 servicingServerID;
+ nuint8 jobDescription[50];
+ nuint8 clientJobInfoVer;
+ nuint8 tabSize;
+ nuint16 numberCopies;
+ nuint16 printFlags;
+ nuint16 maxLines;
+ nuint16 maxChars;
+ nuint8 formName[16];
+ nuint8 reserved[6]; /* must be set to zeros */
+ nuint8 bannerUserName[13];
+ nuint8 bannerFileName[13];
+ nuint8 bannerHeaderFileName[14];
+ nuint8 filePathName[80];
+} NWPrintJobStruct;
+
+typedef struct PRINTER_STATUS
+{
+ nuint8 printerHalted;
+ nuint8 printerOffline;
+ nuint8 currentFormType;
+ nuint8 redirectedPrinter;
+} PRINTER_STATUS;
+
+typedef struct
+{
+ nuint8 jobDescription[ 50 ]; /* OS/2, VLM only */
+ /* VLM returns or sets only 12 characters */
+ /* plus the NULL -- a total of 13 nuint8's */
+ nuint8 jobControlFlags; /* OS/2, VLM only */
+ nuint8 tabSize;
+ nuint16 numCopies;
+ nuint16 printFlags;
+ nuint16 maxLines;
+ nuint16 maxChars;
+ nuint8 formName[ 13 ];
+ nuint8 reserved[ 9 ];
+ nuint16 formType;
+ nuint8 bannerText[ 13 ];
+ nuint8 reserved2;
+ nuint16 flushCaptureTimeout; /* DOS/WIN only */
+ nuint8 flushCaptureOnClose; /* DOS/WIN only */
+} NWCAPTURE_FLAGSRW;
+
+#define NWCAPTURE_FLAGS1 NWCAPTURE_FLAGSRW
+
+typedef struct
+{
+ NWCONN_HANDLE connID;
+ nuint32 queueID;
+ nuint16 setupStringMaxLen;
+ nuint16 resetStringMaxLen;
+ nuint8 LPTCaptureFlag; /* DOS/WIN only */
+ nuint8 fileCaptureFlag; /* DOS/WIN only */
+ nuint8 timingOutFlag; /* DOS/WIN only */
+ nuint8 inProgress; /* DOS/WIN only */
+ nuint8 printQueueFlag; /* DOS/WIN only */
+ nuint8 printJobValid; /* DOS/WIN only */
+ nstr8 queueName[ 65 ]; /* VLM only */
+} NWCAPTURE_FLAGSRO;
+
+#define NWCAPTURE_FLAGS2 NWCAPTURE_FLAGSRO
+
+typedef struct
+{
+ nuint32 connRef;
+ nuint32 queueID;
+ nuint16 setupStringMaxLen;
+ nuint16 resetStringMaxLen;
+ nuint8 LPTCaptureFlag; /* DOS/WIN only */
+ nuint8 fileCaptureFlag; /* DOS/WIN only */
+ nuint8 timingOutFlag; /* DOS/WIN only */
+ nuint8 inProgress; /* DOS/WIN only */
+ nuint8 printQueueFlag; /* DOS/WIN only */
+ nuint8 printJobValid; /* DOS/WIN only */
+ nstr8 queueName[ 65 ]; /* VLM only */
+} NWCAPTURE_FLAGSRO3;
+
+#define NWCAPTURE_FLAGS3 NWCAPTURE_FLAGSRO3
+
+#ifdef N_PLAT_OS2
+
+#define N_APIPIPE "\\PIPE\\NWSPOOL\\API" /*IPC to API*/
+#define NET_SPOOL_SEG "\\sharemem\\nwspool\\seg1"
+#define NET_SPOOL_SEM1 "\\sem\\nwspool\\sem1"
+#define NET_SPOOL_SEM2 "\\sem\\nwspool\\sem2"
+#define NET_SPOOL_SEM3 "\\sem\\nwspool\\sem3"
+
+typedef struct
+{
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobDescription[50];
+ nuint8 jobControlFlags;
+ nuint8 tabSize;
+ nuint16 numberCopies;
+ nuint16 printFlags;
+ nuint16 maxLines;
+ nuint16 maxChars;
+ nuint8 formName[16];
+ nuint8 reserved1[6]; /* must be set to zeros */
+ nuint16 formType;
+ nuint8 bannerFileName[13];
+ nuint8 reserved2; /* must be set to zero */
+
+ /* The following fields can be gotten, but not set */
+ NWCONN_HANDLE connID;
+ nuint32 queueID;
+ nuint16 setupStringMaxLength;
+ nuint16 resetStringMaxLength;
+} SpoolFlagsStruct;
+
+typedef struct _NWPipeStruct
+{
+ nuint16 fwCommand;
+ nuint16 idSession;
+ nuint32 idQueue;
+ nuint16 idConnection;
+ nuint16 idDevice;
+ nuint16 fwMode;
+ nuint16 fwScope;
+ nuint16 cbBufferLength;
+ nuint8 fbValidBuffer;
+ SpoolFlagsStruct nwsSpoolFlags;
+ nuint8 szBannerUserName[13];
+ nuint16 rc;
+} NWPipeStruct;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolGetPrintJobFlags
+(
+ nuint16 deviceID,
+ SpoolFlagsStruct N_FAR * flagsBuffer,
+ nuint16 mode,
+ pnuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolSetPrintJobFlags
+(
+ nuint16 deviceID,
+ SpoolFlagsStruct N_FAR * flagsBuffer,
+ nuint16 unused
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolGetPrinterSetupString
+(
+ nuint16 deviceID,
+ pnuint16 bufferLen,
+ pnstr8 buffer,
+ nuint16 mode,
+ pnuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolSetPrinterSetupString
+(
+ nuint16 deviceID,
+ nuint16 bufferLen,
+ pnstr8 buffer,
+ nuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolGetPrinterResetString
+(
+ nuint16 deviceID,
+ pnuint16 bufferLen,
+ pnstr8 buffer,
+ nuint16 mode,
+ pnuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolSetPrinterResetString
+(
+ nuint16 deviceID,
+ nuint16 bufferLen,
+ pnstr8 buffer,
+ nuint16 scope
+);
+
+#else
+
+typedef struct
+{
+ nuint8 status;
+ nuint8 flags;
+ nuint8 tabSize;
+ nuint8 serverPrinter;
+ nuint8 numberCopies;
+ nuint8 formType;
+ nuint8 reserved;
+ nuint8 bannerText[13];
+ nuint8 reserved2;
+ nuint8 localLPTDevice;
+ nuint16 captureTimeOutCount;
+ nuint8 captureOnDeviceClose;
+} CaptureFlagsStruct;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPrinterDefaults
+(
+ pnuint8 status,
+ pnuint8 flags,
+ pnuint8 tabSize,
+ pnuint8 serverPrinter,
+ pnuint8 numberCopies,
+ pnuint8 formType,
+ pnstr8 bannerText,
+ pnuint8 localLPTDevice,
+ pnuint16 captureTimeOutCount,
+ pnuint8 captureOnDeviceClose
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetPrinterDefaults
+(
+ nuint8 flags,
+ nuint8 tabSize,
+ nuint8 serverPrinter,
+ nuint8 numberCopies,
+ nuint8 formType,
+ pnstr8 bannerText,
+ nuint8 localLPTDevice,
+ nuint16 captureTimeOutCount,
+ nuint8 captureOnDeviceClose
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWStartLPTCapture
+(
+ nuint16 deviceID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetLPTCaptureStatus
+(
+ NWCONN_HANDLE N_FAR * conn
+);
+
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolStartCapture
+(
+ nuint16 deviceID,
+ nuint32 queueID,
+ NWCONN_HANDLE conn,
+ nuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolEndCapture
+(
+ nuint16 deviceID,
+ nuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolCancelCapture
+(
+ nuint16 deviceID,
+ nuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolGetBannerUserName
+(
+ pnstr8 username,
+ nuint16 mode,
+ pnuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSpoolSetBannerUserName
+(
+ const nstr8 N_FAR * username,
+ nuint16 scope
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPrinterStatus
+(
+ NWCONN_HANDLE conn,
+ nuint16 printerNumber,
+ PRINTER_STATUS N_FAR * status
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWStartQueueCapture
+(
+ NWCONN_HANDLE conn,
+ nuint8 LPTDevice,
+ nuint32 queueID,
+ const nstr8 N_FAR * queueName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetCaptureStatus
+(
+ nuint8 LPTDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFlushCapture
+(
+ nuint8 LPTDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEndCapture
+(
+ nuint8 LPTDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCancelCapture
+(
+ nuint8 LPTDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetBannerUserName
+(
+ pnstr8 userName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetBannerUserName
+(
+ const nstr8 N_FAR * userName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetCaptureFlags
+(
+ nuint8 LPTDevice,
+ NWCAPTURE_FLAGS1 N_FAR * captureFlags1,
+ NWCAPTURE_FLAGS2 N_FAR * captureFlags2
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetCaptureFlagsConnRef
+(
+ nuint8 LPTDevice,
+ NWCAPTURE_FLAGS1 N_FAR * captureFlags1,
+ NWCAPTURE_FLAGS3 N_FAR * captureFlags3
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetCaptureFlags
+(
+ NWCONN_HANDLE conn,
+ nuint8 LPTDevice,
+ const NWCAPTURE_FLAGS1 N_FAR * captureFlags1
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPrinterStrings
+(
+ nuint8 LPTDevice,
+ pnuint16 setupStringLen,
+ pnstr8 setupString,
+ pnuint16 resetStringLen,
+ pnstr8 resetString
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetPrinterStrings
+(
+ nuint8 LPTDevice,
+ nuint16 setupStringLen,
+ const nstr8 N_FAR * setupString,
+ nuint16 resetStringLen,
+ const nstr8 N_FAR * resetString
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetMaxPrinters
+(
+ pnuint16 numPrinters
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_print.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwqms.h b/LoginCapture/windows/external/xplatapi/include/nwqms.h
new file mode 100644
index 00000000..24a3b67b
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwqms.h
@@ -0,0 +1,502 @@
+/******************************************************************************
+
+ %name: nwqms.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:51 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWQMS_H )
+#define NWQMS_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define QF_AUTO_START 0x08
+#define QF_ENTRY_RESTART 0x10
+#define QF_ENTRY_OPEN 0x20
+#define QF_USER_HOLD 0x40
+#define QF_OPERATOR_HOLD 0x80
+
+#define QS_CANT_ADD_JOBS 0x01
+#define QS_SERVERS_CANT_ATTACH 0x02
+#define QS_CANT_SERVICE_JOBS 0x04
+
+/*
+This struct is taken from NLM platform in the nwqueue.h file. This
+structure is the format for a print queue only. Other queue types
+might have different structures. Used with the clientRecordArea field
+in some of the structures listed below.
+*/
+typedef struct
+{
+nuint8 versionNumber;
+nuint8 tabSize;
+nuint16 numberOfCopies;
+nuint16 printControlFlags;
+nuint16 maxLinesPerPage;
+nuint16 maxCharsPerLine;
+nuint8 formName[13];
+nuint8 reserve[9];
+nuint8 bannerNameField[13];
+nuint8 bannerFileField[13];
+nuint8 bannerFileName[14];
+nuint8 directoryPath[80];
+} QueuePrintJobStruct;
+
+
+typedef struct
+{
+ nuint8 clientStation;
+ nuint8 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint16 jobNumber;
+ nuint16 jobType;
+ nuint8 jobPosition;
+ nuint8 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint8 jobFileHandle[6];
+ nuint8 servicingServerStation;
+ nuint8 servicingServerTask;
+ nuint32 servicingServerID;
+ nuint8 jobDescription[50];
+ nuint8 clientRecordArea[152];
+} QueueJobStruct;
+
+typedef struct
+{
+ nuint8 clientStation;
+ nuint8 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint16 jobNumber;
+ nuint16 jobType;
+ nuint8 jobPosition;
+ nuint8 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint8 jobFileHandle[6];
+ nuint8 servicingServerStation;
+ nuint8 servicingServerTask;
+ nuint32 servicingServerID;
+} ReplyJobStruct;
+
+typedef struct
+{
+ nuint32 clientStation;
+ nuint32 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint32 jobNumber;
+ nuint16 jobType;
+ nuint16 jobPosition;
+ nuint16 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint32 jobFileHandle;
+ nuint32 servicingServerStation;
+ nuint32 servicingServerTask;
+ nuint32 servicingServerID;
+ nuint8 jobDescription[50];
+ nuint8 clientRecordArea[152];
+} NWQueueJobStruct;
+
+typedef struct
+{
+ nuint32 clientStation;
+ nuint32 clientTask;
+ nuint32 clientID;
+ nuint32 targetServerID;
+ nuint8 targetExecutionTime[6];
+ nuint8 jobEntryTime[6];
+ nuint32 jobNumber;
+ nuint16 jobType;
+ nuint16 jobPosition;
+ nuint16 jobControlFlags;
+ nuint8 jobFileName[14];
+ nuint32 jobFileHandle;
+ nuint32 servicingServerStation;
+ nuint32 servicingServerTask;
+ nuint32 servicingServerID;
+} NWReplyJobStruct;
+
+typedef struct
+{
+ nuint32 totalQueueJobs;
+ nuint32 replyQueueJobNumbers;
+ nuint32 jobNumberList[250]; /* 250 to hold job #'s for old NCP*/
+} QueueJobListReply;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateQueueFile
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ QueueJobStruct N_FAR * job,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateQueueFile2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ NWQueueJobStruct N_FAR * job,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseFileAndStartQueueJob
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseFileAndStartQueueJob2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseFileAndAbortQueueJob
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseFileAndAbortQueueJob2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRemoveJobFromQueue
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRemoveJobFromQueue2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetQueueJobList
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ pnuint16 jobCount,
+ pnuint16 jobList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetQueueJobList2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 queueStartPos,
+ QueueJobListReply N_FAR * job
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueJobEntry
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ QueueJobStruct N_FAR * job
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueJobEntry2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ NWQueueJobStruct N_FAR * job
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetQueueJobFileSize
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ pnuint32 fileSize
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetQueueJobFileSize2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ pnuint32 fileSize
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeQueueJobEntry
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ const QueueJobStruct N_FAR * job
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeQueueJobEntry2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ const NWQueueJobStruct N_FAR * job
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeQueueJobPosition
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ nuint8 newJobPos
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeQueueJobPosition2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ nuint32 newJobPos
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWServiceQueueJob
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 targetJobType,
+ QueueJobStruct N_FAR * job,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWServiceQueueJob2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 targetJobType,
+ NWQueueJobStruct N_FAR * job,
+ NWFILE_HANDLE N_FAR * fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAbortServicingQueueJob
+(
+ NWCONN_HANDLE conn,
+ nuint32 QueueID,
+ nuint16 JobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAbortServicingQueueJob2
+(
+ NWCONN_HANDLE conn,
+ nuint32 QueueID,
+ nuint32 JobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeToClientRights
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWChangeToClientRights2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFinishServicingQueueJob
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint16 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWFinishServicingQueueJob2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 jobNumber,
+ NWFILE_HANDLE fileHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetPrinterQueueID
+(
+ NWCONN_HANDLE conn,
+ nuint16 printerNum,
+ pnuint32 queueID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCreateQueue
+(
+ NWCONN_HANDLE conn,
+ pnstr8 queueName,
+ nuint16 queueType,
+ nuint8 dirPath,
+ pnstr8 path,
+ pnuint32 queueID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDestroyQueue
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueCurrentStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ pnuint8 queueStatus,
+ pnuint16 numberOfJobs,
+ pnuint16 numberOfServers,
+ pnuint32 serverIDlist,
+ pnuint16 serverConnList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueCurrentStatus2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ pnuint32 queueStatus,
+ pnuint32 numberOfJobs,
+ pnuint32 numberOfServers,
+ pnuint32 serverIDlist,
+ pnuint32 serverConnList
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetQueueCurrentStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint8 queueStatus
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetQueueCurrentStatus2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 queueStatus
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueServerCurrentStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 serverID,
+ nuint16 serverConn,
+ nptr statusRec
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWReadQueueServerCurrentStatus2
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ nuint32 serverID,
+ nuint32 serverConn,
+ nptr statusRec
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAttachQueueServerToQueue
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDetachQueueServerFromQueue
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRestoreQueueServerRights
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetQueueServerCurrentStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 queueID,
+ const void N_FAR * statusRec
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwredir.h b/LoginCapture/windows/external/xplatapi/include/nwredir.h
new file mode 100644
index 00000000..2d6a37b0
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwredir.h
@@ -0,0 +1,115 @@
+/******************************************************************************
+
+ %name: nwredir.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:54 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWREDIR_H )
+#define NWREDIR_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(NWOS2) || !defined(WIN32)
+
+#ifndef REDIR_SIGNATURE
+#define REDIR_SIGNATURE 'WN'
+
+typedef struct tNW_REDIR_ENTRY
+{
+ nuint16 index;
+ nuint8 deviceStatus;
+ nuint8 deviceType;
+ nuint16 storedValue;
+ nstr8 localName[16];
+ nstr8 networkName[128];
+} NW_REDIR_ENTRY;
+#endif
+
+/* obsolete
+NWCCODE N_API NWRedirLogin
+(
+ pnstr8 pbstrServerName,
+ pnstr8 pbstrUserName,
+ pnstr8 pbstrPassword
+);
+*/
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRedirLogout
+(
+ pnstr8 pbstrServerName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRedirectDevice
+(
+ pnstr8 pbstrUNCPath,
+ nuint8 buDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCancelRedirection
+(
+ nuint8 buDevice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetRedirectionEntry
+(
+ NW_REDIR_ENTRY N_FAR * entry
+);
+
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParseUNCPath
+(
+ pnstr8 pbstrUNCPath,
+ NWCONN_HANDLE N_FAR * conn,
+ pnstr8 pbstrServerName,
+ pnstr8 pbstrVolName,
+ pnstr8 pbstrPath,
+ pnstr8 pbstrNWPath
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWParseUNCPathConnRef
+(
+ pnstr8 pbstrUNCPath,
+ pnuint32 pluConnRef,
+ pnstr8 pbstrServerName,
+ pnstr8 pbstrVolName,
+ pnstr8 pbstrPath,
+ pnstr8 pbstrNWPath
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif /* NWREDIR_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwserver.h b/LoginCapture/windows/external/xplatapi/include/nwserver.h
new file mode 100644
index 00000000..84176ea0
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwserver.h
@@ -0,0 +1,286 @@
+/******************************************************************************
+
+ %name: nwserver.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:56 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWSERVER_H )
+#define NWSERVER_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LNS_CHECK 0
+
+#ifndef NW_SHORT_NAME_SERVER
+# define NW_SHORT_NAME_SERVER 0
+#endif
+
+#ifndef NW_LONG_NAME_SERVER
+#define NW_LONG_NAME_SERVER 1
+#endif
+
+#ifndef NW_ENCP_SERVER
+#define NW_ENCP_SERVER 1
+#endif
+
+#ifndef NW_EXTENDED_NCP_SERVER
+#define NW_EXTENDED_NCP_SERVER 1
+#endif
+
+#define VERSION_CHECK 1
+# define NW_2X 0
+# define NW_30 1
+# define NW_311 2
+# define NW_32 3
+# define NW_40 4
+
+typedef struct
+{
+ nuint8 serverName[48];
+ nuint8 fileServiceVersion;
+ nuint8 fileServiceSubVersion;
+ nuint16 maximumServiceConnections;
+ nuint16 connectionsInUse;
+ nuint16 maxNumberVolumes;
+ nuint8 revision;
+ nuint8 SFTLevel;
+ nuint8 TTSLevel;
+ nuint16 maxConnectionsEverUsed;
+ nuint8 accountVersion;
+ nuint8 VAPVersion;
+ nuint8 queueVersion;
+ nuint8 printVersion;
+ nuint8 virtualConsoleVersion;
+ nuint8 restrictionLevel;
+ nuint8 internetBridge;
+ nuint8 reserved[60];
+} VERSION_INFO;
+
+typedef struct
+{
+ nuint16 majorVersion;
+ nuint16 minorVersion;
+ nuint16 revision;
+} NETWARE_PRODUCT_VERSION;
+
+/* Defines that are used for the NWCheckNetWareVersion call for values
+ that can be returned in the compatibilityFlag nuint8. */
+#define COMPATIBLE 0x00
+#define VERSION_NUMBER_TOO_LOW 0x01
+#define SFT_LEVEL_TOO_LOW 0x02
+#define TTS_LEVEL_TOO_LOW 0x04
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCheckConsolePrivileges
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDownFileServer
+(
+ NWCONN_HANDLE conn,
+ nuint8 forceFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerDateAndTime
+(
+ NWCONN_HANDLE conn,
+ pnuint8 dateTimeBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetFileServerDateAndTime
+(
+ NWCONN_HANDLE conn,
+ nuint8 year,
+ nuint8 month,
+ nuint8 day,
+ nuint8 hour,
+ nuint8 minute,
+ nuint8 second
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCheckNetWareVersion
+(
+ NWCONN_HANDLE conn,
+ nuint16 minVer,
+ nuint16 minSubVer,
+ nuint16 minRev,
+ nuint16 minSFT,
+ nuint16 minTTS,
+ pnuint8 compatibilityFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerVersionInfo
+(
+ NWCONN_HANDLE conn,
+ VERSION_INFO N_FAR * versBuffer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNetWareProductVersion
+(
+ NWCONN_HANDLE conn,
+ NETWARE_PRODUCT_VERSION N_FAR * version
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerInformation
+(
+ NWCONN_HANDLE conn,
+ pnstr8 serverName,
+ pnuint8 majorVer,
+ pnuint8 minVer,
+ pnuint8 rev,
+ pnuint16 maxConns,
+ pnuint16 maxConnsUsed,
+ pnuint16 connsInUse,
+ pnuint16 numVolumes,
+ pnuint8 SFTLevel,
+ pnuint8 TTSLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerExtendedInfo
+(
+ NWCONN_HANDLE conn,
+ pnuint8 accountingVer,
+ pnuint8 VAPVer,
+ pnuint8 queueingVer,
+ pnuint8 printServerVer,
+ pnuint8 virtualConsoleVer,
+ pnuint8 securityVer,
+ pnuint8 internetBridgeVer
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+_NWGetFileServerType
+(
+ NWCONN_HANDLE conn,
+ nuint16 typeFlag,
+ pnuint16 serverType
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAttachToFileServer
+(
+ const nstr8 N_FAR * serverName,
+ nuint16 scopeFlag,
+ NWCONN_HANDLE N_FAR * newConnID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerLoginStatus
+(
+ NWCONN_HANDLE conn,
+ pnuint8 loginEnabledFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLogoutFromFileServer
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWLoginToFileServer
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * objName,
+ nuint16 objType,
+ const nstr8 N_FAR * password
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEnableFileServerLogin
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDisableFileServerLogin
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetFileServerDescription
+(
+ NWCONN_HANDLE conn,
+ pnstr8 companyName,
+ pnstr8 revision,
+ pnstr8 revisionDate,
+ pnstr8 copyrightNotice
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWAttachToFileServerByConn
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * serverName,
+ nuint16 scopeFlag,
+ NWCONN_HANDLE N_FAR * newConnID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetNetworkSerialNumber
+(
+ NWCONN_HANDLE conn,
+ pnuint32 serialNum,
+ pnuint16 appNum
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWIsManager
+(
+ NWCONN_HANDLE conn
+);
+
+#ifdef NWOS2
+N_EXTERN_LIBRARY( NWCCODE )
+NWLogoutWithLoginID
+(
+ nuint32 citrixLoginID
+);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* The NLM LibC x-plat libraries do not support obsolete apis
+ */
+#include
+#if !defined(__NOVELL_LIBC__)
+ #ifdef INCLUDE_OBSOLETE
+ #include "obsolete/o_server.h"
+ #endif
+#endif /* !defined(__NOVELL_LIBC__) */
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwsm.h b/LoginCapture/windows/external/xplatapi/include/nwsm.h
new file mode 100644
index 00000000..07ac128b
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwsm.h
@@ -0,0 +1,140 @@
+/******************************************************************************
+
+ %name: nwsm.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:08:59 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#if ! defined ( NWSM_H )
+#define NWSM_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWAPIDEF_H )
+#include "nwapidef.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWNAMSPC_H )
+#include "nwnamspc.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LOAD_COULD_NOT_FIND_FILE 1
+#define LOAD_ERROR_READING_FILE 2
+#define LOAD_NOT_NLM_FILE_FORMAT 3
+#define LOAD_WRONG_NLM_FILE_VERSION 4
+#define LOAD_REENTRANT_INITIALIZE_FAILURE 5
+#define LOAD_CAN_NOT_LOAD_MULTIPLE_COPIES 6
+#define LOAD_ALREADY_IN_PROGRESS 7
+#define LOAD_NOT_ENOUGH_MEMORY 8
+#define LOAD_INITIALIZE_FAILURE 9
+#define LOAD_INCONSISTENT_FILE_FORMAT 10
+#define LOAD_CAN_NOT_LOAD_AT_STARTUP 11
+#define LOAD_AUTO_LOAD_MODULES_NOT_LOADED 12
+#define LOAD_UNRESOLVED_EXTERNAL 13
+#define LOAD_PUBLIC_ALREADY_DEFINED 14
+#define LOAD_XDC_DATA_ERROR 15
+#define LOAD_NOT_OS_DOMAIN 16
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMLoadNLM
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * loadCommand
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMLoadNLM2
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * loadCommand,
+ pnuint32 loadNLMReturnCode
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMUnloadNLM
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * NLMName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMMountVolume
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * volumeName,
+ pnuint32 volumeNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMDismountVolumeByNumber
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 volumeNumber
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMDismountVolumeByName
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * volumeName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMAddNSToVolume
+(
+ NWCONN_HANDLE connHandle,
+ nuint16 volNumber,
+ nuint8 namspc
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMSetDynamicCmdStrValue
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * setCommandName,
+ const nstr8 N_FAR * cmdValue
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMSetDynamicCmdIntValue
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * setCommandName,
+ nuint32 cmdValue
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSMExecuteNCFFile
+(
+ NWCONN_HANDLE connHandle,
+ const nstr8 N_FAR * NCFFileName
+);
+
+#include "npackoff.h"
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwssdefs.h b/LoginCapture/windows/external/xplatapi/include/nwssdefs.h
new file mode 100644
index 00000000..913fb9cb
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwssdefs.h
@@ -0,0 +1,202 @@
+/******************************************************************************
+
+ %name: nwssdefs.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:09:02 2005 %
+ $Copyright:
+
+ Copyright (c) 1996 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+#ifndef NWSSDEFS_H
+#define NWSSDEFS_H
+
+#ifndef NTYPES_H
+#include "ntypes.h"
+#endif
+
+#ifndef NWDSDEFS_H
+#include "nwdsdefs.h"
+#endif
+
+#ifndef NWDSDC_H
+#include "nwdsdc.h"
+#endif
+
+#ifndef NWDSDC_H
+#include "nwdsdc.h"
+#endif
+
+#ifndef __NWDSERR_H
+#include "nwdserr.h"
+#endif
+
+
+
+/* ##################### DECLARATIONS START HERE ######################### */
+
+#define NWSS_GLOBAL_RCODE N_EXTERN_LIBRARY(NWRCODE)
+
+/* ############################## ERROR CODES ############################ */
+
+#define NWSS_SUCCESS 0x00000000 /* 0 */
+#define NWSS_ERR_BAD_HANDLE 0xFFFFFCE0 /* -800 */
+#define NWSS_ERR_ENCODING_ASN1ID 0xFFFFFCDF /* -801 */
+#define NWSS_ERR_INVALID_APP 0xFFFFFCDE /* -802 */
+#define NWSS_ERR_APP_EXISTS 0xFFFFFCDD /* -803 */
+#define NWSS_ERR_ACCESS_DENIED 0xFFFFFCDC /* -804 */
+#define NWSS_ERR_OBJ_READ_FAILED 0xFFFFFCDB /* -805 */
+#define NWSS_ERR_KEYCHAIN_EXISTS 0xFFFFFCDA /* -806 */
+#define NWSS_ERR_CMC_FAILURE 0xFFFFFCD9 /* -807 */
+#define NWSS_ERR_INVALID_KEYCHAIN 0xFFFFFCD8 /* -808 */
+#define NWSS_ERR_SHORT_ASN1ID 0xFFFFFCD7 /* -809 */
+#define NWSS_ERR_ID_EXISTS 0xFFFFFCD6 /* -810 */
+#define NWSS_ERR_INVALID_USER_ID 0xFFFFFCD5 /* -811 */
+#define NWSS_ERR_HANDLE_ALLOC_FAILED 0xFFFFFCD4 /* -812 */
+#define NWSS_ERR_NOT_LOGGED_IN 0xFFFFFCD3 /* -813 */
+#define NWSS_ERR_ALREADY_REVOKED 0xFFFFFCD2 /* -814 */
+#define NWSS_ERR_SECRET_ALREADY_EXIST 0xFFFFFCD1 /* -815 */
+#define NWSS_ERR_ILLEGAL_PASSWORD 0xFFFFFCD0 /* -816 */
+#define NWSS_ERR_WRONG_VERSION 0xFFFFFCCF /* -817 */
+#define NWSS_ERR_POLICY_RES_FAILED 0xFFFFFCCE /* -818 */
+#define NWSS_ERR_TTS_DISABLED 0xFFFFFCCD /* -819 */
+#define NWSS_ERR_NO_NDS_CONTEXT 0xFFFFFCCC /* -820 */
+#define NWSS_ERR_KC_SCHEMA_EXT_FAILED 0xFFFFFCCB /* -821 */
+#define NWSS_ERR_APP_SCHEMA_EXT_FAILED 0xFFFFFCCA /* -822 */
+#define NWSS_ERR_MEM_ALLOC_FAILED 0xFFFFFCC9 /* -823 */
+#define NWSS_ERR_OBJ_CREATION_FAILED 0xFFFFFCC8 /* -824 */
+#define NWSS_ERR_BAD_POINTER 0xFFFFFCC7 /* -825 */
+#define NWSS_ERR_OBJ_MODIFY_FAILED 0xFFFFFCC6 /* -826 */
+#define NWSS_ERR_CANT_REMOVE_KC 0xFFFFFCC5 /* -827 */
+#define NWSS_ERR_ASN1ID_NOT_EQUAL 0xFFFFFCC4 /* -828 */
+
+/* ########################### FLAG DEFINITIONS ######################### */
+
+/* application flags */
+#define SS_APP_ENABLED_C 0x0001
+
+/* Secret Store Application flags */
+#define SS_MODIFYENABLED_C 0x0001
+
+/* ########################### STRUCTURED DEFINITIONS ######################### */
+
+
+/* String and Data type */
+typedef struct _ss_string_type
+{
+ nuint16 length;
+ nuint8 *dataByte;
+} SS_Data_T;
+
+
+
+/* Distinguished name type */
+typedef nuint8 SS_DN_T;
+
+/* Case Ignore String */
+typedef SS_Data_T SS_String_T;
+
+/* Application User ID */
+typedef SS_Data_T SS_AppUID_T;
+
+/* Application Secrets Contents */
+typedef SS_Data_T SS_AppSC_T;
+
+/* ASN1 ID */
+typedef SS_Data_T SS_ASN1ID_T;
+
+
+
+/* User Name List */
+typedef struct _ss_app_uid_list
+{
+ nuint16 userCount;
+ SS_AppUID_T N_FAR *userID[MAX_RDN_BYTES];
+} SS_AppUIDList_T;
+
+
+/* Keychain List */
+typedef struct _ss_keychain_list
+{
+ SS_DN_T appName[MAX_DN_BYTES];
+ nuint16 kcDNCount;
+ SS_DN_T N_FAR *kcDN[MAX_DN_BYTES];
+} SS_KeychainList_T;
+
+
+/* ########################## FUNCTION PROTOTYPES ######################### */
+
+
+/******************************************************************
+ ************************** ENABLING APIS *************************
+ ******************************************************************/
+
+NWSS_GLOBAL_RCODE NWSSOpenSecretStore
+(
+ nuint32 N_FAR *ssHandle,
+ SS_DN_T N_FAR *owner,
+ SS_ASN1ID_T N_FAR *appID,
+ SS_KeychainList_T N_FAR *kcDN,
+ SS_AppUIDList_T N_FAR *appUID
+);
+
+
+NWSS_GLOBAL_RCODE NWSSCloseSecretStore
+(
+ nuint32 ssHandle
+);
+
+
+NWSS_GLOBAL_RCODE NWSSAppUserLogin
+(
+ nuint32 ssHandle,
+ nuint16 N_FAR *flags,
+ SS_DN_T N_FAR *appDN,
+ SS_DN_T N_FAR *kcDN,
+ SS_AppUID_T N_FAR *userID,
+ SS_AppSC_T N_FAR *appSecrets
+);
+
+
+
+NWSS_GLOBAL_RCODE NWSSSaveAppSecretsOnKeychain
+(
+ nuint32 ssHandle,
+ SS_DN_T N_FAR *appDN,
+ SS_DN_T N_FAR *kcDN,
+ SS_AppUID_T N_FAR *userID,
+ SS_AppSC_T N_FAR *appSecrets
+);
+
+
+NWSS_GLOBAL_RCODE NWSSRevokeKeychain
+(
+ nuint32 ssHandle,
+ SS_DN_T N_FAR *kcDN
+);
+
+
+NWSS_GLOBAL_RCODE NWSSEncodeAppASN1ID
+(
+ nuint16 N_FAR *oid,
+ SS_ASN1ID_T N_FAR *appID
+);
+
+NWSS_GLOBAL_RCODE NWSSSetDefaultAppUserID
+(
+ nuint32 ssHandle,
+ SS_DN_T N_FAR *owner,
+ SS_KeychainList_T N_FAR *kcDN,
+ SS_AppUIDList_T N_FAR *userID
+);
+/* ########################## CODE ENDS HERE ##################### */
+
+#endif /* NWSSDEFS_H */
diff --git a/LoginCapture/windows/external/xplatapi/include/nwsync.h b/LoginCapture/windows/external/xplatapi/include/nwsync.h
new file mode 100644
index 00000000..bc0396c2
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwsync.h
@@ -0,0 +1,249 @@
+/******************************************************************************
+
+ %name: nwsync.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:09:04 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWSYNC_H )
+#define NWSYNC_H
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint16 connNumber;
+ nuint16 taskNumber;
+ nuint8 lockStatus;
+} LOGICAL_LOCK;
+
+typedef struct
+{
+ nuint16 useCount;
+ nuint16 shareableLockCount;
+ nuint8 locked;
+ nuint16 nextRequest;
+ nuint16 numRecords;
+ LOGICAL_LOCK logicalLock[128];
+ nuint16 curRecord;
+} LOGICAL_LOCKS;
+
+typedef struct
+{
+ nuint16 taskNumber;
+ nuint8 lockStatus;
+ nstr8 logicalName[128];
+} CONN_LOGICAL_LOCK;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 numRecords;
+ nuint8 records[508];
+ nuint16 curOffset;
+ nuint16 curRecord;
+} CONN_LOGICAL_LOCKS;
+
+typedef struct
+{
+ nuint16 loggedCount;
+ nuint16 shareableLockCount;
+ nuint32 recordStart;
+ nuint32 recordEnd;
+ nuint16 connNumber;
+ nuint16 taskNumber;
+ nuint8 lockType;
+} PHYSICAL_LOCK;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 numRecords;
+ PHYSICAL_LOCK locks[32];
+ nuint16 curRecord;
+ nuint8 reserved[8];
+} PHYSICAL_LOCKS;
+
+typedef struct
+{
+ nuint16 taskNumber;
+ nuint8 lockType;
+ nuint32 recordStart;
+ nuint32 recordEnd;
+} CONN_PHYSICAL_LOCK;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 numRecords;
+ CONN_PHYSICAL_LOCK locks[51];
+ nuint16 curRecord;
+ nuint8 reserved[22];
+} CONN_PHYSICAL_LOCKS;
+
+typedef struct
+{
+ nuint16 connNumber;
+ nuint16 taskNumber;
+} SEMAPHORE;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 openCount;
+ nuint16 semaphoreValue;
+ nuint16 semaphoreCount;
+ SEMAPHORE semaphores[170];
+ nuint16 curRecord;
+} SEMAPHORES;
+
+typedef struct
+{
+ nuint16 openCount;
+ nuint16 semaphoreValue;
+ nuint16 taskNumber;
+ nstr8 semaphoreName[128];
+} CONN_SEMAPHORE;
+
+typedef struct
+{
+ nuint16 nextRequest;
+ nuint16 numRecords;
+ nuint8 records[508];
+ nuint16 curOffset;
+ nuint16 curRecord;
+} CONN_SEMAPHORES;
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanPhysicalLocksByFile
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 dataStream,
+ pnint16 iterHandle,
+ PHYSICAL_LOCK N_FAR * lock,
+ PHYSICAL_LOCKS N_FAR * locks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanLogicalLocksByConn
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ pnint16 iterHandle,
+ CONN_LOGICAL_LOCK N_FAR * logicalLock,
+ CONN_LOGICAL_LOCKS N_FAR * logicalLocks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanPhysicalLocksByConnFile
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ NWDIR_HANDLE dirHandle,
+ const nstr8 N_FAR * path,
+ nuint8 dataStream,
+ pnint16 iterHandle,
+ CONN_PHYSICAL_LOCK N_FAR * lock,
+ CONN_PHYSICAL_LOCKS N_FAR * locks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanLogicalLocksByName
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * logicalName,
+ pnint16 iterHandle,
+ LOGICAL_LOCK N_FAR * logicalLock,
+ LOGICAL_LOCKS N_FAR * logicalLocks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanSemaphoresByConn
+(
+ NWCONN_HANDLE conn,
+ nuint16 connNum,
+ pnint16 iterHandle,
+ CONN_SEMAPHORE N_FAR * semaphore,
+ CONN_SEMAPHORES N_FAR * semaphores
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanSemaphoresByName
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * semName,
+ pnint16 iterHandle,
+ SEMAPHORE N_FAR * semaphore,
+ SEMAPHORES N_FAR * semaphores
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSignalSemaphore
+(
+ NWCONN_HANDLE conn,
+ nuint32 semHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWCloseSemaphore
+(
+ NWCONN_HANDLE conn,
+ nuint32 semHandle
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWOpenSemaphore
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * semName,
+ nint16 initSemHandle,
+ pnuint32 semHandle,
+ pnuint16 semOpenCount
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWExamineSemaphore
+(
+ NWCONN_HANDLE conn,
+ nuint32 semHandle,
+ pnint16 semValue,
+ pnuint16 semOpenCount
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWWaitOnSemaphore
+(
+ NWCONN_HANDLE conn,
+ nuint32 semHandle,
+ nuint16 timeOutValue
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwtts.h b/LoginCapture/windows/external/xplatapi/include/nwtts.h
new file mode 100644
index 00000000..5f37fcff
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwtts.h
@@ -0,0 +1,160 @@
+/******************************************************************************
+
+ %name: nwtts.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:09:06 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWTTS_H )
+#define NWTTS_H
+
+#if ! defined ( NWCALDEF_H )
+# include "nwcaldef.h"
+#endif
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ nuint32 systemElapsedTime;
+ nuint8 TTS_Supported;
+ nuint8 TTS_Enabled;
+ nuint16 TTS_VolumeNumber;
+ nuint16 TTS_MaxOpenTransactions;
+ nuint16 TTS_MaxTransactionsOpened;
+ nuint16 TTS_CurrTransactionsOpen;
+ nuint32 TTS_TotalTransactions;
+ nuint32 TTS_TotalWrites;
+ nuint32 TTS_TotalBackouts;
+ nuint16 TTS_UnfilledBackouts;
+ nuint16 TTS_DiskBlocksInUse;
+ nuint32 TTS_FATAllocations;
+ nuint32 TTS_FileSizeChanges;
+ nuint32 TTS_FilesTruncated;
+ nuint8 numberOfTransactions;
+ struct
+ {
+ nuint8 connNumber;
+ nuint8 taskNumber;
+ } connTask[235];
+} TTS_STATS;
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSAbortTransaction
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSBeginTransaction
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSIsAvailable
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSGetControlFlags
+(
+ NWCONN_HANDLE conn,
+ pnuint8 controlFlags
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSSetControlFlags
+(
+ NWCONN_HANDLE conn,
+ nuint8 controlFlags
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSEndTransaction
+(
+ NWCONN_HANDLE conn,
+ pnuint32 transactionNum
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSTransactionStatus
+(
+ NWCONN_HANDLE conn,
+ nuint32 transactionNum
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSGetProcessThresholds
+(
+ NWCONN_HANDLE conn,
+ pnuint8 logicalLockLevel,
+ pnuint8 physicalLockLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSSetProcessThresholds
+(
+ NWCONN_HANDLE conn,
+ nuint8 logicalLockLevel,
+ nuint8 physicalLockLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSGetConnectionThresholds
+(
+ NWCONN_HANDLE conn,
+ pnuint8 logicalLockLevel,
+ pnuint8 physicalLockLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWTTSSetConnectionThresholds
+(
+ NWCONN_HANDLE conn,
+ nuint8 logicalLockLevel,
+ nuint8 physicalLockLevel
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWEnableTTS
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWDisableTTS
+(
+ NWCONN_HANDLE conn
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetTTSStats
+(
+ NWCONN_HANDLE conn,
+ TTS_STATS N_FAR * ttsStats
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/nwvol.h b/LoginCapture/windows/external/xplatapi/include/nwvol.h
new file mode 100644
index 00000000..1cea07f9
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/nwvol.h
@@ -0,0 +1,290 @@
+/******************************************************************************
+
+ %name: nwvol.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:09:08 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+ *****************************************************************************/
+
+#if ! defined ( NWVOL_H )
+#define NWVOL_H
+
+#if ! defined ( NTYPES_H )
+#include "ntypes.h"
+#endif
+
+#if ! defined ( NWCALDEF_H )
+#include "nwcaldef.h"
+#endif
+
+#if ! defined ( NWAPIDEF_H )
+#include "nwapidef.h"
+#endif
+
+
+#include "npackon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* define volume types */
+
+#define VINetWare386 0
+#define VINetWare286 1
+#define VINetWare386v30 2
+#define VINetWare386v31 3
+
+/* define the extended volume information status flag bits */
+
+#define NWSubAllocEnabledBit 0x01
+#define NWCompressionEnabledBit 0x02
+#define NWMigrationEnabledBit 0x04
+#define NWAuditingEnabledBit 0x08
+#define NWReadOnlyEnabledBit 0x10
+#define NWPSSEnabledBit 0x80000000L
+
+/* define the constant for volume request flag for NWScanMountedVolumeList */
+
+#define NW_VOLUME_NUMBER_ONLY 0
+#define NW_VOLUME_NUMBER_AND_NAME 1
+
+typedef struct
+{
+ nuint32 objectID;
+ nuint32 restriction;
+} NWOBJ_REST;
+
+typedef struct
+{
+ nuint8 numberOfEntries;
+ struct
+ {
+ nuint32 objectID;
+ nuint32 restriction;
+ } resInfo[12];
+} NWVolumeRestrictions;
+
+typedef struct
+{
+ nuint8 numberOfEntries;
+ struct
+ {
+ nuint32 objectID;
+ nuint32 restriction;
+ } resInfo[16];
+} NWVOL_RESTRICTIONS;
+
+typedef struct
+{
+ nint32 systemElapsedTime;
+ nuint8 volumeNumber;
+ nuint8 logicalDriveNumber;
+ nuint16 sectorsPerBlock;
+ nuint16 startingBlock;
+ nuint16 totalBlocks;
+ nuint16 availableBlocks;
+ nuint16 totalDirectorySlots;
+ nuint16 availableDirectorySlots;
+ nuint16 maxDirectorySlotsUsed;
+ nuint8 isHashing;
+ nuint8 isCaching;
+ nuint8 isRemovable;
+ nuint8 isMounted;
+ nstr8 volumeName[16];
+} VOL_STATS;
+
+
+typedef struct ExtendedVolInfo_tag
+{
+ nuint32 volType;
+ nuint32 statusFlag;
+ nuint32 sectorSize;
+ nuint32 sectorsPerCluster;
+ nuint32 volSizeInClusters;
+ nuint32 freeClusters;
+ nuint32 subAllocFreeableClusters;
+ nuint32 freeableLimboSectors;
+ nuint32 nonfreeableLimboSectors;
+ nuint32 availSubAllocSectors; /* non freeable */
+ nuint32 nonuseableSubAllocSectors;
+ nuint32 subAllocClusters;
+ nuint32 numDataStreams;
+ nuint32 numLimboDataStreams;
+ nuint32 oldestDelFileAgeInTicks;
+ nuint32 numCompressedDataStreams;
+ nuint32 numCompressedLimboDataStreams;
+ nuint32 numNoncompressibleDataStreams;
+ nuint32 precompressedSectors;
+ nuint32 compressedSectors;
+ nuint32 numMigratedDataStreams;
+ nuint32 migratedSectors;
+ nuint32 clustersUsedByFAT;
+ nuint32 clustersUsedByDirs;
+ nuint32 clustersUsedByExtDirs;
+ nuint32 totalDirEntries;
+ nuint32 unusedDirEntries;
+ nuint32 totalExtDirExtants;
+ nuint32 unusedExtDirExtants;
+ nuint32 extAttrsDefined;
+ nuint32 extAttrExtantsUsed;
+ nuint32 DirectoryServicesObjectID;
+ nuint32 volLastModifiedDateAndTime;
+} NWVolExtendedInfo;
+
+typedef struct NWVolMountNumWithName_tag
+{
+ nuint32 volumeNumber;
+ nstr8 volumeName[NW_MAX_VOLUME_NAME_LEN];
+} NWVolMountNumWithName;
+
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetDiskUtilization
+(
+ NWCONN_HANDLE conn,
+ nuint32 objID,
+ nuint8 volNum,
+ pnuint16 usedDirectories,
+ pnuint16 usedFiles,
+ pnuint16 usedBlocks
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetObjDiskRestrictions
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNumber,
+ nuint32 objectID,
+ pnuint32 restriction,
+ pnuint32 inUse
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanVolDiskRestrictions
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ pnuint32 iterhandle,
+ NWVolumeRestrictions N_FAR * volInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanVolDiskRestrictions2
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ pnuint32 iterhandle,
+ NWVOL_RESTRICTIONS N_FAR * volInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWRemoveObjectDiskRestrictions
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ nuint32 objID
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWSetObjectVolSpaceLimit
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ nuint32 objID,
+ nuint32 restriction
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeInfoWithHandle
+(
+ NWCONN_HANDLE conn,
+ NWDIR_HANDLE dirHandle,
+ pnstr8 volName,
+ pnuint16 totalBlocks,
+ pnuint16 sectorsPerBlock,
+ pnuint16 availableBlocks,
+ pnuint16 totalDirEntries,
+ pnuint16 availableDirEntries,
+ pnuint16 volIsRemovableFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeInfoWithNumber
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ pnstr8 volName,
+ pnuint16 totalBlocks,
+ pnuint16 sectorsPerBlock,
+ pnuint16 availableBlocks,
+ pnuint16 totalDirEntries,
+ pnuint16 availableDirEntries,
+ pnuint16 volIsRemovableFlag
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeName
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ pnstr8 volName
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeNumber
+(
+ NWCONN_HANDLE conn,
+ const nstr8 N_FAR * volName,
+ pnuint16 volNum
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetVolumeStats
+(
+ NWCONN_HANDLE conn,
+ nuint8 volNum,
+ VOL_STATS N_FAR * volInfo
+);
+
+#if defined( N_PLAT_NLM )
+ #define NWGetExtendedVolumeInfo NWGetExtendedVolumeInfo2
+#endif
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWGetExtendedVolumeInfo
+(
+ NWCONN_HANDLE conn,
+ nuint16 volNum,
+ NWVolExtendedInfo N_FAR * volInfo
+);
+
+N_EXTERN_LIBRARY( NWCCODE )
+NWScanMountedVolumeList
+(
+ NWCONN_HANDLE conn,
+ nuint32 volRequestFlags,
+ nuint32 nameSpace,
+ pnuint32 iterHandle,
+ nuint32 numberItems,
+ pnuint32 numberReturned,
+ NWVolMountNumWithName N_FAR * volMountArr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "npackoff.h"
+#endif
diff --git a/LoginCapture/windows/external/xplatapi/include/unicode.h b/LoginCapture/windows/external/xplatapi/include/unicode.h
new file mode 100644
index 00000000..6468f2a9
--- /dev/null
+++ b/LoginCapture/windows/external/xplatapi/include/unicode.h
@@ -0,0 +1,1025 @@
+
+/*--------------------------------------------------------------------------
+
+ %name: unicode.h %
+ %version: 1 %
+ %date_modified: Mon Aug 08 13:09:11 2005 %
+ $Copyright:
+
+ Copyright (c) 1989-1995 Novell, Inc. All Rights Reserved.
+
+ THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
+ TREATIES. NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED
+ COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, CONDENSED,
+ EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, TRANSFORMED OR ADAPTED
+ WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, INC. ANY USE OR EXPLOITATION
+ OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO
+ CRIMINAL AND CIVIL LIABILITY.$
+
+--------------------------------------------------------------------------*/
+
+
+#if !defined( UNICODE_H )
+#define UNICODE_H
+
+#include /* size_t */
+
+#ifndef _SIZE_T_DEFINED
+#define _SIZE_T_DEFINED
+# ifndef _SIZE_T
+# define _SIZE_T
+# ifndef __size_t
+# define __size_t
+typedef unsigned int size_t;
+# endif
+# endif
+#endif
+
+#ifdef N_PLAT_OS2
+# define PN_API * N_API /* OS2 requires different declaration than MS */
+#else
+# define PN_API N_API *
+#endif
+
+#if !defined( NTYPES_H )
+# include "ntypes.h"
+#endif
+
+#if !defined _CONVERT_H
+/*
+ Data types
+*/
+#ifndef UNICODE_TYPE_DEFINED
+#define UNICODE_TYPE_DEFINED
+typedef unsigned short unicode; /* Unicode data must be 16 bits */
+#endif
+typedef unicode N_FAR * punicode;
+typedef unicode N_FAR * N_FAR * ppunicode;
+
+#define nwunisize(x) (sizeof(x)/sizeof(unicode))
+
+/*
+ Converter handle
+*/
+
+typedef void *CONVERT;
+typedef CONVERT N_FAR * pCONVERT;
+
+#endif
+
+
+/****************************************************************************/
+/*
+ Type definitions for converter based APIs
+*/
+
+/*
+ IBM C/Set compiler requires "typedef nint (* N_API xxx)"
+ MSW and NLM platforms require "typedef nint (N_API * xxx)"
+ The PN_API symbol is defined to satisfy both situations.
+*/
+
+/*
+ Function called when non-mappable bytes are found
+*/
+typedef nint (PN_API NMBYTE)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ punicode output, /* Pointer to current output position*/
+ nuint outputLeft, /* Space left in output buffer */
+ pnuint outputUsed, /* Space used in output buffer */
+ nuint8 N_FAR * badInput, /* Pointer to unmappable bytes */
+ nuint badInputSize /* Size of unmappable input */
+);
+
+/*
+ Function called when non-mappable unicode characters are found
+*/
+typedef nint (PN_API NMUNI)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ pnuint8 output, /* Pointer to current output position*/
+ nuint outputLeft, /* Space left in output buffer */
+ pnuint outputUsed, /* Space used in output buffer */
+ unicode N_FAR * badInput, /* Ptr to unmappable unicode chars */
+ nuint badInputSize /* Size of unmappable input */
+);
+
+/*
+ Function called to scan for special byte input
+*/
+typedef pnuint8 (PN_API SCBYTE)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ nuint8 N_FAR * input, /* Input to scan for special bytes */
+ nint scanmax /* Maximum # of bytes to scan or -1 */
+);
+
+/*
+ Function called to scan for special Unicode input
+*/
+typedef punicode (PN_API SCUNI)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ unicode N_FAR * input, /* Input to scan for special chars */
+ nint scanmax /* Maximum # of bytes to scan or -1 */
+);
+
+/*
+ Function called to parse special byte input
+*/
+typedef nint (PN_API PRBYTE)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ punicode output, /* Buffer for Unicode output */
+ nuint outputleft, /* Space left in output buffer */
+ pnuint outputUsed, /* Space used in output buffer */
+ nuint8 N_FAR * input, /* Buffer containing byte input */
+ pnuint inputUsed /* Number of bytes of input used */
+);
+
+/*
+ Function called to parse special Unicode input
+*/
+typedef nint (PN_API PRUNI)
+(
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ pnuint8 output, /* Buffer for bytes output */
+ nuint outputLeft, /* Space left in output buffer */
+ pnuint outputUsed, /* Space used in output buffer */
+ unicode N_FAR * input, /* Buffer containing byte input */
+ pnuint inputUsed /* Number of Unicodes of input used */
+);
+
+
+/****************************************************************************/
+/*
+ Macros used by and returned from converter based API calls
+ (i.e. NWUS*, NWUX*)
+*/
+
+/*
+ Novell-defined Unicode characters.
+ Consult with the Internationalization group before adding to this list.
+*/
+#define UNI_CHANGE_NAMESPACE 0xf8f4
+#define UNI_PREVIOUS_DIR 0xf8f5
+#define UNI_CURRENT_DIR 0xf8f6
+#define UNI_PATH_SEPARATOR 0xF8F7
+#define UNI_VOLUMENAME_ROOT 0xf8f8
+#define UNI_VOLUME_ROOT 0xf8f9
+#define UNI_NDS_ROOT 0xf8fa
+#define UNI_WILD_QMARK 0xf8fb
+#define UNI_WILD_ASTERISK 0xf8fc
+#define UNI_WILD_AUG_QMARK 0xf8fd
+#define UNI_WILD_AUG_ASTERISK 0xf8fe
+#define UNI_WILD_AUG_PERIOD 0xf8ff
+
+/*
+ Actions to take when an unmappable byte or uni character is encountered.
+ Used in SetNoMapAction call.
+*/
+#define NWU_UNCHANGED_ACTION -1 /* Leave action unchanged */
+#define NWU_RETURN_ERROR 0 /* Return error code NWU_UNMAPPABLE_CHAR */
+#define NWU_SUBSTITUTE 1 /* Use the current substitution character */
+#define NWU_CALL_HANDLER 2 /* Call the no map handler function */
+
+/*
+ Codes to enable the Scan and Parse handler functions.
+ Used in SetScanAction call.
+*/
+#define NWU_DISABLED 0 /* Disable Scan/Parse functions */
+#define NWU_ENABLED 2 /* Enable Scan/Parse functions */
+
+/*
+ Flags to pass to NWUXGetCaseConverter to specify whether to load
+ a converter which converts to upper, lower or title case.
+*/
+#define NWU_LOWER_CASE 0 /* Lower case */
+#define NWU_UPPER_CASE 1 /* Upper case */
+#define NWU_TITLE_CASE 2 /* Title case */
+
+/*
+ Flags to pass to NWUXGetNormalizeConverter to specify whether to
+ load a converter which converts to pre-composed or de-composed
+ unicode characters.
+*/
+#define NWU_PRECOMPOSED 0 /* Precomposed */
+#define NWU_DECOMPOSED 1 /* Decomposed */
+
+/*
+ For use in SetByte/UniFunction calls
+*/
+#define NWU_UNCHANGED_FUNCTION ((void N_FAR *)-1)
+#define NWU_RESET_TO_DEFAULT NULL
+
+/*
+ Error codes. FFFFFDE0 to FFFFFDFF reserved for new unicode APIs.
+*/
+#define NWU_NO_CONVERTER -544 /* Default converter not loaded */
+#define NWU_CONVERTER_NOT_FOUND -543 /* Converter file was not found */
+#define NWU_TOO_MANY_FILES -542 /* Too many open files */
+#define NWU_NO_PERMISSION -541 /* Access to file was denied */
+#define NWU_OPEN_FAILED -540 /* File open failed */
+#define NWU_READ_FAILED -539 /* File read failed */
+#define NWU_OUT_OF_MEMORY -538 /* Insufficient memory */
+#define NWU_CANT_LOAD_CONVERTER -537 /* Unable to load converter */
+#define NWU_CONVERTER_CORRUPT -536 /* The converter is invalid */
+#define NWU_NULL_HANDLE -535 /* Converter handle was NULL */
+#define NWU_BAD_HANDLE -534 /* Converter handle is invalid */
+#define NWU_HANDLE_MISMATCH -533 /* Handle doesn't match operation */
+#define NWU_UNMAPPABLE_CHAR -532 /* Unmappable character found */
+#define NWU_RANGE_ERROR -531 /* Invalid constant passed to fn */
+#define NWU_BUFFER_FULL -530 /* Buffer too small for output */
+#define NWU_INPUT_MAX -529 /* Processed max # of input chars */
+#define UNI_PARSER_ERROR -528 /* Error from user-written parser */
+#define NWU_OLD_CONVERTER_VERSION -527 /* Outdated converter DLL */
+#define NWU_UNSUPPORTED_AUX_FUNCTION -526 /* Unsupported AUX function */
+#define NWU_EMBEDDED_NULL -525 /* Embedded null in len spec string */
+#define NWU_GET_CODE_PAGE_FAILED -524 /* Failed to get system cp or cc */
+
+#define NWU_ILLEGAL_UTF8_CHARACTER -506 /* Cannot convert UTF8 char to Uni*/
+#define NWU_INSUFFICIENT_BUFFER -500
+
+
+/*
+ Error codes for translator based APIs (i.e. NW prefix)
+*/
+#define UNI_ALREADY_LOADED -489 /* Already loaded another country or code page */
+#define UNI_FUTURE_OPCODE -490 /* Rule table has unimplimented rules*/
+#define UNI_NO_SUCH_FILE -491 /* No such file or directory */
+#define UNI_TOO_MANY_FILES -492 /* Too many files already open */
+#define UNI_NO_PERMISSION -493 /* Permission denied on file open */
+#define UNI_NO_MEMORY -494 /* Not enough memory */
+#define UNI_LOAD_FAILED -495 /* NWLoadRuleTable failed, don't know why */
+#define UNI_HANDLE_BAD -496 /* Rule table handle was bad */
+#define UNI_HANDLE_MISMATCH -497 /* Rule table handle doesn't match operation*/
+#define UNI_RULES_CORRUPT -498 /* Rule table is corrupt */
+#define UNI_NO_DEFAULT -499 /* No default rule and no 'No map' character*/
+#define UNI_INSUFFICIENT_BUFFER -500
+#define UNI_OPEN_FAILED -501 /* Open failed in NWLoadRuleTable */
+#define UNI_NO_LOAD_DIR -502 /* Load directory could not be determined */
+#define UNI_BAD_FILE_HANDLE -503 /* File handle was bad */
+#define UNI_READ_FAILED -504 /* File read of rule table failed */
+#define UNI_TRANS_CORRUPT -505 /* Translator is corrupt */
+
+#define UNI_ILLEGAL_UTF8_CHARACTER -506 /* Illegal UTF-8 character encountered */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****************************************************************************/
+/*
+ Unicode converter prototypes - These APIs are preferred over the older
+ non-converter counterparts (i.e. NWUnicodeToLocal, NWLocalToUnicode, etc.)
+*/
+/*
+ These are the Standard API's
+*/
+N_EXTERN_LIBRARY(nint) NWUSStandardUnicodeInit
+( /* Initialize standard converters */
+ void
+);
+
+N_EXTERN_LIBRARY(nint) NWUSStandardUnicodeOverride
+( /* Replace standard converter. */
+ nuint codepage
+);
+
+N_EXTERN_LIBRARY(void) NWUSStandardUnicodeRelease
+( /* Release the standard converters */
+ void
+);
+
+N_EXTERN_LIBRARY(nint) NWUSGetCodePage
+( /* Get the native code page and country */
+ pnuint pCodePage,
+ pnuint pCountry
+);
+
+/* NOTE: The actualLength parameter returned by the conversion routines
+ does *not* include the null terminator.
+*/
+
+N_EXTERN_LIBRARY(nint) NWUSByteToUnicode
+( /* Convert bytes to Unicode */
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSByteToUnicodePath
+( /* Convert bytes to Unicode for file path */
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSLenByteToUnicode
+( /* Convert bytes to Unicode */
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ nint inLength, /* Input str length in bytes or -1 */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSLenByteToUnicodePath
+( /* Convert bytes to Unicode for file path */
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ nint inLength, /* Input str length in bytes or -1 */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToByte
+( /* Convert Unicode to bytes */
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToBytePath
+( /* Convert Unicode to bytes for file path */
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToUntermByte
+( /* Convert Unicode to bytes */
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToUntermBytePath
+( /* Convert Unicode to bytes for file path */
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToLowerCase
+( /* Convert Unicode to lower case */
+ punicode lowerCaseOutput,/* Buffer for lower cased output */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUSUnicodeToUpperCase
+( /* Convert Unicode to upper case */
+ punicode upperCaseOutput,/* Buffer for upper cased output */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+/*
+ These are the Extended API's
+*/
+N_EXTERN_LIBRARY(nint) NWUXLoadByteUnicodeConverter
+( /* Load a Byte <-> Unicode converter */
+ nuint codepage, /* Codepage number */
+ pCONVERT N_FAR * byteUniHandle /* Converter handle returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXLoadCaseConverter
+( /* Load a Unicode -> Case converter */
+ nuint caseFlag, /* Want upper, lower or title casing? */
+ pCONVERT N_FAR * caseHandle /* Converter handle returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXLoadCollationConverter
+( /* Load a Unicode -> Collation converter */
+ nuint countryCode, /* Country code for this locale */
+ pCONVERT N_FAR * collationHandle /* Converter handle returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXLoadNormalizeConverter
+( /* Load a Unicode -> Normalized converter */
+ nuint preDeFlag, /* Want precomposed or decomposed flag?*/
+ pCONVERT N_FAR * normalizeHandle /* Converter handle returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnloadConverter
+( /* Release a converter from memory */
+ pCONVERT converterHandle /* Handle to converter to be released */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXByteToUnicode
+( /* Convert bytes to Unicode */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXByteToUnicodePath
+( /* Convert bytes to Unicode for file path */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXLenByteToUnicode
+( /* Convert bytes to Unicode */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ nint inLength, /* Input str length in bytes or -1 */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXLenByteToUnicodePath
+( /* Convert bytes to Unicode for file path */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ punicode unicodeOutput, /* Buffer for resulting Unicode */
+ nuint outputBufferLen,/* Length of output buffer */
+ const nuint8 N_FAR * byteInput, /* Buffer for input bytes */
+ nint inLength, /* Input str length in bytes or -1 */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToByte
+( /* Convert Unicode to bytes */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToBytePath
+( /* Convert Unicode to bytes for file path */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToUntermByte
+( /* Convert Unicode to bytes */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToUntermBytePath
+( /* Convert Unicode to bytes for file path */
+ pCONVERT byteUniHandle, /* Handle to Byte <-> Uni converter*/
+ pnuint8 byteOutput, /* Buffer for output bytes */
+ nuint outputBufferLen,/* Length of output buffer */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in bytes */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToCase
+( /* Convert to upper, lower or title case */
+ pCONVERT caseHandle, /* Handle to converter */
+ punicode monocasedOutput,/* Buffer for output */
+ nuint outputBufferLen,/* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in uni chars */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToCollation
+( /* Convert Unicode to Collation weights */
+ pCONVERT collationHandle, /* Handle to converter */
+ punicode collationWeights,/* Buffer for collation weights */
+ nuint outputBufferLen, /* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in uni chars*/
+);
+
+N_EXTERN_LIBRARY(nint) NWUXUnicodeToNormalized
+( /* Convert Unicode to normalized */
+ pCONVERT normalizeHandle, /* Handle to converter */
+ punicode normalizedOutput,/* Buffer for normalized output */
+ nuint outputBufferLen, /* Length of output buffer. Or 0 */
+ const unicode N_FAR * unicodeInput, /* Buffer for Unicode input */
+ pnuint actualLength /* Length of results in uni chars*/
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetCharSize
+( /* Convert Unicode to bytes for file path */
+ pCONVERT byteUniHandle,/* Handle to Byte <-> Uni converter */
+ const nuint8 N_FAR * byteInput, /* Ptr to single or double-byte char */
+ pnuint pCharSize /* # bytes in character (1 or 2) */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetNoMapAction
+( /* Set action to be taken for no map chars */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ nint noMapByteAction, /* Action to take for unmappable bytes */
+ nint noMapUniAction /* Action to take for unmappable unicode */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetNoMapAction
+( /* Get action to be taken for no map chars */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ pnint noMapByteAction, /* Action to take for unmappable bytes */
+ pnint noMapUniAction /* Action to take for unmappable unicode */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetScanAction
+( /* Enable or disable scan/parse functions */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ nint scanByteAction, /* Set action for scan/parse byte functions */
+ nint scanUniAction /* Set action for scan/parse uni functions */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetScanAction
+( /* Get status of scan/parse functions */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ pnint scanByteAction, /* Status of scan/parse byte functions */
+ pnint scanUniAction /* Status of scan/parse uni functions */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetSubByte
+( /* Set substitution byte for converter */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ nuint8 substituteByte /* Byte to be substituted */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetSubByte
+( /* Get substitution byte for converter */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ pnuint8 substituteByte /* Substitution byte returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetSubUni
+( /* Set substitute uni char for converter */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ unicode substituteUni /* Unicode character to be substituted */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetSubUni
+( /* Get substitute uni char for converter */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ punicode substituteUni /* Substitution unicode char returned here */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetByteFunctions
+( /* Set up unmappable byte handling */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ NMBYTE noMapByteFunc, /* Function called for unmappable bytes */
+ SCBYTE scanByteFunc, /* Byte scanning function */
+ PRBYTE parseByteFunc /* Byte parsing function */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetByteFunctions
+( /* Get unmappable byte handling functions */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ NMBYTE N_FAR *noMapByteFunc,/* Handler function returned here */
+ SCBYTE N_FAR *scanByteFunc, /* Byte scanning function */
+ PRBYTE N_FAR *parseByteFunc /* Byte parsing function */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXSetUniFunctions
+( /* Set up unmappable character handling */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ NMUNI noMapUniFunc, /* Function called for unmappable uni chars */
+ SCUNI scanUniFunc, /* Unicode scanning function */
+ PRUNI parseUniFunc /* Unicode parsing function */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXGetUniFunctions
+( /* Set up unmappable unicode char handling */
+ pCONVERT byteUniHandle, /* Handle to a Byte <-> Unicode converter */
+ NMUNI N_FAR *noMapUniFunc, /* Function called for unmappable uni chars */
+ SCUNI N_FAR *scanUniFunc, /* Unicode scan function */
+ PRUNI N_FAR *parseUniFunc /* Unicode parse function */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXEnableOemEuro
+(
+ pCONVERT convert /* Set up converter to use the NW OEM Euro */
+);
+
+N_EXTERN_LIBRARY(nint) NWUXResetConverter
+(
+ pCONVERT convert /* Reset a converter to default state */
+);
+
+/****************************************************************************/
+
+/*
+ Table based Unicode/Local text conversion APIs. The converter based
+ APIs are preferred over these.
+*/
+N_EXTERN_LIBRARY(nint) NWInitUnicodeTables
+(
+ nint countryCode,
+ nint codePage
+);
+
+N_EXTERN_LIBRARY(NWRCODE) NWLSetPrimaryUnicodeSearchPath
+(
+ const nstr N_FAR *strSearchPath
+);
+
+N_EXTERN_LIBRARY(nint) NWFreeUnicodeTables
+(
+ void
+);
+
+N_EXTERN_LIBRARY(nint) NWLoadRuleTable
+(
+ pnstr ruleTableName, /* Name of the rule table */
+ pnptr ruleHandle /* Where to put the rule table handle */
+);
+
+N_EXTERN_LIBRARY(nint) NWUnloadRuleTable
+(
+ nptr ruleHandle /* Rule table handle */
+);
+
+
+#if defined N_PLAT_NLM
+
+/* NWUSByteToUnicode or NWUXByteToUnicode are preferred */
+N_EXTERN_LIBRARY(nint)
+NWLocalToUnicode /* Convert local to Unicode */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode */
+ nuint32 maxLen, /* Size of results buffer */
+ const void N_FAR * src, /* Buffer with source local code */
+ unicode noMap, /* No map character */
+ pnuint len, /* Number of unicode chars in output */
+ nuint32 allowNoMapFlag /* Flag indicating default map is allowable */
+);
+
+/* NWUSUnicodeToByte or NWUXUnicodeToByte are preferred */
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToLocal /* Convert Unicode to local code */
+(
+ nptr ruleHandle, /* Rule table handle */
+ nptr dest, /* Buffer for resulting local code */
+ nuint32 maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ nuint8 noMap, /* No Map character */
+ pnuint len, /* Number of bytes in output */
+ nuint32 allowNoMapFlag /* Flag indicating default map is allowable */
+);
+
+#if !defined(EXCLUDE_UNICODE_NLM_COMPATIBILITY_MACROS)
+#define NWLocalToUnicode(P1,P2,P3,P4,P5,P6) NWLocalToUnicode(P1,P2,P3,P4,P5,P6, 1)
+#define NWUnicodeToLocal(P1,P2,P3,P4,P5,P6) NWUnicodeToLocal(P1,P2,P3,P4,P5,P6, 1)
+#endif
+
+/* If I could make size_t be nuint32 for N_PLAT_NLM all of the functions */
+/* below here could be single sourced. */
+#if 0
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToCollation /* Convert Unicode to collation */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode weights*/
+ nuint32 maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ unicode noMap, /* No map character */
+ pnuint32 len /* Number of unicode chars in output */
+);
+
+N_EXTERN_LIBRARY(nint)
+NWUnicodeCompare /* Compare two unicode characters */
+(
+ nptr ruleHandle, /* Rule table handle */
+ unicode chr1, /* 1st character */
+ unicode chr2 /* 2nd character */
+);
+
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToMonocase /* Convert Unicode to collation */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode weights*/
+ nuint32 maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ pnuint32 len /* Number of unicode chars in output */
+);
+
+#endif
+
+#else /* not N_PLAT_NLM */
+
+/* NWUSByteToUnicode or NWUXByteToUnicode are preferred */
+N_EXTERN_LIBRARY(nint)
+NWLocalToUnicode /* Convert local to Unicode */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode */
+ size_t maxLen, /* Size of results buffer */
+ const nuint8 N_FAR * src, /* Buffer with source local code */
+ unicode noMap, /* No map character */
+ size_t N_FAR * len /* Number of unicode chars in output */
+);
+
+/* NWUSUnicodeToByte or NWUXUnicodeToByte are preferred */
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToLocal /* Convert Unicode to local code */
+(
+ nptr ruleHandle, /* Rule table handle */
+ pnuint8 dest, /* Buffer for resulting local code */
+ size_t maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ unsigned char noMap, /* No Map character */
+ size_t N_FAR * len /* Number of bytes in output */
+);
+
+#endif /* not N_PLAT_NLM */
+
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToCollation /* Convert Unicode to collation */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode weights*/
+ size_t maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ unicode noMap, /* No map character */
+ size_t N_FAR * len /* Number of unicode chars in output */
+);
+
+N_EXTERN_LIBRARY(nint)
+NWUnicodeCompare /* Compare two unicode characters */
+(
+ nptr ruleHandle, /* Rule table handle */
+ unicode chr1, /* 1st character */
+ unicode chr2 /* 2nd character */
+);
+
+N_EXTERN_LIBRARY(nint)
+NWUnicodeToMonocase /* Convert Unicode to collation */
+(
+ nptr ruleHandle, /* Rule table handle */
+ punicode dest, /* Buffer for resulting Unicode weights*/
+ size_t maxLen, /* Size of results buffer */
+ const unicode N_FAR * src, /* Buffer with source Unicode */
+ size_t N_FAR * len /* Number of unicode chars in output */
+);
+
+
+/*
+ * Functions that work with XLate Tables
+ */
+
+#if defined N_PLAT_DOS && defined N_UNI_NEW_TABLES
+
+# define N_UNI_LOAD_MONOCASE 0x0001
+# define N_UNI_LOAD_COLLATION 0x0002
+
+N_EXTERN_LIBRARY(nint) NWLInitXlateTables
+(
+ nint codePage,
+ nflag8 flags
+);
+
+N_EXTERN_LIBRARY(nint) NWLFreeXlateTables
+(
+ void
+);
+
+N_EXTERN_LIBRARY(nint) NWLLoadXlateTable
+(
+ pnstr ruleTableName, /* Name of the rule table */
+ pnptr ruleHandle /* Where to put the rule table handle */
+);
+
+N_EXTERN_LIBRARY(nint) NWLUnloadXlateTable
+(
+ const void N_FAR * ruleHandle /* Rule table handle */
+);
+
+# define NWInitUnicodeTables(CountryCode, CodePage) \
+ NWLInitXlateTables( \
+ CodePage, \
+ N_UNI_LOAD_MONOCASE | N_UNI_LOAD_COLLATION \
+ )
+# define NWFreeUnicodeTables NWLFreeXlateTables
+# define NWLoadRuleTable NWLLoadXlateTable
+# define NWUnloadRuleTable NWLUnloadXlateTable
+
+#endif
+
+
+N_EXTERN_LIBRARY(nint) NWGetUnicodeToLocalHandle
+(
+ pnptr handle
+);
+
+N_EXTERN_LIBRARY(nint) NWGetLocalToUnicodeHandle
+(
+ pnptr handle
+);
+
+N_EXTERN_LIBRARY(nint) NWGetMonocaseHandle
+(
+ pnptr handle
+);
+
+N_EXTERN_LIBRARY(nint) NWGetCollationHandle
+(
+ pnptr handle
+);
+
+/****************************************************************************/
+
+/*
+ Redefine these functions to use the new unicode API monocase routines.
+*/
+#ifdef N_PLAT_NLM
+# define uniicmp(s1, s2) nwusuniicmp(s1, s2)
+# define uninicmp(s1, s2, l) nwusuninicmp(s1, s2, l)
+#endif
+
+
+/*
+ Unicode string functions that work like those in string.h
+*/
+
+N_EXTERN_LIBRARY(punicode) unicat /* Corresponds to strcat */
+(
+ punicode s1, /* Original string */
+ const unicode N_FAR * s2 /* String to be appended */
+);
+
+N_EXTERN_LIBRARY(punicode) unichr /* Corresponds to strchr */
+(
+ const unicode N_FAR * s, /* String to be scanned */
+ unicode c /* Character to be found */
+);
+
+N_EXTERN_LIBRARY(punicode) unicpy /* Corresponds to strcpy */
+(
+ punicode s1, /* Destination string */
+ const unicode N_FAR * s2 /* Source string */
+);
+
+N_EXTERN_LIBRARY(size_t) unicspn /* Corresponds to strcspn */
+(
+ const unicode N_FAR * s1, /* String to be scanned */
+ const unicode N_FAR * s2 /* Character set */
+);
+
+N_EXTERN_LIBRARY(size_t) unilen /* Corresponds to strlen */
+(
+ const unicode N_FAR * s /* String to determine length of */
+);
+
+N_EXTERN_LIBRARY(punicode) unincat /* Corresponds to strncat */
+(
+ punicode s1, /* Original string */
+ const unicode N_FAR * s2, /* String to be appended */
+ size_t n /* Maximum characters to be appended */
+);
+
+N_EXTERN_LIBRARY(punicode) unincpy /* Corresponds to strncpy */
+(
+ punicode s1, /* Destination string */
+ const unicode N_FAR * s2, /* Source string */
+ size_t n /* Maximum length */
+);
+
+N_EXTERN_LIBRARY(punicode) uninset /* Corresponds to strnset */
+(
+ punicode s, /* String to be modified */
+ unicode c, /* Fill character */
+ size_t n /* Maximum length */
+);
+
+N_EXTERN_LIBRARY(punicode) unipbrk /* Corresponds to strpbrk */
+(
+ const unicode N_FAR * s1, /* String to be scanned */
+ const unicode N_FAR * s2 /* Character set */
+);
+
+N_EXTERN_LIBRARY (punicode) unipcpy /* Corresponds to strpcpy */
+(
+ punicode s1, /* Destination string */
+ const unicode N_FAR * s2 /* Source string */
+);
+
+N_EXTERN_LIBRARY(punicode) unirchr /* Corresponds to strrchr */
+(
+ const unicode N_FAR * s, /* String to be scanned */
+ unicode c /* Character to be found */
+);
+
+N_EXTERN_LIBRARY(punicode) unirev /* Corresponds to strrev */
+(
+ punicode s /* String to be reversed */
+);
+
+N_EXTERN_LIBRARY(punicode) uniset /* Corresponds to strset */
+(
+ punicode s, /* String to modified */
+ unicode c /* Fill character */
+);
+
+N_EXTERN_LIBRARY(size_t) unispn /* Corresponds to strspn */
+(
+ const unicode N_FAR * s1, /* String to be tested */
+ const unicode N_FAR * s2 /* Character set */
+);
+
+N_EXTERN_LIBRARY(punicode) unistr /* Corresponds to strstr */
+(
+ const unicode N_FAR * s1, /* String to be scanned */
+ const unicode N_FAR * s2 /* String to be located */
+);
+
+N_EXTERN_LIBRARY(punicode) unitok /* Corresponds to strtok */
+(
+ punicode s1, /* String to be parsed */
+ const unicode N_FAR * s2 /* Delimiter values */
+);
+
+N_EXTERN_LIBRARY(nint) uniicmp /* Corresponds to stricmp */
+(
+ const unicode N_FAR * s1, /* 1st string to be compared */
+ const unicode N_FAR * s2 /* 2nd string to be compared */
+);
+
+N_EXTERN_LIBRARY(nint) uninicmp /* Corresponds to strnicmp */
+(
+ const unicode N_FAR * s1, /* 1st string to be compared */
+ const unicode N_FAR * s2, /* 2nd string to be compared */
+ size_t len /* Maximum length */
+);
+
+N_EXTERN_LIBRARY(nint) unicmp /* Unicode compare */
+(
+ const unicode N_FAR * s1,
+ const unicode N_FAR * s2
+);
+
+N_EXTERN_LIBRARY(nint) unincmp /* Unicode length compare */
+(
+ const unicode N_FAR * s1,
+ const unicode N_FAR * s2,
+ size_t len
+);
+
+N_EXTERN_LIBRARY(size_t) unisize /* Corresponds to sizeof */
+(
+ const unicode N_FAR * s
+);
+
+/*
+ * UTF-8 <--> Unicode Conversion APIS
+ */
+N_EXTERN_LIBRARY(nint) NWLUnicodeToUTF8
+(
+ const unicode N_FAR * uniStr,
+ nuint maxSize,
+ pnuint8 utf8Str,
+ pnuint utf8Size
+);
+
+N_EXTERN_LIBRARY(nint) NWLUTF8ToUnicode
+(
+ const nuint8 N_FAR * utf8Str,
+ nuint maxSize,
+ punicode uniStr,
+ pnuint uniSize,
+ ppnstr badSequence
+);
+
+N_EXTERN_LIBRARY(nint) NWLUTF8ToUnicodeSize
+(
+ const nuint8 N_FAR * utf8Str,
+ pnuint size
+);
+
+N_EXTERN_LIBRARY(nuint) NWLUnicodeToUTF8Size
+(
+ const unicode N_FAR * uniStr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/****************************************************************************/
+
diff --git a/LoginCapture/windows/lcredmgr.cpp b/LoginCapture/windows/lcredmgr.cpp
new file mode 100644
index 00000000..34cb109d
--- /dev/null
+++ b/LoginCapture/windows/lcredmgr.cpp
@@ -0,0 +1,1075 @@
+/***********************************************************************
+ * File: lcredmgr.cpp
+ * Author: Todd Throne (tthrone@novell.com)
+ *
+ * Abstract: Implements the credential manager.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Following are registry entries, which must be created in order
+ * to run this credential manager;
+ *
+ * [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\NetworkProvider\Order
+ * "ProviderOrder"=LCredMgr,(original string)
+ * [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LCredMgr\networkprovider
+ * "Class"=dword:00000002
+ * "Name"="LoginCapture Credential Provider"
+ * "ProviderPath"="
+ *
+ * Following are registry entries, which must be created in order
+ * to run this notification dll;
+ *
+ * [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\LCredMgr]
+ * "Asynchronous"=dword:00000001
+ * "DLLName"="LCredMgr.dll"
+ * "Impersonate"=dword:00000001
+ * "Logoff"="NPLogoff"
+ *
+ ***********************************************************************/
+
+#include "lcredmgr.h"
+#include
+
+//===[ External data ]=====================================================
+
+//===[ Manifest constants ]================================================
+
+//
+// The authentication type is only used here in a Unicode context
+//
+#define MSV1_0_AUTH_TYPE L"MSV1_0:Interactive"
+#define KERB_AUTH_TYPE L"Kerberos:Interactive"
+#define WNNC_CRED_MANAGER 0xFFFF0000
+
+#define WINDOWS_LOGON_ID 1
+
+//===[ Type definitions ]==================================================
+
+//===[ Function prototypes ]===============================================
+
+BOOL WriteLogFile(LPTSTR String);
+
+DWORD
+APIENTRY
+NPGetCaps (
+ DWORD ndex
+ );
+
+DWORD
+APIENTRY
+NPLogonNotify (
+ PLUID lpLogonId,
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ LPWSTR *lpLogonScript
+ );
+
+DWORD
+APIENTRY
+NPPasswordChangeNotify (
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ DWORD dwChangeInfo
+ );
+
+//===[ Global variables ]==================================================
+
+HMODULE g_hModule;
+HANDLE g_hModuleMutex = NULL;
+BOOLEAN g_bLibraryLoaded = FALSE;
+
+HINSTANCE g_hCASALibrary;
+
+PSETCREDENTIAL pCASASetCredential;
+POPENCACHE pCASAOpenCache;
+PCLOSECACHE pCASACloseCache;
+
+#ifdef _DEBUG
+
+void
+DebugPrint
+(
+ char *format,
+ ...
+)
+{
+ va_list parameters; /* Pointer to parameters on the stack */
+ char newString[600] = {"=> LCredMgr: "};
+ /*
+ Get a pointer to the parameters
+ */
+ va_start(parameters, format);
+ vsprintf( &newString[13], format, parameters );
+ OutputDebugStringA(newString);
+
+}
+
+#endif
+
+//++=======================================================================
+BOOL
+APIENTRY
+DllMain (
+ HANDLE hInst,
+ DWORD dwReason,
+ LPVOID lpReserved
+ )
+//=======================================================================--
+{
+
+#ifdef _DEBUG
+ DebugPrint("DllMain called.\n");
+#endif
+
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+
+ DisableThreadLibraryCalls((HINSTANCE)hInst);
+
+ g_hModule = (HMODULE)hInst;
+
+ g_hModuleMutex = CreateMutex(NULL, FALSE, NULL);
+
+ if (g_hModuleMutex == NULL)
+ {
+ return(FALSE);
+ }
+
+ InitLoginExtension();
+
+ //
+ // Always succeed, this allows us to be configured with regsvr32.exe
+ //
+
+ break;
+
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+
+ case DLL_PROCESS_DETACH:
+ CloseHandle(g_hModuleMutex);
+ break;
+ }
+
+ return TRUE;
+}
+
+//++=======================================================================
+DWORD
+WINAPI
+NPGetCaps (
+ DWORD nIndex
+ )
+//
+// PURPOSE: This entry point is called to query the provider. The parameter
+// is an index representing the query. For a credential manager
+// only the following index values apply:
+//
+// WNNC_SPEC_VERSION - What version of the provider specification
+// was used in developing this provider? The return value is
+// the version number.
+//
+// WNNC_DRIVER_VERSION - The version of the provider.
+//
+// WNNC_START - Will the provider start? When? The return values
+// are:
+//
+// - 0 : Only return this if the provider will *not* start.
+// - Estimated Start time in milliseconds : This is how
+// long the provider is expected to take to start.
+// - 0xFFFFFFFF : Time to start is unknown.
+// - 1 : Provider is already started.
+//
+// A return value of 0 in other cases indicates that the query
+// is not supported.
+//=======================================================================--
+{
+ DWORD dwRes;
+
+#ifdef _DEBUG
+ DebugPrint("NPGetCaps called with nIndex %u.\n", nIndex);
+#endif
+
+ switch (nIndex)
+ {
+ case WNNC_NET_TYPE:
+ dwRes = WNNC_CRED_MANAGER;
+ break;
+
+ case WNNC_SPEC_VERSION:
+ dwRes = WNNC_SPEC_VERSION51; // We are using version 5.1 of the spec.
+ break;
+
+ case WNNC_DRIVER_VERSION:
+ dwRes = 1; // This driver is version 1.
+ break;
+
+ case WNNC_START:
+ dwRes = 1; // We are already "started"
+ break;
+
+ default:
+ dwRes = 0; // We don't support anything else
+ break;
+ }
+
+#ifdef _DEBUG
+ DebugPrint("NPGetCaps returning dwRes %u.\n", dwRes);
+#endif
+
+ return dwRes;
+}
+
+
+//++=======================================================================
+BOOLEAN
+InitCASALibrary (
+ )
+//
+// PURPOSE: Loads the micasa dll entry points.
+//=======================================================================--
+{
+ BOOLEAN bLibraryLoaded = TRUE;
+
+ if (g_bLibraryLoaded == FALSE)
+ {
+ WaitForSingleObjectEx(g_hModuleMutex, INFINITE, FALSE);
+ bLibraryLoaded = FALSE;
+
+ if (g_bLibraryLoaded == FALSE)
+ {
+ g_hCASALibrary = LoadLibrary(L"micasa.dll");
+
+ if (g_hCASALibrary)
+ {
+ pCASASetCredential = (PSETCREDENTIAL)GetProcAddress(g_hCASALibrary, "miCASASetCredential");
+ pCASAOpenCache = (POPENCACHE)GetProcAddress(g_hCASALibrary, "miCASAOpenSecretStoreCache");
+ pCASACloseCache = (PCLOSECACHE)GetProcAddress(g_hCASALibrary, "miCASACloseSecretStoreCache");
+
+ bLibraryLoaded = TRUE;
+ g_bLibraryLoaded = TRUE;
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("LoadLibrary for micasa.dll failed. %d\n", GetLastError());
+ }
+#endif
+ }
+
+ ReleaseMutex(g_hModuleMutex);
+ }
+
+ return bLibraryLoaded;
+}
+
+
+//++=======================================================================
+DWORD
+WINAPI
+NPLogonNotify (
+ PLUID lpLogonId,
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ LPWSTR *lpLogonScript
+ )
+//
+// PURPOSE: This entry point is called when a user logs on. If the user
+// authentication fails here, the user will still be logged on
+// to the local machine.
+//=======================================================================--
+{
+ int ccode;
+ PMSV1_0_INTERACTIVE_LOGON pAuthInfo;
+ SSCS_BASIC_CREDENTIAL basicCredential;
+ SSCS_SECRET_ID_T desktopCredential;
+ SSCS_SECRET_ID_T domainCredential;
+ SSCS_EXT_T extension;
+ BOOLEAN bLibraryLoaded;
+
+#ifdef _DEBUG
+ DebugPrint("NPLogonNotify called.\n");
+#endif
+
+ SetLastError(NO_ERROR);
+
+ bLibraryLoaded = InitCASALibrary();
+
+ if (bLibraryLoaded == FALSE)
+ {
+ SetLastError(NO_ERROR);
+ return NO_ERROR;
+ }
+
+ //
+ // If the primary authenticator is not MSV1_0, return success.
+ // Why? Because this is the only auth info structure that we
+ // understand and we don't want to interact with other types.
+ //
+
+ if (!lstrcmpiW (MSV1_0_AUTH_TYPE, lpAuthentInfoType))
+ {
+#ifdef _DEBUG
+ DebugPrint("NPLogonNotify auth type is MSV1_0_AUTH_TYPE.\n");
+#endif
+ }
+ else if (!lstrcmpiW (KERB_AUTH_TYPE, lpAuthentInfoType))
+ {
+#ifdef _DEBUG
+ DebugPrint("NPLogonNotify auth type is KERB_AUTH_TYPE.\n");
+#endif
+ }
+ else
+ {
+#ifdef _DEBUG
+ DebugPrint("NPLogonNotify auth type is UNSUPPORTED.\n");
+#endif
+
+ SetLastError(NO_ERROR);
+ return NO_ERROR;
+ }
+
+ if ((wcscmp(L"SvcCtl", lpStationName)) == 0)
+ {
+#ifdef _DEBUG
+ DebugPrint("NPLogonNotify stationname indicates a service has logged on.\n");
+#endif
+ return NO_ERROR;
+ }
+
+ //
+ // Do something with the authentication information
+ //
+
+ pAuthInfo = (PMSV1_0_INTERACTIVE_LOGON) lpAuthentInfo;
+
+ basicCredential.unLen = WideCharToMultiByte(
+ CP_UTF8,
+ 0,
+ pAuthInfo->UserName.Buffer,
+ -1,
+ (LPSTR)&basicCredential.username,
+ NSSCS_MAX_USERID_LEN,
+ NULL,
+ NULL);
+
+ if (basicCredential.unLen)
+ {
+// basicCredential.unLen++;
+
+ basicCredential.pwordLen = WideCharToMultiByte(
+ CP_UTF8,
+ 0,
+ pAuthInfo->Password.Buffer,
+ -1,
+ (LPSTR)&basicCredential.password,
+ NSSCS_MAX_PWORD_LEN,
+ NULL,
+ NULL);
+
+ if (basicCredential.pwordLen)
+ {
+// basicCredential.pwordLen++;
+
+ strcpy((char *)&desktopCredential.id, "Desktop");
+ desktopCredential.len = (long)strlen((char *)&desktopCredential.id) + 1;
+
+ basicCredential.unFlags = USERNAME_TYPE_CN_F;
+
+ extension.extID = WINDOWS_LOGON_ID;
+ extension.version = 0x00010000; // 1.0.0
+ extension.ext = (void *)lpLogonId;
+
+ ccode = (*pCASASetCredential)(
+ 0,
+ &desktopCredential,
+ NULL,
+ SSCS_CRED_TYPE_BASIC_F,
+ &basicCredential,
+ &extension);
+
+#ifdef _DEBUG
+ if (!ccode)
+ {
+ DebugPrint("NSSCSSetCredential successful!.\n");
+ }
+ else
+ {
+ DebugPrint("NSSCSSetCredential failed 0x%X\n", ccode);
+ }
+#endif
+
+ if (pAuthInfo->LogonDomainName.Length != 0)
+ {
+ domainCredential.len = WideCharToMultiByte(
+ CP_UTF8,
+ 0,
+ pAuthInfo->LogonDomainName.Buffer,
+ -1,
+ (LPSTR)&domainCredential.id,
+ NSSCS_MAX_SECRET_ID_LEN,
+ NULL,
+ NULL);
+
+ if (domainCredential.len)
+ {
+// domainCredential.len++;
+
+#ifdef _DEBUG
+ DebugPrint("Domain exists - [%s], length %d\n", domainCredential.id, domainCredential.len);
+#endif
+
+ ccode = (*pCASASetCredential)(
+ 0,
+ &desktopCredential,
+ &domainCredential,
+ SSCS_CRED_TYPE_BASIC_F,
+ &basicCredential,
+ &extension);
+
+#ifdef _DEBUG
+ if (!ccode)
+ {
+ DebugPrint("NSSCSSetCredential successful!.\n");
+ }
+ else
+ {
+ DebugPrint("NSSCSSetCredential failed 0x%X\n", ccode);
+ }
+#endif
+ }
+
+ }
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("WideCharToMultiByte for password failed.\n");
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("WideCharToMultiByte for user name failed.\n");
+ }
+#endif
+
+ return NO_ERROR;
+}
+
+//++=======================================================================
+DWORD
+WINAPI
+NPPasswordChangeNotify (
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ DWORD dwChangeInfo
+ )
+//
+// PURPOSE: This function is used to notify a credential manager provider
+// of a password change (or, more accurately, an authentication
+// information change) for an account.
+//=======================================================================--
+{
+// return NO_ERROR;
+#ifdef _DEBUG
+ DebugPrint("NPPasswordChangeNotify called.\n");
+#endif
+ return WN_NOT_SUPPORTED;
+}
+
+//++=======================================================================
+VOID
+WINAPI
+NPLogoff(
+ PWLX_NOTIFICATION_INFO pInfo
+ )
+//=======================================================================--
+{
+ DWORD dwSize;
+ TOKEN_STATISTICS tokenStats;
+ SSCS_SECRETSTORE_T ssId;
+ HANDLE context;
+ BOOLEAN bLibraryLoaded;
+
+#ifdef _DEBUG
+ DebugPrint("NPLogoff called.\n");
+#endif
+
+ dwSize = sizeof(tokenStats);
+
+ if (GetTokenInformation(
+ pInfo->hToken,
+ TokenStatistics,
+ &tokenStats,
+ dwSize,
+ &dwSize))
+ {
+#ifdef _DEBUG
+ DebugPrint("GetTokenInformation for statistics returned LowPart 0x%X HighPart 0x%X\n", tokenStats.AuthenticationId.LowPart, tokenStats.AuthenticationId.HighPart);
+#endif
+
+
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("GetTokenInformation for TokenStatistics failed %u\n", GetLastError());
+ }
+#endif
+
+ bLibraryLoaded = TRUE;
+ WaitForSingleObjectEx(g_hModuleMutex, INFINITE, FALSE);
+
+ if (g_bLibraryLoaded == FALSE)
+ {
+#ifdef _DEBUG
+ DebugPrint("Library not loaded in NPLogoff.\n");
+#endif
+ bLibraryLoaded = FALSE;
+ }
+
+ ReleaseMutex(g_hModuleMutex);
+
+ if (bLibraryLoaded == FALSE)
+ {
+ return;
+ }
+
+ ssId.version = NSSCS_VERSION_NUMBER;
+ strcpy((char *)ssId.ssName, (char *)SSCS_DEFAULT_SECRETSTORE_ID);
+
+ context = (*pCASAOpenCache)(
+ &ssId,
+ 0,
+ NULL);
+
+ if (context)
+ {
+ //
+ // the SSFLAG_DESTROY_SESSION_F closes the session for this user
+ //
+
+ (*pCASACloseCache)(
+ context,
+ SSFLAG_DESTROY_SESSION_F,
+ NULL);
+ }
+
+ return;
+}
+
+//++=======================================================================
+DWORD
+AddSubString(
+ HKEY hKey
+)
+//=======================================================================--
+{
+ LONG rc;
+ CHAR szValue[256],
+ szNewValue[256];
+ DWORD valueSize;
+
+
+ valueSize = sizeof(szValue);
+
+ rc = RegQueryValueExA(
+ hKey,
+ "ProviderOrder",
+ 0,
+ NULL,
+ (PUCHAR)szValue,
+ &valueSize);
+
+ if (rc == S_OK)
+ {
+ strcpy (szNewValue, "LCredMgr,");
+ strcat (szNewValue, szValue);
+
+ rc = RegSetValueExA(
+ hKey,
+ "ProviderOrder",
+ 0,
+ REG_SZ,
+ (PUCHAR)szNewValue,
+ (DWORD) strlen(szNewValue));
+ }
+
+ return rc;
+}
+
+//++=======================================================================
+DWORD
+RemoveSubString(
+ HKEY hKey
+)
+//=======================================================================--
+{
+ LONG rc;
+ CHAR szValue[256],
+ szNewValue[256];
+ PCHAR subString, startString, endString;
+ DWORD valueSize;
+
+
+ valueSize = sizeof(szValue);
+
+ rc = RegQueryValueExA(
+ hKey,
+ "ProviderOrder",
+ 0,
+ NULL,
+ (PUCHAR)szValue,
+ &valueSize);
+
+ if (rc == S_OK)
+ {
+ //
+ // Remove any leading whitespace
+ //
+
+ subString = szValue;
+
+ while (*subString != NULL && (*subString == ',' || *subString == ' '))
+ {
+ subString++;
+ }
+
+ startString = subString;
+
+ //
+ // Check to see if lcredmgr is in the string
+ //
+
+ if ((subString = strstr(startString, "LCredMgr")) != NULL)
+ {
+ if (subString == startString)
+ {
+ while (*subString != ',' && *subString != NULL)
+ {
+ subString++;
+ }
+
+ while ((*subString == ',' || *subString == ' ') && *subString != NULL)
+ {
+ subString++;
+ }
+
+ startString = subString;
+ }
+ else
+ {
+ endString = subString + 8;
+
+ //
+ // Back up past any whitespace or comma's.
+ //
+
+ for (subString--;;subString--)
+ {
+ if (*subString != ' ' && *subString != ',')
+ {
+ *(subString + 1) = '\0';
+ break;
+ }
+ }
+
+ //
+ // Get past any comma's
+ //
+
+ for (;;endString++)
+ {
+ if (*endString == NULL)
+ {
+ break;
+ }
+
+ if ((*endString != ',' && *endString != ' '))
+ {
+ //
+ // concat the two strings without lcredmgr
+ //
+
+ strcpy (szNewValue, startString);
+ strcat (szNewValue, endString);
+ startString = szNewValue;
+
+ break;
+ }
+ }
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "ProviderOrder",
+ 0,
+ REG_SZ,
+ (PUCHAR)startString,
+ (DWORD) strlen(startString));
+ }
+ }
+
+ return rc;
+}
+
+//++=======================================================================
+HRESULT
+DllInstall(
+ BOOL bInstall,
+ LPCWSTR pszCmdLine
+)
+//=======================================================================--
+{
+ HKEY hKey;
+ LONG rc;
+ CHAR szModule[256];
+ DWORD value, valueSize;
+
+#ifdef _DEBUG
+ DebugPrint("DllInstall called\n");
+ OutputDebugStringW(pszCmdLine);
+#endif
+
+
+ if (bInstall == TRUE)
+ {
+ rc = RegCreateKeyExA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Control\\NetworkProvider\\Order",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hKey,
+ NULL);
+
+ if (rc == S_OK)
+ {
+ rc = RemoveSubString(hKey);
+
+ if (rc == S_OK)
+ {
+ rc = AddSubString(hKey);
+ }
+
+ RegCloseKey(hKey);
+ }
+
+ //
+ // Set up our service key
+ //
+
+ if (rc == S_OK)
+ {
+ rc = RegCreateKeyExA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\LCredMgr\\networkprovider",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hKey,
+ NULL);
+
+ if (rc == S_OK)
+ {
+ value = 2;
+
+ rc = RegSetValueExA(
+ hKey,
+ "Class",
+ 0,
+ REG_DWORD,
+ (BYTE *)&value,
+ sizeof(value));
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "Name",
+ 0,
+ REG_SZ,
+ (BYTE *)"LoginCapture Credential Provider",
+ 32);
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ valueSize = GetModuleFileNameA((HMODULE)g_hModule, szModule, sizeof(szModule));
+
+ if (valueSize)
+ {
+ rc = RegSetValueExA(
+ hKey,
+ "ProviderPath",
+ 0,
+ REG_SZ,
+ (BYTE *)szModule,
+ valueSize + 1);
+ }
+ else
+ {
+ rc = GetLastError();
+ }
+
+ RegCloseKey(hKey);
+ }
+ }
+
+ if (rc == S_OK)
+ {
+ rc = RegCreateKeyExA(
+ HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\LCredMgr",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hKey,
+ NULL);
+
+ if (rc == S_OK)
+ {
+ value = 1;
+
+ rc = RegSetValueExA(
+ hKey,
+ "Asynchronous",
+ 0,
+ REG_DWORD,
+ (BYTE *)&value,
+ sizeof(value));
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "DLLName",
+ 0,
+ REG_SZ,
+ (BYTE *)szModule,
+ valueSize + 1);
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "Impersonate",
+ 0,
+ REG_DWORD,
+ (BYTE *)&value,
+ sizeof(value));
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "Logoff",
+ 0,
+ REG_SZ,
+ (BYTE *)"NPLogoff",
+ 9);
+
+ RegCloseKey(hKey);
+ }
+ }
+
+ if (rc == S_OK)
+ {
+ rc = RegCreateKeyExA(
+ HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Novell\\Graphical Login\\NWLGE\\LCredMgr",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hKey,
+ NULL);
+
+ if (rc == S_OK)
+ {
+ rc = RegSetValueExA(
+ hKey,
+ "LoginExtName",
+ 0,
+ REG_SZ,
+ (BYTE *)szModule,
+ valueSize + 1);
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ rc = RegSetValueExA(
+ hKey,
+ "LoginExtDesc",
+ 0,
+ REG_SZ,
+ (BYTE *)"CASA Login Extension",
+ 20);
+
+ if (rc != S_OK)
+ {
+ goto ErrorExit;
+ }
+
+ value = 0x00008002;
+
+ rc = RegSetValueExA(
+ hKey,
+ "LoginExtType",
+ 0,
+ REG_DWORD,
+ (BYTE *)&value,
+ sizeof(value));
+
+ErrorExit:
+ RegCloseKey(hKey);
+ }
+ }
+ }
+ else
+ {
+ rc = RegCreateKeyExA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Control\\NetworkProvider\\Order",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hKey,
+ NULL);
+
+ if (rc == S_OK)
+ {
+ RemoveSubString(hKey);
+
+ RegCloseKey(hKey);
+ }
+
+ //
+ // Delete our service key
+ //
+
+ RegDeleteKeyA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\LCredMgr\\Enum");
+
+ RegDeleteKeyA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\LCredMgr\\networkprovider");
+
+ RegDeleteKeyA(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\LCredMgr");
+
+ RegDeleteKeyA(
+ HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\LCredMgr");
+
+ RegDeleteKeyA(
+ HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Novell\\Graphical Login\\NWLGE\\LCredMgr");
+ }
+
+#ifdef _DEBUG
+ if (rc == S_OK)
+ {
+ DebugPrint("DllInstall successful.\n");
+ }
+ else
+ {
+ DebugPrint("DllInstall failed.\n");
+ }
+#endif
+
+ return rc;
+}
+
+//++=======================================================================
+STDAPI
+DllRegisterServer(
+ void
+ )
+//=======================================================================--
+{
+#ifdef _DEBUG
+ DebugPrint("DllRegisterServer called\n");
+#endif
+
+ return S_OK;
+}
+
+//++=======================================================================
+STDAPI
+DllUnregisterServer(
+ void
+ )
+//=======================================================================--
+{
+#ifdef _DEBUG
+ DebugPrint("DllUnregisterServer called\n");
+#endif
+
+ return S_OK;
+}
+
+//=========================================================================
+//=========================================================================
+
diff --git a/LoginCapture/windows/lcredmgr.def b/LoginCapture/windows/lcredmgr.def
new file mode 100644
index 00000000..a3903f3a
--- /dev/null
+++ b/LoginCapture/windows/lcredmgr.def
@@ -0,0 +1,12 @@
+; lcredmgr.def : Declares the module parameters for the DLL.
+
+LIBRARY lcredmgr.dll
+
+EXPORTS
+ NPGetCaps
+ NPLogonNotify
+ NPPasswordChangeNotify
+ NPLogoff
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
+ DllInstall PRIVATE
diff --git a/LoginCapture/windows/lcredmgr.h b/LoginCapture/windows/lcredmgr.h
new file mode 100644
index 00000000..0059792b
--- /dev/null
+++ b/LoginCapture/windows/lcredmgr.h
@@ -0,0 +1,93 @@
+/***********************************************************************
+ * File: lcredmgr.h
+ * Author: Todd Throne (tthrone@novell.com)
+ *
+ * Abstract: Implements the credential manager.
+ *
+ * Copyright (C) 2004 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+// Insert your headers here
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+#define UNICODE
+#define _UNICODE
+
+#include
+
+#ifdef _DEBUG
+#include
+#include
+#endif
+
+//#include
+//#include
+//#include
+#include
+#include
+
+#include "micasa.h"
+#include "micasa_mgmd.h"
+
+#include "npapi.h"
+
+//===[ Function prototypes ]===============================================
+
+typedef
+int
+(STDAPICALLTYPE *PSETCREDENTIAL)(
+ unsigned long ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ int credentialType, // IN
+ void * credential, // IN
+ SSCS_EXT_T * ext // Reserved
+ );
+
+typedef
+void *
+(STDAPICALLTYPE *POPENCACHE)(
+ SSCS_SECRETSTORE_T * ssid,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+ );
+
+typedef
+int
+(STDAPICALLTYPE *PCLOSECACHE)(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+ );
+
+
+void
+InitLoginExtension(
+ );
+
+BOOLEAN
+InitCASALibrary (
+ );
+
+void
+DebugPrint
+(
+ char *format,
+ ...
+);
+
+
diff --git a/LoginCapture/windows/lextend.cpp b/LoginCapture/windows/lextend.cpp
new file mode 100644
index 00000000..877ebf8a
--- /dev/null
+++ b/LoginCapture/windows/lextend.cpp
@@ -0,0 +1,498 @@
+/***********************************************************************
+ * File: lcredmgr.cpp
+ * Author: Todd Throne (tthrone@novell.com)
+ *
+ * Abstract: Stores the credentials gathered during traditional
+ * client login in CASA.
+ *
+ * Copyright (C) 2005 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Following are registry entries, which must be created in order
+ * to run this login extension;
+ *
+ * [HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Graphical Login\NWLGE\LCredMgr]
+ * "LoginExtName"="lcredmgr.dll"
+ * "LoginExtDesc"="CASA Login Extension"
+ * "LoginExtType"=DWORD:00008002 // means MASTER + AUTHENTICATE
+ *
+ ***********************************************************************/
+
+//===[ Header files specific to this module ]==============================
+
+#include "lcredmgr.h"
+
+#define N_PLAT_MSW4
+#define N_ARCH_32
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+//===[ External data ]==============================
+
+extern PSETCREDENTIAL pCASASetCredential;
+
+//===[ External prototypes ]==============================
+
+//===[ Manifest constants ]==============================
+
+//===[ Type definitions ]==============================
+
+//===[ Function Prototypes ]==============================
+
+N_TYPEDEF_CALLBACK(NWDSCCODE,pNWDSCreateContext)(NWDSContextHandle N_FAR *);
+N_TYPEDEF_CALLBACK(NWDSCCODE,pNWDSSetContext)(NWDSContextHandle,nint,nptr);
+N_TYPEDEF_CALLBACK(NWDSCCODE,pNWDSWhoAmI)(NWDSContextHandle,pnstr8);
+N_TYPEDEF_CALLBACK(NWDSCCODE,pNWDSFreeContext)(NWDSContextHandle);
+
+N_TYPEDEF_CALLBACK(NWCCODE,pNWLoginExtInit)(pNWLGAccessRec*,pNWVersion,pNWVersion,nptr,nptr);
+N_TYPEDEF_CALLBACK(NWCCODE,pNWLGGetLoginData)(nint,nint,nptr,nint);
+
+//===[ Global Variables ]==============================
+
+NWLGAccessRec g_NextAccess = {0, 0, 0}, *g_pAccess = 0;
+BOOL g_passwordChanged = FALSE;
+
+//++=======================================================================
+int
+SetCredentialsInWallet(
+ pnstr pTree,
+ pnstr pUser,
+ nint passwordLen,
+ pnstr pPassword
+ )
+//=======================================================================--
+{
+ int ccode;
+ SSCS_BASIC_CREDENTIAL basicCredential;
+ SSCS_SECRET_ID_T traditionalClient;
+ SSCS_SECRET_ID_T tree;
+ BOOLEAN bLibraryLoaded;
+
+
+#ifdef _DEBUG
+ DebugPrint("Tree name [%s]\n", pTree);
+ DebugPrint("User name [%s]\n", pUser);
+ DebugPrint("Password [%s]\n", pPassword);
+#endif
+
+ bLibraryLoaded = InitCASALibrary();
+
+ if (bLibraryLoaded == FALSE)
+ {
+ SetLastError(NO_ERROR);
+ return NO_ERROR;
+ }
+
+ strcpy((char *)&traditionalClient.id, "Traditional_Client");
+ traditionalClient.len = (long)strlen((char *)&traditionalClient.id) + 1;
+
+ strcpy((char *)&tree.id, pTree);
+ strupr((char *)&tree.id);
+ tree.len = (long)strlen((char *)&tree.id) + 1;
+
+ basicCredential.unFlags = USERNAME_TYPE_NDS_FDN_F;
+
+ if (!pUser)
+ {
+ //
+ // Logout trying to clear the credentials
+ //
+
+ basicCredential.unLen = 0;
+ basicCredential.pwordLen = 0;
+
+ ccode = (*pCASASetCredential)(
+ 0,
+ &traditionalClient,
+ &tree,
+ SSCS_CRED_TYPE_BASIC_F,
+ &basicCredential,
+ NULL);
+
+#ifdef _DEBUG
+ DebugPrint("miCASASetCredential returned 0x%x\n", ccode);
+#endif
+ }
+ else
+ {
+ basicCredential.pwordLen = passwordLen;
+
+ if (passwordLen)
+ {
+ strcpy((char *)&basicCredential.password, pPassword);
+ basicCredential.pwordLen++;
+ }
+
+ strcpy((char *)&basicCredential.username, pUser);
+ basicCredential.unLen = (unsigned long)strlen((char *)&basicCredential.username) + 1;
+
+ ccode = (*pCASASetCredential)(
+ 0,
+ &traditionalClient,
+ &tree,
+ SSCS_CRED_TYPE_BASIC_F,
+ &basicCredential,
+ NULL);
+
+#ifdef _DEBUG
+ DebugPrint("miCASASetCredential returned 0x%x\n", ccode);
+#endif
+ }
+
+ return (ccode);
+}
+
+//++=======================================================================
+int
+GetUserFDN(
+ pnstr pTree,
+ pnstr pUser
+ )
+//=======================================================================--
+{
+ int ccode;
+ HMODULE hInst;
+ NWDSContextHandle hContext;
+ pNWDSCreateContext pfCreateContext;
+ pNWDSSetContext pfSetContext;
+ pNWDSWhoAmI pfWhoAmI;
+ pNWDSFreeContext pfFreeContext;
+
+ hInst = GetModuleHandle(L"NETWIN32.DLL");
+
+ pfCreateContext = (pNWDSCreateContext)GetProcAddress(hInst,"NWDSCreateContextHandle");
+ pfSetContext = (pNWDSSetContext)GetProcAddress(hInst,"NWDSSetContext");
+ pfWhoAmI = (pNWDSWhoAmI)GetProcAddress(hInst,"NWDSWhoAmI");
+ pfFreeContext = (pNWDSFreeContext)GetProcAddress(hInst,"NWDSFreeContext");
+
+ if (!pfCreateContext
+ || !pfSetContext
+ || !pfWhoAmI
+ || !pfFreeContext)
+ {
+ return -1;
+ }
+
+ ccode = pfCreateContext(&hContext);
+
+ if (ccode == SUCCESS)
+ {
+ pfSetContext(hContext, DCK_TREE_NAME, pTree);
+ pfSetContext(hContext, DCK_NAME_CONTEXT, "[root]");
+
+ ccode = pfWhoAmI(hContext, pUser);
+
+#ifdef _DEBUG
+ DebugPrint("NWDSWhoAmI returned 0x%x\n", ccode);
+#endif
+ pfFreeContext(hContext);
+ }
+
+ return ccode;
+}
+
+
+//++=======================================================================
+N_GLOBAL_CALLBACK(NWCCODE)
+OurEventHandler(
+ pNWLGAccessRec pAccess,
+ nint event,
+ nint eventType,
+ nint eventSubType,
+ nparam parm1,
+ nparam parm2,
+ nflag32 flags
+ )
+//=======================================================================--
+{
+ pNWLGGetLoginData pGetLoginData;
+ pNWLGStartInfo data;
+ HMODULE hInst;
+ NWCCODE rc, retCode = NWLG_EVT_OK;
+ char szUserFDN[MAX_DN_BYTES];
+
+
+
+ switch (event)
+ {
+ case NWLG_PRE_SCRIPTS:
+#ifdef _DEBUG
+ DebugPrint("EventHandler called with NWLG_PRE_SCRIPTS.\n");
+#endif
+
+ case NWLG_SYNC_PWD_END:
+#ifdef _DEBUG
+ DebugPrint("EventHandler called with NWLG_SYNC_PWD_END.\n");
+#endif
+ hInst = GetModuleHandle(L"LGNWNT32.DLL");
+
+ pGetLoginData = (pNWLGGetLoginData)GetProcAddress(hInst,"NWLGGetLoginData");
+
+ if (pGetLoginData)
+ {
+ rc = pGetLoginData(NWLG_SD_START_INFO, 0, &data, sizeof(&data));
+
+ if (rc == NWLG_OK)
+ {
+ if (data
+ && data->password
+ && data->restartMode != 2)
+ {
+ if (g_passwordChanged == FALSE)
+ {
+ rc = GetUserFDN(data->tree, szUserFDN);
+
+ if (rc == SUCCESS)
+ {
+#ifdef _DEBUG
+ DebugPrint("GetUserFDN returned user [%s]\n", szUserFDN);
+#endif
+ SetCredentialsInWallet(
+ data->tree,
+ szUserFDN,
+ data->passwordLen,
+ data->password);
+ }
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("Credentials not set since password changed flag = TRUE.\n");
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("No NWLG_SD_START_INFO returned from NWLGGetLoginData or no password data or invalid restartMode.\n");
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("GetLoginData for NWLG_SD_START_INFO failed. 0x%X\n", rc);
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("GetProcAddress for NWLGGetLoginData failed, module handle 0x%x, error %d\n", hInst, GetLastError());
+ }
+#endif
+ break;
+
+ case NWLG_TERMINATE:
+#ifdef _DEBUG
+ DebugPrint("EventHandler called with NWLG_TERMINATE.\n");
+#endif
+
+ // We have to unchain here !
+ pAccess->pEventHandler = g_NextAccess.pEventHandler;
+ }
+
+ // It is time to chain to the default handler, which will take care of
+ // all events (because our DLL is a master extension, not a secondary,
+ // and does not handle events as expected from master extension).
+ // The default handler was copied when our DLL was initialized.
+ if (g_NextAccess.pEventHandler)
+ {
+ retCode = (*g_NextAccess.pEventHandler)
+ (pAccess,event,eventType,eventSubType,parm1,parm2,flags);
+ }
+
+ return (retCode);
+}
+
+//++=======================================================================
+N_GLOBAL_CALLBACK(NWCCODE)
+OurIOHandler(
+ pNWLGAccessRec pAccess,
+ nint ioEvent,
+ nparam param1,
+ nparam param2,
+ nflag32 flags
+ )
+//=======================================================================--
+{
+ pNWLGGetLoginData pGetLoginData;
+ pNWLGStartInfo data;
+ HINSTANCE hInst;
+ NWCCODE rc, rcode = NWLG_OK;
+ char szUserFDN[MAX_DN_BYTES];
+
+
+ switch (ioEvent)
+ {
+#ifdef _DEBUG
+ DebugPrint("IOHandler called.\n");
+#endif
+ case NWLG_IO_CHANGE_PWD:
+#ifdef _DEBUG
+ DebugPrint("IOHandler called with NWLG_IO_CHANGE_PWD.\n");
+#endif
+ if (g_NextAccess.pIOHandler)
+ {
+ rcode = g_NextAccess.pIOHandler(pAccess, ioEvent, param1, param2, flags);
+
+ if (NWLG_CANCEL != pAccess->status)
+ {
+ hInst = GetModuleHandle(L"LGNWNT32.DLL");
+
+ pGetLoginData = (pNWLGGetLoginData)GetProcAddress(hInst,"NWLGGetLoginData");
+
+ if (pGetLoginData)
+ {
+ rc = pGetLoginData(NWLG_SD_START_INFO, 0, &data, sizeof(&data));
+
+ if (rc == NWLG_OK)
+ {
+ if (data
+ && param1
+ && ((pNWLGUserID)param1)->password)
+ {
+ if (data->restartMode != 2)
+ {
+ g_passwordChanged = TRUE;
+
+ rc = GetUserFDN(data->tree, szUserFDN);
+
+ if (rc == SUCCESS)
+ {
+#ifdef _DEBUG
+ DebugPrint("GetUserFDN returned user [%s]\n", szUserFDN);
+#endif
+ SetCredentialsInWallet(
+ data->tree,
+ szUserFDN,
+ (unsigned long)strlen(((pNWLGUserID)param1)->password),
+ ((pNWLGUserID)param1)->password);
+ }
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("Invalid restartMode.\n");
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("No NWLG_SD_START_INFO returned from NWLGGetLoginData or no password data.\n");
+ }
+#endif
+
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("GetLoginData for NWLG_SD_START_INFO failed. 0x%X\n", rc);
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("GetProcAddress for NWLGGetLoginData failed, module handle 0x%x, error %d\n", hInst, GetLastError());
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("Password change cancelled by previous IOHandler!\n");
+ }
+#endif
+ }
+#ifdef _DEBUG
+ else
+ {
+ DebugPrint("Previous IOHandler not presend?!\n");
+ }
+#endif
+
+ break;
+
+ default:
+
+ if (g_NextAccess.pIOHandler)
+ {
+ rcode = g_NextAccess.pIOHandler(pAccess, ioEvent, param1, param2, flags);
+ }
+ }
+
+ return (rcode);
+}
+
+//++=======================================================================
+void
+InitLoginExtension(
+ )
+//=======================================================================--
+{
+ NWCCODE ccode;
+ HINSTANCE hInst;
+ NWVersion versionSupported, runtimeVersion;
+ pNWLoginExtInit pLoginExtInit;
+
+
+ hInst = GetModuleHandle(L"LGNWNT32.DLL");
+
+ if (hInst)
+ {
+ pLoginExtInit = (pNWLoginExtInit)GetProcAddress(hInst,"NWLoginExtInit");
+
+ if (pLoginExtInit)
+ {
+ versionSupported.major = 1;
+ versionSupported.minor = 0;
+ versionSupported.revision = 0;
+
+ ccode = pLoginExtInit(
+ &g_pAccess,
+ &versionSupported,
+ &runtimeVersion,
+ NULL,
+ NULL);
+
+ if (ccode == NWLG_OK)
+ {
+ // Save off the old pointers
+
+ g_NextAccess = *g_pAccess;
+
+ if (g_pAccess)
+ {
+ g_pAccess->pIOHandler = OurIOHandler;
+ g_pAccess->pEventHandler = (pEvtHndlr)OurEventHandler;
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+//=========================================================================
+//=========================================================================
diff --git a/LoginCapture/windows/lextend.h b/LoginCapture/windows/lextend.h
new file mode 100644
index 00000000..55fd078c
--- /dev/null
+++ b/LoginCapture/windows/lextend.h
@@ -0,0 +1,72 @@
+/***********************************************************************
+ * File: lextend.h
+ * Author: Todd Throne (tthrone@novell.com)
+ *
+ * Abstract: Implements a novell client login extension.
+ *
+ * Copyright (C) 2005 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+#ifndef __LEXTEND_H_
+#define __LEXTEND_H_
+
+//===[ Include files ]=====================================================
+
+#define N_PLAT_MSW4
+#define N_ARCH_32
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#include
+
+#include
+#include
+
+#include "nwalias.h"
+#include "nwlgext.h"
+
+//===[ Manifest constants ]================================================
+
+//===[ Macro definitions ]==============================
+
+#define NcSeverityBuild(severity, errorcode) \
+ ((NCSTATUS)(((severity) << 30) | (errorcode)))
+
+//===[ Type definitions ]==================================================
+
+//===[ Function prototypes ]===============================================
+
+void
+DebugPrint
+(
+ char *format,
+ ...
+);
+
+NCSTATUS
+SetCredentialsInWallet(
+ SCHANDLE hSC,
+ pnstr pTree,
+ pnstr pUser,
+ nint passwordLen,
+ pnstr pPassword
+ );
+
+#endif //__LEXTEND_H_
+
+//=========================================================================
+//=========================================================================
+
diff --git a/LoginCapture/windows/micasa.h b/LoginCapture/windows/micasa.h
new file mode 100644
index 00000000..79b7ba4d
--- /dev/null
+++ b/LoginCapture/windows/micasa.h
@@ -0,0 +1,483 @@
+/**************************************************************************
+* %name: micasa.h %
+* %instance: security_2 %
+* %version: 1 %
+* %created_by: jnorman %
+* %date_modified: Mon Aug 08 13:06:34 2005 %
+***************************************************************************
+* This is the SecretStore Client Service IDK Interfaces
+***************************************************************************/
+
+#ifndef _MICASA_H_
+#define _MICASA_H_
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C"
+{
+#endif
+
+#include "micasa_mgmd.h"
+
+
+
+
+
+/***************************************************************************
+*** All strings are length preceeded and the lengths include the NULL.
+***************************************************************************/
+
+
+/***************************************************************************
+*** most apis use a parameter called ssFlags, defined here
+***************************************************************************/
+#define SSFLAG_DESTROY_SESSION_F 0x00000001L // used with miCASACloseSecretStoreCache
+
+
+#define SSCS_SESSION_KEY_CHAIN_F 0x00000002L
+#define SSCS_LOCAL_KEY_CHAIN_F 0x00000004L
+#define SSCS_REMOTE_KEY_CHAIN_F 0x00000008L
+
+
+// ######################### FIRST RELEASE ############################
+// Session key chain is maintained only in only in cache during the usr session */
+/* FLAGS: (SSCS_SESSION_KEY_CHAIN_F) */
+#define SSCS_S_KC_ID_F (SSCS_SESSION_KEY_CHAIN_F)
+#define SSCS_S_KC_ID_CHARS 26
+static SS_UTF8_T SSCS_SESSION_KEY_CHAIN_ID[] = {"SSCS_SESSION_KEY_CHAIN_ID"};
+// {'S','S','C','S','_','S','E','S','S','I','O','N','_','K','E','Y','_','C','H','A','I','N','_','I','D', 0};
+// ######################### FIRST RELEASE ############################
+
+// ######################### FUTURE RELEASE ############################
+// Persistent Private Keychain:
+// A Local keychain that is cached and is persistent */
+#define SSCS_PPV_KC_ID_F SSCS_SL_KC_ID_F
+#define SSCS_PPV_KC_CHARS 24
+#define SSCS_PERSISTENT_PRIVATE_KEYCHAIN_ID SSCS_LOCAL_KEY_CHAIN_ID
+
+
+// Public Keychain:
+// A Remote keychain that is cached locally only for the user session
+#define SSCS_PB_KC_F SSCS_SR_KC_ID_F
+#define SSCS_PB_KC_ID_CHARS 25
+#define SSCS_PUBLIC_KEYCHAIN_ID SSCS_REMOTE_KEY_CHAIN_ID
+
+
+// Persistent Public Keychain:
+// A Remote keychain that is cached locally and is persistent */
+#define SSCS_PPB_KC_F SSCS_SLR_KC_ID_F
+#define SSCS_PPB_KC_ID_CHARS 31
+#define SSCS_PERSISTENT_PUBLIC_KEYCHAIN_ID SSCS_LOCAL_REMOTE_KEY_CHAIN_ID
+// ######################### FUTURE RELEASE ############################
+
+// Default SecretID
+static SS_UTF8_T SECRET_ID_DEFAULT[] = {"Default_Credential"};
+#define SECRET_ID_DEFAULT_LEN 19
+
+// Known keys for Shared Secret format
+// ===============================================
+static SS_UTF8_T SHS_PASSWORD[] = {"Password"};
+// {'P','a','s','s','s','w','o','r','d','=',0};
+#define SHS_PASSWORD_LEN 9
+
+static SS_UTF8_T SHS_USERNAME[] = {"Username"};
+// {'U','s','e','r','n','a','m','e','=',0};
+#define SHS_USER_NAME_LEN 9
+
+static SS_UTF8_T SHS_OTHER[] = {"Other"};
+//{'O','t','h','e','r','=',0};
+#define SHS_OTHER_LEN 6
+
+static SS_UTF8_T SHS_BINARY[] = {"Binary"};
+//{'B','i','n','a','r','y','=',0};
+#define SHS_BINARY_LEN 7
+
+// Common Name
+static SS_UTF8_T SHS_CN[] = {"CN"};
+//{'C','N','=',0};
+#define SHS_CN_LEN 3
+
+// LDAP DN
+static SS_UTF8_T SHS_DN_LDAP[] = {"DN_LDAP"};
+//{'D','N','L','D','A','P','=',0};
+#define SHS_DNLDAP_LEN 8
+
+// NDAP DN
+static SS_UTF8_T SHS_DN_NDAP[] = {"DN_NDAP"};
+//{'D','N','N','D','A','P','=',0};
+#define SHS_DNNDAP_LEN 8
+
+// EMAIL NAME
+static SS_UTF8_T SHS_EMAIL[] = {"EMAIL"};
+//{'E','M','A','I','L','=',0};
+#define SHS_EMAIL_LEN 6
+
+
+
+/* STANDARD KEYCHAIN IDs */
+
+/* Persistent local keychain that is cached */
+/* FLAGS: (SSCS_SESSION_KEY_CHAIN_F | SSCS_LOCAL_KEY_CHAIN_F) */
+#define SSCS_SL_KC_ID_F (SSCS_SESSION_KEY_CHAIN_F | SSCS_LOCAL_KEY_CHAIN_F)
+#define SSCS_SL_KC_ID_CHARS 24
+// #define SSCS_SL_KC_LEN 48
+static SS_UTF8_T SSCS_LOCAL_KEY_CHAIN_ID[] = {"SSCS_LOCAL_KEY_CHAIN_ID"};
+// {'S','S','C','S','_','L','O','C','A','L','_','K','E','Y','_','C','H','A','I','N','_','I','D', 0};
+//
+/* A Remote keychain that is cached locally only for the user session
+/* FLAGS: (SSCS_SESSION_KEY_CHAIN_F | SSCS_REMOTE_KEY_CHAIN_F) */
+#define SSCS_SR_KC_ID_F (SSCS_SESSION_KEY_CHAIN_F | SSCS_REMOTE_KEY_CHAIN_F)
+#define SSCS_SR_KC_ID_CHARS 25
+// #define SSCS_SR_KC_ID_LEN 50
+static SS_UTF8_T SSCS_REMOTE_KEY_CHAIN_ID[] = {"SSCS_REMOTE_KEY_CHAIN_ID"};
+// {'S','S','C','S','_','R','E','M','O','T','E','_','K','E','Y','_','C','H','A','I','N','_','I','D', 0};
+
+/* A Remote keychain that is cached locally and is persistent */
+/* FLAGS: (SSCS_SESSION_KEY_CHAIN_F | SSCS_REMOTE_KEY_CHAIN_F | SSCS_LOCAL_KEY_CHAIN_F) */
+#define SSCS_SLR_KC_ID_F (SSCS_SESSION_KEY_CHAIN_F | SSCS_REMOTE_KEY_CHAIN_F | SSCS_LOCAL_KEY_CHAIN_F)
+#define SSCS_SLR_KC_ID_CHARS 31
+// #define SSCS_SLR_KC_ID_LEN 62
+static SS_UTF8_T SSCS_LOCAL_REMOTE_KEY_CHAIN_ID[] = {"SSCS_LOCAL_REMOTE_KEY_CHAIN_ID"};
+// {'S','S','C','S','_','L','O','C','A','L','_','R','E','M','O','T','E','_','K','E','Y','_','C','H','A','I','N','_','I','D', 0};
+
+
+#define NSSCS_VERSION_NUMBER 0x00040000L // client version Major 04 Minor 00 Revision 01
+ // the final release will be 4.0.0
+
+
+#define NSSCS_MIN_SECRET_BUF_LEN 3968 //* (4K-128)to match server
+#define NSSCS_MID_SECRET_BUF_LEN 32768 //* (4K-128)to match server
+#define NSSCS_MAX_SECRET_BUF_LEN 60416 //* (59K)to match server
+#define NSSCS_MAX_PWORD_HINT_LEN 128 //* maximum hint (bytes)
+
+
+#define NSSCS_MAX_KEYCHAIN_ID_LEN 256 //* in bytes including NULL
+
+#define NSSCS_MAX_NUM_OF_DEFAULT_KEYCHAINS 6
+
+#define NSSCS_MIN_IDLIST_BUF_LEN 16384 //* (16K)
+#define NSSCS_MID_IDLIST_BUF_LEN 32768 //* (32K)
+#define NSSCS_MAX_IDLIST_BUF_LEN 65536 //* (64kK)
+#define NSSCS_JUMBO_IDLIST_BUF_LEN 131072 //* (128K)
+#define NSSCS_JUMBO_ENUM_BUF_LEN 131072 //* (128K)
+#define NSSCS_ENUM_BUFFER_GUESS 32768 //* (32K)
+#define NSSCS_ENUM_DELIM ((SS_UTF8_T)'*') //* immutable
+#define NSSCS_MAX_SRCH_KEY_LEN 128 //* maximum hint (bytes)
+
+#define SSCS_APPLICATION_TYPE_F 0x00000001L
+#define SSCS_CREDENTIAL_TYPE_F 0x00000002L
+
+
+
+static SS_UTF8_T SSCS_DEFAULT_SECRETSTORE_ID[] = {"SecretStore"};
+//{'S','e','c','r','e','t','S','t','o','r','e', 0};
+#define SSCS_DEFAULT_SECRETSTORE_ID_LEN 12
+
+
+static SS_UTF8_T SSCS_CRED_SET[] = {"SS_CredSet"};
+//{'S','S','_','C','r','e','d','S','e','t', 0};
+#define SSCS_CRED_SET_LEN 10
+
+static SS_UTF8_T SSCS_BINARY_SECRET[] = {"SS_Binary"};
+//{'S','S','_','B','i','n','a','r','y', 0};
+#define SSCS_BINARY_CHARS 9
+
+static SS_UTF8_T APP_DELIMITER[] = {":"};
+#define APP_DELIMITER_LEN 2
+
+static SS_UTF8_T CREDSET_DELIMITER[] = {"="};
+#define CREDSET_DELIMITER_LEN 2
+
+static SS_UTF8_T BINARY_DELIMITER[] = {"="};
+#define BINARY_DELIMITER_LEN 2
+
+
+#define SSCS_MASTER_PASSWORD 1
+#define SSCS_ENHANCED_PROTECTION_PASSWORD 2
+#define SSCS_DIRECTORY_PASSWORD 1
+
+
+typedef struct _sscs_password
+{
+ unsigned long pwordType;
+ unsigned long pwordLen; // enhanced protection len & pword to set
+ SS_UTF8_T pword[NSSCS_MAX_PWORD_LEN]; // * should be passed in # of chars
+} SSCS_PASSWORD_T;
+
+
+typedef struct _sscs_sh_secret_id
+{
+ int type; // The shared secret type i.e. SS_App or SS_CredSet
+ int len; // except that it excludes the header and is not escaped.
+ SS_UTF8_T name[NSSCS_MAX_SECRET_ID_LEN]; // The shared secret name. This is the same as the identifier
+} SSCS_SH_SECRET_ID_T;
+
+
+typedef struct _sscs_passcode
+{
+ int passcodeType;
+ void *passcodeHandle; // can be password structure or other types of structures.
+} SSCS_PASSCODE_T;
+
+
+typedef struct _sscs_secretstore
+{
+ unsigned int version;
+ SS_UTF8_T ssName[NSSCS_MAX_SECRET_ID_LEN];
+} SSCS_SECRETSTORE_T;
+
+typedef struct _ssscs_read_extension
+{
+ unsigned long statFlags; //* OUT - return flags on the secret
+ unsigned long crtStamp; //* OUT - secret creation time stamp
+ unsigned long latStamp; //* OUT - last accessed time stamp (optional)
+ unsigned long lmtStamp; //* OUT - last modified time stamp
+} SSCS_READEXT_T;
+
+typedef struct _sscs_hint
+{
+ unsigned long hintLen;
+ SS_UTF8_T hint[NSSCS_MAX_PWORD_HINT_LEN]; //* should be passed in # of chars
+} SSCS_HINT_T;
+
+
+typedef struct _sscs_secretstore_info
+{
+ unsigned int numKeyChains;
+ unsigned int enumBufsize;
+} SSCS_SECRETSTORE_INFO_T;
+
+typedef struct _sscs_srch_key
+{
+ unsigned long srchKeyLen;
+ SS_UTF8_T srchKey[NSSCS_MAX_SRCH_KEY_LEN]; //* should be passed in # of chars
+} SSCS_SRCH_KEY_T;
+
+
+typedef struct _sscs_sh_secret_ID_List
+{
+ unsigned long enumHandle; // set to 0 to begin with
+ unsigned long returnedIDs; // to be initialized by the caller to the array size
+ SSCS_SH_SECRET_ID_T *secIDList; //* an array of secret IDs structures.
+} SSCS_SH_SECRET_ID_LIST_T;
+
+typedef struct _sscs_keychain_id
+{
+ unsigned long len;
+ SS_UTF8_T keychainID[NSSCS_MAX_SECRET_ID_LEN];
+} SSCS_KEYCHAIN_ID_T;
+
+typedef struct _sscs_keychain_id_list
+{
+ unsigned long enumHandle; // set to 0 to begin with
+ unsigned long returnedIDs; // to be initialized by the caller to the array size
+ SSCS_KEYCHAIN_ID_T *keyChainIDList; //* an array of keychainID structures
+} SSCS_KEYCHAIN_ID_LIST_T;
+
+
+
+
+// **************************************************************
+// * The following functions will be exposed as exported API:
+// **************************************************************
+// * SSCS APIs below export the interface for applications.
+// * Support APIs are needed for populating or extracting data
+// * from a Shared Secret.
+// **************************************************************
+
+SSCS_EXTERN_LIBCALL_PTR(void)
+miCASAOpenSecretStoreCache
+(
+ SSCS_SECRETSTORE_T * ssid,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+);
+
+
+SSCS_EXTERN_LIBCALL(int)
+miCASACloseSecretStoreCache
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAReadSecret
+(
+ void * context,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ unsigned long ssFlags,
+ void * secretHandle,
+ SSCS_SH_SECRET_ID_T * sharedSecretID,
+ SSCS_PASSWORD_T * epPassword,
+ SSCS_READEXT_T * readData,
+ SSCS_EXT_T * ext
+);
+
+
+SSCS_EXTERN_LIBCALL(int)
+miCASARemoveSecret
+(
+ void * context,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ unsigned long ssFlags,
+ SSCS_SH_SECRET_ID_T * sharedSecretID,
+ SSCS_PASSWORD_T * epPassword,
+ SSCS_EXT_T * ext
+);
+
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAWriteSecret
+(
+ void * context,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ unsigned long ssFlags,
+ void * secretHandle,
+ SSCS_SH_SECRET_ID_T * sharedSecretID,
+ SSCS_PASSWORD_T * epPassword,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAGetStoreInformation
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_SECRETSTORE_INFO_T * ssInfo,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAEnumerateSecretIDs
+(
+ void * context,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ unsigned long ssFlags,
+ SSCS_SRCH_KEY_T * searchKey,
+ SSCS_SH_SECRET_ID_LIST_T * secretIDList,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASARemoveSecretStore
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASASetMasterPassword
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_PASSWORD_T * password,
+ SSCS_HINT_T * hint,
+ SSCS_EXT_T * ext
+);
+
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAUnlockSecrets
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_PASSWORD_T * password,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASALockStore
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAUnlockStore
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_PASSCODE_T * passcode,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAEnumerateKeyChainIDs
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_SRCH_KEY_T * searchKey,
+ SSCS_KEYCHAIN_ID_LIST_T * kcIDList,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASAAddKeyChain
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ SSCS_EXT_T * ext
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASARemoveKeyChain
+(
+ void * context,
+ unsigned long ssFlags,
+ SSCS_KEYCHAIN_ID_T * keyChainID,
+ SSCS_EXT_T * ext
+);
+
+
+//**************************************************************
+//* Support Functions for processing (populating or extracting)
+//* data components from Shared Secrets
+//**************************************************************
+SSCS_EXTERN_LIBCALL_PTR(void)
+miCASA_CreateSHSHandle();
+
+SSCS_EXTERN_LIBCALL(int)
+miCASA_DestroySHSHandle(void *secretHandle); // in
+
+
+SSCS_EXTERN_LIBCALL(int)
+miCASA_GetNextSHSEntry
+(
+ int restart,
+ void *secretHandle,
+ unsigned long *keyLen,
+ SS_UTF8_T *key,
+ unsigned long *valLen,
+ unsigned char *value
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASA_AddSHSEntry
+(
+ void *secretHandle,
+ SS_UTF8_T *key,
+ unsigned long valueLen,
+ unsigned char *value
+);
+
+SSCS_EXTERN_LIBCALL(int)
+miCASA_RemoveSHSEntry
+(
+ void *secretHandle,
+ SS_UTF8_T *key,
+ unsigned long valueLen,
+ unsigned char *value
+);
+
+
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* _miCASA_H */
diff --git a/LoginCapture/windows/micasa.lib b/LoginCapture/windows/micasa.lib
new file mode 100644
index 00000000..fcd5e438
Binary files /dev/null and b/LoginCapture/windows/micasa.lib differ
diff --git a/LoginCapture/windows/micasa_mgmd.h b/LoginCapture/windows/micasa_mgmd.h
new file mode 100644
index 00000000..1d791cf3
--- /dev/null
+++ b/LoginCapture/windows/micasa_mgmd.h
@@ -0,0 +1,440 @@
+/**************************************************************************
+* %name: micasa_mgmd.h %
+* %instance: security_2 %
+* %version: 1 %
+* %created_by: jnorman %
+* %date_modified: Mon Aug 08 13:06:38 2005 %
+***************************************************************************
+* This is the Managed IDK for collaborating suite of applications
+***************************************************************************/
+
+#ifndef _MICASA_MANAGED_H_
+#define _MICASA_MANAGED_H_
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C"
+{
+#endif
+
+/***************************************************************************
+*** All strings are length preceeded and the lengths include the NULL.
+***************************************************************************/
+
+
+
+#if defined(WIN32)
+
+ #define SSCS_GLOBAL_LIBCALL_PTR(RET) RET * __stdcall
+ #define SSCS_GLOBAL_LIBCALL(RET) RET __stdcall
+ #define SSCS_EXTERN_LIBCALL_PTR(RET) extern RET * __stdcall
+ #define SSCS_EXTERN_LIBCALL(RET) extern RET __stdcall
+ #define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR) typedef RET * (__stdcall *PTR)
+ #define SSCS_TYPEDEF_LIBCALL(RET, PTR) typedef RET (__stdcall *PTR)
+
+#else
+
+ #define SSCS_GLOBAL_LIBCALL_PTR(RET) RET *
+ #define SSCS_GLOBAL_LIBCALL(RET) RET
+ #define SSCS_EXTERN_LIBCALL_PTR(RET) extern RET *
+ #define SSCS_EXTERN_LIBCALL(RET) extern RET
+ #define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR) typedef RET * (*PTR)
+ #define SSCS_TYPEDEF_LIBCALL(RET, PTR) typedef RET (*PTR)
+
+#endif /* WIN32 */
+
+
+#ifndef _MICASA_TYPES_H_
+#define _MICASA_TYPES_H_
+
+#if defined(WIN32)
+#include
+
+ typedef unsigned __int64 uint64_t;
+ typedef signed __int64 int64_t;
+ typedef unsigned int uint32_t;
+ typedef signed int int32_t;
+ typedef unsigned short uint16_t;
+ typedef signed short int16_t;
+ typedef unsigned char uint8_t;
+ typedef signed char int_t;
+
+#else
+
+#include
+#include
+#endif
+
+
+#ifndef _SSUTF8_H_
+/* defining the utf8 for SSCS */
+typedef unsigned char SS_UTF8_T;
+#endif
+
+#define NSSCS_MAX_USERID_LEN 256 //* max username (bytes)
+#define NSSCS_MAX_PWORD_LEN 128 //* max password (bytes)
+#define NSSCS_MAX_SECRET_ID_LEN 512 //* in bytes including NULL
+
+// used to denote what structure is being used for the credentials
+#define SSCS_CRED_TYPE_BASIC_F 0x00000001L
+
+// used to denote the type of username being requested or set
+#define USERNAME_TYPE_CN_F 0x00000000L // default behavior
+#define USERNAME_TYPE_NDS_DN_F 0x00000001L
+#define USERNAME_TYPE_NDS_FDN_F 0x00000002L
+#define USERNAME_TYPE_LDAP_DN_F 0x00000004L
+#define USERNAME_TYPE_EMAIL_F 0x00000008L
+#define USERNAME_TYPE_OTHER_F 0x00000010L
+
+typedef struct _sscs_secret_id
+{
+ uint32_t len; // max id len in bytes
+ SS_UTF8_T id[NSSCS_MAX_SECRET_ID_LEN]; // * should be passed in # of chars
+} SSCS_SECRET_ID_T;
+
+
+typedef struct _sscs_basic_credential
+{
+ uint32_t unFlags;
+ uint32_t unLen;
+ SS_UTF8_T username[NSSCS_MAX_USERID_LEN];
+ uint32_t pwordLen;
+ SS_UTF8_T password[NSSCS_MAX_PWORD_LEN];
+} SSCS_BASIC_CREDENTIAL;
+
+
+typedef struct _sscs_ext_t
+{
+ int32_t extID; // defined to identify the extension
+ int32_t version; // defined as the version of the specified extension
+ void *ext; // points to the actual extension
+} SSCS_EXT_T;
+
+ /* ####################################################################### */
+ /* ############################## ERROR CODES ############################ */
+ /* ####################################################################### */
+
+#define NSSCS_SUCCESS 0x00000000 /* 0 */
+#define NSSCS_E_OBJECT_NOT_FOUND 0xFFFFFCE0 /* -800 */
+#define NSSCS_E_NICI_FAILURE 0xFFFFFCDF /* -801 */
+#define NSSCS_E_INVALID_SECRET_ID 0xFFFFFCDE /* -802 */
+#define NSSCS_E_SYSTEM_FAILURE 0xFFFFFCDD /* -803 */
+#define NSSCS_E_ACCESS_DENIED 0xFFFFFCDC /* -804 */
+#define NSSCS_E_NDS_INTERNAL_FAILURE 0xFFFFFCDB /* -805 */
+#define NSSCS_E_SECRET_UNINITIALIZED 0xFFFFFCDA /* -806 */
+#define NSSCS_E_BUFFER_LEN 0xFFFFFCD9 /* -807 */
+#define NSSCS_E_INCOMPATIBLE_VERSION 0xFFFFFCD8 /* -808 */
+#define NSSCS_E_CORRUPTED_STORE 0xFFFFFCD7 /* -809 */
+#define NSSCS_E_SECRET_ID_EXISTS 0xFFFFFCD6 /* -810 */
+#define NSSCS_E_NDS_PWORD_CHANGED 0xFFFFFCD5 /* -811 */
+#define NSSCS_E_INVALID_TARGET_OBJECT 0xFFFFFCD4 /* -812 */
+#define NSSCS_E_STORE_NOT_FOUND 0xFFFFFCD3 /* -813 */
+#define NSSCS_E_SERVICE_NOT_FOUND 0xFFFFFCD2 /* -814 */
+#define NSSCS_E_SECRET_ID_TOO_LONG 0xFFFFFCD1 /* -815 */
+#define NSSCS_E_ENUM_BUFF_TOO_SHORT 0xFFFFFCD0 /* -816 */
+#define NSSCS_E_NOT_AUTHENTICATED 0xFFFFFCCF /* -817 */
+#define NSSCS_E_NOT_SUPPORTED 0xFFFFFCCE /* -818 */
+#define NSSCS_E_NDS_PWORD_INVALID 0xFFFFFCCD /* -819 */
+#define NSSCS_E_NICI_OUTOF_SYNC 0xFFFFFCCC /* -820 */
+#define NSSCS_E_SERVICE_NOT_SUPPORTED 0xFFFFFCCB /* -821 */
+#define NSSCS_E_TOKEN_NOT_SUPPORTED 0xFFFFFCCA /* -822 */
+#define NSSCS_E_UNICODE_OP_FAILURE 0xFFFFFCC9 /* -823 */
+#define NSSCS_E_TRANSPORT_FAILURE 0xFFFFFCC8 /* -824 */
+#define NSSCS_E_CRYPTO_OP_FAILURE 0xFFFFFCC7 /* -825 */
+#define NSSCS_E_SERVER_CONN_FAILURE 0xFFFFFCC6 /* -826 */
+#define NSSCS_E_CONN_ACCESS_FAILURE 0xFFFFFCC5 /* -827 */
+#define NSSCS_E_ENUM_BUFF_TOO_LONG 0xFFFFFCC4 /* -828 */
+#define NSSCS_E_SECRET_BUFF_TOO_LONG 0xFFFFFCC3 /* -829 */
+#define NSSCS_E_SECRET_ID_TOO_SHORT 0xFFFFFCC2 /* -830 */
+#define NSSCS_E_CORRUPTED_PACKET_DATA 0xFFFFFCC1 /* -831 */
+#define NSSCS_E_EP_ACCESS_DENIED 0xFFFFFCC0 /* -832 */
+#define NSSCS_E_SCHEMA_NOT_EXTENDED 0xFFFFFCBF /* -833 */
+#define NSSCS_E_ATTR_NOT_FOUND 0xFFFFFCBE /* -834 */
+#define NSSCS_E_MIGRATION_NEEDED 0xFFFFFCBD /* -835 */
+#define NSSCS_E_MP_PWORD_INVALID 0xFFFFFCBC /* -836 */
+#define NSSCS_E_MP_PWORD_NOT_SET 0xFFFFFCBB /* -837 */
+#define NSSCS_E_MP_PWORD_NOT_ALLOWED 0xFFFFFCBA /* -838 */
+#define NSSCS_E_WRONG_REPLICA_TYPE 0xFFFFFCB9 /* -839 */
+#define NSSCS_E_ATTR_VAL_NOT_FOUND 0xFFFFFCB8 /* -840 */
+#define NSSCS_E_INVALID_PARAM 0xFFFFFCB7 /* -841 */
+#define NSSCS_E_NEED_SECURE_CHANNEL 0xFFFFFCB6 /* -842 */
+#define NSSCS_E_CONFIG_NOT_SUPPORTED 0xFFFFFCB5 /* -843 */
+#define NSSCS_E_STORE_NOT_LOCKED 0xFFFFFCB4 /* -844 */
+#define NSSCS_E_TIME_OUT_OF_SYNC 0xFFFFFCB3 /* -845 */
+#define NSSCS_E_VERSION_MISMATCH 0xFFFFFCB2 /* -846 */
+#define NSSCS_E_SECRET_BUFF_TOO_SHORT 0xFFFFFCB1 /* -847 */
+#define NSSCS_E_SH_SECRET_FAILURE 0xFFFFFCB0 /* -848 */
+#define NSSCS_E_PARSER_FAILURE 0xFFFFFCAF /* -849 */
+#define NSSCS_E_UTF8_OP_FAILURE 0xFFFFFCAE /* -850 */
+#define NSSCS_E_CTX_LESS_CN_NOT_UNIQUE 0xFFFFFCAD /* -851 */
+#define NSSCS_E_UNSUPPORTED_BIND_CRED 0xFFFFFCAC /* -852 */
+#define NSSCS_E_CERTIFICATE_NOT_FOUND 0xFFFFFCAB /* -853 */
+#define NSSCS_E_CANT_OPEN_CLIENT_CACHE 0xFFFFFCAA /* -854 */
+#define NSSCS_E_WRONG_SH_SEC_TYPE 0xFFFFFCA9 /* -855 */
+
+#define NSSCS_E_NOT_IMPLEMENTED 0xFFFFFC88 /* -888 */
+#define NSSCS_E_BETA_EXPIRED 0xFFFFFC7D /* -899 */
+
+
+ /* #########################################################################
+ ########################### ERROR DESCRIPTIONS ##########################
+ #########################################################################
+
+ NSSCS_E_OBJECT_NOT_FOUND -800
+ Description: Can't find the target object DN in NDS. (Resolve name failed.)
+
+ NSSCS_E_NICI_FAILURE -801
+ Description: NICI operations have failed.
+
+ NSSCS_E_INVALID_SECRET_ID -802
+ Description: Secret ID is not in the User Secret Store.
+
+ NSSCS_E_SYSTEM_FAILURE -803
+ Description: Some internal operating system services have not been available.
+
+ NSSCS_E_ACCESS_DENIED -804
+ Description: Access to the target Secret Store has been denied!
+
+ NSSCS_E_NDS_INTERNAL_FAILURE -805
+ Description: Some internal NDS services have not been available.
+
+ NSSCS_E_SECRET_UNINITIALIZED -806
+ Description: Secret has not been initialized with a write.
+
+ NSSCS_E_BUFFER_LEN -807
+ Description: Size of the buffer is not in a nominal range between minimum and maximum.
+
+ NSSCS_E_INCOMPATIBLE_VERSION -808
+ Description: Client and server components are not of the compatible versions.
+
+ NSSCS_E_CORRUPTED_STORE -809
+ Description: Secret Store data on the server has been corrupted.
+
+ NSSCS_E_SECRET_ID_EXISTS -810
+ Description: Secret ID already exists in the Secret Store.
+
+ NSSCS_E_NDS_PWORD_CHANGED -811
+ Description: User NDS password has been changed by the administrator.
+
+ NSSCS_E_INVALID_TARGET_OBJECT -812
+ Description: Target NDS User object not found.
+
+ NSSCS_E_STORE_NOT_FOUND -813
+ Description: Target NDS User object does not have a Secret Store.
+
+ NSSCS_E_SERVICE_NOT_FOUND -814
+ Description: Secret Store not on the Network.
+
+ NSSCS_E_SECRET_ID_TOO_LONG -815
+ Description: Lenght of the Secret ID buffer exceeds the limit.
+
+ NSSCS_E_ENUM_BUFF_TOO_SHORT -816
+ Description: Lenght of the Enumeration buffer too short.
+
+ NSSCS_E_NOT_AUTHENTICATED -817
+ Description: User not authenticated.
+
+ NSSCS_E_NOT_SUPPORTED -818
+ Description: Not supported operations.
+
+ NSSCS_E_NDS_PWORD_INVALID -819
+ Description: Typed in NDS password not valid.
+
+ NSSCS_E_NICI_OUTOF_SYNC -820
+ Description: Session keys of the client and server NICI are out of sync.
+
+ NSSCS_E_SERVICE_NOT_SUPPORTED -821
+ Description: Requested service not supported yet.
+
+ NSSCS_E_TOKEN_NOT_SUPPORTED -822
+ Description: NDS authentication type not supported.
+
+ NSSCS_E_UNICODE_OP_FAILURE -823
+ Description: Unicode text conversion operation failed.
+
+ NSSCS_E_TRANSPORT_FAILURE -824
+ Description: Connection to server is lost.
+
+ NSSCS_E_CRYPTO_OP_FAILURE -825
+ Description: Cryptographic operation failed.
+
+ NSSCS_E_SERVER_CONN_FAILURE -826
+ Description: Opening a connection to the server failed.
+
+ NSSCS_E_CONN_ACCESS_FAILURE -827
+ Description: Access to server connection failed.
+
+ NSSCS_E_ENUM_BUFF_TOO_LONG -828
+ Description: Size of the enumeration buffer exceeds the limit.
+
+ NSSCS_E_SECRET_BUFF_TOO_LONG -829
+ Description: Size of the Secret buffer exceeds the limit.
+
+ NSSCS_E_SECRET_ID_TOO_SHORT -830
+ Description: Lenght of the Secret ID should be greater than zero.
+
+ NSSCS_E_CORRUPTED_PACKET_DATA -831
+ Description: Protocol data corrupted on the wire.
+
+ NSSCS_E_EP_ACCESS_DENIED -832
+ Description: EP password validation failed. Access to the secret denied!
+
+ NSSCS_E_SCHEMA_NOT_EXTENDED -833
+ Description: Schema is not extended to support SecreStore on the target tree.
+
+ NSSCS_E_ATTR_NOT_FOUND -834
+ Description: One of the optional service attributes is not instantiated.
+
+ NSSCS_E_MIGRATION_NEEDED -835
+ Description: Server has been upgraded and user SecretStore should be updated.
+
+ NSSCS_E_MP_PWORD_INVALID -836
+ Description: Master passwrod could not be verified to read or unlock the secrets.
+
+ NSSCS_E_MP_PWORD_NOT_SET -837
+ Description: Master password has not been set on the SecretStore.
+
+ NSSCS_E_MP_PWORD_NOT_ALLOWED -838
+ Description: Ability to use master password has been disabled.
+
+ NSSCS_E_WRONG_REPLICA_TYPE -839
+ Description: Not a writeable replica of NDS.
+
+ NSSCS_E_ATTR_VAL_NOT_FOUND -840
+ Description: Target attrbute is not instantiated in NDS.
+
+ NSSCS_E_INVALID_PARAM -841
+ Description: API parameter is not initialized.
+
+ NSSCS_E_NEED_SECURE_CHANNEL -842
+ Description: Connection to the SecretStore needs to be over SSL.
+
+ NSSCS_E_CONFIG_NOT_SUPPORTED -843
+ Description: No server to support the given override configuration is found.
+
+ NSSCS_E_STORE_NOT_LOCKED -844
+ Description: Attempt to unlock SecretStore failed because the store is not locked.
+
+ NSSCS_E_TIME_OUT_OF_SYNC -845
+ Description: NDS Replica on the server that holds SecretStore is out of sync with the replica ring.
+
+ NSSCS_E_VERSION_MISMATCH -846
+ Description: Versions of the client dlls don't match.
+
+ NSSCS_E_SECRET_BUFF_TOO_SHORT -847
+ Description: Buffer supplied for the secret is too short (minimum NSSCS_MIN_IDLIST_BUF_LEN).
+
+ NSSCS_E_SH_SECRET_FAILURE -848
+ Description: Shared Secret processing and operations failed.
+
+ NSSCS_E_PARSER_FAILURE -849
+ Description: Shared Secret parser operations failed.
+
+ NSSCS_E_UTF8_OP_FAILURE -850
+ Description: Utf8 string operations failed.
+
+ NSSCS_E_CTX_LESS_CN_NOT_UNIQUE -851
+ Description: Contextless name for LDAP bind does not resolve to a unique DN
+
+ NSSCS_E_UNSUPPORTED_BIND_CRED -852
+ Description: login credential for advanced bind is not supported
+
+ NSSCS_E_CERTIFICATE_NOT_FOUND -853
+ Description: LDAP Root Cert required for Bind operations not found
+
+ NSSCS_E_WRONG_SH_SEC_TYPE -855
+ Description: Unrecognized or unknown shared secret tag.
+
+
+ NSSCS_E_NOT_IMPLEMENTED -888
+ Description: Feature not implemented yet.
+
+ NSSCS_E_BETA_EXPIRED -899
+ Description: Product's BETA life has expired! Official release copy should be
+ purchased.
+
+
+
+ ########################### END OFERROR CODES ########################## */
+
+#endif // _SSCS_SDK_H_
+
+
+ // * The following functions will be exposed as exported API:
+ // **************************************************************
+ // * These function calls will utilize the Support Functions for
+ // * populating or extracting data from a Shared Secret.
+ // **************************************************************
+
+ // General API Info:
+ // All strings passed through the API need to be NULL terminated.
+ //
+ //
+ // Parameters:
+ // ssFlags
+ // Sets behaviors desired on the Secret. Set to 0.
+ //
+ // appSecretID (input) -
+ // Name of service requesting credentials.
+ //
+ // sharedSecretID (input) -
+ // The group name is the name of the backend authentication realm, relating a group of services.
+ // Example: Novell.Collaboration (Groupwise, GW address book, GW Notify, and GWIM)
+ // This parameter can be set to NULL,
+ //
+ // credentialType (input)
+ // Type of credential structure used during this call.
+ // Currently we only support one:
+ // SSCS_CRED_TYPE_BASIC_F
+ //
+ // credential
+ // Pointer to the credential structure
+ //
+ // ext
+ // Reserved.
+ //
+ // Abstract:
+ //
+ // Get cache user credentials routine.
+ //
+ //
+
+ SSCS_EXTERN_LIBCALL(int32_t)
+ miCASAGetCredential
+ (
+ uint32_t ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ int32_t * credentialType, // IN/OUT
+ void * credential, // OUT
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ SSCS_EXTERN_LIBCALL(int32_t)
+ miCASASetCredential
+ (
+ uint32_t ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ int32_t credentialType, // IN
+ void * credential, // IN
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ SSCS_EXTERN_LIBCALL(int32_t)
+ miCASARemoveCredential
+ (
+ uint32_t ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ // end
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif // _MICASA_MANAGED_H_
+
diff --git a/LoginCapture/windows/npapi.h b/LoginCapture/windows/npapi.h
new file mode 100644
index 00000000..4d61f727
--- /dev/null
+++ b/LoginCapture/windows/npapi.h
@@ -0,0 +1,536 @@
+/*---------------------------------------------------------------
+THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+Copyright (C) 1991 - 2000. Microsoft Corporation. All rights reserved.
+
+npapi.h
+
+Abstract:
+
+ Network Provider API prototypes and manifests. A network provider
+ is a client of the Win32 Winnet driver. See the "NT/Win32 Network
+ Provider API Specification" document for further details.
+
+
+Environment:
+
+ User Mode -Win32
+
+Notes:
+
+ This file currently contains the function typedefs that will be needed
+ by the winnet driver to support multiple providers using LoadLibrary.
+
+---------------------------------------------------------------*/
+
+
+#ifndef _NPAPI_INCLUDED
+#define _NPAPI_INCLUDED
+
+//
+// CONNECTIONS
+//
+
+DWORD APIENTRY
+NPAddConnection (
+ LPNETRESOURCEW lpNetResource,
+ LPWSTR lpPassword,
+ LPWSTR lpUserName
+ );
+
+typedef DWORD (*PF_NPAddConnection) (
+ LPNETRESOURCEW lpNetResource,
+ LPWSTR lpPassword,
+ LPWSTR lpUserName
+ );
+
+
+DWORD APIENTRY
+NPAddConnection3 (
+ HWND hwndOwner,
+ LPNETRESOURCEW lpNetResource,
+ LPTSTR lpPassword,
+ LPTSTR lpUserName,
+ DWORD dwFlags
+ );
+
+typedef DWORD (*PF_NPAddConnection3) (
+ HWND hwndOwner,
+ LPNETRESOURCEW lpNetResource,
+ LPWSTR lpPassword,
+ LPWSTR lpUserName,
+ DWORD dwFlags
+ );
+
+
+DWORD APIENTRY
+NPCancelConnection (
+ LPWSTR lpName,
+ BOOL fForce
+ );
+typedef DWORD (*PF_NPCancelConnection) (
+ LPWSTR lpName,
+ BOOL fForce
+ );
+
+DWORD APIENTRY
+NPGetConnection (
+ LPWSTR lpLocalName,
+ LPWSTR lpRemoteName,
+ LPDWORD lpnBufferLen
+ );
+typedef DWORD (*PF_NPGetConnection) (
+ LPWSTR lpLocalName,
+ LPWSTR lpRemoteName,
+ LPDWORD lpnBufferLen
+ );
+
+
+DWORD APIENTRY
+NPGetUniversalName (
+ LPWSTR lpLocalPath,
+ DWORD dwInfoLevel,
+ LPVOID lpBuffer,
+ LPDWORD lpBufferSize
+ );
+typedef DWORD (*PF_NPGetUniversalName) (
+ LPWSTR lpLocalPath,
+ DWORD dwInfoLevel,
+ LPVOID lpBuffer,
+ LPDWORD lpnBufferSize
+ );
+
+DWORD APIENTRY
+NPOpenEnum (
+ DWORD dwScope,
+ DWORD dwType,
+ DWORD dwUsage,
+ LPNETRESOURCEW lpNetResource,
+ LPHANDLE lphEnum
+ );
+typedef DWORD (*PF_NPOpenEnum) (
+ DWORD dwScope,
+ DWORD dwType,
+ DWORD dwUsage,
+ LPNETRESOURCEW lpNetResource,
+ LPHANDLE lphEnum
+ );
+
+DWORD APIENTRY
+NPEnumResource (
+ HANDLE hEnum,
+ LPDWORD lpcCount,
+ LPVOID lpBuffer,
+ LPDWORD lpBufferSize
+ );
+typedef DWORD (*PF_NPEnumResource) (
+ HANDLE hEnum,
+ LPDWORD lpcCount,
+ LPVOID lpBuffer,
+ LPDWORD lpBufferSize
+ );
+
+DWORD APIENTRY
+NPCloseEnum (
+ HANDLE hEnum
+ );
+typedef DWORD (*PF_NPCloseEnum) (
+ HANDLE hEnum
+ );
+
+
+//
+// CAPABILITIES
+//
+
+#define WNNC_SPEC_VERSION 0x00000001
+#define WNNC_SPEC_VERSION51 0x00050001
+#define WNNC_NET_TYPE 0x00000002
+#define WNNC_NET_NONE 0x00000000
+/*
+ removed because of macro definition warnings
+#define WNNC_NET_MSNET 0x00000100
+#define WNNC_NET_LANMAN 0x00000200
+#define WNNC_NET_NETWARE 0x00000300
+#define WNNC_NET_VINES 0x00000400
+*/
+
+#define WNNC_DRIVER_VERSION 0x00000003
+
+#define WNNC_USER 0x00000004
+#define WNNC_USR_GETUSER 0x00000001
+
+#define WNNC_CONNECTION 0x00000006
+#define WNNC_CON_ADDCONNECTION 0x00000001
+#define WNNC_CON_CANCELCONNECTION 0x00000002
+#define WNNC_CON_GETCONNECTIONS 0x00000004
+#define WNNC_CON_ADDCONNECTION3 0x00000008
+
+#define WNNC_DIALOG 0x00000008
+#define WNNC_DLG_DEVICEMODE 0x00000001
+#define WNNC_DLG_PROPERTYDIALOG 0x00000020
+#define WNNC_DLG_SEARCHDIALOG 0x00000040
+#define WNNC_DLG_FORMATNETWORKNAME 0x00000080
+#define WNNC_DLG_PERMISSIONEDITOR 0x00000100
+
+#define WNNC_ADMIN 0x00000009
+#define WNNC_ADM_GETDIRECTORYTYPE 0x00000001
+#define WNNC_ADM_DIRECTORYNOTIFY 0x00000002
+
+#define WNNC_ENUMERATION 0x0000000B
+#define WNNC_ENUM_GLOBAL 0x00000001
+#define WNNC_ENUM_LOCAL 0x00000002
+
+#define WNNC_START 0x0000000C
+#define WNNC_WAIT_FOR_START 0x00000001
+
+
+
+DWORD APIENTRY
+NPGetCaps (
+ DWORD ndex
+ );
+typedef DWORD (*PF_NPGetCaps) (
+ DWORD ndex
+ );
+
+//
+// OTHER
+//
+
+DWORD APIENTRY
+NPGetUser (
+ LPWSTR lpName,
+ LPWSTR lpUserName,
+ LPDWORD lpnBufferLen
+ );
+typedef DWORD (*PF_NPGetUser) (
+ LPWSTR lpName,
+ LPWSTR lpUserName,
+ LPDWORD lpnBufferLen
+ );
+
+#define WNTYPE_DRIVE 1
+#define WNTYPE_FILE 2
+#define WNTYPE_PRINTER 3
+#define WNTYPE_COMM 4
+
+#define WNPS_FILE 0
+#define WNPS_DIR 1
+#define WNPS_MULT 2
+
+DWORD APIENTRY
+NPDeviceMode(
+ HWND hParent
+ );
+typedef DWORD (*PF_NPDeviceMode) (
+ HWND hParent
+ );
+
+// flag for search dialog
+#define WNSRCH_REFRESH_FIRST_LEVEL 0x00000001
+
+DWORD APIENTRY
+NPSearchDialog(
+ HWND hwndParent,
+ LPNETRESOURCEW lpNetResource,
+ LPVOID lpBuffer,
+ DWORD cbBuffer,
+ LPDWORD lpnFlags
+ );
+typedef DWORD (*PF_NPSearchDialog) (
+ HWND hwndParent,
+ LPNETRESOURCEW lpNetResource,
+ LPVOID lpBuffer,
+ DWORD cbBuffer,
+ LPDWORD lpnFlags
+ );
+
+/*
+ removed because of macro definition warnings
+// flags for format network name
+#define WNFMT_MULTILINE 0x00000001
+#define WNFMT_ABBREVIATED 0x00000002
+#define WNFMT_INENUM 0x00000010
+*/
+DWORD APIENTRY
+NPFormatNetworkName(
+ LPWSTR lpRemoteName,
+ LPWSTR lpFormattedName,
+ LPDWORD lpnLength,
+ DWORD dwFlags,
+ DWORD dwAveCharPerLine
+ );
+typedef DWORD (*PF_NPFormatNetworkName) (
+ LPWSTR lpRemoteName,
+ LPWSTR lpFormattedName,
+ LPDWORD lpnLength,
+ DWORD dwFlags,
+ DWORD dwAveCharPerLine
+ );
+
+DWORD APIENTRY
+NPGetPropertyText(
+ DWORD iButton,
+ DWORD nPropSel,
+ LPWSTR lpName,
+ LPWSTR lpButtonName,
+ DWORD nButtonNameLen,
+ DWORD nType
+ );
+typedef DWORD (*PF_NPGetPropertyText) (
+ DWORD iButton,
+ DWORD nPropSel,
+ LPWSTR lpName,
+ LPWSTR lpButtonName,
+ DWORD nButtonNameLen,
+ DWORD nType
+ );
+
+DWORD APIENTRY
+NPPropertyDialog(
+ HWND hwndParent,
+ DWORD iButtonDlg,
+ DWORD nPropSel,
+ LPWSTR lpFileName,
+ DWORD nType
+ );
+typedef DWORD (*PF_NPPropertyDialog) (
+ HWND hwndParent,
+ DWORD iButtonDlg,
+ DWORD nPropSel,
+ LPWSTR lpFileName,
+ DWORD nType
+ );
+
+
+//
+// ADMIN
+//
+
+#define WNDT_NORMAL 0
+#define WNDT_NETWORK 1
+
+#define WNDN_MKDIR 1
+#define WNDN_RMDIR 2
+#define WNDN_MVDIR 3
+
+DWORD APIENTRY
+NPGetDirectoryType (
+ LPWSTR lpName,
+ LPINT lpType,
+ BOOL bFlushCache
+ );
+typedef DWORD (*PF_NPGetDirectoryType) (
+ LPWSTR lpName,
+ LPINT lpType,
+ BOOL bFlushCache
+ );
+
+DWORD APIENTRY
+NPDirectoryNotify (
+ HWND hwnd,
+ LPWSTR lpDir,
+ DWORD dwOper
+ );
+typedef DWORD (*PF_NPDirectoryNotify) (
+ HWND hwnd,
+ LPWSTR lpDir,
+ DWORD dwOper
+ );
+
+VOID
+WNetSetLastErrorA(
+ DWORD err,
+ LPSTR lpError,
+ LPSTR lpProviders
+ );
+
+VOID
+WNetSetLastErrorW(
+ DWORD err,
+ LPWSTR lpError,
+ LPWSTR lpProviders
+ );
+
+#ifdef UNICODE
+ #define WNetSetLastError WNetSetLastErrorW
+#else
+ #define WNetSetLastError WNetSetLastErrorA
+#endif // UNICODE
+
+//
+// CREDENTIAL MANAGEMENT and other classes of providers
+//
+
+
+// Define the Net/Authentication and othr Provider Classes
+#define WN_NETWORK_CLASS 0x00000001
+#define WN_CREDENTIAL_CLASS 0x00000002
+#define WN_PRIMARY_AUTHENT_CLASS 0x00000004
+#define WN_SERVICE_CLASS 0x00000008
+
+#define WN_VALID_LOGON_ACCOUNT 0x00000001
+#define WN_NT_PASSWORD_CHANGED 0x00000002
+
+DWORD APIENTRY
+NPLogonNotify (
+ PLUID lpLogonId,
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ LPWSTR *lpLogonScript
+ );
+typedef DWORD (*PF_NPLogonNotify) (
+ PLUID lpLogonId,
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ LPWSTR *lpLogonScript
+ );
+
+DWORD APIENTRY
+NPPasswordChangeNotify (
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ DWORD dwChangeInfo
+ );
+
+typedef DWORD (*PF_NPPasswordChangeNotify) (
+ LPCWSTR lpAuthentInfoType,
+ LPVOID lpAuthentInfo,
+ LPCWSTR lpPreviousAuthentInfoType,
+ LPVOID lpPreviousAuthentInfo,
+ LPWSTR lpStationName,
+ LPVOID StationHandle,
+ DWORD dwChangeInfo
+ );
+
+//
+// CONNECTION NOTIFICATION
+//
+
+//
+// NotifyStatus
+//
+#define NOTIFY_PRE 0x00000001
+#define NOTIFY_POST 0x00000002
+
+typedef struct _NOTIFYINFO
+{
+ DWORD dwNotifyStatus;
+ DWORD dwOperationStatus;
+ LPVOID lpContext;
+} NOTIFYINFO, *LPNOTIFYINFO;
+
+typedef struct _NOTIFYADD
+{
+ HWND hwndOwner;
+ NETRESOURCE NetResource;
+ DWORD dwAddFlags;
+} NOTIFYADD, *LPNOTIFYADD;
+
+typedef struct _NOTIFYCANCEL
+{
+ LPTSTR lpName;
+ LPTSTR lpProvider;
+ DWORD dwFlags;
+ BOOL fForce;
+} NOTIFYCANCEL, *LPNOTIFYCANCEL;
+
+
+DWORD APIENTRY
+AddConnectNotify (
+ LPNOTIFYINFO lpNotifyInfo,
+ LPNOTIFYADD lpAddInfo
+ );
+
+typedef DWORD (*PF_AddConnectNotify) (
+ LPNOTIFYINFO lpNotifyInfo,
+ LPNOTIFYADD lpAddInfo
+ );
+
+DWORD APIENTRY
+CancelConnectNotify (
+ LPNOTIFYINFO lpNotifyInfo,
+ LPNOTIFYCANCEL lpCancelInfo
+ );
+
+typedef DWORD (*PF_CancelConnectNotify) (
+ LPNOTIFYINFO lpNotifyInfo,
+ LPNOTIFYCANCEL lpCancelInfo
+ );
+
+//
+// Permission editor dialogs
+//
+
+//
+// Capabilities bits of permission editor dialogs
+//
+#define WNPERMC_PERM 0x00000001
+#define WNPERMC_AUDIT 0x00000002
+#define WNPERMC_OWNER 0x00000004
+
+DWORD APIENTRY
+NPFMXGetPermCaps (
+ LPWSTR lpDriveName
+ );
+
+typedef DWORD (*PF_NPFMXGetPermCaps) (
+ LPWSTR lpDriveName
+ );
+
+//
+// Type of security dialog
+//
+#define WNPERM_DLG_PERM 0
+#define WNPERM_DLG_AUDIT 1
+#define WNPERM_DLG_OWNER 2
+
+DWORD APIENTRY
+NPFMXEditPerm (
+ LPWSTR lpDriveName,
+ HWND hwndFMX,
+ DWORD nDialogType
+ );
+
+typedef DWORD (*PF_NPFMXEditPerm) (
+ LPWSTR lpDriveName,
+ HWND hwndFMX,
+ DWORD nDialogType
+ );
+
+DWORD APIENTRY
+NPFMXGetPermHelp (
+ LPWSTR lpDriveName,
+ DWORD nDialogType,
+ BOOL fDirectory,
+ LPVOID lpFileNameBuffer,
+ LPDWORD lpBufferSize,
+ LPDWORD lpnHelpContext
+ );
+
+typedef DWORD (*PF_NPFMXGetPermHelp) (
+ LPWSTR lpDriveName,
+ DWORD nDialogType,
+ BOOL fDirectory,
+ LPVOID lpFileNameBuffer,
+ LPDWORD lpBufferSize,
+ LPDWORD lpnHelpContext
+ );
+
+#endif // _NPAPI_INCLUDED
diff --git a/LoginCapture/windows/nsscs_mgmd_idk.h b/LoginCapture/windows/nsscs_mgmd_idk.h
new file mode 100644
index 00000000..a4727608
--- /dev/null
+++ b/LoginCapture/windows/nsscs_mgmd_idk.h
@@ -0,0 +1,435 @@
+/**************************************************************************
+* %name: nsscs_mgmd_idk.h %
+* %instance: security_2 %
+* %version: 1 %
+* %created_by: jnorman %
+* %date_modified: Mon Aug 08 13:06:42 2005 %
+***************************************************************************
+* This is the Managed IDK for collaborating suite of applications
+***************************************************************************/
+
+#ifndef _NSSCS_MANAGED_IDK_H_
+#define _NSSCS_MANAGED_IDK_H_
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C"
+{
+#endif
+
+/***************************************************************************
+*** All strings are length preceeded and the lengths include the NULL.
+***************************************************************************/
+
+
+
+#if defined(WIN32)
+
+ #define SSCS_GLOBAL_LIBCALL_PTR(RET) RET * __stdcall
+ #define SSCS_GLOBAL_LIBCALL(RET) RET __stdcall
+ #define SSCS_EXTERN_LIBCALL_PTR(RET) extern RET * __stdcall
+ #define SSCS_EXTERN_LIBCALL(RET) extern RET __stdcall
+ #define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR) typedef RET * (__stdcall *PTR)
+ #define SSCS_TYPEDEF_LIBCALL(RET, PTR) typedef RET (__stdcall *PTR)
+
+#else
+
+ #define SSCS_GLOBAL_LIBCALL_PTR(RET) RET *
+ #define SSCS_GLOBAL_LIBCALL(RET) RET
+ #define SSCS_EXTERN_LIBCALL_PTR(RET) extern RET *
+ #define SSCS_EXTERN_LIBCALL(RET) extern RET
+ #define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR) typedef RET * (*PTR)
+ #define SSCS_TYPEDEF_LIBCALL(RET, PTR) typedef RET (*PTR)
+
+#endif /* WIN32 */
+
+#ifndef _SSUTF8_H_
+/* defining the utf8 for SSCS */
+typedef unsigned char SS_UTF8_T;
+#endif
+
+#define NSSCS_MAX_USERID_LEN 256 //* max username (bytes)
+#define NSSCS_MAX_PWORD_LEN 128 //* max password (bytes)
+#define NSSCS_MAX_SECRET_ID_LEN 512 //* in bytes including NULL
+
+// used to denote what structure is being used for the credentials
+#define SSCS_CRED_TYPE_BASIC_F 0x00000001L
+
+// used to denote the type of username being requested or set
+#define USERNAME_TYPE_CN_F 0x00000000L // default behavior
+#define USERNAME_TYPE_NDS_DN_F 0x00000001L
+#define USERNAME_TYPE_LDAP_DN_F 0x00000002L
+#define USERNAME_TYPE_EMAIL_F 0x00000004L
+#define USERNAME_TYPE_OTHER_F 0x00000008L
+
+typedef struct _sscs_secret_id
+{
+ long len; // max id len in bytes
+ SS_UTF8_T id[NSSCS_MAX_SECRET_ID_LEN]; // * should be passed in # of chars
+} SSCS_SECRET_ID_T;
+
+
+typedef struct _sscs_basic_credential
+{
+ unsigned long unFlags;
+ unsigned long unLen;
+ SS_UTF8_T username[NSSCS_MAX_USERID_LEN];
+ unsigned long pwordLen;
+ SS_UTF8_T password[NSSCS_MAX_PWORD_LEN];
+} SSCS_BASIC_CREDENTIAL;
+
+
+typedef struct _sscs_ext_t
+{
+ int extID; // defined to identify the extension
+ int version; // defined as the version of the specified extension
+ void *ext; // points to the actual extension
+} SSCS_EXT_T;
+
+ /* ####################################################################### */
+ /* ############################## ERROR CODES ############################ */
+ /* ####################################################################### */
+
+#define NSSCS_SUCCESS 0x00000000 /* 0 */
+#define NSSCS_E_OBJECT_NOT_FOUND 0xFFFFFCE0 /* -800 */
+#define NSSCS_E_NICI_FAILURE 0xFFFFFCDF /* -801 */
+#define NSSCS_E_INVALID_SECRET_ID 0xFFFFFCDE /* -802 */
+#define NSSCS_E_SYSTEM_FAILURE 0xFFFFFCDD /* -803 */
+#define NSSCS_E_ACCESS_DENIED 0xFFFFFCDC /* -804 */
+#define NSSCS_E_NDS_INTERNAL_FAILURE 0xFFFFFCDB /* -805 */
+#define NSSCS_E_SECRET_UNINITIALIZED 0xFFFFFCDA /* -806 */
+#define NSSCS_E_BUFFER_LEN 0xFFFFFCD9 /* -807 */
+#define NSSCS_E_INCOMPATIBLE_VERSION 0xFFFFFCD8 /* -808 */
+#define NSSCS_E_CORRUPTED_STORE 0xFFFFFCD7 /* -809 */
+#define NSSCS_E_SECRET_ID_EXISTS 0xFFFFFCD6 /* -810 */
+#define NSSCS_E_NDS_PWORD_CHANGED 0xFFFFFCD5 /* -811 */
+#define NSSCS_E_INVALID_TARGET_OBJECT 0xFFFFFCD4 /* -812 */
+#define NSSCS_E_STORE_NOT_FOUND 0xFFFFFCD3 /* -813 */
+#define NSSCS_E_SERVICE_NOT_FOUND 0xFFFFFCD2 /* -814 */
+#define NSSCS_E_SECRET_ID_TOO_LONG 0xFFFFFCD1 /* -815 */
+#define NSSCS_E_ENUM_BUFF_TOO_SHORT 0xFFFFFCD0 /* -816 */
+#define NSSCS_E_NOT_AUTHENTICATED 0xFFFFFCCF /* -817 */
+#define NSSCS_E_NOT_SUPPORTED 0xFFFFFCCE /* -818 */
+#define NSSCS_E_NDS_PWORD_INVALID 0xFFFFFCCD /* -819 */
+#define NSSCS_E_NICI_OUTOF_SYNC 0xFFFFFCCC /* -820 */
+#define NSSCS_E_SERVICE_NOT_SUPPORTED 0xFFFFFCCB /* -821 */
+#define NSSCS_E_TOKEN_NOT_SUPPORTED 0xFFFFFCCA /* -822 */
+#define NSSCS_E_UNICODE_OP_FAILURE 0xFFFFFCC9 /* -823 */
+#define NSSCS_E_TRANSPORT_FAILURE 0xFFFFFCC8 /* -824 */
+#define NSSCS_E_CRYPTO_OP_FAILURE 0xFFFFFCC7 /* -825 */
+#define NSSCS_E_SERVER_CONN_FAILURE 0xFFFFFCC6 /* -826 */
+#define NSSCS_E_CONN_ACCESS_FAILURE 0xFFFFFCC5 /* -827 */
+#define NSSCS_E_ENUM_BUFF_TOO_LONG 0xFFFFFCC4 /* -828 */
+#define NSSCS_E_SECRET_BUFF_TOO_LONG 0xFFFFFCC3 /* -829 */
+#define NSSCS_E_SECRET_ID_TOO_SHORT 0xFFFFFCC2 /* -830 */
+#define NSSCS_E_CORRUPTED_PACKET_DATA 0xFFFFFCC1 /* -831 */
+#define NSSCS_E_EP_ACCESS_DENIED 0xFFFFFCC0 /* -832 */
+#define NSSCS_E_SCHEMA_NOT_EXTENDED 0xFFFFFCBF /* -833 */
+#define NSSCS_E_ATTR_NOT_FOUND 0xFFFFFCBE /* -834 */
+#define NSSCS_E_MIGRATION_NEEDED 0xFFFFFCBD /* -835 */
+#define NSSCS_E_MP_PWORD_INVALID 0xFFFFFCBC /* -836 */
+#define NSSCS_E_MP_PWORD_NOT_SET 0xFFFFFCBB /* -837 */
+#define NSSCS_E_MP_PWORD_NOT_ALLOWED 0xFFFFFCBA /* -838 */
+#define NSSCS_E_WRONG_REPLICA_TYPE 0xFFFFFCB9 /* -839 */
+#define NSSCS_E_ATTR_VAL_NOT_FOUND 0xFFFFFCB8 /* -840 */
+#define NSSCS_E_INVALID_PARAM 0xFFFFFCB7 /* -841 */
+#define NSSCS_E_NEED_SECURE_CHANNEL 0xFFFFFCB6 /* -842 */
+#define NSSCS_E_CONFIG_NOT_SUPPORTED 0xFFFFFCB5 /* -843 */
+#define NSSCS_E_STORE_NOT_LOCKED 0xFFFFFCB4 /* -844 */
+#define NSSCS_E_TIME_OUT_OF_SYNC 0xFFFFFCB3 /* -845 */
+#define NSSCS_E_VERSION_MISMATCH 0xFFFFFCB2 /* -846 */
+#define NSSCS_E_SECRET_BUFF_TOO_SHORT 0xFFFFFCB1 /* -847 */
+#define NSSCS_E_SH_SECRET_FAILURE 0xFFFFFCB0 /* -848 */
+#define NSSCS_E_PARSER_FAILURE 0xFFFFFCAF /* -849 */
+#define NSSCS_E_UTF8_OP_FAILURE 0xFFFFFCAE /* -850 */
+#define NSSCS_E_CTX_LESS_CN_NOT_UNIQUE 0xFFFFFCAD /* -851 */
+#define NSSCS_E_UNSUPPORTED_BIND_CRED 0xFFFFFCAC /* -852 */
+#define NSSCS_E_CERTIFICATE_NOT_FOUND 0xFFFFFCAB /* -853 */
+#define NSSCS_E_CANT_OPEN_CLIENT_CACHE 0xFFFFFCAA /* -854 */
+#define NSSCS_E_WRONG_SH_SEC_TYPE 0xFFFFFCA9 /* -855 */
+
+#define NSSCS_E_NOT_IMPLEMENTED 0xFFFFFC88 /* -888 */
+#define NSSCS_E_BETA_EXPIRED 0xFFFFFC7D /* -899 */
+
+
+ /* #########################################################################
+ ########################### ERROR DESCRIPTIONS ##########################
+ #########################################################################
+
+ NSSCS_E_OBJECT_NOT_FOUND -800
+ Description: Can't find the target object DN in NDS. (Resolve name failed.)
+
+ NSSCS_E_NICI_FAILURE -801
+ Description: NICI operations have failed.
+
+ NSSCS_E_INVALID_SECRET_ID -802
+ Description: Secret ID is not in the User Secret Store.
+
+ NSSCS_E_SYSTEM_FAILURE -803
+ Description: Some internal operating system services have not been available.
+
+ NSSCS_E_ACCESS_DENIED -804
+ Description: Access to the target Secret Store has been denied!
+
+ NSSCS_E_NDS_INTERNAL_FAILURE -805
+ Description: Some internal NDS services have not been available.
+
+ NSSCS_E_SECRET_UNINITIALIZED -806
+ Description: Secret has not been initialized with a write.
+
+ NSSCS_E_BUFFER_LEN -807
+ Description: Size of the buffer is not in a nominal range between minimum and maximum.
+
+ NSSCS_E_INCOMPATIBLE_VERSION -808
+ Description: Client and server components are not of the compatible versions.
+
+ NSSCS_E_CORRUPTED_STORE -809
+ Description: Secret Store data on the server has been corrupted.
+
+ NSSCS_E_SECRET_ID_EXISTS -810
+ Description: Secret ID already exists in the Secret Store.
+
+ NSSCS_E_NDS_PWORD_CHANGED -811
+ Description: User NDS password has been changed by the administrator.
+
+ NSSCS_E_INVALID_TARGET_OBJECT -812
+ Description: Target NDS User object not found.
+
+ NSSCS_E_STORE_NOT_FOUND -813
+ Description: Target NDS User object does not have a Secret Store.
+
+ NSSCS_E_SERVICE_NOT_FOUND -814
+ Description: Secret Store not on the Network.
+
+ NSSCS_E_SECRET_ID_TOO_LONG -815
+ Description: Lenght of the Secret ID buffer exceeds the limit.
+
+ NSSCS_E_ENUM_BUFF_TOO_SHORT -816
+ Description: Lenght of the Enumeration buffer too short.
+
+ NSSCS_E_NOT_AUTHENTICATED -817
+ Description: User not authenticated.
+
+ NSSCS_E_NOT_SUPPORTED -818
+ Description: Not supported operations.
+
+ NSSCS_E_NDS_PWORD_INVALID -819
+ Description: Typed in NDS password not valid.
+
+ NSSCS_E_NICI_OUTOF_SYNC -820
+ Description: Session keys of the client and server NICI are out of sync.
+
+ NSSCS_E_SERVICE_NOT_SUPPORTED -821
+ Description: Requested service not supported yet.
+
+ NSSCS_E_TOKEN_NOT_SUPPORTED -822
+ Description: NDS authentication type not supported.
+
+ NSSCS_E_UNICODE_OP_FAILURE -823
+ Description: Unicode text conversion operation failed.
+
+ NSSCS_E_TRANSPORT_FAILURE -824
+ Description: Connection to server is lost.
+
+ NSSCS_E_CRYPTO_OP_FAILURE -825
+ Description: Cryptographic operation failed.
+
+ NSSCS_E_SERVER_CONN_FAILURE -826
+ Description: Opening a connection to the server failed.
+
+ NSSCS_E_CONN_ACCESS_FAILURE -827
+ Description: Access to server connection failed.
+
+ NSSCS_E_ENUM_BUFF_TOO_LONG -828
+ Description: Size of the enumeration buffer exceeds the limit.
+
+ NSSCS_E_SECRET_BUFF_TOO_LONG -829
+ Description: Size of the Secret buffer exceeds the limit.
+
+ NSSCS_E_SECRET_ID_TOO_SHORT -830
+ Description: Lenght of the Secret ID should be greater than zero.
+
+ NSSCS_E_CORRUPTED_PACKET_DATA -831
+ Description: Protocol data corrupted on the wire.
+
+ NSSCS_E_EP_ACCESS_DENIED -832
+ Description: EP password validation failed. Access to the secret denied!
+
+ NSSCS_E_SCHEMA_NOT_EXTENDED -833
+ Description: Schema is not extended to support SecreStore on the target tree.
+
+ NSSCS_E_ATTR_NOT_FOUND -834
+ Description: One of the optional service attributes is not instantiated.
+
+ NSSCS_E_MIGRATION_NEEDED -835
+ Description: Server has been upgraded and user SecretStore should be updated.
+
+ NSSCS_E_MP_PWORD_INVALID -836
+ Description: Master passwrod could not be verified to read or unlock the secrets.
+
+ NSSCS_E_MP_PWORD_NOT_SET -837
+ Description: Master password has not been set on the SecretStore.
+
+ NSSCS_E_MP_PWORD_NOT_ALLOWED -838
+ Description: Ability to use master password has been disabled.
+
+ NSSCS_E_WRONG_REPLICA_TYPE -839
+ Description: Not a writeable replica of NDS.
+
+ NSSCS_E_ATTR_VAL_NOT_FOUND -840
+ Description: Target attrbute is not instantiated in NDS.
+
+ NSSCS_E_INVALID_PARAM -841
+ Description: API parameter is not initialized.
+
+ NSSCS_E_NEED_SECURE_CHANNEL -842
+ Description: Connection to the SecretStore needs to be over SSL.
+
+ NSSCS_E_CONFIG_NOT_SUPPORTED -843
+ Description: No server to support the given override configuration is found.
+
+ NSSCS_E_STORE_NOT_LOCKED -844
+ Description: Attempt to unlock SecretStore failed because the store is not locked.
+
+ NSSCS_E_TIME_OUT_OF_SYNC -845
+ Description: NDS Replica on the server that holds SecretStore is out of sync with the replica ring.
+
+ NSSCS_E_VERSION_MISMATCH -846
+ Description: Versions of the client dlls don't match.
+
+ NSSCS_E_SECRET_BUFF_TOO_SHORT -847
+ Description: Buffer supplied for the secret is too short (minimum NSSCS_MIN_IDLIST_BUF_LEN).
+
+ NSSCS_E_SH_SECRET_FAILURE -848
+ Description: Shared Secret processing and operations failed.
+
+ NSSCS_E_PARSER_FAILURE -849
+ Description: Shared Secret parser operations failed.
+
+ NSSCS_E_UTF8_OP_FAILURE -850
+ Description: Utf8 string operations failed.
+
+ NSSCS_E_CTX_LESS_CN_NOT_UNIQUE -851
+ Description: Contextless name for LDAP bind does not resolve to a unique DN
+
+ NSSCS_E_UNSUPPORTED_BIND_CRED -852
+ Description: login credential for advanced bind is not supported
+
+ NSSCS_E_CERTIFICATE_NOT_FOUND -853
+ Description: LDAP Root Cert required for Bind operations not found
+
+ NSSCS_E_WRONG_SH_SEC_TYPE -855
+ Description: Unrecognized or unknown shared secret tag.
+
+
+ NSSCS_E_NOT_IMPLEMENTED -888
+ Description: Feature not implemented yet.
+
+ NSSCS_E_BETA_EXPIRED -899
+ Description: Product's BETA life has expired! Official release copy should be
+ purchased.
+
+
+
+ ########################### END OFERROR CODES ########################## */
+
+ // * The following functions will be exposed as exported API:
+ // **************************************************************
+ // * These function calls will utilize the Support Functions for
+ // * populating or extracting data from a Shared Secret.
+ // **************************************************************
+
+ // General API Info:
+ //
+ // There is a high probability that services under the same group share the
+ // same user name and passwords. By specifying a service group name, the caller wants to
+ // take advantage of this to try to improve the user experience. If the service group
+ // name is not specified then no effort is made to share usernames and passwords with
+ // other services.
+ //
+ // If the svcGroupNameIsRealmName parameter is set to true then it is assumed that
+ // the services in the group validate username and passwords against the same
+ // database or against synchronized databases.
+ //
+ // If the svcGroupNameIsRealmName parameter is set to false then an attempt will be
+ // made to share passwords between the services in the group but services will be
+ // allowed to use different passwords. Specifying a service group does not mean
+ // that the system will not be able to obtain a username and password that is
+ // unique to a particular service.
+ //
+ // All strings passed through the API need to be NULL terminated.
+ //
+
+ //
+ // Get cache user credentials routine
+ //
+ // Parameters:
+ //
+ // ssFlags
+ // Sets behaviors desired on the Secret.
+ // Example: SSCS_PERSIST_CREDENTIAL_F (Make credential persistent)
+ //
+ // appSecretID (input) -
+ // Name of service requesting credentials.
+ //
+ // sharedSecretID (input) -
+ // The group name is the name of the backend authentication realm, relating a group of services.
+ // Example: NovellCollaboration (Groupwise, GW address book, GW Notify, and GWIM)
+ // This parameter can be set to NULL,
+ //
+ // credentialType (input)
+ // Type of credential structure used during this call.
+ // Currently we only support one:
+ // SSCS_CRED_TYPE_BASIC_F
+ //
+ // credential
+ // Pointer to the credential structure
+ //
+ // ext
+ // Reserved.
+ //
+ // Abstract:
+ //
+ // Get cache user credentials routine.
+ //
+ //
+
+ SSCS_EXTERN_LIBCALL(int)
+ NSSCSGetCredential
+ (
+ unsigned long ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ int * credentialType, // IN/OUT
+ void * credential, // OUT
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ SSCS_EXTERN_LIBCALL(int)
+ NSSCSSetCredential
+ (
+ unsigned long ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ int credentialType, // IN
+ void * credential, // IN
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ SSCS_EXTERN_LIBCALL(int)
+ NSSCSRemoveCredential
+ (
+ unsigned long ssFlags, // IN
+ SSCS_SECRET_ID_T * appSecretID, // IN
+ SSCS_SECRET_ID_T * sharedSecretID, // Optional IN
+ SSCS_EXT_T * ext // Reserved
+ );
+
+ // end
+
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif // _NSSCS_MANAGED_IDK_H_
+
diff --git a/LoginCapture/windows/windows.vcproj b/LoginCapture/windows/windows.vcproj
new file mode 100644
index 00000000..c952e111
--- /dev/null
+++ b/LoginCapture/windows/windows.vcproj
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Ping.cs b/Ping.cs
new file mode 100644
index 00000000..af53af6e
--- /dev/null
+++ b/Ping.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace Novell.CASA.MiCasa.Common
+{
+ ///
+ /// Summary description for Ping.
+ ///
+ ///
+ [Serializable]
+ public class Ping
+ {
+ public Ping()
+ {
+ //
+ // TODO: Add constructor logic here
+ //
+ }
+
+ public string clientmessage;
+ public string servermessage;
+
+ }
+}
diff --git a/Readme for Windows Build.txt b/Readme for Windows Build.txt
new file mode 100644
index 00000000..c2518eff
--- /dev/null
+++ b/Readme for Windows Build.txt
@@ -0,0 +1,7 @@
+To build miCASA 1.5 for windows, do the following:
+
+1. Install Visual Studio.net
+2. Install Cygwin
+3. Run the mk-cai-all script for windows
+
+The Setup files will be found in the 'products' directory
\ No newline at end of file
diff --git a/Readme for the project and setup.txt b/Readme for the project and setup.txt
new file mode 100644
index 00000000..fd71a54c
--- /dev/null
+++ b/Readme for the project and setup.txt
@@ -0,0 +1,138 @@
+/***********************************************************************
+ * File: README
+ *
+ * Copyright (C) 2005 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ***********************************************************************/
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON WINDOWS
+
+ - Install Visual Studio .NET 2003
+ - Install Cygwin - See instructions below.
+
+Download and start cygwin install:
+Browse to http://sources.redhat.com/cygwin/
+
+Click on "Install or update now!" or "Install Cygwin now"
+
+Cygwin Setup:
+Next
+
+Cygwin Setup - Choose Installation Type:
+Install from Internet
+Next
+
+Cygwin Setup - Choose Installation Directory:
+Root Directory: C:\cygwin
+Install For: "All Users"
+
+Default Text File Type: DOS
+
+Cygwin Setup - Select Local Package Directory:
+ Local Package Directory: C:\cygwin-packages
+
+Cygwin Setup - Select Connection Type:
+ Direct Connection
+
+Choose A Download Site:
+ ftp://ftp.nas.nasa.gov
+
+Cywin Setup - Select Packages:
+ Base:
+ defaults
+
+ Devel:
+ autoconf
+ automake
+ libtool
+ make
+ pkgconfig
+ cvs
+ gcc
+ gcc-g++
+
+ Editors:
+ vim (optional)
+
+ Net:
+ openssh
+ openssl
+
+ Text:
+ more
+
+ Utils:
+ clear (optional)
+
+Cygwin Setup - Create Icons:
+Finish
+
+Download the latest Jave JRE and J2EE from "http://java.sun.com"
+and install them on the machine.
+
+Edit cygwin.bat (c:\cygwin\cygwin.bat) to add a call to
+%VS71COMNTOOLS%\vsvars32.bat (see example below). Also
+add the MSCS and JAVA_HOME environment parameters to
+this file. This sets up the Visual Studio and Java tools
+in Cygwin.
+
+Sample cygwin.bat:
+
+@echo off
+
+call "%VS71COMNTOOLS%\vsvars32.bat" > NUL
+@set "MSCS=c:/WINDOWS/Microsoft.NET/Framework/%
+@set "JAVA_HOME=c:/Sun/AppServer/jdk"
+
+C:
+chdir C:\cygwin\bin
+
+bash --login -i
+
+To build run mk-ca-all or mk-cai-all scripts that will build all of the
+modules for debug and optimized.
+
+
+REQUIREMENTS FOR BUILDING THE SOFTWARE PACKAGE ON LINUX
+
+Install latest mono and mono-devel RPM - Obtain RPMs from
+www.go-mono.org.
+
+
+BUILDING THE SOFTWARE PACKAGE
+
+Windows: Start at Step 1.
+Linux: Skip to Step 2.
+
+1. Run cygwin.bat to start up Cygwin.
+
+2. Generate autotools files:
+./autogen.sh --prefix=/ [--enable-debug]
+( is some writable directory where 'make install' will
+install files for testing.
+
+3. To reconfigure later, or to configure software that came from a source
+distribution (.tar.gz) file, use configure.
+./configure --prefix/ [--enable-debug]
+(run ./configure --help for more options)
+
+4. Select your make target, here are a few interesting ones:
+mk-ca-all or mk-cai-all
+
+All of the build scripts are under shsrc/lshsrc for Linux or
+shsrc/wshsrc for Windows.
+
+
diff --git a/Readme.txt b/Readme.txt
new file mode 100644
index 00000000..ff502a3d
--- /dev/null
+++ b/Readme.txt
@@ -0,0 +1,49 @@
+INSTRUCTIONS FOR SETTING UP YOUR BUILD ENVIRONMENT
+==================================================
+
+MAKE CLEAN ALL run sequence mk-ca-all for developers and mk-cai-all for BMs.
+for individual builds:
+for Linux Directory cd shsrc/lshsrc and for Windows shsrc/wshsrc and find
+the mk-XXX-tp that matches the module name and the type and the platform.
+xxx the module name
+types:
+dp d for debug
+op o for optimized
+tl Linux platform
+tw Windows platform
+example:
+mk-nsssdk-ow optimzed for Windows
+mk-nsssdk-dl debug for linux
+
+command line form:
+mk-nsssdk-ow d clean all (d for developer - m for build manager)
+
+******************************************************************************************
+
+Complier has been upgraded to Microsoft VC 7. After installing the compiler and setting up
+parmaters as described above you need to copy the directory Vc7 under the compiler installation
+into c:\tools or a directory that does not have any spaces in the name because cypgwin and
+gnumake have problems executing commands in paths with spaces in the names.
+
+Cameron Mashayekhi 2/14/2005
+
+******************************************************************************************
+
+
+For a clarification on the location of the compiler please read changes.log with the entry
+dated 3/9/05.
+
+Code changed from using wide chars (wchar_t) to UTF8.
+sscs_utfh8.h
+sscs_string.h
+was added.
+
+To support ISF architecture the nsscs_idk.h replaced nsscs_sdk.h and for the Managed APIs
+the header file nsscs_mgmd_idk.h was added.
+
+nsssdk has been renamed to nssidk.
+
+Cameron Mashayekhi 3/9/05.
+
+******************************************************************************************
+
diff --git a/c_adlib/AD_Facade.cs b/c_adlib/AD_Facade.cs
new file mode 100644
index 00000000..b5786bfd
--- /dev/null
+++ b/c_adlib/AD_Facade.cs
@@ -0,0 +1,296 @@
+using System;
+using System.Collections;
+using System.Xml;
+using System.IO;
+using System.Collections.Specialized;
+using Novell.CASA.DataEngines.Common;
+using Novell.CASA.CASAPolicy;
+#if LINUX
+using Novell.CASA.GUI;
+#endif
+
+namespace Novell.CASA.DataEngines
+{
+
+ public class AD
+ {
+
+ private miCASAEngine micasaengine;
+#if LINUX
+ private GKEngine gkEngine = null;
+ private KWalletEngine kwEngine = null;
+#endif
+ private AggregationPol aggPol;
+
+
+ public AD()
+ {
+ // Always Aggregate miCASA.
+ micasaengine = new miCASAEngine();
+
+/*
+
+ // Reading Policy to see what else needs to be Aggregated.
+ aggPol = (AggregationPol) ICASAPol.GetPolicy(CASAPolType.AGGREGATION_POL);
+ if (aggPol != null )
+ {
+ ArrayList stores = aggPol.StoreList;
+ IEnumerator enumerator = stores.GetEnumerator();
+
+ while(enumerator.MoveNext())
+ {
+ string storeID = (((Store)(enumerator.Current)).StoreName);
+
+ if(storeID.Equals(ConstStrings.KW))
+ {
+ Logger.DbgLog("A-D Lib: KWallet Set up for Aggregation");
+ kwEngine = new KWalletEngine();
+ }
+ else if(storeID.Equals(ConstStrings.GK))
+ {
+ Logger.DbgLog("A-D Lib:Gnome Keyring Set up for Aggregation");
+ gkEngine = new GKEngine();
+ }
+ // Console.WriteLine("StoreName = " + ((Store)(enumerator.Current)).StoreName + "StoreId = " + ((Store)(enumerator.Current)).StoreId);
+ }
+ }
+ */
+
+ }
+
+ public XmlDocument Aggregate()
+ {
+#if LINUX
+ gkEngine = null;
+ kwEngine = null;
+#endif
+ //Read the Policy Just before you aggregate
+
+ // Reading Policy to see what else needs to be Aggregated.
+ aggPol = (AggregationPol) ICASAPol.GetPolicy(CASAPolType.AGGREGATION_POL);
+ if (aggPol != null )
+ {
+ ArrayList stores = aggPol.StoreList;
+ IEnumerator enumerator = stores.GetEnumerator();
+
+ while(enumerator.MoveNext())
+ {
+ string storeID = (((Store)(enumerator.Current)).StoreName);
+
+#if LINUX
+ if(storeID.Equals(ConstStrings.KW))
+ {
+ Logger.DbgLog("A-D Lib: KWallet Set up for Aggregation");
+ kwEngine = new KWalletEngine();
+ }
+ else if(storeID.Equals(ConstStrings.GK))
+ {
+ Logger.DbgLog("A-D Lib:Gnome Keyring Set up for Aggregation");
+ gkEngine = new GKEngine();
+ }
+#endif
+ // Console.WriteLine("StoreName = " + ((Store)(enumerator.Current)).StoreName + "StoreId = " + ((Store)(enumerator.Current)).StoreId);
+ }
+ }
+
+
+
+ XmlDocument ccf = new XmlDocument();
+ XmlElement elem = ccf.CreateElement("CCF");
+ ccf.AppendChild(elem);
+
+ // TBD: Lookup Policy here and maybe send it via constructors
+ XmlNode micasaEnum = micasaengine.Aggregate();
+ if (micasaEnum != null) //Atleast should come incase of no secrets
+ {
+ XmlNode gotit = ccf.ImportNode(micasaEnum,true);
+ ccf.DocumentElement.AppendChild(gotit);
+ }
+ else
+ {
+ // Null comes only when it failed to talk to miCASA.
+#if LINUX
+ Logger.DbgLog("A-D Lib:Failed to Connect to miCASA");
+#endif
+ }
+
+#if LINUX
+ if (gkEngine != null)
+ {
+ XmlNode gkSecrets = gkEngine.Aggregate();
+ if( null != gkSecrets )
+ {
+ XmlNode gkImportedNode = ccf.ImportNode(gkSecrets,true);
+ ccf.DocumentElement.AppendChild(gkImportedNode);
+ }
+ else
+ {
+ Logger.DbgLog("A-D Lib:Failed to Connect to Gnome Keyring");
+
+ }
+ }
+
+
+ if(kwEngine != null )
+ {
+ XmlNode KwEnum = kwEngine.Aggregate();
+ if (KwEnum != null) //Atleast should come incase of no secrets
+ {
+ XmlNode kwImported = ccf.ImportNode(KwEnum,true);
+ ccf.DocumentElement.AppendChild(kwImported);
+ }
+ else
+ {
+ // Null comes only when it failed to talk to Kwallet.
+ Logger.DbgLog("A-D Lib:Failed to Connect to KWallet");
+ }
+ }
+
+#endif
+
+
+ return ccf;
+
+ }
+
+
+ public int SetSecret(XmlNode secret, int StoreID)
+ {
+ //TBD: Check for Store ID and call the right DataEngine.
+ if (StoreID == ConstStrings.CASA_STORE_MICASA)
+ return micasaengine.SetSecret(secret);
+ else
+ {
+#if LINUX
+ Logger.DbgLog("A-D Lib:Failed to Set Secret in to miCASA");
+#endif
+ return -1;
+
+ }
+
+ }
+
+ public int GetSecret(XmlNode secret, int StoreID)
+ {
+
+ //TBD: Check for Store ID and call the right DataEngine.
+ if (StoreID == ConstStrings.CASA_STORE_MICASA)
+ return micasaengine.GetSecret(secret);
+ else
+ {
+#if LINUX
+ Logger.DbgLog("A-D Lib: Failed to Get Secret in to miCASA");
+#endif
+ return -1;
+ }
+ }
+
+
+
+
+ public int Remove(XmlNode secret, int StoreID)
+ {
+
+ //TBD: Check for Store ID and call the right DataEngine.
+ return micasaengine.Remove(secret);
+
+ }
+
+ public int AggregateStore(XmlDocument outDoc, int StoreID)
+ {
+ // This need not be policy aware. GUI knows what its doing.
+
+ XmlNode secEnum;
+ DataEngine engine;
+
+ XmlNode toproot = outDoc.DocumentElement;
+ if (toproot == null)
+ {
+ XmlElement elem = outDoc.CreateElement("CCF");
+ outDoc.AppendChild(elem);
+ }
+
+ if ( StoreID == ConstStrings.CASA_STORE_MICASA ) // If its miCASA
+ {
+ engine = micasaengine;
+ secEnum = engine.Aggregate();
+ if (secEnum != null )
+ {
+ XmlNode root = outDoc.DocumentElement;
+ XmlNodeList miCASANodes = root.SelectNodes("descendant::miCASA");
+ // Console.WriteLine("ADLIB: Count is " + miCASANodes.Count);
+ if (miCASANodes.Count != 0) // If there is something remove it
+ {
+ root.RemoveChild(miCASANodes[0]);
+ }
+ XmlNode gotit = outDoc.ImportNode(secEnum,true);
+ root.AppendChild(gotit);
+ return ConstStrings.CASA_SUCCESS;
+ }
+ else
+ return ConstStrings.CASA_STORE_NOT_AVAILABLE;
+ }
+#if LINUX
+ else if( StoreID == ConstStrings.CASA_STORE_GK )
+ {
+ gkEngine = new GKEngine();
+ secEnum = gkEngine.Aggregate();
+ if (secEnum != null )
+ {
+ XmlNode root = outDoc.DocumentElement;
+ XmlNodeList gkNode = root.SelectNodes("descendant::GK");
+ if (gkNode.Count != 0) // If there is something remove it
+ {
+ root.RemoveChild(gkNode[0]);
+ }
+ XmlNode gkImportNode = outDoc.ImportNode(secEnum,true);
+ root.AppendChild(gkImportNode);
+ return ConstStrings.CASA_SUCCESS;
+ }
+ else
+ return ConstStrings.CASA_STORE_NOT_AVAILABLE;
+
+ }
+ else if(StoreID == ConstStrings.CASA_STORE_KWALLET)
+ {
+ kwEngine = new KWalletEngine();
+ secEnum = kwEngine.Aggregate();
+ if (secEnum != null )
+ {
+ XmlNode root = outDoc.DocumentElement;
+ XmlNodeList gkNode = root.SelectNodes("descendant::KWallet");
+ if (gkNode.Count != 0) // If there is something remove it
+ {
+ root.RemoveChild(gkNode[0]);
+ }
+ XmlNode kwImportNode = outDoc.ImportNode(secEnum,true);
+ root.AppendChild(kwImportNode);
+ return ConstStrings.CASA_SUCCESS;
+ }
+ else
+ {
+ Console.WriteLine("KWallet some issue");
+ return ConstStrings.CASA_STORE_NOT_AVAILABLE;
+ }
+
+ }
+
+ Logger.DbgLog("A-D Lib: Unknown Operation Requested");
+#endif
+ return ConstStrings.CASA_OPERATION_FAILED;
+ }
+
+ public int InitAD()
+ {
+
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+
+ public int CleanUP_AD()
+ {
+
+ return ConstStrings.CASA_SUCCESS;
+ }
+ }
+}
diff --git a/c_adlib/Common.cs b/c_adlib/Common.cs
new file mode 100644
index 00000000..268116cc
--- /dev/null
+++ b/c_adlib/Common.cs
@@ -0,0 +1,65 @@
+using System;
+
+
+namespace Novell.CASA.DataEngines.Common
+{
+
+ public class ConstStrings
+ {
+
+ // Error codes
+ public static int CASA_SUCCESS = 0;
+ public static int CASA_OPERATION_FAILED = 1;
+ public static int CASA_STORE_NOT_AVAILABLE = 3;
+ public static int CASA_DATA_UNAVAILABLE = 4;
+
+ // Store IDs
+ public static string miCASA = "miCASA";
+ public static string KW = "KDE KWallet";
+ public static string GK = "GNOME Keyring";
+ public static string PM = "Password Manager";
+
+ //Store Types
+ public static int CASA_STORE_MICASA = 0;
+ public static int CASA_STORE_FFOX = 1;
+ public static int CASA_STORE_KWALLET =3;
+ public static int CASA_STORE_MOZILLA = 2;
+ public static int CASA_STORE_GK = 4;
+
+
+ //CCF Tag Names
+
+ public static string CCF_ID = "ID";
+ public static string CCF_GKTAG = "GK";
+ public static string CCF_KW = "KWallet";
+ public static string CCF_GKKEYRING = "Keyring";
+ public static string CCF_SECRET = "Secret";
+ public static string CCF_TYPE = "Type";
+ public static string CCF_KEY = "Key";
+ public static string CCF_VALUE = "Value";
+ public static string CCF_TIME = "Time";
+ public static string CCF_CRTIME = "Creation";
+ public static string CCF_MDTIME = "Modified";
+ public static string CCF_ACTIME = "Accessed";
+ public static string CCF_LOCK = "Lock";
+ public static string CCF_LOCKSTATUS = "LockStatus";
+ public static string CCF_LOCKHAND = "LockOnIdle";
+ public static string CCF_LOCKTIME = "LockTimeout";
+ public static string CCF_WALLET = "Wallet";
+ public static string CCF_FOLDER = "Folder";
+ public static string CCF_KEYCHAIN = "Keychain";
+ public static string CCF_KEYCHAINNAME = "Default";
+ public static string CCF_ZONE = "Zone";
+ public static string CCF_SYNCH = "Synch";
+ public static string CCF_NAME = "Name";
+
+
+
+
+ }
+
+
+
+}
+
+
diff --git a/c_adlib/GKEngine.cs b/c_adlib/GKEngine.cs
new file mode 100644
index 00000000..f4772584
--- /dev/null
+++ b/c_adlib/GKEngine.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Collections;
+using System.Xml;
+using System.IO;
+using System.Collections.Specialized;
+using System.Runtime.InteropServices;
+using Gtk;
+using GLib;
+using Novell.CASA.DataEngines.Common;
+using Novell.CASA.DataEngines.GK;
+
+
+namespace Novell.CASA.DataEngines
+{
+
+ /*
+ * This class is implementation of Data engine for Gnome-Keyring.
+ */
+
+ class GKEngine : DataEngine
+ {
+ public GKEngine()
+ {
+
+ }
+
+ public XmlNode Aggregate()
+ {
+ XmlDocument doc = new XmlDocument();
+
+ XmlNode rootElem = doc.CreateElement(ConstStrings.CCF_GKTAG);
+ doc.AppendChild(rootElem);
+ XmlElement keyringElem;
+
+ ArrayList itemList;
+ ArrayList attrList;
+ ItemInfo itemInfo;
+ KeyringInfo keyringInfo;
+ int itemId;
+ ArrayList keyringList = GnomeKeyring.GKGetKeyrings();
+ IEnumerator kEtor = keyringList.GetEnumerator();
+ IEnumerator iEtor;
+
+ while(kEtor.MoveNext())
+ {
+ string keyring = (string)(kEtor.Current);
+
+ keyringElem = doc.CreateElement(ConstStrings.CCF_GKKEYRING);
+ XmlAttribute idAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ idAttr.Value = keyring;
+ keyringElem.SetAttributeNode(idAttr);
+
+ keyringInfo = GnomeKeyring.GKGetKeyringInfo(keyring);
+
+ itemList = GnomeKeyring.GKGetItems(keyring);
+ iEtor = itemList.GetEnumerator();
+ while(iEtor.MoveNext())
+ {
+ itemId = (int)iEtor.Current;
+ itemInfo = GnomeKeyring.GKGetItemInfo(keyring,itemId);
+ attrList = GnomeKeyring.GKGetAttributeList(keyring,itemId);
+
+ XmlElement secretElem = doc.CreateElement(ConstStrings.CCF_SECRET);
+ XmlAttribute secIdAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ secIdAttr.Value = itemInfo.displayName + ":" + itemId;
+
+ secretElem.SetAttributeNode(secIdAttr);
+
+ XmlAttribute typeAttr = doc.CreateAttribute(ConstStrings.CCF_TYPE);
+ typeAttr.Value = itemInfo.itemType.ToString();
+ secretElem.SetAttributeNode(typeAttr);
+
+ XmlElement keyElem = doc.CreateElement(ConstStrings.CCF_KEY);
+ XmlAttribute keyIdAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ keyIdAttr.Value = "GKPassword";
+ keyElem.SetAttributeNode(keyIdAttr);
+
+ XmlElement valueElem = doc.CreateElement(ConstStrings.CCF_VALUE);
+ valueElem.InnerText = itemInfo.secret;
+ keyElem.AppendChild(valueElem);
+ secretElem.AppendChild(keyElem);
+
+ IEnumerator attrEtor = (IEnumerator)(attrList.GetEnumerator());
+ while(attrEtor.MoveNext())
+ {
+ Novell.CASA.DataEngines.GK.Attribute attr = (Novell.CASA.DataEngines.GK.Attribute)(attrEtor.Current);
+ keyElem = doc.CreateElement(ConstStrings.CCF_KEY);
+ keyIdAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ keyIdAttr.Value = attr.key;
+ keyElem.SetAttributeNode(keyIdAttr);
+
+ valueElem = doc.CreateElement(ConstStrings.CCF_VALUE);
+ valueElem.InnerText = attr.value;
+ keyElem.AppendChild(valueElem);
+ secretElem.AppendChild(keyElem);
+ }
+
+ keyringElem.AppendChild(secretElem);
+ XmlElement timeElem = doc.CreateElement(ConstStrings.CCF_TIME);
+
+ XmlElement itemCreatedTimeElem = doc.CreateElement(ConstStrings.CCF_CRTIME);
+ itemCreatedTimeElem.InnerText = itemInfo.mTime.ToString();
+ timeElem.AppendChild(itemCreatedTimeElem);
+
+ XmlElement itemModifiedTimeElem = doc.CreateElement(ConstStrings.CCF_MDTIME);
+ itemModifiedTimeElem.InnerText = itemInfo.cTime.ToString();
+ timeElem.AppendChild(itemModifiedTimeElem);
+
+ secretElem.AppendChild(timeElem);
+ }
+ XmlElement keyringTimeElem = doc.CreateElement(ConstStrings.CCF_TIME);
+
+ XmlElement createdTimeElem = doc.CreateElement(ConstStrings.CCF_CRTIME);
+ createdTimeElem.InnerText = keyringInfo.mTime.ToString();
+ keyringTimeElem.AppendChild(createdTimeElem);
+
+ XmlElement modifiedTimeElem = doc.CreateElement(ConstStrings.CCF_MDTIME);
+ modifiedTimeElem.InnerText = keyringInfo.cTime.ToString();
+ keyringTimeElem.AppendChild(modifiedTimeElem);
+
+ keyringElem.AppendChild(keyringTimeElem);
+
+ XmlElement lockElem = doc.CreateElement(ConstStrings.CCF_LOCK);
+
+ XmlAttribute lockStatusAttr = doc.CreateAttribute(ConstStrings.CCF_LOCKSTATUS);
+ if( keyringInfo.isLocked == 1 )
+ lockStatusAttr.Value = "locked";
+ else
+ lockStatusAttr.Value = "unlocked";
+ lockElem.SetAttributeNode(lockStatusAttr);
+
+ XmlAttribute lockOnIdleAttr = doc.CreateAttribute(ConstStrings.CCF_LOCKHAND);
+ if( keyringInfo.lockOnIdle == 1)
+ lockOnIdleAttr.Value = "true";
+ else
+ lockOnIdleAttr.Value = "false";
+ lockElem.SetAttributeNode(lockOnIdleAttr);
+
+ XmlAttribute lockTimeoutAttr = doc.CreateAttribute(ConstStrings.CCF_LOCKTIME);
+ lockTimeoutAttr.Value = keyringInfo.lockTimeout.ToString();
+ lockElem.SetAttributeNode(lockTimeoutAttr);
+
+ keyringElem.AppendChild(lockElem);
+ rootElem.AppendChild(keyringElem);
+ }
+#if TEST
+ XmlTextWriter writer = new XmlTextWriter("./gk.xml",null);
+ writer.Formatting = Formatting.Indented;
+ doc.Save(writer);
+ writer.Close();
+#endif
+
+ return doc.ChildNodes[0];
+ }
+ public int SetSecret(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+ public int GetSecret(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+ public int Remove(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+ }
+}
diff --git a/c_adlib/IDataEngine.cs b/c_adlib/IDataEngine.cs
new file mode 100644
index 00000000..c7881295
--- /dev/null
+++ b/c_adlib/IDataEngine.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections;
+using System.Xml;
+using System.Threading;
+
+
+namespace Novell.CASA.DataEngines
+{
+
+ /*
+ * Defines the interfaces to be implemenetd by all Data Engines.
+ */
+ public interface DataEngine
+ {
+
+ XmlNode Aggregate();
+
+ int GetSecret(XmlNode secret);
+
+ int SetSecret(XmlNode secret);
+
+ int Remove(XmlNode secret);
+
+
+
+
+ }
+
+}
+
+
diff --git a/c_adlib/KWalletEngine.cs b/c_adlib/KWalletEngine.cs
new file mode 100644
index 00000000..3bf750e6
--- /dev/null
+++ b/c_adlib/KWalletEngine.cs
@@ -0,0 +1,339 @@
+using System;
+using System.Collections;
+using System.Xml;
+using System.IO;
+using Novell.CASA;
+using Novell.CASA.DataEngines.Common;
+using System.Collections.Specialized;
+using System.Runtime.InteropServices;
+using Novell.CASA.DataEngines.KWallet;
+
+
+
+
+namespace Novell.CASA.DataEngines
+{
+
+ /*
+ * This class is implementation of Data engine for KWallet.
+ */
+
+
+ class KWalletEngine : DataEngine
+ {
+
+ string[] EntryTypes = {"Binary","Passwords","Unknown", "Maps"};
+
+
+ public KWalletEngine()
+ {
+ // TBD: Read Policy information and have a list of wallet names;
+
+ }
+
+ public XmlNode Aggregate()
+ {
+ XmlDocument doc = new XmlDocument();
+ Hashtable lookup = new Hashtable();
+ XmlElement key1;
+ XmlAttribute Atr;
+ XmlElement value1;
+ XmlAttribute idAttr;
+ String secid, val;
+ XmlElement currentWallet;
+ XmlElement Folder;
+ XmlElement Type;
+ XmlElement Secret;
+ String walletName, foldername, entryType, secretval;
+
+
+
+ //Adding Kwallet Top Node
+ XmlElement elem = doc.CreateElement(ConstStrings.CCF_KW);
+ doc.AppendChild(elem);
+
+ EnumSecretList enumList = new EnumSecretList();
+ //kwallet.Try(enumList);
+ kwallet.AggregateKW(enumList);
+ EnumSecretList tempEnumSecretList1 = enumList;
+
+ //This can be Null only when nothing is aggregated.
+ if (((String)Marshal.PtrToStringAnsi(tempEnumSecretList1.walletName)) == null )
+ {
+ //TBD: Log that there are no secrets to aggregate
+ }
+ else // Something to Aggregate
+ {
+
+
+ while (tempEnumSecretList1 != null)
+ {
+ walletName = (String)Marshal.PtrToStringAnsi(tempEnumSecretList1.walletName);
+ // Console.WriteLine("\n\nWallet name is***# : "+walletName);
+
+ foldername = (String)Marshal.PtrToStringAnsi(tempEnumSecretList1.folderName);
+ //Console.WriteLine("\tFolder***# : "+foldername);
+ int entrytype = tempEnumSecretList1.entryType;
+ //Console.WriteLine("\t\tEntryType ***#: "+entrytype);
+ entryType = EntryTypes[entrytype];
+ //Console.WriteLine("\t\tEntryType in string ***#: "+entryType);
+
+ secretval = (String)Marshal.PtrToStringAnsi(tempEnumSecretList1.secretVal);
+ //Console.WriteLine("\t\tSecret***# : "+secretval);
+
+ //Adding Wallet
+ if (lookup.ContainsKey(walletName))
+ {
+ //Console.WriteLine("Wallet Node found");
+ currentWallet = (XmlElement)lookup[walletName];
+ }
+ else
+ {
+ currentWallet = doc.CreateElement(ConstStrings.CCF_WALLET);
+ idAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ idAttr.Value = walletName;
+ currentWallet.SetAttributeNode(idAttr);
+ elem.AppendChild(currentWallet);
+ lookup.Add(walletName,currentWallet);
+ }
+
+ //Adding Folder
+ String xpath = "descendant::Folder[@Name='"+foldername+"']";
+ XmlNodeList folList = currentWallet.SelectNodes(xpath);
+ if (folList.Count == 0)
+ {
+ Folder = doc.CreateElement(ConstStrings.CCF_FOLDER);
+ XmlAttribute name_attr = doc.CreateAttribute(ConstStrings.CCF_NAME);
+ name_attr.Value = foldername;
+ Folder.SetAttributeNode(name_attr);
+ currentWallet.AppendChild(Folder);
+
+ }
+
+
+ //Adding Type
+ xpath = "descendant::Folder";
+ XmlNodeList folderlist = currentWallet.SelectNodes(xpath);
+
+ foreach(XmlNode folder in folderlist)
+ {
+ XmlAttributeCollection atcol = folder.Attributes;
+ XmlAttribute attr = atcol[ConstStrings.CCF_NAME];
+ if (attr.InnerXml.Equals(foldername))
+ {
+ xpath = "descendant::Type[@ID='"+entryType+"']";
+ XmlNodeList keylist = folder.SelectNodes(xpath);
+ if (keylist.Count == 0)
+ {
+ Type = doc.CreateElement(ConstStrings.CCF_TYPE);
+ XmlAttribute name_attr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ name_attr.Value = entryType;
+ Type.SetAttributeNode(name_attr);
+ folder.AppendChild(Type);
+
+ }
+ else
+ {
+ //Console.WriteLine("Type Already Added");
+ }
+
+ }
+
+ }
+
+
+
+ //Adding the Secret
+ xpath = "descendant::Folder";
+ folderlist = currentWallet.SelectNodes(xpath);
+
+ foreach(XmlNode folder in folderlist)
+ {
+ XmlAttributeCollection atcol = folder.Attributes;
+ XmlAttribute attr = atcol[ConstStrings.CCF_NAME];
+ if (attr.InnerXml.Equals(foldername))
+ {
+ xpath = "descendant::Type[@ID='"+entryType+"']";
+ XmlNodeList keylist = folder.SelectNodes(xpath);
+ if (keylist.Count == 0)
+ {
+ //Console.WriteLine("Construction of CCF Failed");
+ }
+ else
+ {
+ XmlNode TargetType = folder;
+ string[] split = null;
+
+ int index = secretval.IndexOf('=');
+ secid = secretval.Substring(0,index);
+
+
+ Secret = doc.CreateElement(ConstStrings.CCF_SECRET);
+ XmlAttribute idattr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ idattr.Value = secid;
+ Secret.SetAttributeNode(idattr);
+
+
+ if (entryType.Equals("Maps"))
+ {
+ string delim = ";";
+ char[] delimiter = delim.ToCharArray();
+ string realval = secretval.Substring(index+1);
+
+ for(int x = 1; x < 10 ; x++)
+ {
+ split = realval.Split(delimiter, x);
+ }
+ foreach(string s in split)
+ {
+ int ix;
+ string key;
+ string value;
+
+ //Console.WriteLine("The val is :" + s);
+ if (s.Equals(""))
+ {
+ //Console.WriteLine("No Secret Content for a Secret ID");
+ key = " ";
+ value = " ";
+ }
+ else
+ {
+ ix = s.IndexOf(':');
+ key = s.Substring(0,ix);
+ value = s.Substring(ix+1);
+
+ }
+
+ key1 = doc.CreateElement(ConstStrings.CCF_KEY);
+ Atr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ Atr.Value = key;
+ key1.SetAttributeNode(Atr);
+
+ //Value
+ value1 = doc.CreateElement(ConstStrings.CCF_VALUE);
+ value1.InnerText = value;
+ key1.AppendChild(value1);
+ Secret.AppendChild(key1);
+
+
+
+ TargetType.AppendChild(Secret);
+
+
+
+ }
+
+ }
+ else if (entryType.Equals("Passwords"))
+ {
+
+ //Console.WriteLine("Passwords");
+ val = secretval.Substring(index+1);
+
+
+ //Key
+ key1 = doc.CreateElement(ConstStrings.CCF_KEY);
+ Atr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ Atr.Value = "Credential";
+ key1.SetAttributeNode(Atr);
+
+ //Value
+ value1 = doc.CreateElement(ConstStrings.CCF_VALUE);
+ value1.InnerText = val;
+ key1.AppendChild(value1);
+ Secret.AppendChild(key1);
+
+ TargetType.AppendChild(Secret);
+
+
+ }
+ }
+ }
+ }
+
+
+
+ if (tempEnumSecretList1.next == IntPtr.Zero)
+ {
+ // Console.WriteLine("Reached End ##");
+ break;
+ }
+
+ tempEnumSecretList1 = (EnumSecretList)Marshal.PtrToStructure(tempEnumSecretList1.next, typeof(EnumSecretList));
+
+ }
+ }
+ kwallet.FreeResources();
+ return doc.ChildNodes[0];
+
+
+ }
+
+
+
+
+ public int SetSecret(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+
+
+
+
+ public int GetSecret(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+
+
+ public int Remove(XmlNode secret)
+ {
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+
+
+
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_adlib/Makefile b/c_adlib/Makefile
new file mode 100644
index 00000000..8d9ed8bc
--- /dev/null
+++ b/c_adlib/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = Novell.CASA.A-D
+CS_NAME = $(TARGET)$(xtra).$(CSH)
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+
+#
+# target object and source files
+#
+include src.$(PLAT)
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cs
diff --git a/c_adlib/Novell.CASA.A-D.csproj b/c_adlib/Novell.CASA.A-D.csproj
new file mode 100644
index 00000000..e0ac1635
--- /dev/null
+++ b/c_adlib/Novell.CASA.A-D.csproj
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_adlib/ad_gk/GnomeKeyring.cs b/c_adlib/ad_gk/GnomeKeyring.cs
new file mode 100644
index 00000000..db14705e
--- /dev/null
+++ b/c_adlib/ad_gk/GnomeKeyring.cs
@@ -0,0 +1,286 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Collections;
+using System.Threading;
+using Gtk;
+using GLib;
+
+namespace Novell.CASA.DataEngines.GK
+{
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public class KeyringInfo
+ {
+ public int lockOnIdle;
+ public uint lockTimeout;
+ public uint mTime;
+ public uint cTime;
+ public int isLocked;
+ }
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public class NativeItemInfo
+ {
+ public int itemType;
+ public IntPtr displayName;
+ public IntPtr secret;
+ public int mTime;
+ public int cTime;
+ public NativeItemInfo()
+ {
+ displayName = Marshal.AllocHGlobal(128);
+ secret = Marshal.AllocHGlobal(128);
+ }
+ ~NativeItemInfo()
+ {
+ Marshal.FreeHGlobal(displayName);
+ Marshal.FreeHGlobal(secret);
+ }
+ }
+
+ public class ItemInfo
+ {
+ public string itemType;
+ public string displayName;
+ public string secret;
+ public int mTime;
+ public int cTime;
+ }
+
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public class NativeAttribute
+ {
+ public uint type;
+ public IntPtr key;
+ public IntPtr value;
+ }
+
+ public class Attribute
+ {
+ public uint type;
+ public string key;
+ public string value;
+
+ }
+
+ public class GnomeKeyring
+ {
+ [DllImport("libad_gk.so")]
+ public static extern int GetKeyrings(out IntPtr list);
+ [DllImport("libad_gk.so")]
+ public static extern int GetKeyringInfo(string name,KeyringInfo info);
+ [DllImport("libad_gk.so")]
+ public static extern int GetItems(string keyring,out IntPtr list);
+ [DllImport("libad_gk.so")]
+ public static extern int GetItemInfo(string keyring,int itemId, NativeItemInfo info);
+ [DllImport("libad_gk.so")]
+ public static extern int GetAttributeList(string keyring,int itemId, out IntPtr attrList);
+ [DllImport("libad_gk.so")]
+ public static extern int FreeAttributeList(IntPtr attrList);
+
+ public static KeyringInfo GKGetKeyringInfo(string name)
+ {
+ KeyringInfo info = null;
+ try
+ {
+ info = new KeyringInfo();
+ int retVal = GetKeyringInfo(name,info);
+ if( 0 != retVal )
+ info = null;
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ info = null;
+ }
+ return info;
+ }
+
+ public static void PrintKeyringInfo(KeyringInfo info)
+ {
+ if( null == info )
+ return;
+ try
+ {
+ Console.WriteLine("lockOnIdle = " + info.lockOnIdle);
+ Console.WriteLine("lockTimeout = " + info.lockTimeout);
+ Console.WriteLine("mTime = " + info.mTime);
+ Console.WriteLine("cTime = " + info.cTime);
+ Console.WriteLine("isLocked = " + info.isLocked);
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ public static ItemInfo GKGetItemInfo(string keyring, int itemId)
+ {
+ ItemInfo info = null;
+ try
+ {
+ NativeItemInfo nativeItemInfo = new NativeItemInfo();
+ int retVal = GetItemInfo(keyring, itemId, nativeItemInfo);
+
+ if( 0 != retVal )
+ info = null;
+ else
+ {
+ info = new ItemInfo();
+ if(nativeItemInfo.itemType == 0)
+ info.itemType = "Generic Secret";
+ else if(nativeItemInfo.itemType == 1)
+ info.itemType = "Network Password";
+ else if(nativeItemInfo.itemType == 2)
+ info.itemType = "Note";
+ else
+ info.itemType = "No Type"; // need to have a better name
+
+ info.displayName = Marshal.PtrToStringAnsi(nativeItemInfo.displayName);
+ info.secret = Marshal.PtrToStringAnsi(nativeItemInfo.secret);
+ info.mTime = nativeItemInfo.mTime;
+ info.cTime = nativeItemInfo.cTime;
+ }
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ info = null;
+ }
+ return info;
+ }
+
+ public static void PrintItemInfo(ItemInfo info)
+ {
+ if( null == info )
+ return;
+ try
+ {
+ Console.WriteLine("CS : itemType = " + info.itemType);
+ Console.WriteLine("CS : displayName = " + info.displayName);
+ Console.WriteLine("CS : secret = " + info.secret);
+ Console.WriteLine("CS : mTime = " + info.mTime);
+ Console.WriteLine("CS : cTime = " + info.cTime);
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ public static ArrayList GKGetKeyrings()
+ {
+ ArrayList retList;
+ try
+ {
+ retList = new ArrayList();
+ IntPtr list = new IntPtr();
+ int retVal = GetKeyrings(out list);
+ if ( 0 != retVal )
+ retList = null;
+ GLib.List keyringList = new List(list,typeof(string));
+ IEnumerator etor = (IEnumerator)(keyringList.GetEnumerator());
+ string name;
+ while(etor.MoveNext())
+ {
+ name = (string)etor.Current;
+ retList.Add(name);
+ }
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ retList = null;
+ }
+ return retList;
+ }
+
+ public static ArrayList GKGetItems(string keyring)
+ {
+ ArrayList retList = null;
+ try
+ {
+ retList = new ArrayList();
+ IntPtr list = new IntPtr();
+ int retVal = GetItems(keyring,out list);
+ if( 0 != retVal )
+ retList = null;
+ GLib.List itemList = new List(list,typeof(int));
+ IEnumerator etor = (IEnumerator)(itemList.GetEnumerator());
+ int itemId;
+ while(etor.MoveNext())
+ {
+ itemId = (int)etor.Current;
+ retList.Add(itemId);
+ }
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ retList = null;
+ }
+ return retList;
+ }
+
+ public static ArrayList GKGetAttributeList(string keyring, int itemId)
+ {
+ ArrayList retList = null;
+ try
+ {
+ retList = new ArrayList();
+ IntPtr list = new IntPtr();
+ int retVal = GetAttributeList(keyring, itemId,out list);
+ if( 0 != retVal )
+ retList = null;
+ GLib.List attrList = new List(list,typeof(int));
+ IEnumerator etor = (IEnumerator)(attrList.GetEnumerator());
+ while(etor.MoveNext())
+ {
+ int test = (int)etor.Current;
+ IntPtr ptr = new IntPtr(test);
+
+ NativeAttribute attr = new NativeAttribute();
+ attr = (NativeAttribute)Marshal.PtrToStructure(ptr,typeof(NativeAttribute));
+
+ string key = Marshal.PtrToStringAnsi(attr.key);
+ string value = Marshal.PtrToStringAnsi(attr.value);
+
+ Attribute retAttr = new Attribute();
+ retAttr.type = attr.type;
+ retAttr.key = String.Copy(key);
+ retAttr.value = String.Copy(value);
+ retList.Add(retAttr);
+ }
+ if(retList.Count > 0)
+ FreeAttributeList(list);
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ retList = null;
+ }
+ return retList;
+ }
+
+ public static void PrintAttrList(ArrayList attrList)
+ {
+ if( null == attrList )
+ return;
+ Attribute attr;
+ try
+ {
+ IEnumerator etor = (IEnumerator)(attrList.GetEnumerator());
+ while(etor.MoveNext())
+ {
+ attr = (Attribute)(etor.Current);
+ Console.WriteLine("CS : AttrType = " + attr.type);
+ Console.WriteLine("CS : AttrKey = " + attr.key);
+ Console.WriteLine("CS : AttrValue = " + attr.value);
+ }
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+ }
+}
diff --git a/c_adlib/ad_gk/Makefile b/c_adlib/ad_gk/Makefile
new file mode 100644
index 00000000..6174cb0e
--- /dev/null
+++ b/c_adlib/ad_gk/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = Novell.CASA.DataEngines.GnomeKeyring
+CS_NAME = $(TARGET)$(xtra).$(EXE)
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+
+#
+# target object and source files
+#
+include src.$(PLAT)
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cs
diff --git a/c_adlib/ad_gk/native/Makefile b/c_adlib/ad_gk/native/Makefile
new file mode 100644
index 00000000..bdfd31c7
--- /dev/null
+++ b/c_adlib/ad_gk/native/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = ad_gk
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+BIN_NAME = $(TARGET)$(xtra).$(BIN)
+LIB_NAME = $(TARGET)$(xtra).$(LIB)
+
+#
+# target object and source files
+#
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cl
diff --git a/c_adlib/ad_gk/native/ad_gk.c b/c_adlib/ad_gk/native/ad_gk.c
new file mode 100644
index 00000000..9aa7d59a
--- /dev/null
+++ b/c_adlib/ad_gk/native/ad_gk.c
@@ -0,0 +1,237 @@
+#include "ad_gk.h"
+
+void ListKeyringsCb (GnomeKeyringResult result,
+ GList *keyrings,
+ gpointer data)
+{
+ GList *l = NULL;
+ char *name = NULL;
+ GList **retList = data;
+
+ GetKeyringsCbData *cbData = data;
+ GMainLoop *loop = cbData->loop;
+ retList = cbData->keyringList;
+ *retList = NULL;
+
+ if (result != GNOME_KEYRING_RESULT_OK)
+ {
+ g_print ("Unable to get keyring list - %d\n", result);
+ }
+ else
+ {
+ for (l = keyrings; l != NULL; l = l->next)
+ {
+ name = l->data;
+ *retList = g_list_append (*retList, g_strdup (name));
+ }
+ }
+ g_main_loop_quit (loop);
+}
+
+void KeyringGetInfoCb(GnomeKeyringResult result,
+ GnomeKeyringInfo *info,
+ gpointer data)
+{
+ GetKeyringInfoCbData *cbData = data;
+ KeyringInfo *retInfo = cbData->info;
+ if (result != GNOME_KEYRING_RESULT_OK)
+ {
+ g_print ("Unable to get keyring info %d\n", result);
+ }
+ else
+ {
+ retInfo->lockOnIdle = gnome_keyring_info_get_lock_on_idle(info);
+ retInfo->lockTimeout = gnome_keyring_info_get_lock_timeout(info);
+ retInfo->mTime = gnome_keyring_info_get_mtime(info);
+ retInfo->cTime = gnome_keyring_info_get_ctime(info);
+ retInfo->isLocked = gnome_keyring_info_get_is_locked(info);
+ }
+ g_main_loop_quit (cbData->loop);
+}
+
+void ListItemCb( GnomeKeyringResult result,
+ GList *list,
+ gpointer data)
+{
+ GList **retList;
+ GetItemsCbData *cbData = data;
+ retList = cbData->itemList;
+ *retList = NULL;
+
+ if (result != GNOME_KEYRING_RESULT_OK)
+ {
+ g_print ("Unable to get list of items : %d\n", result);
+ }
+ else
+ {
+ *retList = g_list_copy (list);
+ }
+
+ g_main_loop_quit (cbData->loop);
+}
+
+void ItemGetInfoCb( GnomeKeyringResult result,
+ GnomeKeyringItemInfo *info,
+ gpointer data)
+{
+ GetItemInfoCbData *cbData = data;
+ ItemInfo *itemInfo = cbData->info;
+ if (result != GNOME_KEYRING_RESULT_OK)
+ {
+ g_print ("Unable to get Item info: %d\n", result);
+ }
+ else
+ {
+ itemInfo->itemType = gnome_keyring_item_info_get_type(info);
+ strcpy(itemInfo->displayName,gnome_keyring_item_info_get_display_name(info));
+ strcpy(itemInfo->secret,gnome_keyring_item_info_get_secret(info));
+ itemInfo->mTime = gnome_keyring_item_info_get_mtime(info);
+ itemInfo->cTime = gnome_keyring_item_info_get_ctime(info);
+
+ }
+ g_main_loop_quit (cbData->loop);
+}
+
+void ItemGetAttributesCb(GnomeKeyringResult result,
+ GnomeKeyringAttributeList *attributes,
+ gpointer data)
+{
+ GnomeKeyringAttribute *attrList = NULL;
+ int i = 0;
+ GetAttributeListCbData *cbData = data;
+
+ Attribute *attr = NULL;
+ GList **retList;
+
+ retList = cbData->attrList;
+ *retList = NULL;
+
+ if( result != GNOME_KEYRING_RESULT_OK )
+ {
+ g_print("Unable to get the attributes of item\n");
+ }
+ else
+ {
+ attrList = (GnomeKeyringAttribute*)(attributes->data); //GArray has len and data
+ for(i = 0; i < attributes->len; i++ )
+ {
+ if(attrList[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING)
+ {
+ attr = (Attribute*)malloc(sizeof(Attribute));
+
+ if( NULL != attr )
+ {
+ memset(attr,0,sizeof(Attribute));
+ attr->type = 0;
+ attr->key = (char*)malloc(KEY_SIZE);
+ if(attr->key != NULL)
+ strcpy(attr->key,attrList[i].name);
+ attr->value = (char*)malloc(VAL_SIZE);
+ if(attr->value != NULL)
+ strcpy(attr->value,attrList[i].value.string);
+ }
+ }
+ else if(attrList[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32)
+ {
+ attr = (Attribute*)malloc(sizeof(Attribute));
+ if( NULL != attr )
+ {
+ memset(attr,0,sizeof(Attribute));
+ attr->type = 0;
+ attr->key = (char*)malloc(KEY_SIZE);
+ if(attr->key != NULL)
+ strcpy(attr->key,attrList[i].name);
+ attr->value = (char*)malloc(VAL_SIZE);
+ if(attr->value != NULL)
+ sprintf(attr->value,"%d",attrList[i].value.integer);
+ }
+ }
+ *retList = g_list_append (*retList, attr);
+ }
+ }
+ g_main_loop_quit (cbData->loop);
+}
+
+int GetKeyrings(GList **keyringList)
+{
+ GList *l = NULL;
+
+ GetKeyringsCbData cbData;
+ cbData.loop = g_main_loop_new (NULL, FALSE);
+ cbData.keyringList = keyringList;
+
+ gnome_keyring_list_keyring_names(ListKeyringsCb,&cbData,NULL);
+ g_main_loop_run(cbData.loop);
+ return SUCCESS;
+}
+
+int GetKeyringInfo(char *keyring,KeyringInfo *info)
+{
+ GetKeyringInfoCbData cbData;
+
+ cbData.loop = g_main_loop_new (NULL, FALSE);
+ cbData.info = info;
+
+ gnome_keyring_get_info(keyring, KeyringGetInfoCb,&cbData, NULL);
+ g_main_loop_run (cbData.loop);
+ return SUCCESS;
+}
+
+int GetItems(char *keyring, GList **itemList)
+{
+ GList *l = NULL;
+ gint itemId;
+ GetItemsCbData cbData;
+ cbData.loop = g_main_loop_new (NULL, FALSE);
+ cbData.itemList = itemList;
+
+ gnome_keyring_list_item_ids(keyring, ListItemCb, &cbData, NULL);
+ g_main_loop_run (cbData.loop);
+ return SUCCESS;
+}
+int GetItemInfo(char *keyring, int itemId, ItemInfo *info)
+{
+ GetItemInfoCbData cbData;
+ cbData.loop = g_main_loop_new (NULL, FALSE);
+ cbData.info = info;
+
+ gnome_keyring_item_get_info (keyring,itemId, ItemGetInfoCb,
+ &cbData, NULL);
+ g_main_loop_run (cbData.loop);
+ return SUCCESS;
+}
+
+int GetAttributeList(char *keyring, int itemId, GList **attrList)
+{
+ int i = 0;
+
+ GetAttributeListCbData cbData;
+ cbData.loop = g_main_loop_new (NULL, FALSE);
+ cbData.attrList = attrList;
+
+ gnome_keyring_item_get_attributes (keyring, itemId,
+ ItemGetAttributesCb, &cbData,
+ NULL);
+ g_main_loop_run (cbData.loop);
+ return SUCCESS;
+}
+
+int FreeAttributeList(GList *attrList)
+{
+ GList *l;
+ Attribute *attr = NULL;
+ for(l = attrList; l != NULL; l = l->next)
+ {
+ attr = (Attribute*)(l->data);
+ if(attr->key)
+ {
+ free(attr->key);
+ }
+ if(attr->value)
+ {
+ free(attr->value);
+ }
+ }
+ g_list_free(attrList);
+ return SUCCESS;
+}
diff --git a/c_adlib/ad_gk/native/ad_gk.h b/c_adlib/ad_gk/native/ad_gk.h
new file mode 100644
index 00000000..0c33af6e
--- /dev/null
+++ b/c_adlib/ad_gk/native/ad_gk.h
@@ -0,0 +1,76 @@
+#ifndef _AD_GK_H_
+#define _AD_GK_H_
+#include
+#include
+#include
+#include
+
+#define SUCCESS 0
+#define FAILURE -1
+
+#define KEY_SIZE 128
+#define VAL_SIZE 128
+
+typedef struct _KeyringInfo
+{
+ int32_t lockOnIdle;
+ uint32_t lockTimeout;
+ uint32_t mTime;
+ uint32_t cTime;
+ int32_t isLocked;
+}KeyringInfo;
+
+typedef struct _ItemInfo
+{
+ int32_t itemType;
+ char *displayName;
+ char *secret;
+ uint32_t mTime;
+ uint32_t cTime;
+}ItemInfo;
+
+typedef struct _Attribute
+{
+ uint32_t type;
+ char *key;
+ char *value;
+}Attribute;
+
+
+int GetKeyrings(GList **retList);
+int GetKeyringInfo(char *keyring,KeyringInfo *info);
+int GetItems(char *keyring, GList **itemList);
+int GetItemInfo(char *keyring, int itemId, ItemInfo *info);
+int GetAttributeList(char *keyring, int itemId, GList **);
+int FreeAttributeList(GList *attrList);
+
+typedef struct _GetKeyringsCbData
+{
+ GList **keyringList;
+ GMainLoop *loop;
+}GetKeyringsCbData;
+
+typedef struct _GetKeyringInfoCbData
+{
+ KeyringInfo *info;
+ GMainLoop *loop;
+}GetKeyringInfoCbData;
+
+typedef struct _GetItemsCbData
+{
+ GList **itemList;
+ GMainLoop *loop;
+}GetItemsCbData;
+
+typedef struct _GetItemInfoCbData
+{
+ ItemInfo *info;
+ GMainLoop *loop;
+}GetItemInfoCbData;
+
+typedef struct _GetAttributeListCbData
+{
+ GList **attrList;
+ GMainLoop *loop;
+}GetAttributeListCbData;
+#endif
diff --git a/c_adlib/ad_gk/native/link.lux b/c_adlib/ad_gk/native/link.lux
new file mode 100644
index 00000000..dfd857ac
--- /dev/null
+++ b/c_adlib/ad_gk/native/link.lux
@@ -0,0 +1,13 @@
+LINK = $(CPP) \
+ -Wl,-Bsymbolic \
+ -shared \
+ -pthread\
+ -O2 -fno-exceptions -fno-check-new\
+ -Wl,-rpath -Wl,/usr/lib$(ARCH_LIB) \
+ -L/usr/lib$(ARCH_LIB) -lpthread -lc -ldl \
+ -Wl,-soname -Wl,lib$(TARGET).so.$(PROD_NUM) \
+ -o $(LIBDIR)$(XTRA)/lib$(TARGET).so.$(BLD_VER) \
+ -L$(LIBDIR)$(XTRA) \
+ $(OBJDIR)*.$(O) `pkg-config --libs gnome-keyring-1` -lgnome-keyring \
+ `pkg-config --libs glib-2.0` -lglib-2.0
+
diff --git a/c_adlib/ad_gk/native/objs.lux b/c_adlib/ad_gk/native/objs.lux
new file mode 100644
index 00000000..50130ebf
--- /dev/null
+++ b/c_adlib/ad_gk/native/objs.lux
@@ -0,0 +1,2 @@
+OBJS=\
+ ad_gk.$(O)
diff --git a/c_adlib/ad_gk/objs.lux b/c_adlib/ad_gk/objs.lux
new file mode 100644
index 00000000..3466e0c6
--- /dev/null
+++ b/c_adlib/ad_gk/objs.lux
@@ -0,0 +1,2 @@
+OBJS=\
+ GnomeKeyring
diff --git a/c_adlib/ad_gk/src.lux b/c_adlib/ad_gk/src.lux
new file mode 100644
index 00000000..9b27dd5a
--- /dev/null
+++ b/c_adlib/ad_gk/src.lux
@@ -0,0 +1,2 @@
+SRC=\
+ GnomeKeyring.cs
diff --git a/c_adlib/ad_kw/KWalletEnum.cs b/c_adlib/ad_kw/KWalletEnum.cs
new file mode 100644
index 00000000..9232411d
--- /dev/null
+++ b/c_adlib/ad_kw/KWalletEnum.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Text;
+using System.Collections.Specialized;
+using System.Runtime.InteropServices;
+
+namespace Novell.CASA.DataEngines.KWallet
+{
+
+[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ public class EnumSecretList
+ {
+
+ public IntPtr walletName;
+ public IntPtr folderName;
+ public int entryType;
+ public IntPtr secretVal;
+ public IntPtr next;
+
+ };
+
+}
+
+
diff --git a/c_adlib/ad_kw/KWalletNative.cs b/c_adlib/ad_kw/KWalletNative.cs
new file mode 100644
index 00000000..58dbf68b
--- /dev/null
+++ b/c_adlib/ad_kw/KWalletNative.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Text;
+using System.Collections.Specialized;
+using System.Runtime.InteropServices;
+
+namespace Novell.CASA.DataEngines.KWallet
+{
+
+public class kwallet
+{
+
+ //private static int MAX_NAME_LENGTH = 512;
+ private const string CPP_LIB = "kwallets_rw";
+
+
+
+/*
+
+ [DllImport(CPP_LIB)]
+ public static extern void MyTest(
+ EnumSecretList enumSecretList
+ );
+
+*/
+ [DllImport(CPP_LIB)]
+ public static extern void Aggregate(
+ EnumSecretList enumSecretList
+ );
+
+ [DllImport(CPP_LIB)]
+ public static extern void FreeList();
+
+
+
+/*
+ public static int Try(EnumSecretList enumSecretList)
+ {
+ MyTest(enumSecretList);
+ return 0;
+ }
+
+*/
+ public static int AggregateKW(EnumSecretList enumSecretList)
+ {
+ Aggregate(enumSecretList);
+ return 0;
+ }
+
+
+
+ public static int FreeResources()
+ {
+ FreeList();
+ return 0;
+ }
+
+//TBD: All this for future.
+/*
+ [DllImport(CPP_LIB)]
+ public static extern int ReadSecret
+ (
+ [MarshalAs(UnmanagedType.LPStr)]
+ String walletName,
+ [MarshalAs(UnmanagedType.LPStr)]
+ String folderName,
+ [MarshalAs(UnmanagedType.LPStr)]
+ String key,
+ [MarshalAs(UnmanagedType.LPStr)]
+ Byte[] secretVal
+ );
+
+ [DllImport(CPP_LIB)]
+ public static extern int WriteSecret
+ (
+ [MarshalAs(UnmanagedType.LPStr)]
+ String walletName,
+ [MarshalAs(UnmanagedType.LPStr)]
+ String folderName,
+ int entryType,
+ [MarshalAs(UnmanagedType.LPStr)]
+ String key,
+ [MarshalAs(UnmanagedType.LPStr)]
+ Byte[] secret
+ );
+
+
+
+
+ [DllImport(CPP_LIB)]
+ public static extern void CloseAllWallets();
+
+
+
+
+
+
+
+ public static int ReadWallet(String walletName, String folderName, String key, Byte[] secretVal)
+ {
+
+ // Read a secret from wallet
+ return (ReadSecret(walletName, folderName, key, secretVal));
+ }
+
+ public static int WriteWallet(String walletName, String folderName,int entryType, String key, Byte[] secretVal)
+ {
+
+ // Write secret to wallet
+ return (WriteSecret( walletName, folderName, entryType, key, secretVal));
+
+ }
+
+
+
+
+
+ public static void DisconnectApplication()
+ {
+
+ CloseAllWallets();
+
+ }
+*/
+
+}
+
+}
diff --git a/c_adlib/ad_kw/Makefile b/c_adlib/ad_kw/Makefile
new file mode 100644
index 00000000..7ca8719e
--- /dev/null
+++ b/c_adlib/ad_kw/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = Novell.CASA.DataEngines.KWallet
+CS_NAME = $(TARGET)$(xtra).$(EXE)
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+
+#
+# target object and source files
+#
+include src.$(PLAT)
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cs
diff --git a/c_adlib/ad_kw/native/Makefile b/c_adlib/ad_kw/native/Makefile
new file mode 100644
index 00000000..201ac918
--- /dev/null
+++ b/c_adlib/ad_kw/native/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = kwallets_rw
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+BIN_NAME = $(TARGET)$(xtra).$(BIN)
+LIB_NAME = $(TARGET)$(xtra).$(LIB)
+
+#
+# target object and source files
+#
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cl
diff --git a/c_adlib/ad_kw/native/casa_dcop.h b/c_adlib/ad_kw/native/casa_dcop.h
new file mode 100644
index 00000000..eed42008
--- /dev/null
+++ b/c_adlib/ad_kw/native/casa_dcop.h
@@ -0,0 +1,49 @@
+// -*- c++ -*-
+#ifndef DCOPIFACEDEMO_H
+#define DCOPIFACEDEMO_H
+
+
+#include
+
+
+/**
+ * Adding DCOP interface to the Console.
+ *
+ */
+
+
+struct EnumSecretList
+{
+ // struct SecretInfo *sInfo;
+ char *walletName;
+ char *folderName;
+ int entryType;
+ char *secretVal;
+ struct EnumSecretList *next;
+};
+
+
+
+
+
+class DCOPDemoWidget : public QObject
+{
+
+ Q_OBJECT
+
+public:
+ DCOPDemoWidget();
+ ~DCOPDemoWidget();
+
+public slots:
+
+ int ReadAllWalletSecrets(struct EnumSecretList **);
+
+private:
+
+ int ReadKey(Wallet *, QString, QByteArray*);
+
+};
+
+#endif
+
diff --git a/c_adlib/ad_kw/native/kwallets_rw.cpp b/c_adlib/ad_kw/native/kwallets_rw.cpp
new file mode 100644
index 00000000..c49a76c1
--- /dev/null
+++ b/c_adlib/ad_kw/native/kwallets_rw.cpp
@@ -0,0 +1,389 @@
+#include
+#include
+#include
+#include
+#include
+
+
+using namespace KWallet;
+
+#include "kwallets_rw.h"
+#include "kwallets_rw.moc"
+//#include "mytest.h"
+
+
+// char *applName="dcopifacedemo";
+ char *applName="casaconsole";
+ QStringList walletList;
+
+ DCOPDemoWidget *win = new DCOPDemoWidget();
+
+ DCOPDemoWidget::DCOPDemoWidget()
+ {
+ if ( !kapp->dcopClient()->isRegistered() ) {
+ kapp->dcopClient()->registerAs( "casaconsole" );
+ }
+
+ }
+
+ DCOPDemoWidget::~DCOPDemoWidget()
+ {
+
+ for ( QStringList::Iterator walletIter = walletList.begin(); walletIter != walletList.end(); ++walletIter )
+ {
+ QString walletName = (*walletIter);
+ Wallet::disconnectApplication(walletName,applName);
+
+ }
+ }
+
+
+
+
+
+
+ int DCOPDemoWidget::ReadKey(Wallet *wallet,QString key, QByteArray *secretVal)
+ {
+
+ // Read the secret from the entry
+ QByteArray value;
+
+ if (wallet->readEntry(key, value)==0)
+ {
+
+ if (value)
+ {
+
+ *secretVal = value;
+ QDataStream convert(*secretVal, IO_ReadOnly);
+
+
+ if (wallet->entryType(key) == 1 )
+ {
+
+ // Convert the ByteArray to QString
+ QString passwd;
+ convert >> passwd;
+
+ } else if (wallet->entryType(key) == 3)
+ {
+
+ // If the entry is of type "map"
+ // Convert the ByteArray to QMap
+ QMap mapSecret;
+ convert >> mapSecret;
+
+ // Iterate through each map entry.
+ QMap::Iterator mapIter;
+ QString tempSecret = QString::fromLatin1("");
+
+ for ( mapIter = mapSecret.begin(); mapIter != mapSecret.end(); ++mapIter )
+ {
+ // This logic has to be improved
+ tempSecret.append(mapIter.key().latin1());
+ tempSecret.append(":");
+ tempSecret.append(mapIter.data().latin1());
+
+ if ((++mapIter) != mapSecret.end())
+ tempSecret.append(";");
+
+ --mapIter;
+ }
+
+ // Convert the QString to QByteArray
+ QDataStream stream(*secretVal, IO_WriteOnly);
+ stream << tempSecret ;
+
+ }
+
+ } else
+ {
+ printf("Could not read the entry..inner IF\n");
+ return -1;
+ }
+
+ } else
+ {
+ printf("Could not read the entry Inside wallet->readkey\n");
+ return -1;
+ }
+
+ return 0;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern "C"
+{
+ struct EnumSecretList *tempEnumSecrets = NULL;
+
+ //void MyTest(struct EnumSecretList *enumWalletSecrets)
+ void Aggregate(struct EnumSecretList *enumWalletSecrets)
+ {
+
+ printf("inside natiove agg");
+ int retVal = 0;
+ // struct EnumSecretList *tempEnumSecrets = NULL;
+ retVal = win->ReadAllWalletSecrets(&tempEnumSecrets);
+
+ struct EnumSecretList *iter = tempEnumSecrets;
+ //struct EnumSecretList *head = tempEnumSecrets;
+/*
+ if (iter == NULL)
+ {
+
+ printf("Native has given NULLLL\n");
+ enumWalletSecrets = NULL;
+ return;
+ }
+*/
+ while (iter != NULL)
+ {
+
+ /*
+ printf("\n\n**Wallet Name : %s\n",iter->walletName);
+ printf("\t**Folder Name : %s\n",iter->folderName);
+ printf("\t\t**Secret Type : %d\n",iter->entryType);
+ printf("\t\t\t**Secret Value : %s\n",iter->secretVal);
+ */
+
+ enumWalletSecrets->walletName = iter->walletName;
+ enumWalletSecrets->folderName = iter->folderName;
+ enumWalletSecrets->secretVal = iter->secretVal;
+ enumWalletSecrets->entryType = iter->entryType;
+ enumWalletSecrets->next = iter->next;
+
+ iter = iter->next;
+ if (iter != NULL)
+ {
+ enumWalletSecrets = enumWalletSecrets->next ;
+ }
+ else
+ {
+ enumWalletSecrets = NULL;
+ }
+
+ }
+/*
+ // Free the list
+ struct EnumSecretList *temp;
+ while (head != NULL)
+ {
+ free(head->walletName);
+ free(head->folderName);
+ free(head->secretVal);
+ //free(head->entryType);
+ temp = head->next;
+ free(head);
+ head = temp;
+ }
+
+
+ */
+
+ }
+
+
+
+ void FreeList()
+ {
+
+ struct EnumSecretList *head = tempEnumSecrets;
+
+ // Free the list
+ struct EnumSecretList *temp;
+ while (head != NULL)
+ {
+ free(head->walletName);
+ free(head->folderName);
+ free(head->secretVal);
+ //free(head->entryType);
+ temp = head->next;
+ free(head);
+ head = temp;
+ }
+
+
+ }
+}
+
+
+
+
+ int DCOPDemoWidget::ReadAllWalletSecrets(struct EnumSecretList **enumWalletSecrets)
+ {
+
+ walletList = Wallet::walletList();
+ for ( QStringList::Iterator walletIter = walletList.begin(); walletIter != walletList.end(); ++walletIter )
+ {
+ QString walletName = (*walletIter);
+ // printf("The wallet name is %s\n",(*walletIter).latin1());
+
+
+ // Open the wallet
+ Wallet *wallet = NULL;
+ wallet = Wallet::openWallet(walletName,0,Wallet::Synchronous);
+
+ if (wallet == NULL)
+ {
+ printf("Could not open the wallet\n");
+ return -1;
+ }
+
+ // Get the folder list of the wallet
+ QStringList folderList = wallet->folderList();
+
+ for ( QStringList::Iterator folderIter = folderList.begin(); folderIter != folderList.end(); ++folderIter)
+ {
+
+ // printf("\t%s\n",(*folderIter).latin1());
+ QString folderName = (*folderIter);
+
+ // Set the current folder
+ if (!(wallet->setFolder(folderName)))
+ {
+ printf("Could not set the folder\n");
+ return -1;
+ }
+
+ // Get the list of entries in the folder
+ QStringList entryList = wallet->entryList();
+
+ for ( QStringList::Iterator entryIter = entryList.begin(); entryIter != entryList.end(); ++entryIter)
+ {
+ //printf("Entry Name : \t\t%s\n",(*entryIter).latin1());
+
+ // Read the secret from the entry
+ QString key = (*entryIter);
+
+ QByteArray *secretVal = new QByteArray();
+ if (ReadKey(wallet,key,secretVal) != 0)
+ {
+ printf("Could not read \"%s\"\n",key.latin1());
+ break;
+ //FIXME
+ }
+
+ struct EnumSecretList *tempWalletSecrets = (struct EnumSecretList*)malloc(sizeof(struct EnumSecretList));
+
+ if (tempWalletSecrets == NULL) {
+ printf("Memory Allocation failure\n");
+ return -1;
+ }
+
+ tempWalletSecrets->walletName = (char*)malloc(512);
+
+ if (tempWalletSecrets->walletName == NULL)
+ {
+ printf("Memory Allocation failure\n");
+ return -1;
+ }
+
+ //printf("Wallet Name is %s\n",walletName.latin1());
+ strcpy(tempWalletSecrets->walletName, walletName.latin1());
+ tempWalletSecrets->folderName = (char*)malloc(512);
+
+ if (tempWalletSecrets->folderName == NULL)
+ {
+ printf("Memory Allocation failure\n");
+ return -1;
+ }
+
+ // printf("Folder Name is %s\n",folderName.latin1());
+
+ strcpy(tempWalletSecrets->folderName, folderName.latin1());
+ tempWalletSecrets->entryType = wallet->entryType(key);
+ // printf("EntryType is %d\n",wallet->entryType(key));
+
+
+ if (*enumWalletSecrets == NULL)
+ {
+ *enumWalletSecrets = tempWalletSecrets;
+ }
+ else
+ {
+ struct EnumSecretList *iter;
+ for(iter=*enumWalletSecrets; iter->next!=NULL; iter=iter->next);
+ iter->next = tempWalletSecrets;
+ }
+
+ tempWalletSecrets->next = NULL;
+
+
+
+
+ QDataStream convert(*secretVal, IO_ReadOnly);
+ QString passwd;
+ convert >> passwd;
+ tempWalletSecrets->secretVal = (char*)malloc(512);
+
+ if (tempWalletSecrets->secretVal == NULL)
+ {
+ printf("Memory Allocation failure\n");
+ return -1;
+ }
+
+ strcpy(tempWalletSecrets->secretVal,key.latin1());
+ //printf("After strcpy - 1 - key is %s\n",key.latin1());
+ strcat(tempWalletSecrets->secretVal,"=");
+ //printf("After strcat = \n");
+ if(passwd)
+ {
+ //printf("Passwd is %s\n",passwd.latin1());
+ strcat(tempWalletSecrets->secretVal,passwd.latin1());
+ }
+
+ // Free memory
+ free(secretVal);
+ // printf("After free\n");
+
+ }
+
+ }
+
+
+ // Print all the secrets
+/*
+ struct EnumSecretList *iter = *enumWalletSecrets;
+ while (iter != NULL)
+ {
+ printf("\n\nWallet Name : %s\n",iter->walletName);
+ printf("\tFolder Name : %s\n",iter->folderName);
+ printf("\t\tSecret Type : %d\n",iter->entryType);
+ printf("\t\t\t Secret Value : %s\n",iter->secretVal);
+ iter = iter->next;
+ }
+
+*/
+
+ }
+
+ return(0);
+
+}
+
+
+
+
diff --git a/c_adlib/ad_kw/native/kwallets_rw.h b/c_adlib/ad_kw/native/kwallets_rw.h
new file mode 100644
index 00000000..54404b9f
--- /dev/null
+++ b/c_adlib/ad_kw/native/kwallets_rw.h
@@ -0,0 +1,54 @@
+// -*- c++ -*-
+#ifndef DCOPIFACEDEMO_H
+#define DCOPIFACEDEMO_H
+#include
+
+
+/**
+ * Adding DCOP interface to an app.
+ */
+
+
+struct EnumSecretList
+{
+ char *walletName;
+ char *folderName;
+ int entryType;
+ char *secretVal;
+ struct EnumSecretList *next;
+};
+
+
+struct TryEnumSecretList
+{
+ char *name;
+ struct TryEnumSecretList *next;
+};
+
+
+
+
+class DCOPDemoWidget : public QObject
+{
+
+ Q_OBJECT
+
+public:
+ DCOPDemoWidget();
+ ~DCOPDemoWidget();
+
+public slots:
+
+// void dump();
+ int ReadAllWalletSecrets(struct EnumSecretList **);
+// int ReadWalletSecret(QString, QString, QString, QByteArray*);
+// int WriteWalletSecret(QString, QString, QString, QByteArray , int);
+
+private:
+
+ int ReadKey(Wallet*, QString, QByteArray*);
+
+};
+
+#endif
+
diff --git a/c_adlib/ad_kw/native/kwallets_rw.moc b/c_adlib/ad_kw/native/kwallets_rw.moc
new file mode 100644
index 00000000..f9f1e703
--- /dev/null
+++ b/c_adlib/ad_kw/native/kwallets_rw.moc
@@ -0,0 +1,108 @@
+/****************************************************************************
+** DCOPDemoWidget meta object code from reading C++ file 'casa_dcop.h'
+**
+** Created: Wed Mar 23 15:53:55 2005
+** by: The Qt MOC ($Id: qt/moc_yacc.cpp 3.3.1 edited Feb 18 14:21 $)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#undef QT_NO_COMPAT
+//#include "mytest.h"
+#include "casa_dcop.h"
+#include
+#include
+
+#include
+#if !defined(Q_MOC_OUTPUT_REVISION) || (Q_MOC_OUTPUT_REVISION != 26)
+#error "This file was generated using the moc from 3.3.1. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+const char *DCOPDemoWidget::className() const
+{
+ return "DCOPDemoWidget";
+}
+
+QMetaObject *DCOPDemoWidget::metaObj = 0;
+static QMetaObjectCleanUp cleanUp_DCOPDemoWidget( "DCOPDemoWidget", &DCOPDemoWidget::staticMetaObject );
+
+#ifndef QT_NO_TRANSLATION
+QString DCOPDemoWidget::tr( const char *s, const char *c )
+{
+ if ( qApp )
+ return qApp->translate( "DCOPDemoWidget", s, c, QApplication::DefaultCodec );
+ else
+ return QString::fromLatin1( s );
+}
+#ifndef QT_NO_TRANSLATION_UTF8
+QString DCOPDemoWidget::trUtf8( const char *s, const char *c )
+{
+ if ( qApp )
+ return qApp->translate( "DCOPDemoWidget", s, c, QApplication::UnicodeUTF8 );
+ else
+ return QString::fromUtf8( s );
+}
+#endif // QT_NO_TRANSLATION_UTF8
+
+#endif // QT_NO_TRANSLATION
+
+QMetaObject* DCOPDemoWidget::staticMetaObject()
+{
+ if ( metaObj )
+ return metaObj;
+ QMetaObject* parentObject = QObject::staticMetaObject();
+ static const QUMethod slot_0 = {"dump", 0, 0 };
+ // static const QUMethod slot_1 = {"getKWalletSecret", 0, 0 };
+ // static const QUMethod slot_2 = {"setKWalletSecret", 0, 0 };
+ static const QMetaData slot_tbl[] = {
+ { "dump()", &slot_0, QMetaData::Public },
+// { "getKWalletSecret()", &slot_1, QMetaData::Public },
+// { "setKWalletSecret()", &slot_2, QMetaData::Public }
+ };
+ metaObj = QMetaObject::new_metaobject(
+ "DCOPDemoWidget", parentObject,
+ slot_tbl, 3,
+ 0, 0,
+#ifndef QT_NO_PROPERTIES
+ 0, 0,
+ 0, 0,
+#endif // QT_NO_PROPERTIES
+ 0, 0 );
+ cleanUp_DCOPDemoWidget.setMetaObject( metaObj );
+ return metaObj;
+}
+
+void* DCOPDemoWidget::qt_cast( const char* clname )
+{
+ if ( !qstrcmp( clname, "DCOPDemoWidget" ) )
+ return this;
+ return QObject::qt_cast( clname );
+}
+
+bool DCOPDemoWidget::qt_invoke( int _id, QUObject* _o )
+{
+ switch ( _id - staticMetaObject()->slotOffset() ) {
+ case 0: break;//dump(); break;
+ // case 1: getKWalletSecret(); break;
+ // case 2: setKWalletSecret(); break;
+ default:
+ return QObject::qt_invoke( _id, _o );
+ }
+ return TRUE;
+}
+
+bool DCOPDemoWidget::qt_emit( int _id, QUObject* _o )
+{
+ return QObject::qt_emit(_id,_o);
+}
+#ifndef QT_NO_PROPERTIES
+
+bool DCOPDemoWidget::qt_property( int id, int f, QVariant* v)
+{
+ return QObject::qt_property( id, f, v);
+}
+
+bool DCOPDemoWidget::qt_static_property( QObject* , int , int , QVariant* ){ return FALSE; }
+#endif // QT_NO_PROPERTIES
diff --git a/c_adlib/ad_kw/native/link.lux b/c_adlib/ad_kw/native/link.lux
new file mode 100644
index 00000000..eaa57137
--- /dev/null
+++ b/c_adlib/ad_kw/native/link.lux
@@ -0,0 +1,14 @@
+LINK = $(CPP) \
+ -Wl,-Bsymbolic \
+ -shared \
+ -pthread\
+ -O2 -fno-exceptions -fno-check-new\
+ -Wl,-rpath -Wl,/usr/lib$(ARC) \
+ -L/usr/lib$(ARC) -lpthread -lc -ldl \
+ -Wl,-soname -Wl,lib$(TARGET).so.$(PROD_NUM) \
+ -o $(LIBDIR)$(XTRA)/lib$(TARGET).so.$(BLD_VER) \
+ -L$(LIBDIR)$(XTRA) \
+ $(OBJDIR)*.$(O) -L/opt/kde3/lib$(ARC) \
+ -L/usr/X11R6/lib$(ARC) -L/usr/lib/qt3/lib$(ARC) \
+ -lkwalletclient -lqt-mt
+
diff --git a/c_adlib/ad_kw/native/objs.lux b/c_adlib/ad_kw/native/objs.lux
new file mode 100644
index 00000000..94ac84dc
--- /dev/null
+++ b/c_adlib/ad_kw/native/objs.lux
@@ -0,0 +1,2 @@
+OBJS=\
+ kwallets_rw.$(O)
diff --git a/c_adlib/ad_kw/objs.lux b/c_adlib/ad_kw/objs.lux
new file mode 100644
index 00000000..323ef5bc
--- /dev/null
+++ b/c_adlib/ad_kw/objs.lux
@@ -0,0 +1,3 @@
+OBJS=\
+ KWalletEnum\
+ KWalletNative
diff --git a/c_adlib/ad_kw/src.lux b/c_adlib/ad_kw/src.lux
new file mode 100644
index 00000000..c02d17e3
--- /dev/null
+++ b/c_adlib/ad_kw/src.lux
@@ -0,0 +1,3 @@
+SRC=\
+ KWalletEnum.cs\
+ KWalletNative.cs
diff --git a/c_adlib/miCASAEngine.cs b/c_adlib/miCASAEngine.cs
new file mode 100644
index 00000000..b7ccf37d
--- /dev/null
+++ b/c_adlib/miCASAEngine.cs
@@ -0,0 +1,382 @@
+using System;
+using System.Collections;
+using System.Xml;
+using System.IO;
+using Novell.CASA;
+using System.Collections.Specialized;
+using Novell.CASA.DataEngines.Common;
+
+
+
+namespace Novell.CASA.DataEngines
+{
+
+ /*
+ * This class is implementation of Data engine for miCASA.
+ */
+
+ //TBD: Generally we need to find out if fault is in parameter or miCASA or not available
+
+ class miCASAEngine : DataEngine
+ {
+
+ public SecretStore store = null;
+
+ public miCASAEngine()
+ {
+
+ //TBD: What happens here at miCASA end ?
+ store = SecretStore.getInstance();
+ }
+
+ public XmlNode Aggregate()
+ {
+
+ XmlDocument doc = new XmlDocument();
+ XmlElement key1;
+ XmlAttribute Atr;
+ XmlElement value1;
+ XmlElement mi_secret;
+ XmlAttribute synchAttr;
+ XmlAttribute secidAttr;
+ String sKey, sValue;
+
+
+ //Adding miCASA Top Node
+ XmlElement elem = doc.CreateElement(ConstStrings.miCASA);
+ doc.AppendChild(elem);
+
+
+ StringCollection sc = store.enumerateSecretIDs();
+ if (sc != null)
+ {
+ // Adding Keychain
+ XmlElement keychain = doc.CreateElement(ConstStrings.CCF_KEYCHAIN);
+ XmlAttribute id_attr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ id_attr.Value = ConstStrings.CCF_KEYCHAINNAME;
+ keychain.SetAttributeNode(id_attr);
+ elem.AppendChild(keychain);
+
+
+ StringEnumerator se = sc.GetEnumerator();
+ se.Reset();
+
+ while (se.MoveNext())
+ {
+
+ Secret secret = store.getSecret(se.Current);
+ NameValueCollection nvc = secret.getKeyValueCollection();
+
+ mi_secret = doc.CreateElement(ConstStrings.CCF_SECRET);
+ synchAttr = doc.CreateAttribute(ConstStrings.CCF_SYNCH);
+ //TBD:
+ synchAttr.Value = "Persistent Secret" ;
+ secidAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ secidAttr.Value = se.Current;
+ mi_secret.SetAttributeNode(secidAttr);
+ mi_secret.SetAttributeNode(synchAttr);
+
+
+ for (int i = 0; i < nvc.Count; i++)
+ {
+
+ sKey = nvc.GetKey(i);
+ sValue = nvc.Get(sKey);
+
+ //Key
+ key1 = doc.CreateElement(ConstStrings.CCF_KEY);
+ Atr = doc.CreateAttribute(ConstStrings.CCF_ID);
+
+ Atr.Value = sKey;
+ key1.SetAttributeNode(Atr);
+
+ //Value
+ value1 = doc.CreateElement(ConstStrings.CCF_VALUE);
+ value1.InnerText = sValue;
+
+ key1.AppendChild(value1);
+
+ mi_secret.AppendChild(key1);
+
+ }
+
+/*
+ //Time
+ XmlElement Time1 = doc.CreateElement(ConstStrings.CCF_TIME);
+
+ XmlElement zone1 = doc.CreateElement(ConstStrings.CCF_ZONE);
+ zone1.InnerText = "IST";
+
+ XmlElement cr1 = doc.CreateElement(ConstStrings.CCF_CRTIME);
+ cr1.InnerText = null;
+
+ XmlElement mod1 = doc.CreateElement(ConstStrings.CCF_MDTIME);
+ mod1.InnerText = null;
+
+ XmlElement acc1 = doc.CreateElement(ConstStrings.CCF_ACTIME);
+ acc1.InnerText = null;
+
+ Time1.AppendChild(zone1);
+ Time1.AppendChild(cr1);
+ Time1.AppendChild(mod1);
+ Time1.AppendChild(acc1);
+
+ mi_secret.AppendChild(Time1);
+*/
+
+ //Finally Add Secret to Elem
+ keychain.AppendChild(mi_secret);
+
+ }
+ }
+
+
+
+ return doc.ChildNodes[0];
+
+
+ }
+
+ internal bool KeyInNewList(NameValueCollection nvc, string key)
+ {
+ if (nvc != null)
+ {
+ for (int i = 0; i < nvc.Count; i++)
+ {
+ string sKey = nvc.GetKey(i);
+ if( key == sKey )
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+
+ public int SetSecret(XmlNode secret)
+ {
+
+ XmlAttributeCollection atcol = secret.Attributes;
+ String secretid = atcol["ID"].InnerXml;
+ Secret secretVal = store.getSecret(secretid);
+
+ NameValueCollection nvc = secretVal.getKeyValueCollection();
+ ArrayList existingKeyList;
+
+ if (nvc.Count == 0)
+ {
+ existingKeyList = null;
+ }
+ else
+ {
+ existingKeyList = new ArrayList();
+ }
+
+ for(int i = 0; i < nvc.Count; i++ )
+ {
+ existingKeyList.Add(nvc.GetKey(i));
+ }
+
+ XmlNodeList keylist = secret.SelectNodes("descendant::Key");
+
+ NameValueCollection newNVC = new System.Collections.Specialized.NameValueCollection();
+
+ foreach (XmlNode tuple in keylist)
+ {
+ //Get the Key
+ XmlAttributeCollection at = tuple.Attributes;
+ String keyname = (at["ID"]).InnerText;
+ newNVC.Add(keyname, tuple.ChildNodes[0].InnerText);
+ }
+
+ if(null != existingKeyList)
+ {
+ IEnumerator etor = existingKeyList.GetEnumerator();
+ while( etor.MoveNext() )
+ {
+ string key = (string)etor.Current;
+ if(KeyInNewList(newNVC,key) == false)
+ {
+ secretVal.removeKey(key,0);
+ }
+ }
+ }
+ for(int i = 0 ; i < newNVC.Count ; i++)
+ {
+ string key = newNVC.GetKey(i);
+ secretVal.setKeyValuePair(key,newNVC.Get(key));
+ }
+
+ // TBD: Return Value ??
+ store.setSecret(0, secretVal, Secret.SS_CREDSET);
+
+ return ConstStrings.CASA_SUCCESS;
+
+ }
+
+
+
+
+
+ public int GetSecret(XmlNode secret)
+ {
+ XmlDocument doc;
+ XmlElement key1;
+ XmlAttribute Atr;
+ XmlElement value1;
+ XmlElement mi_secret;
+ XmlAttribute synchAttr;
+ XmlAttribute secidAttr;
+ String sKey, sValue;
+
+
+
+ XmlAttributeCollection atcol = secret.Attributes;
+ String secretid = atcol["ID"].InnerXml;
+
+ Secret secretVal = store.getSecret(secretid);
+ NameValueCollection nvc = secretVal.getKeyValueCollection();
+
+ if (nvc.Count == 0)
+ {
+ //Console.WriteLine("Secret got deleted, ID is " + secretid) ;
+ return ConstStrings.CASA_DATA_UNAVAILABLE;
+ }
+ else
+ {
+ //Console.WriteLine("Got the secret from miCASA.");
+ doc = secret.OwnerDocument;
+ XmlNode root = secret.ParentNode;
+ XmlNode keychain = secret.ParentNode;
+
+ // Delete the Secret Node.
+ root.RemoveChild(secret);
+
+ mi_secret = doc.CreateElement(ConstStrings.CCF_SECRET);
+ synchAttr = doc.CreateAttribute("Synch");
+ synchAttr.Value = "Persistent Secret";
+ secidAttr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ secidAttr.Value = secretid;
+ mi_secret.SetAttributeNode(secidAttr);
+ mi_secret.SetAttributeNode(synchAttr);
+
+ for (int i = 0; i < nvc.Count; i++)
+ {
+
+ sKey = nvc.GetKey(i);
+ sValue = nvc.Get(sKey);
+
+ //Key
+ key1 = doc.CreateElement(ConstStrings.CCF_KEY);
+ Atr = doc.CreateAttribute(ConstStrings.CCF_ID);
+ Atr.Value = sKey;
+ key1.SetAttributeNode(Atr);
+
+ //Value
+ value1 = doc.CreateElement(ConstStrings.CCF_VALUE);
+ value1.InnerText = sValue;
+
+ key1.AppendChild(value1);
+
+ mi_secret.AppendChild(key1);
+
+ //Console.WriteLine(sKey + " = " + sValue);
+ }
+
+
+ //Time
+ XmlElement Time1 = doc.CreateElement(ConstStrings.CCF_TIME);
+
+ XmlElement zone1 = doc.CreateElement(ConstStrings.CCF_ZONE);
+ zone1.InnerText = "IST";
+
+ XmlElement cr1 = doc.CreateElement(ConstStrings.CCF_CRTIME);
+ cr1.InnerText = null;
+
+ XmlElement mod1 = doc.CreateElement(ConstStrings.CCF_MDTIME);
+ mod1.InnerText = null;
+
+ XmlElement acc1 = doc.CreateElement(ConstStrings.CCF_ACTIME);
+ acc1.InnerText = null;
+
+ Time1.AppendChild(zone1);
+ Time1.AppendChild(cr1);
+ Time1.AppendChild(mod1);
+ Time1.AppendChild(acc1);
+
+ mi_secret.AppendChild(Time1);
+
+ //Finally Add Secret to Elem
+ keychain.AppendChild(mi_secret);
+
+
+ return ConstStrings.CASA_SUCCESS;
+ }
+
+
+
+ }
+
+
+
+ public int Remove(XmlNode secret)
+ {
+
+ XmlAttributeCollection atcol = secret.Attributes;
+ String secretid = atcol["ID"].InnerXml;
+
+ //TBD: Why no other overloaded API
+ store.removeSecret(secretid.Substring(secretid.IndexOf(":")+1), Secret.SS_CREDSET);
+
+
+ XmlNode root = secret.ParentNode;
+ root.RemoveChild(secret);
+
+ return ConstStrings.CASA_SUCCESS;
+
+
+ }
+
+
+
+
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_adlib/objs.lux b/c_adlib/objs.lux
new file mode 100644
index 00000000..b69c4dc4
--- /dev/null
+++ b/c_adlib/objs.lux
@@ -0,0 +1,9 @@
+OBJS=\
+ Common\
+ IDataEngine\
+ miCASAEngine\
+ AD_Facade\
+ KWalletEngine\
+ GKEngine \
+ ../c_gui/Logger
+
diff --git a/c_adlib/objs.w32 b/c_adlib/objs.w32
new file mode 100644
index 00000000..64864e3a
--- /dev/null
+++ b/c_adlib/objs.w32
@@ -0,0 +1,7 @@
+OBJS=\
+ Common\
+ IDataEngine\
+ miCASAEngine\
+ AD_Facade\
+ ..\\c_gui\\Logger.cs
+
diff --git a/c_adlib/src.lux b/c_adlib/src.lux
new file mode 100644
index 00000000..a776a9f2
--- /dev/null
+++ b/c_adlib/src.lux
@@ -0,0 +1,8 @@
+SRC=\
+ Common.cs\
+ IDataEngine.cs\
+ miCASAEngine.cs\
+ AD_Facade.cs\
+ KWalletEngine.cs\
+ GKEngine.cs \
+ ../c_gui/Logger.cs
diff --git a/c_adlib/src.w32 b/c_adlib/src.w32
new file mode 100644
index 00000000..eb2aec9d
--- /dev/null
+++ b/c_adlib/src.w32
@@ -0,0 +1,6 @@
+SRC=\
+ Common.cs\
+ IDataEngine.cs\
+ miCASAEngine.cs\
+ AD_Facade.cs\
+ ..\\c_gui\\Logger.cs
diff --git a/c_common/sscs_ll.c b/c_common/sscs_ll.c
new file mode 100644
index 00000000..1848ae28
--- /dev/null
+++ b/c_common/sscs_ll.c
@@ -0,0 +1,437 @@
+/****************************************************************************
+ %name: sscs_ll.c %
+ %version: 9 %
+ %date_modified: Thu May 12 13:17:50 2005 %
+ *
+ ****************************************************************************/
+
+#include
+#include
+#include "sscs_lldefs.h"
+
+
+/* */
+/*
+ * NAME - _ll_CreateLink
+ *
+ * DESCRIPTION
+ * This function will create a link to be used in a list.
+ *
+ */
+LL_LINK_T *_ll_CreateLink(uint32_t itemSize)
+{ /* beginning of the call */
+/* ########################## DECLARATIONS START HERE ######################### */
+
+ /* allocate the new link */
+ LL_LINK_T *newLink = (LL_LINK_T *)(malloc(sizeof(LL_LINK_T) + itemSize));
+
+/* ############################## CODE STARTS HERE ############################ */
+
+ if(newLink)
+ {
+ /* clear out the allocated buffer */
+ memset(newLink, 0 , sizeof(sizeof(LL_LINK_T)+itemSize));
+ newLink->item = (((uint8_t *)newLink) + sizeof(LL_LINK_T));
+ return(newLink);
+ }
+
+ return(NULL);
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of _ll_CreateLink */
+
+
+
+/* */
+/*
+ * NAME - ll_RemoveCurrentLink
+ *
+ * DESCRIPTION
+ *
+ *
+ */
+void ll_RemoveCurrentLink(LL_LINKLIST_T *list)
+{ /* beginning of the call */
+/* ######################## DECLARATIONS START HERE ######################## */
+
+ int i;
+ LL_LINK_T *prev = NULL, *targetLink = NULL;
+
+/* ########################### CODE STARTS HERE ############################ */
+
+ if(list->elemCount)
+ {
+ // save the link to delete
+ targetLink = list->clp;
+ // start at the head
+ list->clp = list->head;
+
+ for(i = 0; i < (int)list->elemCount; i++)
+ {
+ if(list->clp == targetLink)
+ {
+ if(prev)
+ {
+ prev->next = list->clp->next;
+ list->clp = prev;
+ }
+ else
+ {
+ list->head = list->head->next;
+ list->clp = list->head;
+ }
+
+ free(targetLink);
+ list->elemCount--;
+ break;
+ }
+ else
+ {
+ prev = list->clp;
+ list->clp = list->clp->next;
+ }
+ }
+ }
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_RemoveCurrentLink */
+
+
+
+
+
+/* */
+/*
+ * NAME - ll_InsertSharedSecretLink
+ *
+ * DESCRIPTION
+ * This function inserts a new link into the link list after the
+ * CLP. If the CLP is pointing to the tail of the list the new
+ * link will become the new tail for the list. The new link will
+ * become the CLP and the index will be set to CLP.
+ *
+ */
+int ll_InsertSharedSecretLink
+ (
+ LL_LINKLIST_T *list,
+ uint32_t kLen,
+ SS_UTF8_T *key,
+ uint32_t vLen,
+ uint8_t *value
+ )
+{ /* beginning of the call */
+/* ########################## DECLARATIONS START HERE ######################################## */
+
+ uint32_t keyLen = sscs_Utf8StrSize(key);
+ LL_LINK_T *newLink = _ll_CreateLink(sizeof(LL_SHSEC_KEY_VAL_T) + keyLen + vLen);
+ LL_SHSEC_KEY_VAL_T *sharedLink;
+
+/* ############################## CODE STARTS HERE ########################################### */
+
+ if(newLink)
+ {
+ if(list->elemCount)
+ {
+ list->clp = list->head;
+ /* check for duplicates */
+ do
+ {
+ // check to see if the key exists
+ if(((ll_GetSHSecKeyLen(list) == kLen) &&
+ (memcmp(ll_GetSHSecKey(list), key, ll_GetSHSecKeyLen(list))) == 0))
+ {
+ // the key exists now check for the value
+ if((ll_GetSHSecValLen(list) == vLen) &&
+ (memcmp(ll_GetSHSecVal(list), value, ll_GetSHSecValLen(list)) == 0))
+ {
+ /* element already in the list */
+ free(newLink);
+ return(NSSCS_LL_SUCCESS);
+ }
+ else
+ {
+ // free the link with old valude
+ ll_RemoveCurrentLink(list);
+ break;
+ }
+ }
+
+ /* move forward one link */
+ if(list->clp->next)
+ {
+ list->clp = list->clp->next;
+ continue;
+ }
+ else
+ {
+ /* end of the list not found */
+ break;
+ }
+ } while(TRUE);
+
+ if (list->clp)
+ {
+ list->clp->next = newLink;
+ /* reset the clp to the new link */
+ list->clp = newLink;
+ (list->elemCount)++;
+ }
+ else
+ {
+ list->head = list->clp = newLink;
+ list->elemCount = 1;
+ }
+ }
+ else
+ {
+ list->head = list->clp = newLink;
+ list->elemCount = 1;
+ }
+
+ /* copy linkData to the link */
+ sharedLink = (LL_SHSEC_KEY_VAL_T*)list->clp->item;
+ sharedLink->kLen = kLen;
+ sharedLink->vLen = vLen;
+ sharedLink->key = (SS_UTF8_T *)(((uint8_t *)sharedLink) + sizeof(LL_SHSEC_KEY_VAL_T));
+ sharedLink->value = (((uint8_t *)sharedLink) + sizeof(LL_SHSEC_KEY_VAL_T)) + keyLen;
+
+ sscs_Utf8Strcpy(sharedLink->key, key);
+ memcpy(sharedLink->value, value, vLen);
+
+ return(NSSCS_LL_SUCCESS);
+ }
+ else
+ {
+ return(NSSCS_E_LL_SYS_FAILURE);
+ }
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_InsertSharedSecretLink */
+
+
+
+
+/* */
+/*
+ * NAME - ll_RemoveSharedSecretLink
+ *
+ * DESCRIPTION
+ * This function removes a Shared Secret link from the link list at the
+ * CLP.
+ *
+ */
+int ll_RemoveSharedSecretLink
+ (
+ LL_LINKLIST_T *list,
+ uint32_t kLen,
+ SS_UTF8_T *key
+ )
+{ /* beginning of the call */
+/* ########################## DECLARATIONS START HERE ######################### */
+
+ LL_LINK_T *prev = NULL;
+
+/* ############################## CODE STARTS HERE ############################ */
+
+ if(list->elemCount)
+ {
+ list->clp = list->head;
+ /* check for duplicates */
+ do
+ {
+ // keys should be unique
+ if(((ll_GetSHSecKeyLen(list) == kLen) &&
+ (memcmp(ll_GetSHSecKey(list), key, ll_GetSHSecKeyLen(list))) == 0))
+ {
+ /* element already in the list */
+ if(prev)
+ {
+ prev->next = list->clp->next;
+ free(list->clp);
+ list->clp = prev;
+ }
+ else
+ {
+ list->head = list->head->next;
+ free(list->clp);
+ list->clp = list->head;
+ }
+
+ list->elemCount--;
+ return(NSSCS_LL_SUCCESS);
+ }
+
+ /* move forward one link */
+ if(list->clp->next)
+ {
+ prev = list->clp;
+ list->clp = list->clp->next;
+ continue;
+ }
+ else
+ {
+ /* end of the list item not found */
+ return(NSSCS_LL_SUCCESS);
+ }
+ } while(TRUE);
+ }
+
+ return(NSSCS_E_LL_SYS_FAILURE);
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_RemoveSharedSecretLink */
+
+
+
+
+/* */
+/*
+ * NAME - ll_DestroyList
+ *
+ * DESCRIPTION
+ * This function completely destroy a linked list by freeing the
+ * memory for all the links.
+ *
+ */
+void ll_DestroyList(LL_LINKLIST_T *list)
+{ /* beginning of the call */
+/* ############################## CODE STARTS HERE ############################ */
+
+ /* kill the links in the link list */
+ while(list->elemCount)
+ {
+ list->clp = list->head;
+ list->head = list->head->next;
+ free(list->clp);
+ list->elemCount--;
+ }
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_DestroyList */
+
+
+
+
+/* */
+/*
+ * NAME - ll_Next
+ *
+ * DESCRIPTION
+ * This function moves the CLP to point to the next
+ * link in the list and returns a TRUE or FALSE based on the
+ * success or failure (when it reaches the end of the list) of the
+ * operation.
+ *
+ */
+int ll_Next(LL_LINKLIST_T *list)
+{ /* beginning of the call */
+/* ############################## CODE STARTS HERE ############################ */
+
+ if(list)
+ {
+ if(list->elemCount)
+ {
+ if(list->clp->next)
+ {
+ list->clp = list->clp->next;
+ return(TRUE); /* if not at the tail of the list */
+ }
+ }
+ }
+
+ return(FALSE); /* cannot go beyond the tail of the list */
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_Next */
+
+
+
+
+
+/* */
+/*
+ * NAME - ll_InsertNewLink
+ *
+ * DESCRIPTION
+ * Cache in a set of ds items.
+ *
+ */
+void *ll_InsertNewLink
+ (
+ LL_LINKLIST_T *list,
+ uint32_t itemSize
+ )
+{ /* beginning of the call */
+/* ########################## DECLARATIONS START HERE ######################### */
+
+ LL_LINK_T *newLink = _ll_CreateLink(itemSize);
+
+/* ############################## CODE STARTS HERE ############################ */
+
+ if(newLink)
+ {
+ if(list->elemCount)
+ {
+ list->clp = list->head;
+ /* check for duplicates */
+ while(list->clp->next)
+ {
+ list->clp = list->clp->next;
+ }
+
+ list->clp->next = newLink;
+ /* reset the clp to the new link */
+ list->clp = newLink;
+ (list->elemCount)++;
+ }
+ else
+ {
+ list->head = list->clp = newLink;
+ list->elemCount = 1;
+ }
+
+
+
+ return(newLink->item);
+ }
+ else
+ {
+ return(NULL);
+ }
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_InsertNewLink */
+
+
+
+
+
+
+/* */
+/*
+ * NAME - ll_GetEntry
+ *
+ * DESCRIPTION
+ * This function returns a pointer to the current item
+ * in the list or returns NULL
+ *
+ */
+void* ll_GetEntry(LL_LINKLIST_T *list)
+{ /* beginning of the call */
+/* ############################## CODE STARTS HERE ############################ */
+
+ if(list)
+ {
+ if(list->elemCount)
+ {
+ if(list->clp->item)
+ {
+ return list->clp->item;
+ }
+ }
+ }
+
+ return NULL;
+
+/* ############################### CODE ENDS HERE ############################# */
+} /* end of ll_GetEntry */
diff --git a/c_doc/CacheAPI.doc b/c_doc/CacheAPI.doc
new file mode 100644
index 00000000..322f5947
Binary files /dev/null and b/c_doc/CacheAPI.doc differ
diff --git a/c_doc/ClientAPI.doc b/c_doc/ClientAPI.doc
new file mode 100644
index 00000000..479122a4
--- /dev/null
+++ b/c_doc/ClientAPI.doc
@@ -0,0 +1,1004 @@
+{\rtf1\ansi\deff1\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq2\fcharset0 Arial;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq0\fcharset2 Symbol;}{\f4\froman\fprq2\fcharset0 Times New Roman;}{\f5\fmodern\fprq1\fcharset0 Courier New;}{\f6\fswiss\fprq2\fcharset0 Arial Black;}{\f7\fnil\fprq0\fcharset0 Tahoma;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red255\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033\snext1 Default;}
+{\s2\sa120\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe255\loch\fs24\lang1033\sbasedon1\snext2 Text body;}
+{\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af7\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1033\sbasedon2\snext3 List;}
+{\s4\sb120\sa120\rtlch\af7\afs20\lang255\ai\ltrch\dbch\afs20\langfe255\ai\loch\fs20\lang1033\i\sbasedon1\snext4 Caption;}
+{\s5\rtlch\af7\afs24\lang255\ltrch\dbch\afs24\langfe255\loch\fs24\lang1033\sbasedon1\snext5 Index;}
+{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe255\loch\f1\fs24\lang1033\sbasedon2\snext6 Table Contents;}
+{\s7\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ai\ab\ltrch\dbch\af1\afs24\langfe255\ai\ab\loch\f1\fs24\lang1033\i\b\sbasedon6\snext7 Table Heading;}
+{\*\cs9\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 1;}
+{\*\cs10\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 2;}
+{\*\cs11\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 3;}
+{\*\cs12\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 4;}
+{\*\cs13\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 5;}
+{\*\cs14\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 6;}
+{\*\cs15\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 7;}
+{\*\cs16\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 8;}
+{\*\cs17\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 9;}
+{\*\cs18\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033 RTF_Num 2 10;}
+{\*\cs19\cf0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs24\lang1033 RTF_Num 3 1;}
+{\*\cs20\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 2;}
+{\*\cs21\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 3;}
+{\*\cs22\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 4;}
+{\*\cs23\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 5;}
+{\*\cs24\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 6;}
+{\*\cs25\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 7;}
+{\*\cs26\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 8;}
+{\*\cs27\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 9;}
+{\*\cs28\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe1033\loch\f3\fs24\lang1033 RTF_Num 3 10;}
+{\*\cs29\cf2\ul\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033 Internet Link;}
+}{\*\listtable{\list\listtemplateid1\listsimple
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'00);}{\levelnumbers\'01;}\f0\langfe1033\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'01);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'02);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'03);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'04);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'05);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'06);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'07);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'08);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}
+{\*\soutlvl{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'09);}{\levelnumbers\'01;}\f3\f3\langfe1033\f3\fi0\li0}}{\listname RTF_Num 3;}\listid1}
+{\list\listtemplateid2\listsimple
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}
+{\*\soutlvl{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'01\'b7;}{\levelnumbers;}\f3\f3\f3\fi0\li0}}{\listname RTF_Num 2;}\listid2}
+}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}{\listoverride\listid2\listoverridecount0\ls1}}
+
+{\info{\comment StarWriter}{\vern6450}}\deftab720
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1065\margrsxn1080\margtsxn1440\margbsxn1440\pgdscnxt0 Default;}}
+{\*\pgdscno0}\paperh15840\paperw12240\margl1065\margr1080\margt1440\margb1440\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1065\margrsxn1080\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx-380\tx0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa700\ql\rtlch\af1\afs36\lang255\ab\ltrch\dbch\af1\afs36\langfe1033\ab\loch\f1\fs36\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx-380\tx0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa700\ql\rtlch\af1\afs36\lang255\ab\ltrch\dbch\af1\afs36\langfe1033\ab\loch\f1\fs36\lang1033\b
+\par
+\par
+\par
+\par \pard\plain \ltrpar\s1\cf1\ul\sl360\slmult0\qc\tqr\tx-380\tx0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa700\rtlch\af1\afs48\lang255\ab\ltrch\dbch\af1\afs48\langfe1033\ab\loch\f1\fs48\lang1033\b {\loch\f1\fs48\lang1033\i0\b SecretStore Client Service SDK APIs}
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\qc\tqr\tx-380\tx0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa700\rtlch\af1\afs28\lang255\ai\ab\ltrch\dbch\af1\afs28\langfe1033\ai\ab\loch\f1\fs28\lang1033\i\b {\loch\f1\fs28\lang1033\i\b version 1.0}
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx-380\tx0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa700\ql\rtlch\af1\afs36\lang255\ab\ltrch\dbch\af1\afs36\langfe1033\ab\loch\f1\fs36\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The Novell SecretStore API includes functions to store, retreive, and manage secrets in the SSCS cache. SecretStore functions can be identified to be in any of the following categories:}
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\f0\fs21\langfe1033\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf3 Enabling Functions }}{\loch\f0\fs21\lang1033{\cf1 }}
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 Administrative Functions }
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 Shared Secret Support Functions }
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b Enabling Functions }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following functions prepare applications to use Novell Single Sign-on and include:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3344\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Functions}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3344\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSGetStoreInformation}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Returns SecretStore related information.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3344\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSReadSharedSecret }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Reads the application secrets from the SecretStore service for a logged in and authenticated user of SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3344\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSRemoveSharedSecret }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Removes a specified secret from the user\rquote s SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSWriteSharedSecret }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Writes new secret, or overwrites an existing secret after modification. }
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCOpenSecretStoreCache}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Writes new secret, or overwrites an existing secret after modification. }
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSCloseSecretStoreCache}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Writes new secret, or overwrites an existing secret after modification. }
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b Administrative Functions}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These functions create the user\rquote s Single Sign-on capability and generate encryption keys for an enabled application:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3385\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Functions}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSUnlockStore }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Unlocks a client\rquote s SecretStore after it was locked in an enhanced protection scenario by removing the lock, or by using a previous eDirectory password on master password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSEnumerateSecretIDs }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Lists the application secret identifiers in a target secret.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSRemoveSecretStore }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Removes SecretStore from a target object.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSSetMasterPassword }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Allows the owner of SecretStore to set the SecretStore master password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3385\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf3\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCSRemoveKeychain }
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Allows the owner of the SecretStore to remove a Keychain.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b Shared Secret Support Functions}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The shared secret support functions enable the application to create, modify, and remove shared secrets in the cache. }
+\par \pard\plain {\listtext\pard\plain \li1920\ri0\lin1920\rin0\fi0\sb160\cf1\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\f0\langfe1033 1)}\ilvl0 \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These support functions populate or extract data from a shared secrets:}
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSAddSHSEntry }
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSCreateSHSHandle }
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSDestroySHSHandle}
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSGetNextSHSEntry}
+\par \pard\plain {\listtext\pard\plain \li2280\ri0\lin2280\rin0\fi0\sb120\cf3\f0\fs21\f0\fs21\langfe1033\f0\fs21\sl240\slmult0\tqr\tx2180\tx2280\f3\f3\f3 \'b7}\ilvl0 \ltrpar\s1\cf3\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSRemoveSHSEntry }
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b API Function Flags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following flags are defined for the Single Sign-on API functions:}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Input Only Flags for Write API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1738\cellx5908\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1738\cellx5908\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1738\cellx5908\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1738\cellx5908\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Input Only Flags for Unlock API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1741\cellx5909\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1741\cellx5909\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1741\cellx5909\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Input Only Flags for Read API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Input Only Flags for All APIs}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1220\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Input Only Flag for GetStoreInfo API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Output Only Flags from Read API}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Output Only Flag from GetServiceInformation API statFlags}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Context Flags for The Type of Context Passed in to Initialize Context Structure}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Context Flags for Input and Returned from the Context Structure}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1440\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx1585\cellx5840\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\ul\sl360\slmult0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\rtlch\af1\afs40\lang255\ab\ltrch\dbch\af1\afs40\langfe1033\ab\loch\f1\fs40\lang1033\b {\loch\f1\fs40\lang1033\i0\b Function Prototypes}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following are {\b _stdcall} function prototypes exported APIs in Windows. For definitions of the SecretStore function return types, refer to nsscs.h.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\rtlch\af1\afs32\lang255\ltrch\dbch\af1\afs32\langfe1033\loch\f1\fs32\lang1033
+\par \pard\plain \ltrpar\s1\cf1\ul\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b SharedSecret support APIs}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSAddSHSEntry}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs21\lang1033{\loch\f1\fs21\lang1033\i\b{\b{\i SharedSecret support function}}}{\b\b\b{\loch\f1\fs21\lang1033\b: }}{\loch\f1\fs21\lang1033Enters a key or a value in a key-value pair stored in a SharedSecret.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSAddSHSEntry} \line (\line void *{\i handle}, \line unsigned char *{\i key}, \line unsigned char *{\i val}, \line unsigned long {\i sscsFlags}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 handle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Specifies the handle created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle}{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 key}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Adds a key to a key-value pair stored in a SharedSecret.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 val}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Adds a value to a key-value pair stored in a SharedSecret.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssCtxFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SH_SECRET_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Shared Secret processing and operations failed.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 API parameter is not initialized.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This function adds user-allocated key and value structureS to a SharedSecret buffer.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSCreateSHSHandle }
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSGetNextSHSEntry }
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSRemoveSHSEntry }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other SharedSecret support calls here.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSCreateSHSHandle}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs21\lang1033{\loch\f1\fs21\lang1033\i\b{\b{\i SharedSecret support function}}}{\b\b\b{\loch\f1\fs21\lang1033\b: }}{\loch\f1\fs21\lang1033Creates the SharedSecret buffer and Returns a pointer to it that can be passed to the subsequent calls. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL_PTR(void) {\b NSSCSCreateSHSHandle} (void);}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 Returns a void pointer that functions as a handle.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This function is called for each thread in a user-defined application that shares secrets.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSDestroySHSHandle }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other Shared Secret buffer calls here.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSDestroySHSHandle}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs21\lang1033{\loch\f1\fs21\lang1033\i\b{\b{\i SharedSecret support function}}}{\b\b\b{\loch\f1\fs21\lang1033\b: }}{\loch\f1\fs21\lang1033Frees the memory associated with the handle created for each SharedSecret thread of execution. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSDestroySHSHandle} \line (\line void *{\i handle} \line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 handle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Specifies the handle created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle }{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call signifies the end of SharedSecret processing by destroying an internal Shared Secret buffer.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSCreateSHSHandle }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other Shared Secret buffer calls here.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSGetNextSHSEntry}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033{\loch\f1\fs21\lang1033\i\b\fs21{\cf1{\b{\i SharedSecret support function}}}}{\b\b\b{\cf1{\loch\f1\fs21\lang1033\b\fs21: }}}{\cf1{\loch\f1\fs21\lang1033\fs21Specifies sequential calls required to obtain the SharedSecret data returned to }}{\loch\f1\fs21\lang1033\fs21{\cf3 NSSCSReadSharedSecret}{\cf1 . }}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSGetNextSHSEntry} \line (\line BOOL {\i restart}, \line void *{\i handle}, \line in *{\i keyLen}, \line unsigned long *{\i key}, \line int *{\i valLen}, \line unsigned char *{\i val}, \line unsigned long {\i sscsFlags\line });
+}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 restart}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies location in the buffer to begin search. Set to 1 to begin from the beginning of the buffer, otherwise, set to 0.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 handle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Points to the handle created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle }{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 keyLen}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to the length of the key.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 key}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to the key used for storing key-value pair data as defined in the SharedSecret format. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 valLen}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to the length of the value.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 val}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to the value used to for storing key-value pair data as defined in the SharedSecret format. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 sscsFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded in returning a key or value data.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SH_SECRET_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Shared Secret processing and operations failed}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 \endash 1}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation has completed its search.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 Sequential calls to this function contain the handle, the unsigned long context flag from the user-populated SSS_CONTEXT_T struct passed into }}{\loch\f0\fs21\lang1033{\cf3 NSSCSReadSharedSecret }{\cf1 , and pointers to user-allocated key/value buffer and length parameters which are populated
+ upon return of the call.}}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSAddSHSEntry }
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSRemoveSharedSecret }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other Shared Secret buffer calls here.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSRemoveSHSEntry}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs21\lang1033{\loch\f1\fs21\lang1033\i\b{\b{\i SharedSecret support function}}}{\b\b\b{\loch\f1\fs21\lang1033\b: }}{\loch\f1\fs21\lang1033Removes a key or a value in a key-value pair stored in a SharedSecret.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSRemoveSHSEntry} \line (\line void *{\i handle}, \line unsigned char *{\i key}, \line unsigned char *{\i val}, \line unsigned long {\i sscsFlags}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 handle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Specifies the handle created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle}{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 key}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the value of the key-value pair desired to be removed.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 val}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the value of the key-value pair desired to be removed.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssCtxFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3993\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3993\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded in returning a key or value data.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3993\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SH_SECRET_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Shared Secret processing and operations failed.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx3993\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The API parameter is not initialized.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3993\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operating system services have not been available.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 This function contains the handle, pointers to user-allocated key and value buffers, and the unsigned long context flag member of the SSS_CONTEXT_T struct populated from calling }}{\loch\f0\fs21\lang1033{\cf3 NSSCSGetServiceInformation }{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSAddSHSEntry{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 NSSCSGetNextSHSEntry}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\ul\sl240\slmult0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCS Operational APIs}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li720\ri0\lin720\rin0\fi-240\sb40\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li0\ri0\lin0\rin0\fi-240\sb40\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSOpenSecretStoreCache}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 This call opens and initializes a session with SecretStore cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSOpenSecretStoreCache} \line (\line SSCS_CONTEXT_T *{\i storeContext,} \line unsigned long {\i ssFlags}, \line SSCS_EXT_T *{\i ext\line )};}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeContext}
+\par \pard\plain \ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT)}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for this API.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values for this function; see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote }{\cf1 for more information.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4590\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to memory allocation failure.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore cache.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Crypto failure detected.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Access to the SecretStore cache has been denied.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore .}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some operation has failed internally.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call starts a session with SecretStore cache and returns a context with pertinent information for use with subsequent calls. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSCloseSecretStoreCache}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 This call closes and uninitializes a session with the SecretStore cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSCloseSecretStoreCache} \line (\line SSCS_CONTEXT_T *{\i storeContext,} \line unsigned long {\i ssFlags}, \line SSCS_EXT_T *{\i ext\line )};}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeContext}
+\par \pard\plain \ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT)}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for this API.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values for this function; see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote }{\cf1 for more information.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4590\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to memory allocation failure.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore cache.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Crypto failure detected.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Access to the SecretStore cache has been denied.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore .}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some operation has failed internally.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call ends a session with SecretStore cache based on the pertinent information passed in through the context. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSGetStoreInformation}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Returns information regarding the SecretStore cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSGetStoreInfomaion} \line (\line SSCS_CONTEXT_T *{\i storeContext,} \line unsigned long {\i ssFlags}, \line SSCS_GSINFOEXT_T *{\i gsInfo}, //mandatory\line SSCS_EXT_T *{\i ext\line )};}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeContext}
+\par \pard\plain \ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT)}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values for this function; see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote }{\cf1 for more information.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4590\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to memory allocation failure.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore cache.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Crypto failure detected.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Access to the SecretStore cache has been denied.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore .}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4590\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some operation has failed internally.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call returns statistical information regarding the SecretStore cache. Information such as number of Keychains, number of secrets per Keychains, etc.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSReadSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Reads data from an existing Shared Secret from the user\rquote s SecretStore cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSReadSecret} \line (\line SSCS_CONTEXT_T *{\i storeContext,} \line unsigned long {\i ssFlags}, \line void *secretH{\i andle}, \line SSCS_SH_SECRET_ID_T *s{\i haredSecretID}, \line SSCS_PWORD_T *{\i epPassword}, \line SS
+CS_READEXT_T *{\i readData}, \line SSSC_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeConext}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Context for the session with Cache returned by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSOpenSecretStoreCache}{\cf1 . Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies the flags.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 secretHandle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Specifies the handle to the secret buffer created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle}{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 sharedSecretID}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the user-populated SS_SH_SECRET_ID_T struct containing the shared secret type, name, and length.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 epPassword}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to an optional field to pass in the Enhanced Protection Password for reading a secret. When the passwords is not present, you can pass in a NULL. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 readData}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the extension to be set to read data stored in a user\rquote s secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the extensions used for the secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4276\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4276\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4276\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to a failure such as improper memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4276\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The API parameter is not initialized.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4276\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_TOO_SHORT}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The length of the Secret ID should be greater than zero.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This function passes the handle, as well as a user-populated SS_SH_SECRET_ID_T structure, containing the shared secret type, name, and length. It also points to internally allocated key and value buffers}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other Shared Secret Buffer calls here.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSEnumerateSecretIDs}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Enables the application to list the secret identifiers (secret IDs) for secrets stored in one Keychain in the user\rquote s SecretStore cache. The list of available Keychains }
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs21\lang1033{\loch\f1\fs21\lang1033\i0\b0{\cf1 should be retrieved from a prior call to }}{\loch\f1\fs21\lang1033{\f0\cf3 NSSCSGetStoreInformation.}}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSEnumerateSecretIDs} \line (\line SSCS_CONTEXT_T *{\i storeContext}, \line unsigned long ssflags, \line unsigned long keychainID, }
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 SSCS_KEY_T *{\i searchKey}, \line unsigned long *{\i count} \line void \tab \tab *{\i secretIDListHandle}, \line SSCS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeContext}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Context for the session with Cache returned by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSOpenSecretStoreCache}{\cf1 . Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 searchKey}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) If set to NULL will cause the call to return all of the entries in the target Keychain. If the pointer to an initialized SSCS_KEY_T structure was passed in the SecretStore cache is searched for secrets with the matching key in them. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 count}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) The number of SecretIDs returned in the list representeded by secretIDListHandle. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 secretIDListHandle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs24\lang1033{\loch\f0\fs21\lang1033\i0\b0{\fs21{\cf1 (IN/OUT) This handle should be initialized with a prior call to }}}{\fs21\fs21\fs21{\loch\f0\fs21\lang1033\f0\f0{\cf3 NSSCSCreateSHSHandle}}}{\loch\f0\fs24\lang1033\f0\f0and the call will return the list secretIDs found.{\fs20 }}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values for this function; see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote on page\~61}{\cf1 for more information.}}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4376\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attributed related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4376\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore or the schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 A list of lists will be returned by this call. There will be a list of SecretIDs which in turn are lists of key/value pairs.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf3\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSRemoveSecretStore}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Completely Removes SecretStore from the user's work area on the workstation. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSRemoveSecretStore} \line (\line SSCS_CONTEXT_T store{\i Context}, \line unsigned long {\i ssFlags}, \line SS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeContext}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Context for the session with Cache returned by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSOpenSecretStoreCache}{\cf1 . Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extension returns for the secrets.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values (for more information, see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote on page\~61}{\cf1 ):}}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSRemoveSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Removes a Shared Secret from a user's SecretStore on eDirectory. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSRemoveSecret} \line (}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 SSCS_CONTEXT_T *{\i storeContext},}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 unsigned long {\i ssFlags}, \line SCSS_SH_SECRET_ID_T *s{\i haredSecret}, \line SSCS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeCotnext}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Context for the session with Cache returned by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSOpenSecretStoreCache}{\cf1 . Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 sharedSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the user-populated SS_SH_SECRET_ID_T structure containing the shared secret type, name, and length.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033{\loch\f6\fs16\lang1033\i0\b0{\fs16\f6 NOTE: }}{\loch\f1\fs24\lang1033{\fs17 For binding to server over LDAP/SSL this parameter is mandatory and it should be in fully qualified LDAP form ("cn=user, ou=users, o=novell").}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the extensions used for the secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 A NICI failure was detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The client does not have a SecretStore or the schema is not extended to begin with. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_TOO_SHORT}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The length of the Secret ID should be greater than zero.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The API parameter is not initialized.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This function passes a user-populated SS_SH_SECRET_ID_T structure that contains the shared secret type, name, and length. It also passes the populated SSS_CONTEXT_T and SS_OBJECT_DN_T structures, ssFlags, and the SS_EXT_T structures that are normally passe
+d into the call to NSSCSRemoveSecret. Consequently, this function provides flexibility in making calls to trees and user DNs other than the primary connection.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSSetMasterPassword}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 A special function for use by administrative utilities. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSSetMasterPassword} \line (\line SSCS_CONTEXT_T *store{\i Context,} \line unsigned long {\i ssFlags}, \line SSCS_PWORD_T *{\i password}, \line SSCS_HINT_T *{\i hint}, \line SSCS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeCotnext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Context for the session with Cache returned by {\cf3 NSSCSOpenSecretStoreCache}. Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 password}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the master password to be set. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 hint}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the hint for the master password to be set by the user.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extension returns for the secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b turn Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 A NICI failure was detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The client does not have a SecretStore or the schema is not extended to begin with. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_TOO_SHORT}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The length of the Secret ID should be greater than zero.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The API parameter is not initialized.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call can set a master password on the user\rquote s SecretStore if it is allowed by the service and if the user has enhanced protection set on their SecretStore.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSUnlockSecrets}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 This call unlocks the client\rquote s SecretStore after an administrative change of the client\rquote s eDirectory password has caused the user\rquote s SecretStore with enhanced protection secrets to become locked. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSUnlockSecrets} \line (\line SSCS_CONTEXT_T {\i callerContext}, \line unsigned long {\i ssFlags}, \line SSCS_PWORD_T *{\i password}, \line SSCS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeCotnext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 (IN) Context for the session with Cache returned by {\cf3 NSSCSOpenSecretStoreCache}. Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 password}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This points to the client\rquote s clear text password.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 These are common return values for this function; see }}{\loch\f0\fs21\lang1033{\cf3 \ldblquote Return Values\rdblquote on page\~61}{\cf1 for more information.}}
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4391\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4391\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Client does not have a SecretStore or the schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4391\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_UNLOCKING_FAILED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Verification of the old eDirectory password failed; therefore, unlocking the store failed.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 NSSCSUnlockSecrets the client\rquote s SecretStore after an administrative change of the client\rquote s eDirectory password. When administrator changes a eDirectory user\rquote s password, the SecretStore service is automatically locked. A prior call to }}{\loch\f0\fs21\lang1033{\cf3 NSSCSReadSecret }{\cf1 will
+ fail with the NSSCS_E_NDS_PWORD_CHANGED. Then the client should make a call to }{\cf3 NSSCSUnlockSecrets }{\cf1 and supply the client\rquote s old eDirectory password to unlock the SecretStore.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If the service allows master password for users and the user has set a master password on their SecretStore prior to locking, then the user can use the master password to unlock the SecretStore. This helps for instances when the user forgets the eDirectory
+ password. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If the password change has been due to a user forgetting the password and there is no master password, then SecretStore is not recoverable. Consequently, the locked SecretStore should be deleted and recreated by the client. eDirectory password changes by t
+he user will not cause the SecretStore to be locked.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The owner of the SecretStore can use this function call with proper flags to remove the locked secrets or unlock the SecretStore with the previous eDirectory password or master password. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSWriteSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Creates a SecretID according to the Shared Secret format utilizing either the prefix SS_App or SS_CredSet and then writes the contents in SHS format.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSWriteSecret} \line (\line SSCS_CONTEXT_T *store{\i context,} \line unsigned long *{\i ssFlags}, \line void *{\i handle,} \line SSCS_SH_SECRET_ID_T *s{\i haredSecret,} \line SSCS_PWORD_T *{\i epPassword}, \line SSCS_EXT_T
+ *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeCotnext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 (IN) Context for the session with Cache returned by {\cf3 NSSCSOpenSecretStoreCache}. Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 handle}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 Specifies the handle created by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSCreateSHSHandle}{\cf1 .}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 sharedSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the user-populated SS_SH_SECRET_ID_T struct containing the Shared Secret type, name, and length.}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 epPassword}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional field to pass in the Master Password or the Enhanced Protection Password for reading a secret. When neither one of the passwords are present, you can pass in a NULL. }
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the extensions used for the secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4326\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4326\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4326\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4326\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_TOO_SHORT}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Length of the Secret ID should be greater than zero.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx4326\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SH_SECRET_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Shared Secret processing and operations failed.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4326\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_EXISTS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID already exists in the Secret Store.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af1\afs32\lang255\ab\ltrch\dbch\af1\afs32\langfe1033\ab\loch\f1\fs32\lang1033\b {\loch\f1\fs32\lang1033\i0\b NSSCSRemoveKeyChain}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs21\lang255\ltrch\dbch\af1\afs21\langfe1033\loch\f1\fs21\lang1033 {\loch\f1\fs21\lang1033\i0\b0 Removes a Shared Secret from a user's SecretStore on eDirectory. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\b NSSCSRemoveKeyChain} \line (}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 SSCS_CONTEXT_T *{\i storeContext},}
+\par \pard\plain \ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe1033\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 unsigned long {\i ssFlags}, \line SSCS_EXT_T *{\i ext}\line );}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 storeCotnext}
+\par \pard\plain \ltrpar\s1\cf0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf1 (IN) Context for the session with Cache returned by }}{\loch\f0\fs21\lang1033{\cf3 NSSCSOpenSecretStoreCache}{\cf1 . Will have a place to set the working Keychain in it and the file and instance handles for session in progress with cache.}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ssFlags}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 sharedSecret}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the user-populated SS_SH_SECRET_ID_T structure containing the shared secret type, name, and length.}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af1\afs24\lang255\ltrch\dbch\af1\afs24\langfe1033\loch\f1\fs24\lang1033{\loch\f6\fs16\lang1033\i0\b0{\fs16\f6 NOTE: }}{\loch\f1\fs24\lang1033{\fs17 For binding to server over LDAP/SSL this parameter is mandatory and it should be in fully qualified LDAP form ("cn=user, ou=users, o=novell").}}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ai\ltrch\dbch\af0\afs21\langfe1033\ai\loch\f0\fs21\lang1033\i {\loch\f0\fs21\lang1033\i\b0 ext}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the extensions used for the secrets. }
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Return Values}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5047\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af1\afs16\lang255\ab\ltrch\dbch\af1\afs16\langfe1033\ab\loch\f1\fs16\lang1033\b {\loch\f1\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The operation succeeded. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_CRYPTO_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 A NICI failure was detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The client does not have a SecretStore or the schema is not extended to begin with. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\cellx5047\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_SECRET_ID_TOO_SHORT}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The length of the Secret ID should be greater than zero.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt0\trpaddfl3\trpaddl10\trpaddfb3\trpaddb0\trpaddfr3\trpaddr10\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5047\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10095
+\pard\intbl\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 NSSCS_E_INVALID_PARAM}
+\cell\pard\plain \intbl\ltrpar\s1\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af1\afs18\lang255\ltrch\dbch\af1\afs18\langfe1033\loch\f1\fs18\lang1033 {\loch\f1\fs18\lang1033\i0\b0 The API parameter is not initialized.}
+\cell\row\pard \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe1033\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This function passes a user-populated SS_SH_SECRET_ID_T structure that contains the shared secret type, name, and length. It also passes the populated SSS_CONTEXT_T and SS_OBJECT_DN_T structures, ssFlags, and the SS_EXT_T structures that are normally passe
+d into the call to NSSCSRemoveSecret. Consequently, this function provides flexibility in making calls to trees and user DNs other than the primary connection.}
+\par \pard\plain \ltrpar\s1\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af1\afs26\lang255\ab\ltrch\dbch\af1\afs26\langfe1033\ab\loch\f1\fs26\lang1033\b {\loch\f1\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe1033\loch\f0\fs21\lang1033
+\par }
\ No newline at end of file
diff --git a/c_doc/SHS.doc b/c_doc/SHS.doc
new file mode 100644
index 00000000..c013dd9b
Binary files /dev/null and b/c_doc/SHS.doc differ
diff --git a/c_doc/SSCSLLD.doc b/c_doc/SSCSLLD.doc
new file mode 100644
index 00000000..6c910483
Binary files /dev/null and b/c_doc/SSCSLLD.doc differ
diff --git a/c_doc/SecretStore client service.doc b/c_doc/SecretStore client service.doc
new file mode 100644
index 00000000..49a9ff85
Binary files /dev/null and b/c_doc/SecretStore client service.doc differ
diff --git a/c_doc/TransportAPI.doc b/c_doc/TransportAPI.doc
new file mode 100644
index 00000000..69d0e005
--- /dev/null
+++ b/c_doc/TransportAPI.doc
@@ -0,0 +1,1462 @@
+{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fprq2\fcharset0 Times New Roman;}{\f3\fswiss\fprq2\fcharset0 Arial;}{\f4\fswiss\fprq2\fcharset0 Trebuchet MS;}{\f5\fmodern\fprq1\fcharset0 Courier New;}{\f6\fswiss\fprq2\fcharset0 Arial Black;}{\f7\fnil\fprq2\fcharset2 Wingdings;}{\f8\froman\fprq2\fcharset2 Symbol;}{\f9\froman\fprq2\fcharset2 Webdings;}{\f10\fnil\fprq0\fcharset2 StarSymbol;}{\f11\fswiss\fprq2\fcharset0 Arial;}{\f12\fnil\fprq0\fcharset0 Tahoma;}}
+{\colortbl;\red0\green0\blue0;\red255\green0\blue0;\red0\green0\blue255;\red0\green0\blue128;\red128\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s1\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe1033\loch\fs24\lang1033\snext1 Default;}
+{\s2\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext2 Text body;}
+{\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af12\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon2\snext3 List;}
+{\s4\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af12\afs20\lang255\ai\ltrch\dbch\af0\afs20\langfe255\ai\loch\f0\fs20\lang1033\i\sbasedon1\snext4 Caption;}
+{\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af12\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext5 Index;}
+{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext6 Normal;}
+{\s7\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext8 alpha;}
+{\s8\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext8 alpha+;}
+{\s9\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext8 alpha_text;}
+{\s10\keepn\cf1\charscalex0\sl440\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs104\lang255\ab\ltrch\dbch\af3\afs104\langfe255\ab\loch\f3\fs104\lang1033\b\sbasedon6\snext10 appNum;}
+{\s11\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext11 BarText;}
+{\s12\cf1\charscalex0\sl320\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs20\lang255\ltrch\dbch\af4\afs20\langfe255\loch\f4\fs20\lang1033\sbasedon6\snext12 BarURL;}
+{\s13\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext13 bl_bullet;}
+{\s14\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext13 blt_bultext;}
+{\s15\li1920\ri0\lin1920\rin0\fi0\sb160\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext15 Body;}
+{\s16\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext16 Body1;}
+{\s17\sa160\cf1\charscalex0\sl280\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs16\lang255\ltrch\dbch\af4\afs16\langfe255\loch\f4\fs16\lang1033\sbasedon6\snext17 BodyQS;}
+{\s18\caps\cf1\charscalex0\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs20\lang255\ltrch\dbch\af4\afs20\langfe255\loch\f4\fs20\lang1033\sbasedon6\snext18 BookName;}
+{\s19\cf1\charscalex0\sl260\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext19 BookTitle;}
+{\s20\cf1\charscalex0\sl260\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs16\lang255\ltrch\dbch\af4\afs16\langfe255\loch\f4\fs16\lang1033\sbasedon6\snext20 BookTitle-NotEnglish;}
+{\s21\caps\cf1\charscalex0\sl260\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs16\lang255\ltrch\dbch\af4\afs16\langfe255\loch\f4\fs16\lang1033\sbasedon6\snext21 BookType;}
+{\s22\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext22 bs_subbullet;}
+{\s23\li3060\ri0\lin3060\rin0\fi-380\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2940\tx3060{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext23 bss_subbullet;}
+{\s24\li3060\ri0\lin3060\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext22 bsst_subbultext;}
+{\s25\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext22 bst_subbultext;}
+{\s26\cf1\charscalex0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext26 container_text;}
+{\s27\li2160\ri0\lin2160\rin0\fi0\sb1000\sa160\cf1\charscalex0\sl180\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ab\ltrch\dbch\af3\afs18\langfe255\ab\loch\f3\fs18\lang1033\b\sbasedon6\snext27 cpyrt_text;}
+{\s28\sb180\sa120\cf1\charscalex0\sl180\slmult0\tx2160{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext28 d_text;}
+{\s29\sa120\cf1\charscalex0\sl180\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext29 d_text+;}
+{\s30\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext30 Descriptor;}
+{\s31\keepn\cf1\charscalex0\sl380\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs90\lang255\ab\ltrch\dbch\af3\afs90\langfe255\ab\loch\f3\fs90\lang1033\b\sbasedon6\snext31 chapNum;}
+{\s32\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext32 em2_module;}
+{\s33\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext33 clb_bullet;}
+{\s34\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext34 clt_text;}
+{\s35\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext35 clt_text+;}
+{\s36\li2160\ri0\lin2160\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext36 cmnd;}
+{\s37\li2520\ri0\lin2520\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext14 cmnd1;}
+{\s38\li2920\ri0\lin2920\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext22 cmnd2;}
+{\s39\sb240\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext39 FrontBody;}
+{\s40\sb240\sa200\cf1\charscalex0\sl240\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext40 FrontPara+;}
+{\s41\sb480\sa200\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext41 FrontParaArial;}
+{\s42\li140\ri240\lin140\rin240\fi0\sb160\sa100\keepn\cf1\charscalex0\sl180\slmult0\tx1440{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext42 Codesample;}
+{\s43\sa720\cf1\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext44 h0_IndexHead;}
+{\s44\sb240\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext45 term;}
+{\s45\li1920\ri0\lin1920\rin0\fi0\sa160\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext45 termdef;}
+{\s46\li480\ri0\lin480\rin0\fi0\sb240\sa120\cf1\charscalex0\sl280\slmult0\tldot\tx7680\tqdec\tx8040{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ab\ltrch\dbch\af3\afs24\langfe255\ab\loch\f3\fs24\lang1033\b\sbasedon6\snext46 h0_IndexHeadTOC;}
+{\s47\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext47 h0_ModName;}
+{\s48\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext48 ComputerOutputInTable;}
+{\s49\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext49 container_object;}
+{\s50\sb340\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext32 em1;}
+{\s51\li1920\ri0\lin1920\rin0\fi-1920\sa720\cf1\charscalex0\sl360\slmult0\tqc\tx1520\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext51 h0_tabbed;}
+{\s52\li480\ri0\lin480\rin0\fi-480\sb240\sa120\cf1\charscalex0\sl280\slmult0\tx0\tx480{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ab\ltrch\dbch\af3\afs24\langfe255\ab\loch\f3\fs24\lang1033\b\sbasedon6\snext52 h0_tabbedTOC;}
+{\s53\sb140\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext32 em1+;}
+{\s54\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext54 em3_explanation;}
+{\s55\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext55 em4_action;}
+{\s56\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext56 em5_severity;}
+{\s57\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext57 em6_source;}
+{\s58\li2640\ri0\lin2640\rin0\fi0\sb160\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext58 h1_hint1;}
+{\s59\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext59 em7_posscause;}
+{\s60\li3120\ri0\lin3120\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext60 h2_hint2;}
+{\s61\li1200\ri0\lin1200\rin0\fi-240\cf1\charscalex0\sl240\slmult0\tx1200\tldot\tx7680\tqdec\tx8040{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext61 h2_likeh3TOC;}
+{\s62\cf1\charscalex0\sl280\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext62 h2_likeh4TOC;}
+{\s63\li1920\ri0\lin1920\rin0\fi-1920\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx1620\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext63 em7_problem;}
+{\s64\cf1\charscalex0\sl280\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext64 h3_likeh4TOC;}
+{\s65\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext65 Heading1;}
+{\s66\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext66 Heading2;}
+{\s67\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext67 Heading3;}
+{\s68\li2640\ri0\lin2640\rin0\fi0\sb160\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext68 i1_important1;}
+{\s69\li3120\ri0\lin3120\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext69 i2_important2;}
+{\s70\li1920\ri0\lin1920\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext70 etext;}
+{\s71\li960\ri0\lin960\rin0\fi-960\sb300\sa200\keepn\cf1\charscalex0\sl200\slmult0\tx960{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b\sbasedon6\snext71 figurecaption;}
+{\s72\sa360\cf1\charscalex0\sl100\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs10\lang255\ltrch\dbch\af0\afs10\langfe255\loch\f0\fs10\lang1033\sbasedon6\snext72 figureholder;}
+{\s73\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext73 Numbered;}
+{\s74\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext74 Numbered1;}
+{\s75\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext75 Numbered1A;}
+{\s76\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext76 NumberedA;}
+{\s77\li2640\ri0\lin2640\rin0\fi0\sb160\keepn\cf1\charscalex0\sl240\slmult0\tx2860{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ab\ltrch\dbch\af0\afs20\langfe255\ab\loch\f0\fs20\lang1033\b\sbasedon6\snext78 pm1_menu1;}
+{\s78\li2880\ri0\lin2880\rin0\fi0\sb40\keepn\cf1\charscalex0\sl240\slmult0\tx3100{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ab\ltrch\dbch\af0\afs20\langfe255\ab\loch\f0\fs20\lang1033\b\sbasedon6\snext79 pm2_menu2;}
+{\s79\li3120\ri0\lin3120\rin0\fi0\sb40\keepn\cf1\charscalex0\sl240\slmult0\tx3340{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ab\ltrch\dbch\af0\afs20\langfe255\ab\loch\f0\fs20\lang1033\b\sbasedon6\snext80 pm3_menu3;}
+{\s80\li3360\ri0\lin3360\rin0\fi0\sb40\keepn\cf1\charscalex0\sl240\slmult0\tx3580{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ab\ltrch\dbch\af0\afs20\langfe255\ab\loch\f0\fs20\lang1033\b\sbasedon6\snext81 pm4_menu4;}
+{\s81\li3600\ri0\lin3600\rin0\fi0\sb40\keepn\cf1\charscalex0\sl240\slmult0\tx3820{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ab\ltrch\dbch\af0\afs20\langfe255\ab\loch\f0\fs20\lang1033\b\sbasedon6\snext81 pm5_menu5;}
+{\s82\sb480\sa240\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext82 side_para;}
+{\s83\li2160\ri0\lin2160\rin0\fi0\sb20\cf1\charscalex0\sl180\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext83 t_text;}
+{\s84\li2160\ri0\lin2160\rin0\fi0\sb20\cf1\charscalex0\sl180\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext84 t_text+;}
+{\s85\sb300\sa120\keepn\cf1\charscalex0\sl260\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ai\ltrch\dbch\af3\afs24\langfe255\ai\loch\f3\fs24\lang1033\i\sbasedon6\snext85 TplType;}
+{\s86\li360\ri0\lin360\rin0\fi-360\cf1\charscalex0\sl280\slmult0\tx360{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext86 VarFile-bullet;}
+{\s87\li360\ri0\lin360\rin0\fi-360\cf1\charscalex0\sl280\slmult0\tx360{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext87 VarFile-Number;}
+{\s88\cf1\charscalex0\sl280\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext88 VarFile-Para;}
+{\s89\li2640\ri0\lin2640\rin0\fi0\sb160\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext89 w1_warning1;}
+{\s90\li3120\ri0\lin3120\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs18\lang255\ltrch\dbch\af0\afs18\langfe255\loch\f0\fs18\lang1033\sbasedon6\snext90 w2_warning2;}
+{\s91\li1920\ri4160\lin1920\rin4160\fi-1920\sb400\sa100\keepn\cf1\charscalex0\sl200\slmult0\tqr\tx1520\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b\sbasedon6\snext91 xc_excaption;}
+{\s92\li2560\ri0\lin2560\rin0\fi-2560\cf1\charscalex0\sl240\slmult0\tx560\tqr\tx2000\tx2560\tqr\tx9400\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext92 footer;}
+{\s93\li2160\ri0\lin2160\rin0\fi-2160\sb120\cf1\charscalex0\sl160\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs12\lang255\ltrch\dbch\af4\afs12\langfe255\loch\f4\fs12\lang1033\sbasedon6\snext93 footerQSpartnumber;}
+{\s94\sb260\sa60\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext94 FrontHead;}
+{\s95\sa160\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs16\lang255\ltrch\dbch\af0\afs16\langfe255\loch\f0\fs16\lang1033\sbasedon6\snext95 FrontPara;}
+{\s96\sb260\sa80\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs20\lang255\ltrch\dbch\af6\afs20\langfe255\loch\f6\fs20\lang1033\sbasedon6\snext97 GroupTitlesIX;}
+{\s97\li480\ri0\lin480\rin0\fi-480\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext97 Level1IX;}
+{\s98\li1920\ri0\lin1920\rin0\fi-1920\sa700\cf1\charscalex0\sl360\slmult0\tqr\tx1540\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext98 h0_alpha;}
+{\s99\li440\ri0\lin440\rin0\fi-440\sb140\sa40\cf1\charscalex0\sl240\slmult0\tx0\tx440\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext99 h0_alphaTOC;}
+{\s100\sa700\cf1\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext44 h0_nonum;}
+{\s101\cf1\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext44 h0_nonumReadme;}
+{\s102\li440\ri0\lin440\rin0\fi0\sb140\sa40\cf1\charscalex0\sl240\slmult0\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext102 h0_nonumTOC;}
+{\s103\li1920\ri0\lin1920\rin0\fi-1920\sa700\cf1\charscalex0\sl360\slmult0\tqr\tx1540\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext103 h0_numeric;}
+{\s104\li440\ri0\lin440\rin0\fi-440\sb140\sa40\cf1\charscalex0\sl240\slmult0\tx0\tx440\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext104 h0_numericTOC;}
+{\s105\li1920\ri0\lin1920\rin0\fi-1920\sa700\cf1\charscalex0\sl360\slmult0\tqr\tx1540\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext105 h0_roman;}
+{\s106\li960\ri0\lin960\rin0\fi-960\sb200\sa100\cf1\charscalex0\sl240\slmult0\tx0\tx960{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext106 h0_romanTOC;}
+{\s107\li1920\ri0\lin1920\rin0\fi-1920\sa700\cf1\charscalex0\sl360\slmult0\tqr\tx1540\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext107 h0_title;}
+{\s108\sa680\cf1\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe255\ab\loch\f3\fs36\lang1033\b\sbasedon6\snext108 h0_TOCHead;}
+{\s109\sb360\sa200\keepn\cf1\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b\sbasedon6\snext109 h1_head1;}
+{\s110\li800\ri0\lin800\rin0\fi-800\sb360\sa200\keepn\cf1\charscalex0\sl360\slmult0\tx800{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b\sbasedon6\snext110 h1_head1Readme;}
+{\s111\li900\ri0\lin900\rin0\fi-460\cf1\charscalex0\sl240\slmult0\tx900\tldot\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext111 h1_head1ReadmeTOC;}
+{\s112\li900\ri0\lin900\rin0\fi-460\cf1\charscalex0\sl240\slmult0\tx900\tldot\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext112 h1_head1TOC;}
+{\s113\sb360\sa120\keepn\cf1\charscalex0\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b\sbasedon6\snext113 h2_head2;}
+{\s114\li1400\ri0\lin1400\rin0\fi-640\sb360\sa120\keepn\cf1\charscalex0\sl300\slmult0\tx1400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b\sbasedon6\snext114 h2_head2Readme;}
+{\s115\li1140\ri0\lin1140\rin0\fi-420\cf1\charscalex0\sl240\slmult0\tx1140\tldot\tqr\tx8380{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext115 h2_head2ReadmeTOC;}
+{\s116\li1140\ri0\lin1140\rin0\fi-420\cf1\charscalex0\sl240\slmult0\tx1140\tldot\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext116 h2_head2TOC;}
+{\s117\sb300\sa60\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext117 h3_head3;}
+{\s118\li1920\ri0\lin1920\rin0\fi-520\sb300\sa60\keepn\cf1\charscalex0\sl240\slmult0\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext118 h3_head3Readme;}
+{\s119\li1680\ri0\lin1680\rin0\fi-240\cf1\charscalex0\sl240\slmult0\tx1680\tldot\tx7680\tqdec\tx8040{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext119 h3_head3ReadmeTOC;}
+{\s120\li1680\ri0\lin1680\rin0\fi-240\cf1\charscalex0\sl240\slmult0\tx1680\tldot\tx7680\tqdec\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext120 h3_head3TOC;}
+{\s121\li1920\ri0\lin1920\rin0\fi0\sb240\sa60\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext121 h4_head4;}
+{\s122\li2160\ri0\lin2160\rin0\fi-240\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext122 h4_head4TOC;}
+{\s123\li2160\ri0\lin2160\rin0\fi0\sb240\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext123 hint;}
+{\s124\sb140\keepn\cf1\charscalex0\sl180\slmult0\tqr\tx1800{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext124 IconPara;}
+{\s125\li2160\ri0\lin2160\rin0\fi0\sb240\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext125 important;}
+{\s126\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext126 IndexIX;}
+{\s127\li2520\ri0\lin2520\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext127 lb1_list1;}
+{\s128\li2520\ri0\lin2520\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext127 lb1_list1note;}
+{\s129\li2920\ri0\lin2920\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0\tx2560\tx2920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext129 lb2_list2;}
+{\s130\li2920\ri0\lin2920\rin0\fi-240\sb20\cf1\charscalex0\sl200\slmult0\tx2560\tx2920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext129 lb2_list2note;}
+{\s131\li3300\ri0\lin3300\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0\qj\tx2560\tx3300{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext129 lb2_list3;}
+{\s132\li3300\ri0\lin3300\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0\tx2560\tx3300{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext129 lb3_list3;}
+{\s133\li3300\ri0\lin3300\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0\tx2560\tx3300{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext129 lb3_list3note;}
+{\s134\li2160\ri0\lin2160\rin0\fi-240\sb40\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext134 lb_list;}
+{\s135\li2160\ri0\lin2160\rin0\fi-240\sb20\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext134 lb_listnote;}
+{\s136\li2520\ri0\lin2520\rin0\fi-240\sb40\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext136 lc1_listofcmd1;}
+{\s137\li2920\ri0\lin2920\rin0\fi-240\sb40\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext137 lc2_listofcmd2;}
+{\s138\li2160\ri0\lin2160\rin0\fi-240\sb40\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext138 lc_listofcmds;}
+{\s139\li720\ri0\lin720\rin0\fi-480\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext139 Level2IX;}
+{\s140\cf1\charscalex0\sl220\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext140 line_text;}
+{\s141\li2160\ri0\lin2160\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext134 list;}
+{\s142\li2520\ri0\lin2520\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext127 list1;}
+{\s143\li2520\ri0\lin2520\rin0\fi-240\sb80\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext127 list1note;}
+{\s144\li2920\ri0\lin2920\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0\tx2560\tx2920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext129 list2;}
+{\s145\li2920\ri0\lin2920\rin0\fi-240\sb80\cf1\charscalex0\sl200\slmult0\tx2560\tx2920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext129 list2note;}
+{\s146\li3300\ri0\lin3300\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0\tx2560\tx3300{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext129 list3;}
+{\s147\li3300\ri0\lin3300\rin0\fi-240\sb120\cf1\charscalex0\sl240\slmult0\tx2560\tx3300{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext129 list3note;}
+{\s148\li2160\ri0\lin2160\rin0\fi-240\sb80\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext134 listnote;}
+{\s149\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext149 lm1_listofmsg1;}
+{\s150\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext150 lm2_listofmsg2;}
+{\s151\li3060\ri0\lin3060\rin0\fi0\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext151 lm3_listofmsg3;}
+{\s152\li1920\ri0\lin1920\rin0\fi0\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext152 lm_listofmsgs;}
+{\s153\sb140\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext153 Msg;}
+{\s154\li1920\ri0\lin1920\rin0\fi0\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext154 msg;}
+{\s155\li2280\ri0\lin2280\rin0\fi0\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext14 msg1;}
+{\s156\li2680\ri0\lin2680\rin0\fi0\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext22 msg2;}
+{\s157\li3060\ri0\lin3060\rin0\fi0\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033\sbasedon6\snext22 msg3;}
+{\s158\sb440\cf2\charscalex0\sl440\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs36\lang255\ab\ltrch\dbch\af0\afs36\langfe255\ab\loch\f0\fs36\lang1033\b\sbasedon6\snext158 NestError;}
+{\s159\sb440\cf2\charscalex0\sl440\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs36\lang255\ab\ltrch\dbch\af0\afs36\langfe255\ab\loch\f0\fs36\lang1033\b\sbasedon6\snext159 NotAllowed;}
+{\s160\li1920\ri0\lin1920\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext160 note;}
+{\s161\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext161 note1;}
+{\s162\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext162 note2;}
+{\s163\li3060\ri0\lin3060\rin0\fi0\sb120\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext163 note3;}
+{\s164\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numlist;}
+{\s165\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numlist+;}
+{\s166\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numlist+_sub;}
+{\s167\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numlist_sub;}
+{\s168\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numtext;}
+{\s169\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext169 numtext1;}
+{\s170\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext165 numtext_sub;}
+{\s171\keepn\cf1\charscalex0\sl380\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs90\lang255\ab\ltrch\dbch\af3\afs90\langfe255\ab\loch\f3\fs90\lang1033\b\sbasedon6\snext171 partNum;}
+{\s172\cf3\charscalex0\sl200\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext172 PartNumber;}
+{\s173\li2280\ri0\lin2280\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext174 pexpln;}
+{\s174\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext174 pstep+;}
+{\s175\cf2\charscalex0\sl720\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs66\lang255\ltrch\dbch\af4\afs66\langfe255\loch\f4\fs66\lang1033\sbasedon6\snext175 Product;}
+{\s176\li2680\ri0\lin2680\rin0\fi-400\sb120\cf1\charscalex0\sl240\slmult0\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext176 psb_pstepbullet;}
+{\s177\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext22 psbt_pstepbultext;}
+{\s178\li2680\ri0\lin2680\rin0\fi-2680\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2560\tx2680{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext178 psn_subnum;}
+{\s179\li3060\ri0\lin3060\rin0\fi-380\sb120\cf1\charscalex0\sl240\slmult0\tx3060{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext179 psnb_subnumbullet;}
+{\s180\li3060\ri0\lin3060\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext180 psnbt_subnumbultext;}
+{\s181\li2680\ri0\lin2680\rin0\fi0\sb120\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext178 pst_subtext;}
+{\s182\li2280\ri0\lin2280\rin0\fi-360\sb120\cf1\charscalex0\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext174 pstep;}
+{\s183\sb100\sa100\cf1\charscalex0\sl120\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs10\lang255\ltrch\dbch\af4\afs10\langfe255\loch\f4\fs10\lang1033\sbasedon6\snext183 QSLegal;}
+{\s184\cf1\charscalex0\sl280\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon6\snext184 QSnote;}
+{\s185\keepn\cf2\charscalex0\sl320\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs26\lang255\ltrch\dbch\af4\afs26\langfe255\loch\f4\fs26\lang1033\sbasedon6\snext185 QSVersion;}
+{\s186\li1920\ri0\lin1920\rin0\fi0\sb160\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext186 ref_class;}
+{\s187\li1920\ri0\lin1920\rin0\fi0\sb80\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext187 ref_class+;}
+{\s188\sb420\sa120\keepn\cf1\charscalex0\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b\sbasedon6\snext188 ref_head1;}
+{\s189\sb300\sa60\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext189 ref_head2;}
+{\s190\li1920\ri0\lin1920\rin0\fi0\sb240\sa60\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ab\ltrch\dbch\af3\afs20\langfe255\ab\loch\f3\fs20\lang1033\b\sbasedon6\snext190 ref_head3;}
+{\s191\li1920\ri0\lin1920\rin0\fi0\sb160\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext191 ref_purpose;}
+{\s192\cf1\charscalex0\sl220\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033\sbasedon6\snext192 ReleaseDate;}
+{\s193\li800\ri0\lin800\rin0\fi-800\sb160\sa500\keepn\cf1\charscalex0\sl240\slmult0\tx800{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ab\ltrch\dbch\af3\afs24\langfe255\ab\loch\f3\fs24\lang1033\b\sbasedon6\snext193 ReleaseDateReadme;}
+{\s194\cf1\charscalex0\sl240\slmult0\tx1580\tqr\tx3960{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext194 rev;}
+{\s195\keepn\cf1\charscalex0\sl240\slmult0\tx2600{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033\sbasedon6\snext195 slug;}
+{\s196\li360\ri0\lin360\rin0\fi-120\sb40\cf1\charscalex0\sl220\slmult0\tx240\tx360{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext196 t_list;}
+{\s197\li240\ri0\lin240\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0\tx240{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext197 tb_tblblt;}
+{\s198\li240\ri0\lin240\rin0\fi0\sb120\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext198 tb_tblblt+;}
+{\s199\li1920\ri0\lin1920\rin0\fi-1920\sb300\sa140\cf1\charscalex0\sl200\slmult0\tqr\tx1560\tx1920{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b\sbasedon6\snext199 tc_caption;}
+{\s200\sb160\cf1\charscalex0\sl220\slmult0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext200 tc_ttextcen;}
+{\s201\sb160\cf1\charscalex0\sl220\slmult0\tqdec\tx480{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext201 td_ttextdec;}
+{\s202\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b\sbasedon6\snext203 thead;}
+{\s203\sb160\keepn\cf1\charscalex0\sl200\slmult0\tx2160{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b\sbasedon6\snext204 tsubhead;}
+{\s204\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext204 ttext;}
+{\s205\cf1\charscalex0\sl220\slmult0\qj{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ab\ltrch\dbch\af3\afs18\langfe255\ab\loch\f3\fs18\lang1033\b\sbasedon6\snext205 Title;}
+{\s206\sa380\cf2\charscalex0\sl440\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs36\lang255\ltrch\dbch\af4\afs36\langfe255\loch\f4\fs36\lang1033\sbasedon6\snext30 Title1;}
+{\s207\keepn\cf2\charscalex0\sl520\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs54\lang255\ltrch\dbch\af4\afs54\langfe255\loch\f4\fs54\lang1033\sbasedon6\snext207 TitleQS;}
+{\s208\sa660\cf1\charscalex0\sl460\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs36\lang255\ltrch\dbch\af6\afs36\langfe255\loch\f6\fs36\lang1033\sbasedon6\snext30 TitleQSContents;}
+{\s209\sb380\sa180\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ab\ltrch\dbch\af4\afs24\langfe255\ab\loch\f4\fs24\lang1033\b\sbasedon6\snext209 TitleQSTOC;}
+{\s210\li60\ri0\lin60\rin0\fi-60\sa40\cf1\charscalex0\sl180\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs16\lang255\ltrch\dbch\af0\afs16\langfe255\loch\f0\fs16\lang1033\sbasedon6\snext210 TMarkPara;}
+{\s211\li240\ri0\lin240\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0\tx240{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext211 tn+_tblnum+;}
+{\s212\li240\ri0\lin240\rin0\fi-240\sb120\cf1\charscalex0\sl220\slmult0\tx240{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext211 tn_tblnum;}
+{\s213\sb160\cf1\charscalex0\sl220\slmult0\qr{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext213 tr_ttextrt;}
+{\s214\li240\ri0\lin240\rin0\fi-240\sb160\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs18\lang255\ab\ltrch\dbch\af5\afs18\langfe255\ab\loch\f5\fs18\lang1033\b\sbasedon6\snext214 UserInputInTable;}
+{\s215\sa200\cf1\charscalex0\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b\sbasedon6\snext191 util_head;}
+{\s216\li1200\ri0\lin1200\rin0\fi-480\cf1\charscalex0\sl240\slmult0\tx1200\tldot\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext216 util_headTOC;}
+{\s217\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext218 varlist_term;}
+{\s218\li2280\ri0\lin2280\rin0\fi0\sb80\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033\sbasedon6\snext217 varlist_text;}
+{\s219\cf2\charscalex0\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs30\lang255\ltrch\dbch\af4\afs30\langfe255\loch\f4\fs30\lang1033\sbasedon6\snext219 Version;}
+{\s220\li1920\ri0\lin1920\rin0\fi0\sb240\cf1\charscalex0\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033\sbasedon6\snext220 warning;}
+{\s221\cf0\tqc\tx4320\tqr\tx8640{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext221 Header;}
+{\s222\cf0\tqc\tx4320\tqr\tx8640{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext222 Footer;}
+{\s223\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon2\snext223 Table Contents;}
+{\s224\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af0\afs24\lang255\ai\ab\ltrch\dbch\af0\afs24\langfe255\ai\ab\loch\f0\fs24\lang1033\i\b\sbasedon223\snext224 Table Heading;}
+{\*\cs226\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 1;}
+{\*\cs227\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 2;}
+{\*\cs228\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 3;}
+{\*\cs229\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 4;}
+{\*\cs230\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 5;}
+{\*\cs231\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 6;}
+{\*\cs232\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 7;}
+{\*\cs233\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 8;}
+{\*\cs234\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 9;}
+{\*\cs235\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033 RTF_Num 2 10;}
+{\*\cs236\cf1\rtlch\af6\afs132\lang255\ltrch\dbch\af6\afs132\langfe1033\loch\f6\fs132\lang1033 RTF_Num 3 1;}
+{\*\cs237\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 2;}
+{\*\cs238\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 3;}
+{\*\cs239\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 4;}
+{\*\cs240\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 5;}
+{\*\cs241\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 6;}
+{\*\cs242\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 7;}
+{\*\cs243\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 8;}
+{\*\cs244\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 9;}
+{\*\cs245\cf0\rtlch\af10\afs24\lang255\ltrch\dbch\af10\afs24\langfe255\loch\f10\fs24\lang1033 RTF_Num 3 10;}
+{\*\cs246\cf1\rtlch\af7\afs24\lang255\ltrch\dbch\af7\afs24\langfe1033\loch\f7\fs24\lang1033 RTF_Num 4 1;}
+{\*\cs247\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 Default Paragraph Font;}
+{\*\cs248\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe1033\loch\fs24\lang1033 Normal;}
+{\*\cs249\cf0\rtlch\af6\afs24\lang255\ltrch\dbch\af6\afs24\langfe255\loch\f6\fs24\lang1033\sbasedon248 ArialBlackTOC;}
+{\*\cs250\cf1\rtlch\afs16\lang255\ab\ltrch\dbch\afs16\langfe255\ab\loch\fs16\lang1033\b\sbasedon248 caption#;}
+{\*\cs251\cf1\rtlch\af6\afs132\lang255\ltrch\dbch\af6\afs132\langfe0\loch\f6\fs132\lang1033\sbasedon248 chapchar;}
+{\*\cs252\cf1\rtlch\af3\afs50\lang255\ab\ltrch\dbch\af3\afs50\langfe0\ab\loch\f3\fs50\lang1033\b\sbasedon248 chapnum;}
+{\*\cs253\cf1\rtlch\afs20\lang255\ai\ltrch\dbch\afs20\langfe255\ai\loch\fs20\lang1033\i\sbasedon248 chapter;}
+{\*\cs254\cf1\rtlch\af7\afs28\lang255\ltrch\dbch\af7\afs28\langfe255\loch\f7\fs28\lang1033\sbasedon248 checkbox;}
+{\*\cs255\cf1\rtlch\af5\afs24\lang255\ab\ltrch\dbch\af5\afs24\langfe0\ab\loch\f5\fs24\lang1033\b\sbasedon248 command;}
+{\*\cs256\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 constant;}
+{\*\cs257\cf1\rtlch\afs16\lang255\ai\ltrch\dbch\afs16\langfe255\ai\loch\fs16\lang1033\i\sbasedon248 continued;}
+{\*\cs258\cf1\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 disk_name;}
+{\*\cs259\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon247 Emphasis;}
+{\*\cs260\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 emphasis;}
+{\*\cs261\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 EquationVariables;}
+{\*\cs262\cf1\rtlch\afs21\lang255\ltrch\dbch\afs21\langfe255\loch\fs21\lang1033\sbasedon248 error_explanation;}
+{\*\cs263\cf1\rtlch\af0\afs24\lang255\ab\ltrch\dbch\af0\afs24\langfe255\ab\loch\f0\fs24\lang1033\b\sbasedon248 fn_functionname;}
+{\*\cs264\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 fp_funcparam;}
+{\*\cs265\cf1\rtlch\afs24\lang255\ab\ltrch\dbch\afs24\langfe255\ab\loch\fs24\lang1033\b\sbasedon248 gt_glossterm;}
+{\*\cs266\cf1\rtlch\afs70\lang255\ab\ltrch\dbch\afs70\langfe255\ab\loch\fs70\lang1033\b\sbasedon248 init_cap;}
+{\*\cs267\cf1\rtlch\af3\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f3\fs24\lang1033\sbasedon248 key;}
+{\*\cs268\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 man_title;}
+{\*\cs269\cf0{\*\updnprop10000}\up6\rtlch\af3\afs14\lang255\ltrch\dbch\af3\afs14\langfe0\loch\f3\fs14\lang1033\sbasedon248 MChar;}
+{\*\cs270\cf1\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 menu_opt;}
+{\*\cs271\cf0\rtlch\af5\afs24\lang255\ltrch\dbch\af5\afs24\langfe255\loch\f5\fs24\lang1033\sbasedon248 message;}
+{\*\cs272\cf1\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe255\loch\fs24\lang1033\sbasedon248 meta;}
+{\*\cs273\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 NDSattr;}
+{\*\cs274\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 NDSclass;}
+{\*\cs275\cf1\rtlch\af6\afs20\lang255\ab\ltrch\dbch\af6\afs20\langfe0\ab\loch\f6\fs20\lang1033\b\sbasedon248 numberlist#;}
+{\*\cs276\cf1\rtlch\af0\afs24\lang255\ab\ltrch\dbch\af0\afs24\langfe255\ab\loch\f0\fs24\lang1033\b\sbasedon248 option;}
+{\*\cs277\cf1\rtlch\af6\afs132\lang255\ltrch\dbch\af6\afs132\langfe0\loch\f6\fs132\lang1033\sbasedon248 partchar;}
+{\*\cs278\cf1\rtlch\af6\afs20\lang255\ltrch\dbch\af6\afs20\langfe0\loch\f6\fs20\lang1033\sbasedon248 pgnumber;}
+{\*\cs279\cf0\rtlch\af0\afs24\lang255\ab\ltrch\dbch\af0\afs24\langfe255\ab\loch\f0\fs24\lang1033\b\sbasedon248 ref_class_role;}
+{\*\cs280\cf0{\*\updnprop10000}\up6\rtlch\af0\afs14\lang255\ltrch\dbch\af0\afs14\langfe255\loch\f0\fs14\lang1033\sbasedon248 Registered;}
+{\*\cs281\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 regular;}
+{\*\cs282\cf0\rtlch\af0\afs24\lang255\ab\ltrch\dbch\af0\afs24\langfe255\ab\loch\f0\fs24\lang1033\b\sbasedon248 runin;}
+{\*\cs283\cf2\ulth\rtlch\afs20\lang255\ltrch\dbch\afs20\langfe0\loch\fs20\lang1033\sbasedon248 SDKLink;}
+{\*\cs284\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 struc_field;}
+{\*\cs285\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 structure;}
+{\*\cs286\cf0{\*\updnprop10000}\dn6\rtlch\af0\afs14\lang255\ltrch\dbch\af0\afs14\langfe0\loch\f0\fs14\lang1033\sbasedon248 Subscript;}
+{\*\cs287\cf0\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 subscript;}
+{\*\cs288\cf0{\*\updnprop10000}\up6\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 Superscript;}
+{\*\cs289\cf0\rtlch\af8\afs24\lang255\ltrch\dbch\af8\afs24\langfe255\loch\f8\fs24\lang1033\sbasedon248 Symbol;}
+{\*\cs290\cf0{\*\updnprop10000}\up6\rtlch\af0\afs14\lang255\ltrch\dbch\af0\afs14\langfe255\loch\f0\fs14\lang1033\sbasedon248 superscript;}
+{\*\cs291\cf1\rtlch\af8\afs28\lang255\ltrch\dbch\af8\afs28\langfe255\loch\f8\fs28\lang1033\sbasedon248 test;}
+{\*\cs292\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 term1;}
+{\*\cs293\cf1\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe0\loch\f3\fs18\lang1033\sbasedon248 TOCPage#;}
+{\*\cs294\cf1\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe0\loch\f0\fs24\lang1033\sbasedon248 tstrok;}
+{\*\cs295\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 variable;}
+{\*\cs296\cf0\rtlch\af0\afs24\lang255\ai\ltrch\dbch\af0\afs24\langfe255\ai\loch\f0\fs24\lang1033\i\sbasedon248 version_variable;}
+{\*\cs297\cf0\rtlch\af9\afs24\lang255\ltrch\dbch\af9\afs24\langfe255\loch\f9\fs24\lang1033\sbasedon248 WebDings;}
+{\*\cs298\cf1\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe0\loch\fs24\lang1033\sbasedon248 Western Times New Roman;}
+{\*\cs299\cf1\rtlch\af7\afs24\lang255\ltrch\dbch\af7\afs24\langfe255\loch\f7\fs24\lang1033\sbasedon248 wingdings;}
+{\*\cs300\cf2\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 xref;}
+{\*\cs301\cf2\ulth\rtlch\af0\afs24\lang255\ltrch\dbch\af0\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon248 xrefpoint;}
+{\*\cs302\cf4\ul\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe1033\loch\fs24\lang1033 Internet Link;}
+{\*\cs303\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe1033\loch\fs24\lang1033 Numbering Symbols;}
+{\*\cs304\cf5\ul\rtlch\afs24\lang255\ltrch\dbch\afs24\langfe1033\loch\fs24\lang1033 Visited Internet Link;}
+}{\*\listtable{\list\listtemplateid1
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'00.;}{\levelnumbers\'01;}\fi-283\li283}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'01.;}{\levelnumbers\'01;}\fi-283\li567}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'02.;}{\levelnumbers\'01;}\fi-283\li850}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'03.;}{\levelnumbers\'01;}\fi-283\li1134}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'04.;}{\levelnumbers\'01;}\fi-283\li1417}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'05.;}{\levelnumbers\'01;}\fi-283\li1701}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'06.;}{\levelnumbers\'01;}\fi-283\li1984}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'07.;}{\levelnumbers\'01;}\fi-283\li2268}
+{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'08.;}{\levelnumbers\'01;}\fi-283\li2551}
+{\*\soutlvl{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'09.;}{\levelnumbers\'01;}\fi-283\li2835}}{\listname RTF_Num 2;}\listid1}
+}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}}
+
+{\info{\creatim\yr2004\mo8\dy18\hr10\min17}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6450}}\deftab720
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1260\margrsxn900\margtsxn720\margbsxn720\headery0{\*\headeryb196\headerxl0\headerxr0\headeryh479}{\header \pard\plain \s195\cf1\charscalex0\sl240\slmult0\tx2600{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\keepn\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033
+\par }
+\footery0{\*\footeryt437\footerxl0\footerxr0\footeryh720}{\footer \pard\plain \s92\cf1\charscalex0\sl240\slmult0\tx560\tqr\tx2000\tx2560\tqr\tx9400\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033
+\par }
+\pgdscnxt0 Default;}
+{\pgdsc1\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1260\margrsxn900\margtsxn720\margbsxn720\headery0{\*\headeryb77\headerxl0\headerxr0\headeryh360}{\header \pard\plain \s195\cf1\charscalex0\sl240\slmult0\tx2600\keepn\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe1033\loch\f3\fs20\lang1033 {\loch\f3\fs20\lang1033\i0\b0 Novell Confidential\tab Manual ( 99a) 15 April 2004\tab }
+\par }
+\footery77{\*\footeryt0\footerxl0\footerxr0\footeryh360}{\footer \pard\plain \s92\cf1\charscalex0\sl240\slmult0\tx3120\tqr\tx4560\tx5120\tqr\tx11960\tqr\tx12640\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe1033\loch\f3\fs20\lang1033 {\loch\f3\fs20\lang1033\i0\b0 \tab \tab \tab Functions \tab {\*\cs278\cf1\rtlch\ltrch\dbch\loch\f6\fs20\lang1033 \tab \tab }{\field{\*\fldinst \\page\\* ARABIC}{\fldrslt 4}}{\*\cs278\cf1\rtlch\ltrch\dbch\loch\f6\fs20\lang1033 }}
+\par }
+\pgdscnxt0 First Page;}}
+{\*\pgdscno0}\paperh15840\paperw12240\margl1260\margr900\margt720\margb720\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1260\margrsxn900\margtsxn1199\margbsxn1440\headery720{\header \pard\plain \s195\cf1\charscalex0\sl240\slmult0\tx2600{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\keepn\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033
+\par }
+\footery720{\footer \pard\plain \s92\cf1\charscalex0\sl240\slmult0\tx560\tqr\tx2000\tx2560\tqr\tx9400\tqr\tx10080{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs20\lang255\ltrch\dbch\af3\afs20\langfe255\loch\f3\fs20\lang1033
+\par }
+\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \ltrpar\s1\cf1\qc\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe1033\ab\loch\f3\fs36\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\qc\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe1033\ab\loch\f3\fs36\lang1033\b
+\par
+\par
+\par
+\par
+\par
+\par
+\par
+\par
+\par \pard\plain \ltrpar\s1\cf1\ul\qc\rtlch\af3\afs48\lang255\ab\ltrch\dbch\af3\afs48\langfe1033\ab\loch\f3\fs48\lang1033\b {\loch\f3\fs48\lang1033\i0\b SecretStore Transport APIs}
+\par
+\par \pard\plain \ltrpar\s1\cf1\qc\rtlch\af3\afs28\lang255\ai\ab\ltrch\dbch\af3\afs28\langfe1033\ai\ab\loch\f3\fs28\lang1033\i\b {\loch\f3\fs28\lang1033\i\b Version 1.0}
+\par \page\pard\plain \ltrpar\s1\cf1\qc\rtlch\af3\afs36\lang255\ab\ltrch\dbch\af3\afs36\langfe1033\ab\loch\f3\fs36\lang1033\b
+\par \pard\plain \ltrpar\s1\cf1\sl240\slmult0\tqr\tx2180\li360\ri0\lin360\rin0\fi0\sb120\rtlch\afs21\lang255\ltrch\dbch\afs21\langfe1033\loch\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The Novell SecretStore API includes functions to enable and maintain transparent authentication capabilities, providing simplification of user authentication within your client/server applications. SecretStore functions can be identified as either of the f
+ollowing categories:}
+\par \pard\plain \ltrpar\s204\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li360\ri0\lin360\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain {\listtext\pard\plain \li643\ri0\lin643\rin0\fi-283\sb120\cf2\fs21\fs21\langfe1033\fs21\sl240\slmult0\tqr\tx2180 1.}\ilvl0 \ltrpar\s13\cf2\sl240\slmult0\tqr\tx2180{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li643\ri0\lin643\rin0\fi-283\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 \tab Enabling Functions}
+\par \pard\plain {\listtext\pard\plain \li643\ri0\lin643\rin0\fi-283\sb120\cf1\fs20\fs21\langfe1033\fs21\sl240\slmult0\tqr\tx2180 2.}\ilvl0 \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li643\ri0\lin643\rin0\fi-283\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 Administrative Functions}
+\par \pard\plain \ltrpar\s109\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b Enabling Functions }
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following functions prepare applications to use Novell Single Sign-on and include:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3340\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Functions}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3340\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransGetServiceInformation}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Returns service and SecretStore related information.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3340\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransReadSecret}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Reads the application secrets from the SecretStore service for a logged in and authenticated eDirectory user of a SecretStore enabled application.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3340\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransRemoveSecret}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Removes a specified secret from a user\rquote s SecretStore on an eDirectory object for an application.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3340\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransWriteSecret}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Writes new secrets or overwrites the old secrets of an application in the SecretStore service for a logged in and authenticated eDirectory user of a SecretStore-enabled application.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3340\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransWriteSecretStore}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f11\fs18\lang1033 {\loch\f11\fs18\lang1033\i0\b0 Writes all off the secrets at once.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3340\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransReadSecretStore}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Reads all of the secrets at once.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s109\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b Administrative Functions}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These functions create the user\rquote s Single Sign-on capability and generate encryption keys for an enabled application:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3380\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Functions}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3380\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransEnumerateSecretIDs}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Lists the application secret identifiers in a target secret.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3380\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransRemoveSecretStore}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Removes SecretStore from a target object.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3380\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransSetEPMasterPassword}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Allows the owner of SecretStore to set the SecretStore master password.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3380\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf2\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 sscs_TransUnlockSecrets}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Unlocks a client\rquote s SecretStore after it was locked in an enhanced protection scenario by removing the lock, or by using a previous eDirectory password on master password.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s109\cf1\sl360\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b API Function Flags}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following flags are defined for the Single Sign-on API functions:}
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Input Only Flags for Write API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000001L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCED_PROTECTION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced Protection indicator flag for Read and Write.}
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000040L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_PASSWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 (Optional) Enhanced Protection optional password indicator flag for Read and Write.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00004000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_CHK_SID_FOR_COLLISION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Check for existing SID to prevent collision and overwrite.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Input Only Flags for Unlock API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000020L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_ F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The master password used to read a secret in place of the Enhanced Protection password or to unlock in place of the old eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000004L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REMOVE_LOCK_FROM_ STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Can delete locked secrets from store to remove lock.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Input Only Flags for Read API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000020L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_ F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The master password used to read a secret in place of the Enhanced Protection password or to unlock in place of the old eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000008L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REPAIR_THE_ STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Request all possible repairs on damaged store.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Input Only Flags for All APIs}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1220\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000010L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Informs the service that the strings, such as secretID, DN, searchString, etc., are already converted to unicode and no conversion is necessary. (Results returned in unicode.)}
+\cell\row\pard \trowd\trqr\trrh1000\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000200L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000800L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_UNBINDLDAP_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates LDAP-based access to directory should be terminated.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000080L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Use the tree name in the context to set the tree.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Input Only Flag for GetServiceInfo API}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000080L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000100L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_GET_ CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Returns a DS context for reuse in the subsequent calls.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000800L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_BINDLDAP_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Bind over LDAP to eDirectory hosting the SecretStore is requested.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Output Only Flags from Read API}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These flags come back on the returned optional extension structures, sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } and sscs_TransReadSecret{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } (statFlags on reading a secret and statFlags on the store):}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0001000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SECRET_LOCKED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced protection lock on a secret.}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0002000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SECRET_NOT_INITIALIZED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret not yet initialized with a Write.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0004000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCED_PROTECT_INFO_ F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret is marked for enhanced protection.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0008000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_STORE_NOT_SYNCED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Store is not yet synchronized across replicas.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0020000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_PWORD_PRESENT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 There is an Enhanced Protection application password on the secret.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Output Only Flag from GetServiceInformation API statFlags}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0080000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_MP_NOT_ ALLOWED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The use of master password has been disabled by the service.}
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x0040000L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_ PRESENT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 There is a master password on the SecretStore (Admin configurable option on the server).}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Context Flags for The Type of Context Passed in to Initialize Context Structure}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000001L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NCP context.}
+\cell\row\pard \trowd\trqr\trrh340\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000002L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 LDAP context. (Reserved for the future.)}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000008L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_INIT_CTX_SS_HANDLE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Initialize the client supplied context for SS use.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000010L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DEINIT_CTX_SS_HANDLE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Deinitialize the client context for application unbind}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000020L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REINIT_TARGET_DN_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Reinitialize the target DN for admin in the context when admin is switching target.}
+\cell\row\pard \trowd\trqr\trrh780\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000040L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_LDAP_CONTEXT_LESS_DN_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Resolving the context less DN for the bind is requested because the DN that is passed in is contextless.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000080L{\*\bkmkstart DDE_LINK1}{\*\bkmkend DDE_LINK1}}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ADV_BIND_INFO_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Use the advanced bind structure and preform service location.}
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000100L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\charscalex0\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033{\loch\f3\fs18\lang1033\i0\b0\charscalex100 0x00000200L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000400L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033
+\cell\row\pard \trowd\trqr\trrh560\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000800L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s113\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Context Flags for Input and Returned from the Context Structure}
+\par \trowd\trqr\trrh300\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr0\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Flag}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1440\trpaddft3\trpaddt0\trpaddfl3\trpaddl80\trpaddfb3\trpaddb160\trpaddfr3\trpaddr80\cellx1583\cellx5831\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 0x00000004L}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_CONTEXT_INITIALIZED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Connection to server is established and context structure is initialized (returned from SS when context is initialized or can be supplied when the context is preinitialized outside SS and is passed in for SS use).}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \page\pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s109\cf1\sl360\slmult0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb360\sa200\keepn\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b API Prototypes}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The following are {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b _stdcall} function prototypes exported APIs in Windows. For definitions of the SecretStore function return types, refer to nssscl.h.}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransEnumerateSecretIDs}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Enables the administrator or user to list the secret identifiers (secret IDs) for secrets stored in the user\rquote s SecretStore. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransEnumerateSecretIDs} \line (\line SSS_CONTEXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line char *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i searchString}, \line unsigned long *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i count} \line SS_SECR
+ET_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDList}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This optional structure can be initialized by making a call to sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a set of flags for initializing secrets:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4220\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1900\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4220\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates that all applicable char strings (such as targetObject, secretID, etc.) are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag also instructs the API not to convert the return char string
+s to local code page. }
+\par \pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033{\loch\f6\fs17\lang1033\i0\b0{\fs17\f6 NOTE: }}{\loch\f3\fs18\lang1033This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4220\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4220\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i searchString}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Set to *, NULL, or "" if all entries are desired in the search. Use the asterisk "*" as delimiter to search for specific entries with known prefixes, such as "MYAppSecretNumber_*". }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i count}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) The number of secret identifiers stored for the user. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDList}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) An asterisk "*" separated list of secret identifiers matching the search string.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \rdblquote Return Values\rdblquote }for more information.}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4369\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attributed related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4369\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4369\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The memory allocated for the secretIDBuffer should be set to SSCS_ENUM_BUFFER_GUESS. This should be enough memory for most applications. }
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If this call returns SSCS_ERR_MORE_DATA (not a fatal error), call it again with a buffer the size of returned secretIDList->len. If the buffer is too small for all of the data in the SecretStore, the returned buffered from the server is stuffed as much as
+it has room. search string can be used to change the scope of the search when buffer size is a constraint.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransReadSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \pard\plain \ltrpar\s134\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransWriteSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \pard\plain \ltrpar\s134\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransRemoveSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransGetServiceInformation}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Returns service information from the SecretStore for authenticated users of a Single Sign-on enabled application.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransGetServiceInfomaion} \line (\line SSS_CONTEXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext,} \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObjDN,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line SSS_GSINFOEXT_T *{\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i gsInfo}, //mandatory\line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext\line )};}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This handle can be initialized by making calls to eDirectory prior to SecretStore or requesting sscs_TransGetServiceInformation to initialize it. The flags field can take on these values to indicate the type of context used:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3972\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the NCP context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the LDAP context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the SASL SAML context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the SASL NMAS context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the SASL GSS context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the SASL LDAP context indicator flag.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_INIT_LDAP_SS_HANDLE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Set when init is passed into the handle without bind. This is done when you do the bind for contexts initialized outside of SecretStore client.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx3972\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DEINIT_LDAP_HANDLE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Deinitializes the passed in handle when you want to perform the unbind later (for contexts initialized outside of SecretStore client).}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx3972\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REINIT_TARGET_DN_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Reinitializes the handle to a new target DN. Set when the administrator plans to switch from one target DN to another.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObjDN}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. The caller should have at least READ/WRITE privileges over the target object. }
+\par \pard\plain \ltrpar\s161\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033{\loch\f6\fs16\lang1033\i0\b0{\f6 NOTE: }}{\loch\f3\fs16\lang1033{\fs17 For binding to server over LDAP/SSL this parameter is mandatory and it should be in fully qualified LDAP form ("cn=user, ou=users, o=novell").}}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a set of flags for initializing secrets as defined earlier in this document: }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F \line SSCS_TRANS_SET_TREE_NAME_F \line SSCS_TRANS_GET_CONTEXT_F}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT)}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_ENHANCEDPROTECT_INFO_F\emdash Secret is marked for enhanced protection.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_PRESENT_F\emdash There is a master password on the SecretStore (Admin configurable option on the server).}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_MP_NOT_ALLOWED_F\emdash \tab The use of master password has been disabled by the service.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote on page\~61} for more information.}
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4584\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attributed related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4584\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4584\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This can authenticate and connect the SecretStore client to the target SecretStore server. The initialized context (NCP/LDAP) can be utilized across other calls to have an ongoing session with SecretStore. This allows considerable performance enhancement b
+y reusing credentials across multiple calls and avoiding reinitialization per call. These new SecretStore calls can still perform per-call initialization and operations for connectors.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransReadSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \pard\plain \ltrpar\s134\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransWriteSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \pard\plain \ltrpar\s134\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransRemoveSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransReadSecret}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Reads the secrets from the SecretStore service for an authenticated user of a SecretStore-enabled application.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransReadSecret} \line (\line SSS_CONTEXT_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags,}\line SS_PWORD_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPassword} \line SSS_READEXT_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i readInfo,} \line SS_SECRET_ID_T
+ *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}, \line SS_SECRET_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValue}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional structure that can be initialized by making a call to sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a set of flags for initializing secrets.}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4355\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This flag indicates that all applicable char strings such as targetObject, secretID etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char str
+ings to local code page as well. This is a feature of SSO client v1.1 and does not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCED_PROTECTION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced Protection indicator flag for Read and Write.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enables the user to supply the EP master password to unlock the SecretStore in place of the previous eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REPAIR_THE_STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Request all possible repairs on damaged store.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4355\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPassword}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional field to pass in the Master Password or the Enhanced Protection Password for reading a secret. When neither one of the passwords are present, you can pass in a NULL. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i readInfo}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Specifies the structure that returns the status information coming back from reading a secret. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to a unique secret identifier chosen by the application that should be supplied to locate the application secret values in the user's secrets, preferably in the Novell conventional format described earlier in this document. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValue}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to a buffer that the client allocates for the returned secret value. A call with "secretValue->len=0" returns the required buffer size in "secretValue->size".}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extensions for the secrets. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function (see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote }for more information):}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4210\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_PWORD_CHANGE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Admin has changed the user password and as a result the client\rquote s SecretStore is locked (non-repudiation).}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4210\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_EP_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced Protection password validation failed.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This SecretStore call accesses the service on behalf of a logged in and authenticated user. It returns to the client component of the application a clear copy of the application\rquote s secrets stored in SecretStore. }
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The unique {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID} that was chosen for this application when the user's SecretStore was being populated is passed in as input. As a result, the object is located in the tree and the SecretStore is read until the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID} is located. When the proper secret
+ is located in the SecretStore, it is decrypted and returned in the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValue} buffer allocated for the purpose. Since the actual required size of the secret buffer is returned regardless of the success or failure of this call, the client can make a secon
+d call with the proper buffer size if the original request failed due to insufficient buffer size. }
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject} is of the "User" type in eDirectory, then the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext} and the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject} should match. In other words, only the owner of the SecretStore can read the secrets. If the {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject} is not a User, the call that has proper access ri
+ghts can read SecretStore on a non-User object type in eDirectory.}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The {\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i SecretCount} field can return the count of secrets in the SecretStore if the client is talking to a Version 2.0 SecretStore on the server.}
+\par \pard\plain \ltrpar\s160\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb120\ql\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033{\loch\f6\fs16\lang1033\i0\b0{\f6 NOTE: }}{\loch\f3\fs16\lang1033{\fs17{\*\cs260\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i sssinit.exe}}{\fs17{ enables an administrator to extend the schema on a non-user object for SecretStore. This tool and the SecretStore product installation by default extends schema on a non-user object.}}}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs21\lang1033\i0\b0{\cf2 sscs_TransWriteSecret}}{\loch\f0\fs21\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransRemoveSecret}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Removes the specified secret from SecretStore. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransRemoveSecret} \line (\line SSS_Context_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unisgned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line SS_SECRET_ID_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional structure that can be initialized by calling sscs_TransGetServiceInformation {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to an optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a set of flags for initializing secrets.}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4136\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4136\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates that all applicable char strings such as targetObject, secretID etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char strings to lo
+cal code page as well. This is a feature of SSO client v1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4136\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4136\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to a unique secret identifier chosen by the application that should be supplied to locate the application secret values in the user\rquote s SecretStore to be removed. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, returns a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values (for more information, see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote }:}
+\par \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4405\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with. }
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4405\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4405\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The sscs_TransRemoveSecret call removes an identified secret from the SecretStore for the user. If the secret happens to be the last secret in the user\rquote s SecretStore the SecretStore is removed completely. }
+\par \pard\plain \ltrpar\s160\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb120\ql\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransReadSecret}
+\par \pard\plain \ltrpar\s134\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransWriteSecret}
+\par \pard\plain \ltrpar\s134\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransEnumerateSecretIDs,}
+\par \pard\plain \ltrpar\s134\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransRemoveSecret}
+\par \pard\plain \ltrpar\s134\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb40\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransRemoveSecretStore}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Removes SecretStore from the eDirectory object. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransRemoveSecretStore} \line (\line SSS_CONTEXT_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional structure that can be initialized by making a call to sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a set of flags for initializing secrets.}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4156\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4156\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates that all applicable char strings such as targetObject, secretID etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char strings to lo
+cal code page as well. This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4156\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4156\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 ***}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extension returns for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values (for more information, see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote }):}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx5040\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx5040\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx5040\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransEnumerateSecretIDs}
+\par \pard\plain \ltrpar\s141\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransReadSecret}
+\par \pard\plain \ltrpar\s141\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransWriteSecret}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 }
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransSetEPMasterPassword}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 A special function for use by administrative utilities. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransSetEPMasterPassword} \line (\line SSS_CONTEXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext,} \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObjDN,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line SS_PWORD_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i password}, \line SS_HINT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i hint}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line )
+;}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to an optional structure that can be initialized by making a call to sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. The caller should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies the set of flags for initializing secrets:}
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi-360\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi-360\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi-360\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi-360\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s13\cf1\sl240\slmult0\tqr\tx2180\tx2280{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi-360\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4705\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4705\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates that all applicable char strings such as targetObject, secretID, etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char strings to l
+ocal code page as well. This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4705\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REMOVE_LOCK_FROM_STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Causes SecretStore to delete all of the enhanced protected secrets that are locked and, therefore, remove the lock from SecretStore.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4705\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enables the user to supply the EP master password to unlock the SecretStore in place of the previous eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4705\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4705\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 ***}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i password}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the master password to be set. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs295\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i hint}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the hint for the master password to be set by the user.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extension returns for the secrets. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote }for more information.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This call can set a master password on the user\rquote s SecretStore if it is allowed by the service and if the user has enhanced protection set on their SecretStore.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 See other SecretStore APIs.}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransUnlockSecrets}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 This call unlocks the client\rquote s SecretStore after an administrative change of the client\rquote s eDirectory password has caused the user\rquote s SecretStore with enhanced protection secrets to become locked. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransUnlockSecrets} \line (\line SSS_CONTEXT_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}, \line SS_PWORD_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i password}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies the optional structure that can be initialized by making a call to sscs_TransGetServiceInformation {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used:}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. The caller should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies the set of flags for initializing secrets:}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4704\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4704\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Indicates that all applicable char strings such as targetObject, secretID, etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char strings to l
+ocal code page as well. This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4704\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REMOVE_LOCK_FROM_STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Causes SecretStore to delete all of the enhanced protected secrets that are locked and, therefore, remove the lock from SecretStore.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4704\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enables the user to supply the EP master password to unlock the SecretStore in place of the previous eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4704\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4704\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 ***}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i password}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This points to the client\rquote s clear text password.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote } for more information.}
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4402\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4402\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_UNLOCKING_FAILED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Verification of the old eDirectory password failed; therefore, unlocking the store failed.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4402\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransUnlockSecrets the client\rquote s SecretStore after an administrative change of the client\rquote s eDirectory password. When administrator changes a eDirectory user\rquote s password, the SecretStore service is automatically locked. A prior call to sscs_TransReadSec
+ret{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } will fail with the SSCS_E_NDS_PWORD_CHANGED. Then the client should make a call to sscs_TransUnlockSecrets and supply the client\rquote s old eDirectory password to unlock the SecretStore.}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If the service allows master password for users and the user has set a master password on their SecretStore prior to locking, then the user can use the master password to unlock the SecretStore. This helps for instances when the user forgets the eDirectory
+ password. }
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 If the password change has been due to a user forgetting the password and there is no master password, then SecretStore is not recoverable. Consequently, the locked SecretStore should be deleted and recreated by the client. eDirectory password changes by t
+he user will not cause the SecretStore to be locked.}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The owner of the SecretStore can use this function call with proper flags to remove the locked secrets or unlock the SecretStore with the previous eDirectory password or master password. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 See other SecretStore APIs{.}}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransWriteSecret}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 This call writes a secret to the user\rquote s SecretStore for authenticated users of SecretStore-enabled applications.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransWriteSecret} \line (\line SSS_Context_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags} \line SS_PWORD_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPassword}, \line SS_SECRET_ID_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}, \line SS_SECRET_T
+ *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValue},\line SS_EXT_F *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This optional structure can be initialized by making a call to sscs_TransGetServiceInformation prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a set of flags for initializing secrets. }
+\par \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4295\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCEDPROTECTION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the enhanced protection ON for this secret.}
+\cell\row\pard \trowd\trqr\trrh1080\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_PASSWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 If Enhanced Protection is turned on (using the SSCS_TRANS_ENHANCEDPROTECTION flag), this optional flag specifies the use of the password supplied through the SS_WRITEEXT_T and SS_EXT_T structures.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_CHECK_SID_FOR_COLISION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Forces the sscs_TransWriteSecret to check for the existence fo the secret in the SecretStore to prevent from overwriting a secret by returning the appropriate error.}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This flag indicates that all applicable char strings (such as targetObject, secretID, etc.) are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char s
+trings to local code page as well. This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4295\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPassword}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is an optional field to pass in the Master Password or the Enhanced Protection Password for writing a secret. When neither one of the passwords are present, you can pass in a NULL.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretID}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a unique secret identifier chosen by the application that should be supplied to locate the application secret values in the user\rquote s SecretStore.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValue}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a buffer that the client allocates for the application secret value and encodes the secret within it.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote } for more information.}
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4344\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4344\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment. }
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs21\lang1033\i0\b0{\charscalex100\fs21 The {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 N}}}{\loch\f0\fs20\lang1033{\field{\*\fldinst HYPERLINK \\l "RTF303366756e634a756e2e666d" }{\fldrslt \*\cs302\cf4\ul\rtlch\ltrch\dbch\loch\fs24\lang1033{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\charscalex100\ul\fs21 SSWriteSecret}}}{\charscalex100\fs21 call begins a session with SecretStore to populate it with a new secret. This function call takes the clear copy of the application\rquote s secret from the application, encrypts it, and stores it in the user\rquote s SecretStore in eDirectory. The us
+er of the application must be logged in and authenticated to eDirectory in order for this call to succeed. }}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The unique secret ID that was chosen for this application when installing the user\rquote s SecretStore is passed in as input. As a result, the object is located in the tree and the SecretStore is populated by adding the application secret values to it. Once the
+proper attribute value is located in the SecretStore, it is populated or overwritten with the application secret value in the incoming buffer. The application secret is encrypted and written to the user\rquote s secret associated with the target application. This
+ call overwrites the existing value if present. This call by default creates and writes the secret and if the secret identified by the secret ID is found it will overwrite it.}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 The SSCS_TRANS_CHECK_SID_FOR_COLLISION_F flag is used to force a check for existing secret identified by the secret ID in the SecretStore to prevent collision. The owner and other persons with proper access rights can use this function. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf2\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 sscs_TransReadSecret}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransWriteSecretStore}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Writess all of the secrets from the user's SecretStore on the backend at once for with small overhead for synchronization.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransWriteSecret} \line (\line SSS_Context_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags} \line unsigned long *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretCount,} \line SS_PWORD_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPasswords}, \line SS_SE
+CRET_ID_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDs}, \line SS_SECRET_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValues},\line SS_EXT_F *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This optional structure can be initialized by making a call to sscs_TransGetServiceInformation{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) This is a list of flags for initializing secrets. }
+\par \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4295\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCEDPROTECTION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the enhanced protection ON for this secret.}
+\cell\row\pard \trowd\trqr\trrh1080\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_PASSWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 If Enhanced Protection is turned on (using the SSCS_TRANS_ENHANCEDPROTECTION flag), this optional flag specifies the use of the password supplied through the SS_WRITEEXT_T and SS_EXT_T structures.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_CHECK_SID_FOR_COLISION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Forces the sscs_TransWrteSeceret the check for the existence of the secret in the SecretStore to prevent from overwriting a secret by returning the appropriate error.}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This flag indicates that all applicable char strings (such as targetObject, secretID, etc.) are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char s
+trings to local code page as well. This is a feature of SSO client Version 1.1 and will not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4295\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4295\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPasswords}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a list of Enhanced Protection Password s or the MasterPassword corresponding to the secrets in the list of secrets. When neither one of the passwords are present, the pointer can be NULL. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i readInfos}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Specifies the list of structures that returns the status information coming back from reading a secrets. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDs}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to a list of unique secret identifiers chosen by the application that should be supplied to locate the application secret values in the user's secrets, preferably in the Novell conventional format described earlier in this document. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValues}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i (OUT) Points to a list of populated secrets that will sent to the server..}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, this structure can return a set of applicable future extensions for the secrets.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function; see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote on page\~61} for more information.}
+\par \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrt\brdrs\brdrw20\brdrcf1\cellx4344\clbrdrt\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4344\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore. }
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4344\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment. }
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\charscalex0\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs21\lang1033\i0\b0{\charscalex100\fs21 The {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 sscs_Trans}}}{\loch\f0\fs20\lang1033{\field{\*\fldinst HYPERLINK \\l "RTF303366756e634a756e2e666d" }{\fldrslt \*\cs302\cf4\ul\rtlch\ltrch\dbch\loch\fs24\lang1033{\charscalex100\ul\fs21\cf2 WriteSecretStore}}}{\charscalex100\fs21 call begins a session with SecretStore to populate it with a new set of secret. Each set of parameters corresponds to a secret and this call is designed to bypass the overhead associated with writing secrets one at a time.}}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 sscs_TransWriteSecret,}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 sscs_TransReadSecretStore{\fs24 }}
+\par \page\pard\plain \ltrpar\s215\cf1\sl360\slmult0\tqr\tx8400{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sa200\ql\rtlch\af3\afs32\lang255\ab\ltrch\dbch\af3\afs32\langfe255\ab\loch\f3\fs32\lang1033\b {\loch\f3\fs32\lang1033\i0\b sscs_TransReadSecretStore}
+\par \pard\plain \ltrpar\s191\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af3\afs21\lang255\ltrch\dbch\af3\afs21\langfe255\loch\f3\fs21\lang1033 {\loch\f3\fs21\lang1033\i0\b0 Reads all of the secrets from the user's SecretStore on the backend at once for with small overhead for synchronization.}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Syntax}
+\par \pard\plain \ltrpar\s154\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af5\afs18\lang255\ltrch\dbch\af5\afs18\langfe255\loch\f5\fs18\lang1033 {\loch\f5\fs18\lang1033\i0\b0 #include \line \line SS_EXTERN_LIBCALL(int) {\*\cs263\cf1\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\b sscs_TransReadSecretStore} \line (\line SSS_CONTEXT_T {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}, \line SS_OBJECT_DN_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject,} \line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i *ssFlags,}\line unsigned long {\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretCount,}\line SS_PWORD_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPasswords,}\line SSS_RE
+ADEXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i readInfos,} \line SS_SECRET_ID_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDs}, \line SS_SECRET_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValues}, \line SS_EXT_T *{\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ext}\line );}
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Parameters}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i callerContext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies an optional structure that can be initialized by making a call to {\field{\*\fldinst REF RTF413373776a61713a20526566 \\h}{\fldrslt NSSSGetServiceInformation (page\~79)}}{\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 } prior to use here. The flags field of the structure can take on the following values to indicate the type of context used.}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NCP_CTX_F\emdash Directory Service API context indicator flag}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_LDAP_CTX_F\emdash LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SAML_CTX_F\emdash SASL SAML context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_NMAS_CTX_F\emdash SASL NMAS conntext indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_GSS_CTX_F\emdash SASL GSS context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 SSCS_TRANS_SASL_CTX_F\emdash SASL LDAP context indicator flag }
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i targetObject}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to the optional RDN (relative distinguished name or "short name") of the target object that contains the user\rquote s secrets. You should have at least READ/WRITE privileges over the target object.}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i ssFlags}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a pointer to a list of flags for initializing the secrets.}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4355\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh1740\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ALL_STRINGS_UNICODE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This flag indicates that all applicable char strings such as targetObject, secretID etc., are already in Unicode and the API does not need to perform conversion from local code page to Unicode. This flag instructs the API not to convert the return char str
+ings to local code page as well. This is a feature of SSO client v1.1 and does not work on the older versions.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_ENHANCEDPROTECTION_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced Protection indicator flag for Read and Write.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_EP_MASTER_PWORD_USED_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enables the user to supply the EP master password to unlock the SecretStore in place of the previous eDirectory password.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_REPAIR_THE_STORE_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Request all possible repairs on damaged store.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4355\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_SET_TREE_NAME_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Sets the tree name.}
+\cell\row\pard \trowd\trqr\trrh860\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4355\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_TRANS_DESTROY_CONTEXT_F}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Internally destroys the DS context passed in. This flag can be used on the last call to SecretStore to destroy the context that was used.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i epPasswords}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Specifies a list of Enhanced Protection Password s or the MasterPassword corresponding to the secrets in the list of secrets. When neither one of the passwords are present, the pointer can be NULL. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i readInfos}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Specifies the list of structures that returns the status information coming back from reading a secrets. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretIDs}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (IN) Points to a list of unique secret identifiers chosen by the application that should be supplied to locate the application secret values in the user's secrets, preferably in the Novell conventional format described earlier in this document. }
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs20\lang1033{\loch\f0\fs24\lang1033\i\b0\*\cs264\cf0\rtlch\ltrch\dbch\loch\f0\fs24\lang1033\i secretValues}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) Points to a list of populated secrets that will be returned..}
+\par \pard\plain \ltrpar\s217\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\keepn\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 ext}
+\par \pard\plain \ltrpar\s14\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2280\ri0\lin2280\rin0\fi0\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 (OUT) If present, points to a set of applicable future extensions for the secrets. }
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Return Values}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 These are common return values for this function (see {\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 \ldblquote Return Values\rdblquote on } for more information):}
+\par \trowd\trqr\trrh380\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4210\clbrdrt\brdrs\brdrw20\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Value}
+\cell\pard\plain \intbl\ltrpar\s202\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af3\afs16\lang255\ab\ltrch\dbch\af3\afs16\langfe255\ab\loch\f3\fs16\lang1033\b {\loch\f3\fs16\lang1033\i0\b Description}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_SUCCESS}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 The operation succeeded.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_SYSTEM_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some internal operation failed due to some failure such as memory allocation.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_CORRUPTED_STORE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 This indicates data corruption in SecretStore.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NICI_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 NICI failure detected.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_SECRET_ID}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Secret ID is not in the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 eDirectory denied access to an object or attribute related to the SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_STORE_NOT_FOUND}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client does not have a SecretStore or the Schema is not extended to begin with.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_PWORD_CHANGE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Admin has changed the user password and as a result the client\rquote s SecretStore is locked (non-repudiation).}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_NDS_INTERNAL_FAILURE}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Some eDirectory operation has failed internally.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INCOMPATIBLE_VERSION}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Client SecretStore is not compatible with server SecretStore.}
+\cell\row\pard \trowd\trqr\trrh640\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\cellx4210\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_INVALID_TARGET_OBJECT}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Target object is not the type designated for SecretStore attachment.}
+\cell\row\pard \trowd\trqr\trrh420\trpaddft3\trpaddt120\trpaddfl3\trpaddl80\trpaddfb3\trpaddb120\trpaddfr3\trpaddr80\clbrdrb\brdrs\brdrw20\brdrcf1\cellx4210\clbrdrb\brdrs\brdrw20\brdrcf1\cellx10080
+\pard\intbl\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 SSCS_E_EP_ACCESS_DENIED}
+\cell\pard\plain \intbl\ltrpar\s204\cf1\sl220\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb160\ql\rtlch\af3\afs18\lang255\ltrch\dbch\af3\afs18\langfe255\loch\f3\fs18\lang1033 {\loch\f3\fs18\lang1033\i0\b0 Enhanced Protection password validation failed.}
+\cell\row\pard \pard\plain \ltrpar\s49\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af0\afs20\lang255\ltrch\dbch\af0\afs20\langfe255\loch\f0\fs20\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b Remarks}
+\par \pard\plain \ltrpar\s15\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb160\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033 {\loch\f0\fs21\lang1033\i0\b0 This SecretStore call accesses the service on behalf of a logged in and authenticated user. It returns the list of all secrets from SecretStore. }
+\par \pard\plain \ltrpar\s160\cf1\sl200\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li1920\ri0\lin1920\rin0\fi0\sb120\ql\rtlch\af3\afs16\lang255\ltrch\dbch\af3\afs16\langfe255\loch\f3\fs16\lang1033
+\par \pard\plain \ltrpar\s188\cf1\sl300\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\sb420\sa120\keepn\ql\rtlch\af3\afs26\lang255\ab\ltrch\dbch\af3\afs26\langfe255\ab\loch\f3\fs26\lang1033\b {\loch\f3\fs26\lang1033\i0\b See Also}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 sscs_TransReadSecret,}
+\par \pard\plain \ltrpar\s141\cf1\sl240\slmult0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li2160\ri0\lin2160\rin0\fi-240\sb120\ql\rtlch\af0\afs21\lang255\ltrch\dbch\af0\afs21\langfe255\loch\f0\fs21\lang1033{\loch\f0\fs24\lang1033\i0\b0\*\cs300\cf2\rtlch\ltrch\dbch\loch\f0\fs24\lang1033 sscs_TransWriteSecretStore{\fs24 }}
+\par }
\ No newline at end of file
diff --git a/c_gui/CASAManager.csproj b/c_gui/CASAManager.csproj
new file mode 100644
index 00000000..229b03bd
--- /dev/null
+++ b/c_gui/CASAManager.csproj
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_gui/CASAManager.csproj.user b/c_gui/CASAManager.csproj.user
new file mode 100644
index 00000000..53b5d76a
--- /dev/null
+++ b/c_gui/CASAManager.csproj.user
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_gui/CASAManager.sh b/c_gui/CASAManager.sh
new file mode 100644
index 00000000..7b58478d
--- /dev/null
+++ b/c_gui/CASAManager.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+mono /opt/novell/CASA/bin/CASAManager.exe &
diff --git a/c_gui/CasaMain.cs b/c_gui/CasaMain.cs
new file mode 100644
index 00000000..72213b45
--- /dev/null
+++ b/c_gui/CasaMain.cs
@@ -0,0 +1,1068 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : CasaMain.cs
+/// DESCRIPTION : The main class for CASA application.
+/// AUTHORS : Jim Norman, CSL.Manojna
+/// UPDATED ON : 26 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+using System;
+using System.IO;
+using System.Diagnostics;
+using Gtk;
+using Glade;
+using Novell.CASA;
+using Novell.CASA.MiCasa.Common;
+using Novell.CASA.MiCasa.Communication;
+
+
+public class CasaMain
+{
+
+
+ public MiCasa objMiCasa = null;
+ public Firefox objFirefox = null;
+ public Mozilla objMozilla = null;
+ public KdeWallet objKdeWallet = null;
+ public GnomeKeyring objGnomeKeyring = null;
+
+ public static Glade.XML gxml;
+
+ int loginPromptCount = 3;
+
+ #region Glade Widgets
+
+ [Glade.Widget]
+ Gtk.Window windowMain;
+
+ [Glade.Widget]
+ Gtk.Notebook notebookStores;
+
+ [Glade.Widget]
+ Gtk.Dialog dialogPersistentStorage,
+ dialogPreferences,
+ dialogAbout,
+ dialogLogin,
+ dialogLoginContinue,
+ dialogConfirmRefresh,
+ dialogSingleInstance,
+ dialogLoginReprompt;
+
+ [Glade.Widget]
+ Gtk.Entry entryMasterPassword1,
+ entryMasterPassword2,
+ entryMasterPassword3,
+ entryMasterPassword4;
+
+ [Glade.Widget]
+ Gtk.CheckButton checkbuttonFirefox,
+ checkbuttonMozilla,
+ checkbuttonGnomeKeyring,
+ checkbuttonKdeWallet;
+
+ [Glade.Widget]
+ Gtk.Label label88,
+ labelLoginContinue1,
+ labelLoginContinue2;
+
+ [Glade.Widget]
+ Gtk.Button okbuttonPersistentStorage;
+
+ [Glade.Widget]
+ Gtk.MenuItem mmiNew,
+ mmiNewKey,
+ mmiView,
+ mmiLink,
+ mmiCopy,
+ mmiDelete,
+ mmiRefresh,
+ mmiLockSecrets,
+ mmiUnlockSecrets,
+ mmiDestroySecrets,
+ mmiEdit,
+ mmiOptions,
+ mmiDebug;
+
+ #endregion
+
+
+
+ ///#######################################################################
+ /// MAIN
+
+ ///
+ /// The main entry point for the CASA application.
+ ///
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ Logger.DbgLog("GUI:CasaMain.Main() - BEGIN");
+
+ Common.ReadPlatform();
+
+ Application.Init();
+
+ new CasaMain(args);
+
+ Application.Run();
+
+ Logger.DbgLog("GUI:CasaMain.Main() - END");
+ }
+
+
+ ///#######################################################################
+ /// CONSTRUCTOR
+
+ ///
+ /// CasaMain constructor funtion.
+ ///
+ public CasaMain(string[] args)
+ {
+ Logger.DbgLog("GUI:CasaMain.CasaMain() - BEGIN");
+
+ if( false == Common.CheckForSingleInstance() )
+ {
+ MasterPasswordAuthentication();
+ }
+ else
+ {
+ Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogSingleInstance", null);
+ gxmlTemp.Autoconnect(this);
+ }
+
+ Logger.DbgLog("GUI:CasaMain.CasaMain() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// INITIALIZE MAIN GUI
+
+ ///
+ /// Main GUI initializing routine. This routine builds the Main window of CASA.
+ ///
+ public void InitializeGUI()
+ {
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - BEGIN");
+
+ gxml = new Glade.XML(Common.GladeFile, "windowMain", null);
+ gxml.Autoconnect(this);
+ windowMain.DeleteEvent += new DeleteEventHandler(OnWindowMainDeleted);
+
+ /// PLATFORM SPECIFIC GUI CHANGES
+ //ConfigureGUI();
+
+ /// POLICY INIT
+ StorePolicyInterface.Init();
+
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - miCASA policy = " + Common.IS_MICASA);
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - Firefox policy = " + Common.IS_FIREFOX);
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - Mozilla policy = " + Common.IS_MOZILLA);
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - KdeWallet policy = " + Common.IS_KDEWALLET);
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - GNOME Keyring policy = " + Common.IS_GNOMEKEYRING);
+
+ /// STOREDATA INIT
+ StoreDataInterface.Init();
+
+ if( Common.IS_MICASA )
+ {
+ Logger.DbgLog("GUI:CasaMain.new MiCasa().");
+ objMiCasa = new MiCasa();
+ }
+ else
+ (notebookStores.GetNthPage(Common.STORE_MICASA)).Visible = Common.IS_MICASA;
+
+ if( Common.IS_FIREFOX )
+ {
+ Logger.DbgLog("GUI:CasaMain.new Firefox().");
+ objFirefox = new Firefox();
+ }
+ else
+ (notebookStores.GetNthPage(Common.STORE_FIREFOX)).Visible = Common.IS_FIREFOX;
+
+ if( Common.IS_MOZILLA )
+ {
+ Logger.DbgLog("GUI:CasaMain.new Mozilla().");
+ objMozilla = new Mozilla();
+ }
+ else
+ (notebookStores.GetNthPage(Common.STORE_MOZILLA)).Visible = Common.IS_MOZILLA;
+
+ if( Common.IS_KDEWALLET )
+ {
+ Logger.DbgLog("GUI:CasaMain.new KdeWallet().");
+ objKdeWallet = new KdeWallet();
+ }
+ else
+ (notebookStores.GetNthPage(Common.STORE_KDEWALLET)).Visible = Common.IS_KDEWALLET;
+
+ if( Common.IS_GNOMEKEYRING )
+ {
+ Logger.DbgLog("GUI:CasaMain.new GnomeKeyring().");
+ objGnomeKeyring = new GnomeKeyring();
+ }
+ else
+ (notebookStores.GetNthPage(Common.STORE_GNOMEKEYRING)).Visible = Common.IS_GNOMEKEYRING;
+
+ notebookStores.CurrentPage = Common.STORE_MICASA;
+ windowMain.Show();
+
+ Logger.DbgLog("GUI:CasaMain.InitializeGUI() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// MASTER PASSWORD AUTHENTICATION
+
+ ///
+ /// This routine implements the MasterPassword authentication.
+ ///
+ public void MasterPasswordAuthentication()
+ {
+ Logger.DbgLog("GUI:CasaMain.Login() - BEGIN");
+
+ if( true == IsMasterPasswordSet() )
+ {
+ Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned true");
+
+ if( false == miCASA.IsSecretPersistent(1,"") )
+ {
+ Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned false");
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null);
+ gxmlTemp.Autoconnect (this);
+ dialogLogin.TransientFor = windowMain;
+ entryMasterPassword3.Text="";
+ label88.Hide();
+ entryMasterPassword4.Hide();
+ }
+ else
+ {
+ Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned true");
+ InitializeGUI();
+ }
+ }
+ else
+ {
+ Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned false");
+
+ Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogLogin", null);
+ gxmlTemp.Autoconnect(this);
+ entryMasterPassword3.Text="";
+ entryMasterPassword4.Text="";
+ }
+
+ Logger.DbgLog("GUI:CasaMain.Login() - END");
+ }
+
+
+
+ public void okbuttonLogin_clicked(object abj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.okbuttonLogin_clicked() - BEGIN");
+
+ if( true == entryMasterPassword4.Visible )
+ {
+ if(entryMasterPassword3.Text != "" && (entryMasterPassword3.Text == entryMasterPassword4.Text))
+ {
+ miCASA.SetMasterPassword(0, entryMasterPassword3.Text);
+ dialogLogin.Destroy();
+ MiCasaRequestReply.Send(MiCasaRequestReply.VERB_UNLOCK_STORE, entryMasterPassword3.Text);
+ InitializeGUI();
+ }
+ else
+ {
+ entryMasterPassword3.Text="";
+ entryMasterPassword4.Text="";
+ entryMasterPassword3.HasFocus=true;
+ }
+ }
+ else
+ {
+ if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text) )
+ {
+ dialogLogin.Destroy();
+ MiCasaRequestReply.Send(MiCasaRequestReply.VERB_UNLOCK_STORE, entryMasterPassword3.Text);
+ InitializeGUI();
+ }
+ else
+ {
+ Logger.DbgLog("GUI:CasaMain.okbuttonLogin_clicked() - MasterPassword verification failed.");
+ //dialogLogin.Destroy();
+ //LoginContinue("Master Password verfication failed", "The store will not be persistent");
+ loginPromptCount--;
+ dialogLogin.Hide();
+
+ if( loginPromptCount > 0 )
+ {
+ dialogLogin.Show();
+ entryMasterPassword3.Text="";
+ }
+ else
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLoginReprompt", null);
+ gxmlTemp.Autoconnect (this);
+ }
+ }
+ }
+
+ Logger.DbgLog("GUI:CasaMain.okbuttonLogin_clicked() - END");
+ }
+
+ internal void on_buttonRetryRepropmt_clicked(object obj, EventArgs args)
+ {
+ dialogLoginReprompt.Destroy();
+ dialogLogin.Show();
+ entryMasterPassword3.Text="";
+ loginPromptCount = 3;
+ }
+
+ internal void on_buttonCloseReprompt_clicked(object obj, EventArgs args)
+ {
+ dialogLoginReprompt.Destroy();
+ dialogLogin.Destroy();
+ Application.Quit();
+ }
+
+ public void closebuttonLogin_clicked(object abj, EventArgs args)
+ {
+ dialogLogin.Destroy();
+ Application.Quit();
+ }
+
+
+ public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.OnDialogLoginDeleted() - BEGIN");
+
+ Gtk.Application.Quit();
+ args.RetVal = true;
+
+ Logger.DbgLog("GUI:CasaMain.OnDialogLoginDeleted() - END");
+ }
+
+ public void on_entryMasterPassword3_activate(object obj, EventArgs args)
+ {
+ if( true == entryMasterPassword4.Visible )
+ entryMasterPassword4.HasFocus = true;
+ else if( "" != entryMasterPassword3.Text )
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ public void on_entryMasterPassword4_activate(object obj, EventArgs args)
+ {
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ public bool IsMasterPasswordSet()
+ {
+ Logger.DbgLog("GUI:CasaMain.IsMasterPasswordSet() - BEGIN");
+
+ string MICASA_PASSCODE_BY_MASTER_PASSWD_FILE = "/.miCASAPCByMPasswd";
+ string fileName = GetUserHomeDir() + MICASA_PASSCODE_BY_MASTER_PASSWD_FILE;
+
+ Logger.DbgLog("GUI:CasaMain.IsMasterPasswordSet() - END");
+ return (File.Exists(fileName));
+ }
+
+ private string GetUserHomeDir()
+ {
+ if (Common.IS_LINUX)
+ return Environment.GetEnvironmentVariable("HOME");
+ else
+ return Environment.GetEnvironmentVariable("USERPROFILE");
+
+ }
+
+ ///#######################################################################
+ /// LOGIN WARNING DIALOG
+
+ ///
+ /// Error dialog prompt for MasterPassword authentication
+ ///
+ public void LoginContinue(string LabelMain, string LabelTips)
+ {
+ Logger.DbgLog("GUI:CasaMain.LoginContinue() - BEGIN");
+
+ Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogLoginContinue", null);
+ gxmlTemp.Autoconnect(this);
+ dialogLoginContinue.TransientFor = windowMain;
+ labelLoginContinue1.LabelProp = LabelMain;
+ labelLoginContinue2.LabelProp = LabelTips;
+
+ Logger.DbgLog("GUI:CasaMain.LoginContinue() - END");
+ }
+
+ public void on_buttonLoginContinue_clicked(object abj, EventArgs args)
+ {
+ dialogLoginContinue.Destroy();
+ InitializeGUI();
+ }
+
+
+ ///#######################################################################
+ /// ON MAIN MENU ACTIVATED HANDLERS
+
+
+
+ internal void on_notebookStores_switch_page(object obj, SwitchPageArgs args)
+ {
+ switch(args.PageNum)
+ {
+ case Common.STORE_MICASA:
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ if( false == objKdeWallet.IS_STORE_AGGREGATED )
+ {
+ objKdeWallet.AggregateStore();
+ objKdeWallet.IS_STORE_AGGREGATED = true;
+ }
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ if( false == objGnomeKeyring.IS_STORE_AGGREGATED )
+ {
+ objGnomeKeyring.AggregateStore();
+ objGnomeKeyring.IS_STORE_AGGREGATED = true;
+ }
+ break;
+ }
+
+ }
+
+
+ ///
+ ///
+ ///
+ internal void FileMenuActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.FileMenuActivated() - BEGIN");
+
+ if (MiCASAStore.IsLocked())
+ {
+ LockGUI();
+ Logger.DbgLog("GUI:CasaMain.FileMenuActivated() Store is locked - END");
+ return;
+ }
+ else
+ {
+ mmiLockSecrets.Sensitive = true;
+ mmiUnlockSecrets.Sensitive = false;
+ mmiDestroySecrets.Sensitive = true;
+ notebookStores.Sensitive = true;
+ mmiRefresh.Sensitive = true;
+ mmiDebug.Sensitive = true;
+ mmiOptions.Sensitive = true;
+ mmiEdit.Sensitive = true;
+ }
+
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ if( 0 != objMiCasa.tvSecretIDMiCasa.Selection.CountSelectedRows() )
+ {
+ mmiNew.Sensitive = mmiNewKey.Sensitive = true;
+ }
+ else
+ {
+ mmiNew.Sensitive = true;
+ mmiNewKey.Sensitive = false;
+ }
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ if( 0 != objKdeWallet.tvSecretIDKdeWallet.Selection.CountSelectedRows() )
+ {
+ mmiNew.Sensitive = false;
+ }
+ else
+ {
+ mmiNew.Sensitive = false;
+ }
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ if( 0 != objGnomeKeyring.tvSecretIDGnomeKeyring.Selection.CountSelectedRows() )
+ {
+ mmiNew.Sensitive = false;
+ }
+ else
+ {
+ mmiNew.Sensitive = false;
+ }
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.FileMenuActivated() - END");
+ }
+
+
+
+ ///
+ ///
+ ///
+ internal void EditMenuActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.EditMenuActivated() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ if( 0 != objMiCasa.tvSecretIDMiCasa.Selection.CountSelectedRows() )
+ {
+ mmiView.Sensitive = mmiDelete.Sensitive = true;
+ mmiCopy.Sensitive = false;
+ }
+ else
+ {
+ mmiView.Sensitive = mmiLink.Sensitive = mmiCopy.Sensitive = mmiDelete.Sensitive = false;
+ }
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ if( 0 != objKdeWallet.tvSecretIDKdeWallet.Selection.CountSelectedRows() )
+ {
+ mmiView.Sensitive = true;
+ mmiLink.Sensitive = mmiCopy.Sensitive = mmiDelete.Sensitive = false;
+ }
+ else
+ {
+ mmiView.Sensitive = mmiLink.Sensitive = mmiCopy.Sensitive = mmiDelete.Sensitive = false;
+ }
+ break;
+
+ case Common.STORE_GNOMEKEYRING: if( 0 != objGnomeKeyring.tvSecretIDGnomeKeyring.Selection.CountSelectedRows() )
+ {
+ mmiView.Sensitive = true;
+ mmiLink.Sensitive = mmiCopy.Sensitive = mmiDelete.Sensitive = false;
+ }
+ else
+ {
+ mmiView.Sensitive = mmiLink.Sensitive = mmiCopy.Sensitive = mmiDelete.Sensitive = false;
+ }
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.EditMenuActivated() - END");
+ }
+
+
+ ///#######################################################################
+ /// REFRESH ALL STORES
+
+ ///
+ ///
+ ///
+ public void RefreshAllStores(object obj, EventArgs args)
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogConfirmRefresh", null);
+ gxmlTemp.Autoconnect (this);
+ dialogConfirmRefresh.TransientFor = windowMain;
+ }
+
+ public void on_buttonRefreshYes_clicked(object abj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.on_buttonRefreshYes_clicked() - BEGIN");
+
+ if( Common.IS_MICASA )
+ objMiCasa.AggregateStore();
+
+ if( Common.IS_FIREFOX )
+ objFirefox.AggregateStore();
+
+ if( Common.IS_MOZILLA )
+ objMozilla.AggregateStore();
+
+ if( Common.IS_KDEWALLET )
+ objKdeWallet.AggregateStore();
+
+ if( Common.IS_GNOMEKEYRING )
+ objGnomeKeyring.AggregateStore();
+
+ dialogConfirmRefresh.Destroy();
+
+ Logger.DbgLog("GUI:CasaMain.on_buttonRefreshYes_clicked() - END");
+ }
+
+ public void on_buttonRefreshNo_clicked(object abj, EventArgs args)
+ {
+ dialogConfirmRefresh.Destroy();
+ }
+
+
+
+ ///#######################################################################
+ /// QUIT APPLICATION
+
+ ///
+ ///
+ ///
+ public void QuitApplication(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.QuitApplication() - BEGIN");
+
+ windowMain.Destroy();
+
+ Gtk.Application.Quit();
+
+ Logger.DbgLog("GUI:CasaMain.QuitApplication() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// ADD NEW SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewSecretActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.NewSecret() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ objMiCasa.OnNewSecretActivated(obj, args);
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.NewSecret() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// ADD NEW KEY
+
+ ///
+ ///
+ ///
+ public void OnNewKeyActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.NewKeyValue() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ objMiCasa.OnNewKeyActivated(obj, args);
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.NewKeyValue() - END");
+ }
+
+ public void OnLockMiCASASecrets(object sender, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.NewKeyValue() - START");
+ MiCasaRequestReply.Send(MiCasaRequestReply.VERB_LOCK_STORE);
+ LockGUI();
+ Logger.DbgLog("GUI:CasaMain.NewKeyValue() - END");
+ }
+
+ private void LockGUI()
+ {
+ mmiLockSecrets.Sensitive = false;
+ mmiUnlockSecrets.Sensitive = true;
+ mmiDestroySecrets.Sensitive = false;
+ notebookStores.Sensitive = false;
+ mmiNew.Sensitive = false;
+ mmiRefresh.Sensitive = false;
+ mmiDebug.Sensitive = false;
+ mmiOptions.Sensitive = false;
+ mmiEdit.Sensitive = false;
+ }
+
+
+ ///#######################################################################
+ /// VIEW KEY-VALUES
+
+ ///
+ /// VIEW Key-Values
+ ///
+ public void ViewKeyValue(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.ViewKeyValue() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ objMiCasa.ViewKeyValues();
+ break;
+
+ case Common.STORE_FIREFOX:
+ objFirefox.ViewKeyValues();
+ break;
+
+ case Common.STORE_MOZILLA:
+ objMozilla.ViewKeyValues();
+ break;
+
+ case Common.STORE_KDEWALLET:
+ objKdeWallet.ViewKeyValues();
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ objGnomeKeyring.ViewKeyValues();
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.ViewKeyValue() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// LINK KEY-VALUE
+
+ ///
+ /// LINK Key-Values
+ ///
+ public void LinkKeyValue(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.LinkKeyValue() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ objMiCasa.ViewKeyValues();
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.LinkKeyValue() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// COPY KEY-VALUE
+
+ ///
+ /// COPY Key-Values
+ ///
+ public void CopyKeyValue(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.CopyKeyValue() - BEGIN");
+
+ //Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogCopyKeyValue", null);
+ //gxmlTemp.Autoconnect (this);
+
+ Logger.DbgLog("GUI:CasaMain.CopyKeyValue() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// DELETE SECRET
+
+ ///
+ /// DELETE Secret
+ ///
+ public void DeleteSecret(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.DeleteSecret() - BEGIN");
+
+ switch(notebookStores.CurrentPage)
+ {
+ case Common.STORE_MICASA:
+ objMiCasa.OnDeleteActivated(obj, args);
+ break;
+
+ case Common.STORE_FIREFOX:
+ break;
+
+ case Common.STORE_MOZILLA:
+ break;
+
+ case Common.STORE_KDEWALLET:
+ break;
+
+ case Common.STORE_GNOMEKEYRING:
+ break;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.DeleteSecret() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// PERSISTENT STORAGE CALLED VIA MAIN MENU
+
+ ///
+ ///
+ ///
+ public void PersistentStorage(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.PersistentStorage() - BEGIN");
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogPersistentStorage", null);
+ gxmlTemp.Autoconnect (this);
+ dialogPersistentStorage.TransientFor = windowMain;
+ entryMasterPassword1.Text="";
+ entryMasterPassword2.Text="";
+
+ if(IsMasterPasswordSet() == true)
+ {
+ entryMasterPassword1.Sensitive=false;
+ entryMasterPassword2.Sensitive=false;
+ okbuttonPersistentStorage.Sensitive=false;
+ }
+
+ Logger.DbgLog("GUI:CasaMain.PersistentStorage() - END");
+ }
+
+ public void okbuttonPersistentStorage_clicked(object abj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.okbuttonPersistentStorage_clicked() - BEGIN");
+
+ if((entryMasterPassword1.Text != "" && entryMasterPassword2.Text != "") && (entryMasterPassword1.Text == entryMasterPassword2.Text))
+ {
+ //StorePolicyInterface.SetMasterPassword(entryMasterPassword1.Text);
+ miCASA.SetMasterPassword(0, entryMasterPassword1.Text);
+ dialogPersistentStorage.Destroy();
+ }
+
+ Logger.DbgLog("GUI:CasaMain.okbuttonPersistentStorage_clicked() - END");
+ }
+
+ public void cancelbuttonPersistentStorage_clicked(object abj, EventArgs args)
+ {
+ dialogPersistentStorage.Destroy();
+ }
+
+
+
+ ///#######################################################################
+ /// PREFERENCES
+
+ ///
+ ///
+ ///
+ public void Preferences(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.Preferences() - BEGIN");
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogPreferences", null);
+ gxmlTemp.Autoconnect (this);
+ dialogPreferences.TransientFor = windowMain;
+ checkbuttonFirefox.Active=Common.IS_FIREFOX;
+ checkbuttonMozilla.Active=Common.IS_MOZILLA;
+ checkbuttonGnomeKeyring.Active=Common.IS_GNOMEKEYRING;
+ checkbuttonKdeWallet.Active=Common.IS_KDEWALLET;
+
+ Logger.DbgLog("GUI:CasaMain.Preferences() - END");
+ }
+
+ public void okbuttonPreferences_clicked(object abj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.okbuttonPreferences_clicked() - BEGIN");
+
+ string[] storeID = new string[]{""};
+
+ notebookStores.GetNthPage(Common.STORE_FIREFOX).Visible = Common.IS_FIREFOX = checkbuttonFirefox.Active;
+ notebookStores.GetNthPage(Common.STORE_MOZILLA).Visible = Common.IS_MOZILLA = checkbuttonMozilla.Active;
+ notebookStores.GetNthPage(Common.STORE_GNOMEKEYRING).Visible = Common.IS_GNOMEKEYRING = checkbuttonGnomeKeyring.Active;
+ notebookStores.GetNthPage(Common.STORE_KDEWALLET).Visible = Common.IS_KDEWALLET = checkbuttonKdeWallet.Active;
+
+ StorePolicyInterface.SetAggregationPolicy(Common.STORE_FIREFOX, Common.IS_FIREFOX, storeID, 1);
+ StorePolicyInterface.SetAggregationPolicy(Common.STORE_MOZILLA, Common.IS_MOZILLA, storeID, 1);
+ StorePolicyInterface.SetAggregationPolicy(Common.STORE_KDEWALLET, Common.IS_KDEWALLET, storeID, 1);
+ StorePolicyInterface.SetAggregationPolicy(Common.STORE_GNOMEKEYRING, Common.IS_GNOMEKEYRING, storeID, 1);
+
+ StorePolicyInterface.SaveAggregationPolicy();
+
+
+ if(Common.IS_FIREFOX)
+ {
+ if( null == objFirefox )
+ objFirefox = new Firefox();
+
+ objFirefox.AggregateStore();
+ }
+ if(Common.IS_MOZILLA)
+ {
+ if( null == objMozilla )
+ objMozilla = new Mozilla();
+
+ objMozilla.AggregateStore();
+ }
+ if(Common.IS_KDEWALLET)
+ {
+ if( null == objKdeWallet )
+ objKdeWallet = new KdeWallet();
+
+ objKdeWallet.AggregateStore();
+ }
+ if(Common.IS_GNOMEKEYRING)
+ {
+ if( null == objGnomeKeyring )
+ objGnomeKeyring = new GnomeKeyring();
+
+ objGnomeKeyring.AggregateStore();
+ }
+
+
+ dialogPreferences.Destroy();
+
+ Logger.DbgLog("GUI:CasaMain.okbuttonPreferences_clicked() - END");
+ }
+
+ public void cancelbuttonPreferences_clicked(object abj, EventArgs args)
+ {
+ dialogPreferences.Destroy();
+ }
+
+
+ ///#######################################################################
+ /// DEBUG
+
+ ///
+ ///
+ ///
+ public void on_create_sample_secrets1_activate(object obj, EventArgs arg)
+ {
+ MiCasaRequestReply.Send(MiCasaRequestReply.VERB_CREATE_TEST_SECRETS, null, null, null, null);
+ //StoreDataInterface.RefreshAllStores();
+ objMiCasa.AggregateStore();
+ }
+
+ public void on_remove_test_secrets1_activate(object obj, EventArgs args)
+ {
+ MiCasaRequestReply.Send(MiCasaRequestReply.VERB_REMOVE_TEST_SECRETS, null, null, null, null);
+ //StoreDataInterface.RefreshAllStores();
+ objMiCasa.AggregateStore();
+ }
+
+ public void on_view_log_file1_activate(object obj, EventArgs args)
+ {
+
+ }
+
+ public void on_enable_logging1_activate(object obj, EventArgs args)
+ {
+
+ }
+
+ ///#######################################################################
+ /// ABOUT
+
+ ///
+ ///
+ ///
+ public void About(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.About() - BEGIN");
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogAbout", null);
+ gxmlTemp.Autoconnect (this);
+ dialogAbout.TransientFor = windowMain;
+ Logger.DbgLog("GUI:CasaMain.About() - END");
+ }
+
+ public void closebuttonAbout_clicked(object obj, EventArgs args)
+ {
+ dialogAbout.Destroy();
+ }
+
+
+ ///#######################################################################
+ /// SINGLE INSTANCE DIALOG CLOSE HANDLER
+
+ ///
+ /// dislogSingleInstance delete window handler
+ ///
+ public void on_dialogSingleInstance_delete_event(object obj, DeleteEventArgs args)
+ {
+ dialogSingleInstance.Destroy();
+ Application.Quit();
+ }
+
+ public void on_buttonSIClose_clicked(object obj, EventArgs args)
+ {
+ dialogSingleInstance.Destroy();
+ Application.Quit();
+ }
+
+ ///#######################################################################
+ /// WINDOW MAIN CLOSE HANDLER
+
+ ///
+ /// MainWindow delete window handler
+ ///
+ public void OnWindowMainDeleted(object obj, DeleteEventArgs args)
+ {
+ Logger.DbgLog("GUI:CasaMain.OnWindowMainDeleted() - BEGIN");
+
+ windowMain.Destroy();
+ Gtk.Application.Quit ();
+ args.RetVal = true;
+
+ Logger.DbgLog("GUI:CasaMain.OnWindowMainDeleted() - END");
+ }
+
+}
+}
+///###########################################################################
+/// END OF FILE
+///###########################################################################
diff --git a/c_gui/Common.cs b/c_gui/Common.cs
new file mode 100644
index 00000000..8354c76c
--- /dev/null
+++ b/c_gui/Common.cs
@@ -0,0 +1,237 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : Common.cs
+/// DESCRIPTION : Class for defining constants and common static
+/// methods.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 24 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+using System;
+using System.Text;
+using System.Diagnostics;
+using System.IO;
+using System.Threading;
+using Gtk;
+using Glade;
+
+
+public class Common
+{
+
+ public const int STORE_MICASA = 0,
+ STORE_FIREFOX = 1,
+ STORE_MOZILLA = 2,
+ STORE_KDEWALLET = 3,
+ STORE_GNOMEKEYRING = 4;
+
+ public static bool IS_MICASA = true,
+ IS_FIREFOX = false,
+ IS_MOZILLA = false,
+ IS_KDEWALLET = false,
+ IS_GNOMEKEYRING = false;
+
+ public static bool IS_LINUX = false,
+ IS_WINDOWS = false;
+
+ public static string GladeFile = null,
+ DebugLogFile = null;
+
+
+ ///##############################################################
+ /// SPI CONSTANTS
+ ///
+
+ public static int MAX_STORES = 10;
+
+ public static string STORENAME_MICASA = "miCASA",
+ STORENAME_FIREFOX = "Firefox",
+ STORENAME_MOZILLA = "Mozilla",
+ STORENAME_KDEWALLET = "KDE KWallet",
+ STORENAME_GNOMEKEYRING = "GNOME Keyring";
+
+
+ ///##############################################################
+ /// SDI CONSTANTS
+ ///
+
+ //Operations
+ public static int OPERATION_ADD_SECRET = 0,
+ OPERATION_ADD_KEY = 1,
+ OPERATION_MODIFY_KEY = 2,
+ OPERATION_DELETE_SECRET = 3,
+ OPERATION_DELETE_KEY = 4;
+
+ //Limits
+ public static int MAX_ARRAY_ELEMENTS = 10;
+ public static int MAX_NATIVE_ELEMENTS = 5;
+
+ public static string NATIVEINFO_FOLDERNAME = "Folder Name";
+ public static string NATIVEINFO_TYPEID = "Type of Secret";
+ public static string NATIVEINFO_SYNC = "Syncronization Status";
+ public static string NATIVEINFO_SYNCTYPE = "Syncronization Type";
+ public static string NATIVEINFO_MODIFIEDTIME = "Last Modified Time";
+
+ public static int INDEX_NATIVEINFO_FOLDERNAME = 0,
+ INDEX_NATIVEINFO_TYPEID = 1,
+ INDEX_NATIVEINFO_SYNC = 2,
+ INDEX_NATIVEINFO_SYNCTYPE = 3,
+ INDEX_NATIVEINFO_MODIFIEDTIME = 4;
+
+ ///##############################################################
+ /// ERROR CODES
+
+ public static int STATUS_SUCCESS = 0,
+ STATUS_FAILURE = 1,
+
+ // POLICY STATUS CODE RANGE: 2 - 20
+ STATUS_POLICY_COULDNOTBESAVED = 2,
+ STATUS_POLICY_POLICYNOTFOUND = 3,
+
+ // STORE STATUS CODE RANGE: 21 - 40
+ STATUS_STORE_INVALIDSTOREID = 21,
+ STATUS_STORE_DATANOTFOUNDINSTORE = 22,
+ STATUS_STORE_UNSUPPORTEDOPERATION = 23,
+ STATUS_STORE_ADINITFAILED = 24,
+ STATUS_STORE_AGGREGATEFAILED = 25,
+ STATUS_STORE_READFAILED = 26,
+ STATUS_STORE_UPDATEFAILED = 27;
+
+
+ ///##############################################################
+ /// STATIC ROUTINES
+
+ public static void ShowErrorDialog(Exception exp)
+ {
+ Console.WriteLine("CASA-EXCEPTION: " + exp.ToString());
+ }
+
+
+
+ public static void ShowErrorDialog(int errorCode)
+ {
+ Console.WriteLine("CASA-ERROR: " + errorCode);
+ }
+
+ ///#######################################################################
+ /// READ PLATFORM
+
+ ///
+ /// Routine to read the operating system of the target machine.
+ /// IS_LINUX, IS_WINDOWS flags are set.
+ /// Path to Glade file is set in this routine.
+ ///
+ public static void ReadPlatform()
+ {
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - BEGIN");
+
+ int platform = (int)Environment.OSVersion.Platform;
+
+ if ( (128 == platform) || (4 == platform) )
+ {
+ IS_LINUX = true;
+ GladeFile = "/opt/novell/CASA/images/casa-1.5.glade";
+ //GladeFile = "./images/casa-1.5.glade";
+
+ if( !File.Exists(GladeFile) )
+ {
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - ERROR: Glade file could not be found.");
+ //Gtk.Application.Quit();
+ Environment.Exit(-1);
+ }
+
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - IS_LINUX = " + IS_LINUX);
+ }
+ else
+ {
+ IS_WINDOWS = true;
+ //Common.GladeFile = Environment.GetEnvironmentVariable("HOMEDRIVE") + "\\Program Files\\Novell\\CASA\\images\\casa-1.5.glade";
+ GladeFile = "..\\images\\casa-1.5.glade";
+ if( !File.Exists(GladeFile) )
+ {
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - ERROR: Glade file could not be found.");
+ Environment.Exit(-1);
+ }
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - IS_WINDOWS = " + IS_WINDOWS);
+ }
+
+ Logger.DbgLog("GUI:CasaMain.SetGladeFilePath() - END");
+ }
+
+
+ ///#######################################################################
+ /// SINGLE INSTANCE CHECK
+
+ ///
+ /// MainWindow delete window handler
+ ///
+
+ public static bool CheckForSingleInstance()
+ {
+ bool bRet=false;;
+
+ if( true == IS_LINUX )
+ {
+ Process mgrProcess = null;
+ StreamReader sReader = null;
+
+ try
+ {
+ mgrProcess = new Process();
+ ProcessStartInfo mgrProcessStartInfo = new ProcessStartInfo("ps" );
+ mgrProcessStartInfo.Arguments = "h";
+ mgrProcessStartInfo.UseShellExecute = false;
+ mgrProcessStartInfo.RedirectStandardOutput = true;
+ mgrProcess.StartInfo = mgrProcessStartInfo;
+ mgrProcess.Start();
+ mgrProcess.WaitForExit();
+ sReader = mgrProcess.StandardOutput;
+ string str = sReader.ReadLine();
+ int num = 0;
+ while( str != null)
+ {
+ str = sReader.ReadLine();
+ if(str != null)
+ {
+ if(str.EndsWith("CASAManager.exe"))
+ {
+ num++;
+ }
+ }
+ }
+ if( num > 1 )
+ bRet = true;
+ else
+ bRet = false;
+ }
+ catch(Exception e)
+ {
+ Logger.DbgLog("GUI:CasaMain.CheckIfAnotherInstanceIsRunning() " + e.ToString());
+ bRet = false;
+ }
+
+ if(mgrProcess != null)
+ mgrProcess.Close();
+ if(sReader != null)
+ sReader.Close();
+ //return bRet;
+
+ }
+ else if( true == IS_WINDOWS )
+ {
+ bRet = false;
+ //return(false);
+ }
+ return bRet;
+ }
+
+}
+
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/Firefox.cs b/c_gui/Firefox.cs
new file mode 100644
index 00000000..f5da48da
--- /dev/null
+++ b/c_gui/Firefox.cs
@@ -0,0 +1,31 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : Firefox.cs
+/// DESCRIPTION : GUI implementation of Firefox store.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 26 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+using System;
+using Gtk;
+using Glade;
+
+public class Firefox : Store
+{
+ public override void AggregateStore()
+ {
+
+ }
+
+ public override void ViewKeyValues()
+ {
+
+ }
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/GnomeKeyring.cs b/c_gui/GnomeKeyring.cs
new file mode 100644
index 00000000..f9f1aaaa
--- /dev/null
+++ b/c_gui/GnomeKeyring.cs
@@ -0,0 +1,477 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : GnomeKeyring.cs
+/// DESCRIPTION : GUI implementation of GNOME-Keyring store.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 26 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+using System;
+using Gtk;
+using Glade;
+using Novell.CASA.MiCasa.Common;
+using Novell.CASA.MiCasa.Communication;
+
+
+public class GnomeKeyring : Store
+{
+
+ Gtk.TreeStore tsSecretIDGnomeKeyring,
+ tsNativeInfoGnomeKeyring,
+ tsKeyValue;
+
+ CellRendererText cellEditable;
+
+ public bool IS_STORE_AGGREGATED = false;
+
+ #region Glade Widgets
+
+ [Glade.Widget]
+ public Gtk.TreeView tvSecretIDGnomeKeyring;
+
+ [Glade.Widget]
+ Gtk.TreeView tvKeyValue,
+ tvNativeInfoGnomeKeyring;
+
+ [Glade.Widget]
+ Gtk.Dialog dialogManageSecret,
+ dialogLogin;
+
+ [Glade.Widget]
+ Gtk.Menu menuRightClick;
+
+ [Glade.Widget]
+ Gtk.Entry entrySecretID,
+ entryKey,
+ entryValue,
+ entryMasterPassword3,
+ entryMasterPassword4;
+
+ [Glade.Widget]
+ Gtk.CheckButton cbuttonShowPassword;
+
+ [Glade.Widget]
+ Gtk.Label label86,
+ label88;
+
+ [Glade.Widget]
+ Gtk.Button buttonNewAdd,
+ buttonNewRemove,
+ buttonManageOk;
+ [Glade.Widget]
+ Gtk.MenuItem cmiNew,
+ cmiDelete,
+ cmiView,
+ cmiLink,
+ cmiCopy;
+
+ #endregion
+
+
+
+ ///#######################################################################
+ /// CONSTRUCTOR
+
+ ///
+ ///
+ ///
+ public GnomeKeyring()
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.GnomeKeyring() - BEGIN");
+
+ /// SecretID TreeStore
+ tvSecretIDGnomeKeyring = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvSecretIDGnomeKeyring");
+ tsSecretIDGnomeKeyring = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[]));
+ tvSecretIDGnomeKeyring.AppendColumn("Secret-ID",new CellRendererText(),"text",0);
+ tvSecretIDGnomeKeyring.Model = tsSecretIDGnomeKeyring;
+ tvSecretIDGnomeKeyring.RowActivated += new RowActivatedHandler(OntvSecretIDGnomeKeyringRowActivated);
+ tvSecretIDGnomeKeyring.ButtonReleaseEvent += new ButtonReleaseEventHandler(OnRightClicked);
+ tvSecretIDGnomeKeyring.CursorChanged += new EventHandler(OnCursorChanged);
+ /// NativeInfo TreeStore
+ tvNativeInfoGnomeKeyring = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvNativeInfoGnomeKeyring");
+ tsNativeInfoGnomeKeyring = new TreeStore(typeof(string), typeof(string));
+ tvNativeInfoGnomeKeyring.AppendColumn("NativeKey",new CellRendererText(),"text",0);
+ tvNativeInfoGnomeKeyring.AppendColumn("NativeValue",new CellRendererText(),"text",1);
+ tvNativeInfoGnomeKeyring.Model = tsNativeInfoGnomeKeyring;
+ tvNativeInfoGnomeKeyring.ModifyBase(StateType.Normal,new Gdk.Color(0xff,0xff,0xe6));
+ /// Aggregate the store
+ //AggregateStore();
+
+ Logger.DbgLog("GUI:GnomeKeyring.GnomeKeyring() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// AGGREGATE STORE
+
+ ///
+ ///
+ ///
+ public override void AggregateStore()
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.AggregateStore() - BEGIN");
+
+ try
+ {
+ tsSecretIDGnomeKeyring.Clear();
+ StoreDataInterface.AggregateStore(Common.STORE_GNOMEKEYRING);
+ StoreDataInterface.ReadStore(Common.STORE_GNOMEKEYRING,ref tsSecretIDGnomeKeyring);
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.AggregateStore() - EXCEPTION" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:GnomeKeyring.AggregateStore() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// DISPLAY NATIVE INFO
+
+ ///
+ ///
+ ///
+ private void OnCursorChanged(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnCursorChanged() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ string[] NativeKeys = null,
+ NativeValues = null;
+
+ if( tvSecretIDGnomeKeyring.Selection.GetSelected (out model, out iter) )
+ selected = (string) model.GetValue(iter, 0);
+
+ if( (null != selected) && (selected.Length > 0) )
+ {
+ tsNativeInfoGnomeKeyring.Clear();
+ /// Populate NativeInfo
+ tsNativeInfoGnomeKeyring.AppendValues("Keyring Name","= "+ model.GetValue(iter,3));
+ NativeKeys = (string[]) model.GetValue(iter, 4);
+ NativeValues= (string[]) model.GetValue(iter, 5);
+ for( int i=0; i< NativeKeys.Length; i++ )
+ if( (NativeValues[i] != null) && (NativeValues[i] != "") )
+ tsNativeInfoGnomeKeyring.AppendValues(NativeKeys[i], "= "+NativeValues[i]);
+ tvNativeInfoGnomeKeyring.ShowAll();
+ }
+
+ Logger.DbgLog("GUI:GnomeKeyring.OnCursorChanged() - END");
+ }
+
+
+ ///#######################################################################
+ /// RIGHT-CLICK CONTEXT MENU
+
+ ///
+ ///
+ ///
+ public void OnRightClicked(object obj, ButtonReleaseEventArgs args)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - BEGIN");
+
+ if( 3 == args.Event.Button )
+ {
+ try
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - Context menu opened.");
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "menuRightClick", null);
+ gxmlTemp.Autoconnect (this);
+ menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
+ if( 0 != tvSecretIDGnomeKeyring.Selection.CountSelectedRows() )
+ cmiNew.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
+ else
+ cmiNew.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - EXCEPTION" + exp.ToString());
+ }
+ }
+
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - END");
+ }
+
+ ///#######################################################################
+ /// VIEW KEY-VALUES
+
+ ///
+ ///
+ ///
+ public override void ViewKeyValues()
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.ViewKeyValues() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected= null;
+ string[] keys = null,
+ values = null;
+ try
+ {
+ if( tvSecretIDGnomeKeyring.Selection.GetSelected (out model, out iter) )
+ {
+ selected = (string) model.GetValue(iter, 0);
+ keys = (string[]) model.GetValue(iter, 1);
+ values = (string[]) model.GetValue(iter, 2);
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogManageSecret", null);
+ gxmlTemp.Autoconnect (this);
+ dialogManageSecret.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain");
+ dialogManageSecret.Title = "VIEW";
+
+ cellEditable = new CellRendererText();
+ cellEditable.Editable = false;
+ //cellEditable.Edited += new EditedHandler(OnKeyValueEdited);
+ /// KEY:0 VALUE:1 VALUE-DUP:2 DIRTY-BIT:3
+ tsKeyValue = new TreeStore(typeof(string),typeof(string), typeof(string), typeof(bool));
+ tvKeyValue.AppendColumn("Key",new CellRendererText(),"text",0);
+ tvKeyValue.AppendColumn("Value",cellEditable,"text",2);
+
+ entrySecretID.Text=selected;
+ for( int i=0; i< keys.Length; i++ )
+ {
+ if( (null != keys[i]) && (null != values[i]) )
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false);
+
+ }
+ tvKeyValue.Model = tsKeyValue;
+ entryKey.Sensitive = entryValue.Sensitive = buttonNewAdd.Sensitive = buttonNewRemove.Sensitive = buttonManageOk.Sensitive = false;
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.ViewKeyValues() - EXCEPTION" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:GnomeKeyring.ViewKeyValues() - END");
+ }
+
+
+ ///
+ /// EDIT KEY-VALUE
+ ///
+ public void OnKeyValueEdited(object obj, EditedArgs args)
+ {
+
+ }
+
+ ///
+ /// ADD BUTTON CLICKED
+ ///
+ public void on_buttonNewAdd_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// REMOVE BUTTON CLICKED
+ ///
+ public void on_buttonNewRemove_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// SHOW PASSWORD CHECK BUTTON CLICKED
+ ///
+ public void on_cbuttonShowPassword_toggled(object obj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+ Console.WriteLine("Manojna........");
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+ if( true == cbuttonShowPassword.Active)
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null);
+ gxmlTemp.Autoconnect (this);
+ dialogLogin.TransientFor = dialogManageSecret;
+
+ label86.Text = "Enter your Master Password to view passwords";
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ label88.Hide();
+ entryMasterPassword4.Hide();
+ dialogLogin.Show();
+ }
+ else
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 2);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ }
+
+ }
+
+ public void okbuttonLogin_clicked(object abj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+
+ if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text) )
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 1);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ dialogLogin.Destroy();
+ }
+ else
+ {
+ // prompt user
+ MessageDialog md=new MessageDialog(dialogLogin,Gtk.DialogFlags.Modal,
+ Gtk.MessageType.Warning,
+ Gtk.ButtonsType.Ok,
+ "Master Password incorrect");
+
+ md.Response +=new ResponseHandler(md_Response2);
+ md.SetPosition(Gtk.WindowPosition.CenterOnParent);
+ md.Modal = true;
+ md.Show();
+ }
+ }
+
+ public void closebuttonLogin_clicked(object abj, EventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ }
+
+
+ public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ args.RetVal = true;
+ }
+
+ public void on_entryMasterPassword3_activate(object obj, EventArgs args)
+ {
+ if( "" != entryMasterPassword3.Text )
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ public void on_entryMasterPassword4_activate(object obj, EventArgs args)
+ {
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ private void md_Response2(object o, ResponseArgs args)
+ {
+ MessageDialog md = (MessageDialog)o;
+ if (md != null)
+ {
+ md.Destroy();
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ }
+ }
+
+ ///
+ /// MANAGE SECRET-ID DIALOG OK-BUTTON CLICKED
+ ///
+ public void on_buttonManageOk_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// MANAGE SECRET-ID DIALOG CANCEL-BUTTON CLICKED
+ ///
+ public void on_buttonManageCancel_clicked(object obj, EventArgs args)
+ {
+ tsKeyValue.Dispose();
+ dialogManageSecret.Destroy();
+ }
+
+ ///
+ /// SECRET-ID DOUBLE CLICKED
+ ///
+ private void OntvSecretIDGnomeKeyringRowActivated( object obj, RowActivatedArgs args )
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OntvSecretIDGnomeKeyringRowActivated() - ViewKeyValues() called.");
+ ViewKeyValues();
+ }
+
+
+ ///
+ /// VIEW KEY-VALUES CALLED VIA MAIN-MENU/CONTEXT-MENU
+ ///
+ public void OnViewActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:KdeWallet.OnViewActivated() - ViewKeyValues() called.");
+ ViewKeyValues();
+ }
+
+
+
+ ///#######################################################################
+ /// ADD NEW SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewSecretActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// ADD NEW KEY-VALUES TO EXISTING SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewKeyActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// LINK
+
+ ///
+ /// LINK Key-Values
+ ///
+ public void OnLinkActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// COPY
+
+ ///
+ /// COPY Key-Values
+ ///
+ public void OnCopyActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ // DELETE SECRET
+
+ ///
+ /// DELETE Secret
+ ///
+ public void OnDeleteActivated(object obj, EventArgs args)
+ {
+
+ }
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/KdeWallet.cs b/c_gui/KdeWallet.cs
new file mode 100644
index 00000000..85287ad8
--- /dev/null
+++ b/c_gui/KdeWallet.cs
@@ -0,0 +1,479 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : KdeWallet.cs
+/// DESCRIPTION : GUI implementation of KDE-Wallet store.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 26 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+using System;
+using Gtk;
+using Glade;
+using Novell.CASA.MiCasa.Common;
+using Novell.CASA.MiCasa.Communication;
+
+public class KdeWallet : Store
+{
+
+ Gtk.TreeStore tsSecretIDKdeWallet,
+ tsNativeInfoKdeWallet,
+ tsKeyValue;
+
+ CellRendererText cellEditable;
+
+ public bool IS_STORE_AGGREGATED = false;
+
+ #region Glade Widgets
+
+ [Glade.Widget]
+ public Gtk.TreeView tvSecretIDKdeWallet;
+
+ [Glade.Widget]
+ Gtk.TreeView tvKeyValue,
+ tvNativeInfoKdeWallet;
+
+ [Glade.Widget]
+ Gtk.Dialog dialogManageSecret,
+ dialogLogin;
+
+ [Glade.Widget]
+ Gtk.Menu menuRightClick;
+
+ [Glade.Widget]
+ Gtk.Entry entrySecretID,
+ entryKey,
+ entryValue,
+ entryMasterPassword3,
+ entryMasterPassword4;
+
+ [Glade.Widget]
+ Gtk.CheckButton cbuttonShowPassword;
+
+ [Glade.Widget]
+ Gtk.Label label86,
+ label88;
+
+ [Glade.Widget]
+ Gtk.Button buttonNewAdd,
+ buttonNewRemove,
+ buttonManageOk;
+
+ [Glade.Widget]
+ Gtk.MenuItem cmiNew,
+ cmiDelete,
+ cmiView,
+ cmiLink,
+ cmiCopy;
+
+ #endregion
+
+
+ ///#######################################################################
+ /// CONSTRUCTOR
+
+ ///
+ ///
+ ///
+ public KdeWallet()
+ {
+ Logger.DbgLog("GUI:KdeWallet.KdeWallet() - BEGIN");
+
+ /// SecretID TreeStore
+ tvSecretIDKdeWallet = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvSecretIDKdeWallet");
+ tsSecretIDKdeWallet = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[]));
+ tvSecretIDKdeWallet.AppendColumn("Secret-ID",new CellRendererText(),"text",0);
+ tvSecretIDKdeWallet.Model = tsSecretIDKdeWallet;
+ tvSecretIDKdeWallet.RowActivated += new RowActivatedHandler(OntvSecretIDKdeWalletRowActivated);
+ tvSecretIDKdeWallet.ButtonReleaseEvent += new ButtonReleaseEventHandler(OnRightClicked);
+ tvSecretIDKdeWallet.CursorChanged += new EventHandler(OnCursorChanged);
+ /// NativeInfo TreeStore
+ tvNativeInfoKdeWallet = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvNativeInfoKdeWallet");
+ tsNativeInfoKdeWallet = new TreeStore(typeof(string), typeof(string));
+ tvNativeInfoKdeWallet.AppendColumn("NativeKey",new CellRendererText(),"text",0);
+ tvNativeInfoKdeWallet.AppendColumn("NativeValue",new CellRendererText(),"text",1);
+ tvNativeInfoKdeWallet.Model = tsNativeInfoKdeWallet;
+ tvNativeInfoKdeWallet.ModifyBase(StateType.Normal,new Gdk.Color(0xff,0xff,0xe6));
+ /// Aggregate the store
+ //AggregateStore();
+
+ Logger.DbgLog("GUI:KdeWallet.KdeWallet() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// AGGREGATE STORE
+
+ ///
+ ///
+ ///
+ public override void AggregateStore()
+ {
+ Logger.DbgLog("GUI:KdeWallet.AggregateStore() - BEGIN");
+
+ try
+ {
+ tsSecretIDKdeWallet.Clear();
+ StoreDataInterface.AggregateStore(Common.STORE_KDEWALLET);
+ StoreDataInterface.ReadStore(Common.STORE_KDEWALLET,ref tsSecretIDKdeWallet);
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:KdeWallet.AggregateStore() - EXCEPTION" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:KdeWallet.AggregateStore() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// DISPLAY NATIVE INFO
+
+ ///
+ ///
+ ///
+ private void OnCursorChanged(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:KdeWallet.OnCursorChanged() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ string[] NativeKeys = null,
+ NativeValues = null;
+
+ if( tvSecretIDKdeWallet.Selection.GetSelected (out model, out iter) )
+ selected = (string) model.GetValue(iter, 0);
+
+ if( (null != selected) && (selected.Length > 0) )
+ {
+ tsNativeInfoKdeWallet.Clear();
+ /// Populate NativeInfo
+ tsNativeInfoKdeWallet.AppendValues("Wallet Name", "= "+model.GetValue(iter,3));
+ NativeKeys = (string[]) model.GetValue(iter, 4);
+ NativeValues = (string[]) model.GetValue(iter, 5);
+ for( int i=0; i< NativeKeys.Length; i++ )
+ if( (null != NativeValues[i]) && ("" != NativeValues[i]) )
+ tsNativeInfoKdeWallet.AppendValues(NativeKeys[i], "= "+NativeValues[i]);
+ tvNativeInfoKdeWallet.ShowAll();
+ }
+
+ Logger.DbgLog("GUI:KdeWallet.OnCursorChanged() - END");
+ }
+
+
+ ///#######################################################################
+ /// RIGHT-CLICK CONTEXT MENU
+
+ ///
+ ///
+ ///
+ public void OnRightClicked(object obj, ButtonReleaseEventArgs args)
+ {
+ Logger.DbgLog("GUI:KdeWallet.OnRightClicked() - BEGIN");
+
+ if( 3 == args.Event.Button )
+ {
+ try
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - Context menu opened.");
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "menuRightClick", null);
+ gxmlTemp.Autoconnect (this);
+ menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
+
+ if( 0 != tvSecretIDKdeWallet.Selection.CountSelectedRows() )
+ cmiNew.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
+ else
+ cmiNew.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - EXCEPTION" + exp.ToString());
+ }
+ }
+
+ Logger.DbgLog("GUI:KdeWallet.OnRightClicked() - END");
+ }
+
+
+ ///#######################################################################
+ /// VIEW KEY-VALUES
+
+ ///
+ ///
+ ///
+ public override void ViewKeyValues()
+ {
+ Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ string[] keys = null,
+ values = null;
+
+ try
+ {
+ if( tvSecretIDKdeWallet.Selection.GetSelected (out model, out iter) )
+ {
+ selected = (string) model.GetValue(iter, 0);
+ keys = (string[]) model.GetValue(iter, 1);
+ values = (string[]) model.GetValue(iter, 2);
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogManageSecret", null);
+ gxmlTemp.Autoconnect (this);
+ dialogManageSecret.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain");
+ dialogManageSecret.Title = "VIEW";
+
+ cellEditable = new CellRendererText();
+ cellEditable.Editable = false;
+ //cellEditable.Edited += new EditedHandler(OnKeyValueEdited);
+ /// KEY:0 VALUE:1 VALUE-DUP:2 DIRTY-BIT:3
+ tsKeyValue = new TreeStore(typeof(string),typeof(string), typeof(string), typeof(bool));
+ tvKeyValue.AppendColumn("Key",new CellRendererText(),"text",0);
+ tvKeyValue.AppendColumn("Value",cellEditable,"text",2);
+
+ entrySecretID.Text = selected;
+ for( int i=0; i< keys.Length; i++ )
+ {
+ if( (null != keys[i]) && (null != values[i]) )
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false);
+ }
+ tvKeyValue.Model = tsKeyValue;
+ entryKey.Sensitive = entryValue.Sensitive = buttonNewAdd.Sensitive = buttonNewRemove.Sensitive = buttonManageOk.Sensitive = false;
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - EXCEPTION" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - END");
+ }
+
+
+ ///
+ /// EDIT KEY-VALUE
+ ///
+ public void OnKeyValueEdited(object obj, EditedArgs args)
+ {
+
+ }
+
+ ///
+ /// ADD BUTTON CLICKED
+ ///
+ public void on_buttonNewAdd_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// REMOVE BUTTON CLICKED
+ ///
+ public void on_buttonNewRemove_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// SHOW PASSWORD CHECK BUTTON CLICKED
+ ///
+ public void on_cbuttonShowPassword_toggled(object obj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+ if( true == cbuttonShowPassword.Active)
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null);
+ gxmlTemp.Autoconnect (this);
+ dialogLogin.TransientFor = dialogManageSecret;
+
+ label86.Text = "Enter your Master Password to view passwords";
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ label88.Hide();
+ entryMasterPassword4.Hide();
+ dialogLogin.Show();
+ }
+ else
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 2);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ }
+
+ }
+
+ public void okbuttonLogin_clicked(object abj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+
+ if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text) )
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 1);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ dialogLogin.Destroy();
+ }
+ else
+ {
+ // prompt user
+ MessageDialog md=new MessageDialog(dialogLogin,Gtk.DialogFlags.Modal,
+ Gtk.MessageType.Warning,
+ Gtk.ButtonsType.Ok,
+ "Master Password incorrect");
+
+ md.Response +=new ResponseHandler(md_Response2);
+ md.SetPosition(Gtk.WindowPosition.CenterOnParent);
+ md.Modal = true;
+ md.Show();
+ }
+ }
+
+ public void closebuttonLogin_clicked(object abj, EventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ }
+
+
+ public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ args.RetVal = true;
+ }
+
+ public void on_entryMasterPassword3_activate(object obj, EventArgs args)
+ {
+ if( "" != entryMasterPassword3.Text )
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ public void on_entryMasterPassword4_activate(object obj, EventArgs args)
+ {
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ private void md_Response2(object o, ResponseArgs args)
+ {
+ MessageDialog md = (MessageDialog)o;
+ if (md != null)
+ {
+ md.Destroy();
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ }
+ }
+ ///
+ /// MANAGE SECRET-ID DIALOG OK-BUTTON CLICKED
+ ///
+ public void on_buttonManageOk_clicked(object obj, EventArgs args)
+ {
+
+ }
+
+ ///
+ /// MANAGE SECRET-ID DIALOG CANCEL-BUTTON CLICKED
+ ///
+ public void on_buttonManageCancel_clicked(object obj, EventArgs args)
+ {
+ tsKeyValue.Dispose();
+ dialogManageSecret.Destroy();
+ }
+
+ ///
+ /// SECRET-ID DOUBLE CLICKED
+ ///
+ private void OntvSecretIDKdeWalletRowActivated( object obj, RowActivatedArgs args )
+ {
+ Logger.DbgLog("GUI:KdeWallet.OntvSecretIDKdeWalletRowActivated() - SecretID double clicked.");
+ ViewKeyValues();
+ }
+
+
+ ///
+ /// VIEW KEY-VALUES CALLED VIA MAIN-MENU/CONTEXT-MENU
+ ///
+ public void OnViewActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:KdeWallet.OnViewActivated() - ViewKeyValues() called.");
+ ViewKeyValues();
+ }
+
+
+
+
+
+
+ ///#######################################################################
+ /// ADD NEW SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewSecretActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// ADD NEW KEY-VALUES TO EXISTING SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewKeyActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// LINK
+
+ ///
+ /// LINK Key-Values
+ ///
+ public void OnLinkActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ /// COPY
+
+ ///
+ /// COPY Key-Values
+ ///
+ public void OnCopyActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+ ///#######################################################################
+ // DELETE SECRET
+
+ ///
+ /// DELETE Secret
+ ///
+ public void OnDeleteActivated(object obj, EventArgs args)
+ {
+
+ }
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/Logger.cs b/c_gui/Logger.cs
new file mode 100644
index 00000000..477c4eaa
--- /dev/null
+++ b/c_gui/Logger.cs
@@ -0,0 +1,106 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : Logger.cs
+/// DESCRIPTION : Debug Log implementation Class.
+/// AUTHORS :
+/// CREATED ON :
+/// UPDATED ON :
+///#################################################################
+
+
+namespace Novell.CASA.GUI
+{
+ using System;
+ using System.Text;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Threading;
+
+ class Logger
+ {
+ private static string debugLog = null;
+ private static Stream debugStream= null;
+ private static Mutex dbgmutex = new Mutex();
+
+
+ static Logger()
+ {
+#if DEBUG
+ debugLog = GetHomeDir() + "/.CASAManager.logs";
+
+ // Set up for Debug
+
+ if( File.Exists( debugLog ) )
+ {
+ File.Delete( debugLog );
+ }
+
+ debugStream = File.Create(debugLog);
+
+ Debug.Listeners.Add(new TextWriterTraceListener(debugStream));
+ Debug.AutoFlush = true;
+ Debug.Indent();
+ Debug.WriteLine("Debug Log created");
+#endif
+ }
+
+
+ public static void logbreak()
+ {
+ dbgmutex.WaitOne();
+ Debug.WriteLine(" ") ;
+ Debug.WriteLine("----------------------------------------------------") ;
+ Debug.WriteLine(" ") ;
+ dbgmutex.ReleaseMutex();
+
+ }
+
+
+ // The log format is Time stamp :Component name: Error description
+ public static void DbgLog(string message)
+ {
+#if DEBUG
+ dbgmutex.WaitOne();
+
+ Debug.Write(DateTime.Now.ToLongTimeString());
+ Debug.Write(" " + DateTime.Now.ToLongDateString());
+ Debug.Write(":");
+ Debug.WriteLine(message);
+
+ dbgmutex.ReleaseMutex();
+#endif
+ }
+
+ public static void ExpLog(string message)
+ {
+#if DEBUG
+ dbgmutex.WaitOne();
+
+ Debug.Write(DateTime.Now.ToLongTimeString());
+ Debug.Write(" " + DateTime.Now.ToLongDateString());
+ Debug.Write(": Exception encountered - ");
+ Debug.WriteLine(message);
+ Debug.WriteLine(" ") ;
+ StackTrace st = new StackTrace();
+ Debug.WriteLine(st.ToString());
+
+ dbgmutex.ReleaseMutex();
+#endif
+ }
+ static string GetHomeDir()
+ {
+ int platform = (int)Environment.OSVersion.Platform;
+
+ if ( (platform == 128) || ( platform == 4) )
+ {
+ return System.Environment.GetEnvironmentVariable("HOME");
+ }
+ else
+ {
+ return (System.Environment.GetEnvironmentVariable("HOMEDRIVE")) +
+ (System.Environment.GetEnvironmentVariable("HOMEPATH"));
+ }
+ }
+
+ }
+}
diff --git a/c_gui/Makefile b/c_gui/Makefile
new file mode 100644
index 00000000..a97f8ee9
--- /dev/null
+++ b/c_gui/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = CASAManager
+CS_NAME = $(TARGET)$(xtra).$(EXE)
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+
+#
+# target object and source files
+#
+include src.$(PLAT)
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cs
diff --git a/c_gui/MiCasa.cs b/c_gui/MiCasa.cs
new file mode 100644
index 00000000..e782c644
--- /dev/null
+++ b/c_gui/MiCasa.cs
@@ -0,0 +1,1117 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : MiCasa.cs
+/// DESCRIPTION : GUI implementation of miCASA store.
+/// AUTHORS : Jim Norman, CSL.Manojna
+/// UPDATED ON : 26 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using Gtk;
+using Glade;
+using Novell.CASA.MiCasa.Common;
+using Novell.CASA.MiCasa.Communication;
+
+
+public class MiCasa : Store
+{
+ Gtk.TreeStore tsSecretIDMiCasa,
+ tsNativeInfoMiCasa,
+ tsKeyValue,
+ tsAvailableSecrets,
+ tsAvailableKeys,
+ tsLinkedKeys;
+
+ CellRendererText cellEditable;
+
+ ArrayList arrDeletedKeys = null;
+
+ private SecretStore m_store = null;
+
+ #region Glade Widgets
+
+ [Glade.Widget]
+ public Gtk.Window windowMain;
+
+ [Glade.Widget]
+ public Gtk.TreeView tvSecretIDMiCasa;
+
+ [Glade.Widget]
+ Gtk.TreeView tvNativeInfoMiCasa,
+ tvKeyValue,
+ tvAvailableSecrets,
+ tvAvailableKeys,
+ tvLinkedKeys;
+
+ [Glade.Widget]
+ Gtk.Dialog dialogNewSecret,
+ dialogManageSecret,
+ dialogConfirmDelete,
+ dialogLogin,
+ dialogLinkKeyValue;
+
+ [Glade.Widget]
+ Gtk.Menu menuRightClick;
+
+ [Glade.Widget]
+ Gtk.Entry entrySecretID,
+ entryKey,
+ entryValue,
+ entryDeleteSecretID,
+ entryLinkValue,
+ entryMasterPassword3,
+ entryMasterPassword4;
+
+ [Glade.Widget]
+ Gtk.CheckButton cbuttonShowPassword;
+
+ [Glade.Widget]
+ Gtk.MenuItem cmiNewKey,
+ cmiDelete,
+ cmiView,
+ cmiLink,
+ cmiCopy;
+
+ [Glade.Widget]
+ Gtk.Notebook notebook2;
+
+ [Glade.Widget]
+ Gtk.Label labelLinkSecretID,
+ labelLinkKeyID,
+ label86,
+ label88;
+ #endregion
+
+
+
+ ///#######################################################################
+ /// CONSTRUCTOR
+
+ ///
+ ///
+ ///
+ public MiCasa()
+ {
+ Logger.DbgLog("GUI:MiCasa.MiCasa() - BEGIN");
+
+ /// SecretID TreeStore
+ tvSecretIDMiCasa = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvSecretIDMiCasa");
+ tsSecretIDMiCasa = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[]));
+ tvSecretIDMiCasa.AppendColumn("Secret-ID",new CellRendererText(),"text",0);
+ tvSecretIDMiCasa.Model = tsSecretIDMiCasa;
+ tvSecretIDMiCasa.RowActivated += new RowActivatedHandler(OntvSecretIDMiCasaRowActivated);
+ tvSecretIDMiCasa.ButtonReleaseEvent += new ButtonReleaseEventHandler(OnRightClicked);
+ tvSecretIDMiCasa.CursorChanged += new EventHandler(OnCursorChanged);
+ /// NativeInfo TreeStore
+ tvNativeInfoMiCasa = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvNativeInfoMiCasa");
+ tsNativeInfoMiCasa = new TreeStore(typeof(string), typeof(string));
+ tvNativeInfoMiCasa.AppendColumn("NativeKey",new CellRendererText(),"text",0);
+ tvNativeInfoMiCasa.AppendColumn("NativeValue",new CellRendererText(),"text",1);
+ tvNativeInfoMiCasa.Model = tsNativeInfoMiCasa;
+ tvNativeInfoMiCasa.ModifyBase(StateType.Normal,new Gdk.Color(0xff,0xff,0xe6));
+ /// Aggregate the store
+ AggregateStore();
+
+ //TreeIter iterSecret;
+ //if( tsSecretIDMiCasa.GetIterFirst(out iterSecret) )
+ // tvSecretIDMiCasa.Selection.SelectIter(iterSecret);
+
+ Logger.DbgLog("GUI:MiCasa.MiCasa() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// AGGREGATE STORE
+
+ ///
+ ///
+ ///
+ public override void AggregateStore()
+ {
+ Logger.DbgLog("GUI:MiCasa.AggregateStore() - BEGIN");
+
+ try
+ {
+ tsSecretIDMiCasa.Clear();
+ StoreDataInterface.AggregateStore(Common.STORE_MICASA);
+ StoreDataInterface.ReadStore(Common.STORE_MICASA,ref tsSecretIDMiCasa);
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.AggregateStore() - EXCEPTION:" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:MiCasa.AggregateStore() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// DISPLAY NATIVE INFO
+
+ ///
+ /// For Native Information display.
+ ///
+ private void OnCursorChanged(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnCursorChanged() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ string[] NativeKeys = null,
+ NativeValues = null;
+
+ if( tvSecretIDMiCasa.Selection.GetSelected (out model, out iter) )
+ selected = (string) model.GetValue (iter, 0);
+
+ if( (null != selected) && (selected.Length > 0) )
+ {
+ tsNativeInfoMiCasa.Clear();
+ /// Populate NativeInfo
+ tsNativeInfoMiCasa.AppendValues("Keychain Name", "= "+model.GetValue(iter,3));
+ NativeKeys = (string[]) model.GetValue (iter, 4);
+ NativeValues = (string[]) model.GetValue (iter, 5);
+ for( int i=0; i< NativeKeys.Length; i++ )
+ if( (null != NativeValues[i]) && ("" != NativeValues[i]) )
+ tsNativeInfoMiCasa.AppendValues(NativeKeys[i], "= "+NativeValues[i]);
+ tvNativeInfoMiCasa.ShowAll();
+ }
+
+ Logger.DbgLog("GUI:MiCasa.OnCursorChanged() - END");
+ }
+
+ ///#######################################################################
+ /// RIGHT-CLICK CONTEXT MENU
+
+ ///
+ ///
+ ///
+ public void OnRightClicked(object obj, ButtonReleaseEventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnRightClicked() - BEGIN");
+
+ if( 3 == args.Event.Button )
+ {
+ try
+ {
+ Logger.DbgLog("GUI:MiCasa.OnRightClicked() - Context menu opened.");
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "menuRightClick", null);
+ gxmlTemp.Autoconnect (this);
+ menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
+
+ if( 0 != tvSecretIDMiCasa.Selection.CountSelectedRows() )
+ cmiCopy.Sensitive = false;
+ else
+ cmiNewKey.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnRightClicked() - EXCEPTION:" + exp.ToString());
+ }
+ }
+ Logger.DbgLog("GUI:MiCasa.OnRightClicked() - BEGIN");
+ }
+
+
+
+ ///#######################################################################
+ /// VIEW KEY-VALUES
+
+ ///
+ ///
+ ///
+ public override void ViewKeyValues()
+ {
+ Logger.DbgLog("GUI:MiCasa.dialogManageSecret() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ string[] keys = null,
+ values = null;
+
+ try
+ {
+ if( null == arrDeletedKeys )
+ arrDeletedKeys = new ArrayList();
+ else
+ arrDeletedKeys.Clear();
+
+ if( tvSecretIDMiCasa.Selection.GetSelected (out model, out iter) )
+ {
+ selected = (string) model.GetValue(iter, 0);
+ keys = (string[]) model.GetValue(iter, 1);
+ values = (string[]) model.GetValue(iter, 2);
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogManageSecret", null);
+ gxmlTemp.Autoconnect (this);
+ dialogManageSecret.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain");
+ dialogManageSecret.Title = "ADD / VIEW / EDIT / LINK";
+
+ cellEditable = new CellRendererText();
+ cellEditable.Editable = true;
+ cellEditable.Edited += new EditedHandler(OnKeyValueEdited);
+ /// KEY:0 VALUE:1 VALUE-DUP:2 DIRTY-BIT:3 LINK:4
+ tsKeyValue = new TreeStore(typeof(string),typeof(string), typeof(string), typeof(bool), typeof(string));
+ tvKeyValue.AppendColumn("Key",new CellRendererText(),"text",0);
+ tvKeyValue.AppendColumn("Value",cellEditable,"text",2);
+ tvKeyValue.AppendColumn("Linked", new CellRendererText(), "text", 4);
+ tvKeyValue.RowActivated += new RowActivatedHandler(tvKeyValue_RowActivated);
+
+ entrySecretID.Text = selected;
+
+ SecretStore ss = GetMiCasaStore();
+ bool bHasLinks = false;
+
+ for( int i=0; i< keys.Length; i++ )
+ {
+ Secret secret = ss.getSecret(selected);
+ Hashtable ht = secret.GetLinkedKeys(keys[i]);
+ if (ht != null && ht.Count > 0)
+ bHasLinks = true;
+ else
+ bHasLinks = false;
+
+ if( (null != keys[i]) && (null != values[i]) )
+ if( bHasLinks )
+ {
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false, "Yes");
+ }
+ else
+ {
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false, "No");
+
+ }
+ }
+
+
+
+ tvKeyValue.Model = tsKeyValue;
+ entryKey.HasFocus = true;
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.dialogManageSecret() - EXCEPTION:" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:MiCasa.dialogManageSecret() - END");
+ }
+
+
+ ///
+ /// EDIT KEY-VALUE
+ ///
+ public void OnKeyValueEdited(object obj, EditedArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnKeyValueEdited() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ object val;
+ string KeyName = null,
+ KeyValue = null;
+ string[] Keys = null,
+ Values = null;
+
+ try
+ {
+ tvKeyValue.Selection.GetSelected (out model, out iter);
+ val = tsKeyValue.GetValue(iter,0);
+ KeyName = val.ToString();
+ if( true == cbuttonShowPassword.Active )
+ val = tsKeyValue.GetValue(iter,1);
+ else
+ val = tsKeyValue.GetValue(iter,2);
+ KeyValue = val.ToString();
+
+ tvSecretIDMiCasa.Selection.GetSelected (out model, out iter);
+
+ if( false == entrySecretID.Editable )
+ {
+ if( ("" != args.NewText) && (KeyValue != args.NewText) )
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_MODIFY_KEY, KeyName, args.NewText, ref model, ref iter) )
+ {
+ Logger.DbgLog("GUI:MiCasa.OnKeyValueEdited() - StoreDataInterface.UpdateStore() succeeded");
+ tvKeyValue.Selection.GetSelected (out model, out iter);
+ tsKeyValue.SetValue(iter, 1, args.NewText);
+ tsKeyValue.SetValue(iter, 2, "********");
+
+ tvSecretIDMiCasa.Selection.GetSelected (out model, out iter);
+ Keys = (string[]) model.GetValue(iter, 1);
+ Values = (string[]) model.GetValue(iter, 2);
+ for( int i=0; i< Keys.Length; i++ )
+ {
+ if( Keys[i] == KeyName )
+ {
+ Values[i] = args.NewText;
+ tsSecretIDMiCasa.SetValue(iter, 2, Values);
+ break;
+ }
+ }
+ AggregateStore();
+ }
+ else
+ Logger.DbgLog("GUI:MiCasa.OnKeyValueEdited() - ERROR: STATUS_STORE_UPDATEFAILED");
+ }
+ else
+ {
+ tvKeyValue.Selection.GetSelected (out model, out iter);
+ tsKeyValue.SetValue(iter, 1, args.NewText);
+ tsKeyValue.SetValue(iter, 2, "********");
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnKeyValueEdited() - EXCEPTION:" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:MiCasa.OnKeyValueEdited() - END");
+ }
+
+ ///
+ /// ADD BUTTON CLICKED
+ ///
+ public void on_buttonNewAdd_clicked(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewAdd_clicked() - BEGIN");
+
+ if( ("" != entryKey.Text) && ("" != entryValue.Text) )
+ {
+ TreeIter iterKey;
+ ArrayList arrKeys = null,
+ arrValues = null;
+ object val = null;
+ arrKeys = new ArrayList();
+ arrValues = new ArrayList();
+
+ if(tsKeyValue.GetIterFirst(out iterKey))
+ {
+ do
+ {
+ val = tsKeyValue.GetValue(iterKey,0);
+ arrKeys.Add(val.ToString());
+ val = tsKeyValue.GetValue(iterKey,1);
+ arrValues.Add(val.ToString());
+ }
+ while( tsKeyValue.IterNext(ref iterKey) );
+ }
+ if( -1 == (arrKeys.IndexOf(entryKey.Text)) )
+ iterKey = tsKeyValue.AppendValues(entryKey.Text, entryValue.Text, "********", true, "No");
+
+ //tvKeyValue.Selection.SelectIter(iterKey);
+ entryKey.Text = entryValue.Text = "";
+ entryKey.HasFocus = true;
+ }
+
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewAdd_clicked() - END");
+ }
+
+
+ ///
+ /// REMOVE BUTTON CLICKED
+ ///
+ public void on_buttonNewRemove_clicked(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewRemove_clicked() - BEGIN");
+
+ TreeModel modelKey;
+ TreeIter iterKey;
+
+ if(tvKeyValue.Selection.GetSelected (out modelKey, out iterKey))
+ if( false == (bool)tsKeyValue.GetValue(iterKey,3) )
+ arrDeletedKeys.Add(tsKeyValue.GetValue(iterKey,0));
+
+ if( 0 != tvKeyValue.Selection.CountSelectedRows() )
+ {
+ TreeModel model;
+ TreeIter iter;
+
+ tvKeyValue.Selection.GetSelected (out model, out iter);
+ tsKeyValue.Remove(ref iter);
+ tvKeyValue.ColumnsAutosize();
+ }
+
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewRemove_clicked() - END");
+ }
+
+
+ ///
+ /// SHOW PASSWORD CHECK BUTTON CLICKED
+ ///
+ public void on_cbuttonShowPassword_toggled(object obj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+ if( true == cbuttonShowPassword.Active)
+ {
+ // prompt user for MasterPassword
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null);
+ gxmlTemp.Autoconnect (this);
+ dialogLogin.TransientFor = dialogManageSecret;
+
+ label86.Text = "Enter your Master Password to view passwords";
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ label88.Hide();
+ entryMasterPassword4.Hide();
+ dialogLogin.Show();
+ }
+ else
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 2);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ }
+
+ }
+
+ public void okbuttonLogin_clicked(object abj, EventArgs args)
+ {
+ TreeViewColumn tvCol;
+
+ if( tvKeyValue.Model.IterNChildren() > 0 )
+
+ if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text) )
+ {
+ tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1));
+ tvCol = new TreeViewColumn("Value", cellEditable, "text", 1);
+ tvKeyValue.InsertColumn(tvCol, 1);
+ dialogLogin.Destroy();
+ }
+ else
+ {
+ // prompt user
+ MessageDialog md=new MessageDialog(dialogLogin,Gtk.DialogFlags.Modal,
+ Gtk.MessageType.Warning,
+ Gtk.ButtonsType.Ok,
+ "Master Password incorrect");
+
+ md.Response +=new ResponseHandler(md_Response2);
+ md.SetPosition(Gtk.WindowPosition.CenterOnParent);
+ md.Modal = true;
+ md.Show();
+ }
+ }
+
+ public void closebuttonLogin_clicked(object abj, EventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ }
+
+
+ public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
+ {
+ cbuttonShowPassword.Active = false;
+ dialogLogin.Destroy();
+ args.RetVal = true;
+ }
+
+ public void on_entryMasterPassword3_activate(object obj, EventArgs args)
+ {
+ if( "" != entryMasterPassword3.Text )
+ okbuttonLogin_clicked(obj, args);
+ }
+
+ public void on_entryMasterPassword4_activate(object obj, EventArgs args)
+ {
+ okbuttonLogin_clicked(obj, args);
+ }
+
+
+ private void md_Response2(object o, ResponseArgs args)
+ {
+ MessageDialog md = (MessageDialog)o;
+ if (md != null)
+ {
+ md.Destroy();
+ entryMasterPassword3.Text="";
+ entryMasterPassword3.HasFocus = true;
+ }
+ }
+
+ ///
+ /// MANAGE SECRET-ID DIALOG OK-BUTTON CLICKED
+ ///
+ public void on_buttonManageOk_clicked(object obj, EventArgs args)
+ {
+ TreeModel modelSecret;
+ TreeIter iterSecret,
+ iterKey;
+ string NewKey = null,
+ NewValue = null;
+ string[] Keys = null,
+ Values = null,
+ strDeletedKeys = null;
+ bool dirtyBit = false;
+ ArrayList arrKeys = null,
+ arrValues = null;
+
+ try
+ {
+ if( (0 == tvKeyValue.Model.IterNChildren()) && tvSecretIDMiCasa.Selection.GetSelected (out modelSecret, out iterSecret) )
+ {
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_DELETE_SECRET, "", "", ref modelSecret, ref iterSecret) )
+ {
+ tsSecretIDMiCasa.Remove(ref iterSecret);
+ tvSecretIDMiCasa.ColumnsAutosize();
+ tsNativeInfoMiCasa.Clear();
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - DELETE_SECRET_SUCCEEDED");
+ }
+ else
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - DELETE_SECRET_FAILED");
+ AggregateStore();
+ }
+ else
+ {
+ if( (null != arrDeletedKeys) && (arrDeletedKeys.Count > 0) )
+ {
+ tvSecretIDMiCasa.Selection.GetSelected (out modelSecret, out iterSecret);
+ strDeletedKeys = (string[])arrDeletedKeys.ToArray(typeof(string));
+ for( int i=0; i < strDeletedKeys.Length; i++)
+ {
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_DELETE_KEY, strDeletedKeys[i], null, ref modelSecret, ref iterSecret) )
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - DELETE_KEY_SUCCEEDED.");
+ else
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - DELETE_KEY_FAILED.");
+ }
+ arrDeletedKeys.Clear();
+ AggregateStore();
+ }
+
+ if( tsKeyValue.GetIterFirst(out iterKey) && tvSecretIDMiCasa.Selection.GetSelected (out modelSecret, out iterSecret) )
+ {
+ do
+ {
+ NewKey = (string) tsKeyValue.GetValue(iterKey,0);
+ NewValue = (string) tsKeyValue.GetValue(iterKey,1);
+ dirtyBit = (bool) tsKeyValue.GetValue(iterKey,3);
+
+ if( true == dirtyBit )
+ {
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_ADD_KEY, NewKey, NewValue, ref modelSecret, ref iterSecret) )
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - ADD_KEY_VALUE_SUCCEEDED.");
+ else
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - ADD_KEY_VALUE_FAILED.");
+ }
+ }
+ while( tsKeyValue.IterNext(ref iterKey) );
+ AggregateStore();
+ }
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonManageOk_clicked() - EXCEPTION:" + exp.ToString());
+ }
+
+ tsKeyValue.Dispose();
+ dialogManageSecret.Destroy();
+ }
+
+ ///
+ /// MANAGE SECRET-ID DIALOG CANCEL-BUTTON CLICKED
+ ///
+ public void on_buttonManageCancel_clicked(object obj, EventArgs args)
+ {
+ tsKeyValue.Dispose();
+ arrDeletedKeys.Clear();
+ dialogManageSecret.Destroy();
+ }
+
+ ///
+ /// SECRET-ID DOUBLE CLICKED
+ ///
+ private void OntvSecretIDMiCasaRowActivated( object obj, RowActivatedArgs args )
+ {
+ Logger.DbgLog("GUI:MiCasa.OntvSecretIDMiCasaRowActivated() - SecretID doubled clicked.");
+ ViewKeyValues();
+ }
+
+ ///
+ /// VIEW KEY-VALUES CALLED VIA MAIN-MENU/CONTEXT-MENU
+ ///
+ public void OnViewActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnViewActivated() - ViewKeyValues() called.");
+ ViewKeyValues();
+ }
+
+ ///#######################################################################
+ /// ADD NEW SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewSecretActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnNewSecretActivated() - BEGIN");
+
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogNewSecret", null);
+ gxmlTemp.Autoconnect (this);
+ dialogNewSecret.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain");
+ dialogNewSecret.Title = "ADD NEW SECRET";
+
+ cellEditable = new CellRendererText();
+ cellEditable.Editable = true;
+ cellEditable.Edited += new EditedHandler(OnKeyValueEdited);
+ /// KEY:0 VALUE:1 VALUE-DUP:2 DIRTY-BIT:3 LINK:4
+ tsKeyValue = new TreeStore(typeof(string),typeof(string), typeof(string), typeof(bool), typeof(string));
+ tvKeyValue.AppendColumn("Key",new CellRendererText(),"text",0);
+ tvKeyValue.AppendColumn("Value",cellEditable,"text",2);
+ tvKeyValue.AppendColumn("Linked",new CellRendererText(),"text",4);
+ tvKeyValue.Model = tsKeyValue;
+ tsKeyValue.Clear();
+ entrySecretID.HasFocus = true;
+ entrySecretID.Text = "";
+
+ Logger.DbgLog("GUI:MiCasa.OnNewSecretActivated() - END");
+ }
+
+
+
+ ///#######################################################################
+ /// ADD NEW KEY-VALUES TO EXISTING SECRET
+
+ ///
+ ///
+ ///
+ public void OnNewKeyActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnNewKeyActivated() - BEGIN");
+
+ ViewKeyValues();
+
+ Logger.DbgLog("GUI:MiCasa.OnNewKeyActivated() - END");
+ }
+
+
+
+
+ public void on_buttonNewOk_clicked(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - BEGIN");
+
+ TreeModel modelSecret;
+ TreeIter iterSecret,
+ iterKey;
+ string NewKey = null,
+ NewValue = null;
+ string[] Keys = null,
+ Values = null,
+ NativeKeys = null,
+ NativeValues = null;
+ object val = null;
+ ArrayList arrKeys = null,
+ arrValues = null;
+
+ if( (true == entrySecretID.Editable) && ("" != entrySecretID.Text) && (tvKeyValue.Model.IterNChildren() > 0) )
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - Adding New Secrets and KeyValues.");
+
+ arrKeys = new ArrayList();
+ arrValues = new ArrayList();
+
+ try
+ {
+ if(tsKeyValue.GetIterFirst(out iterKey))
+ {
+ do
+ {
+ val = tsKeyValue.GetValue(iterKey,0);
+ NewKey = val.ToString();
+ val = tsKeyValue.GetValue(iterKey,1);
+ NewValue = val.ToString();
+
+ if( -1 == (arrKeys.IndexOf(NewKey)) )
+ {
+ arrKeys.Add(NewKey);
+ arrValues.Add(NewValue);
+ }
+ }
+ while( tsKeyValue.IterNext(ref iterKey) );
+
+ Keys = (string[])arrKeys.ToArray(typeof(string));
+ Values = (string[])arrValues.ToArray(typeof(string));
+ NativeKeys = new string[Common.MAX_NATIVE_ELEMENTS];
+ NativeValues = new string[Common.MAX_NATIVE_ELEMENTS];
+ NativeKeys[Common.INDEX_NATIVEINFO_FOLDERNAME] = Common.NATIVEINFO_FOLDERNAME;
+ NativeKeys[Common.INDEX_NATIVEINFO_TYPEID] = Common.NATIVEINFO_TYPEID;
+ NativeKeys[Common.INDEX_NATIVEINFO_SYNC] = Common.NATIVEINFO_SYNC;
+ NativeKeys[Common.INDEX_NATIVEINFO_SYNCTYPE] = Common.NATIVEINFO_SYNCTYPE;
+ NativeKeys[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = Common.NATIVEINFO_MODIFIEDTIME;
+ NativeValues[Common.INDEX_NATIVEINFO_FOLDERNAME] = null;
+ NativeValues[Common.INDEX_NATIVEINFO_TYPEID] = null;
+ NativeValues[Common.INDEX_NATIVEINFO_SYNC] = null;
+ NativeValues[Common.INDEX_NATIVEINFO_SYNCTYPE] = null;
+ NativeValues[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = null;
+
+ iterSecret = tsSecretIDMiCasa.AppendValues(entrySecretID.Text, Keys, Values, "Default", NativeKeys, NativeValues);
+ modelSecret = tvSecretIDMiCasa.Model;
+
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_ADD_SECRET, "", "", ref modelSecret, ref iterSecret) )
+ {
+ AggregateStore();
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - ADD_NEW_SECRET_SUCCEEDED.");
+ }
+ else
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - ERROR: ADD_NEW_SECRET_FAILED");
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - EXCEPTION:" + exp.ToString());
+ }
+ tsKeyValue.Dispose();
+ dialogNewSecret.Destroy();
+ }
+
+
+ Logger.DbgLog("GUI:MiCasa.on_buttonNewOk_clicked() - END");
+ }
+
+
+
+ public void on_buttonNewCancel_clicked(object obj, EventArgs args)
+ {
+ dialogNewSecret.Destroy();
+ }
+
+
+
+ ///#######################################################################
+ /// LINK
+
+ ///
+ /// LINK Key-Values
+ ///
+ public void OnLinkActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnLinkActivated() - ViewKeyValues() called.");
+ ViewKeyValues();
+ }
+
+
+
+ ///#######################################################################
+ /// COPY
+
+ ///
+ /// COPY Key-Values
+ ///
+ public void OnCopyActivated(object obj, EventArgs args)
+ {
+
+ }
+
+
+
+ ///#######################################################################
+ // DELETE SECRET
+
+ ///
+ /// DELETE Secret
+ ///
+ public void OnDeleteActivated(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.OnDeleteActivated() - BEGIN");
+
+ if( 0 != tvSecretIDMiCasa.Selection.CountSelectedRows() )
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogConfirmDelete", null);
+ gxmlTemp.Autoconnect (this);
+ dialogConfirmDelete.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain");
+ TreeModel model;
+ TreeIter iter;
+ string selected = null;
+ if( tvSecretIDMiCasa.Selection.GetSelected (out model, out iter) )
+ {
+ selected = (string) model.GetValue (iter, 0);
+ if( (null != selected) && (selected.Length > 0) )
+ entryDeleteSecretID.Text = selected;
+ }
+ }
+
+ Logger.DbgLog("GUI:MiCasa.OnDeleteActivated() - END");
+ }
+
+ public void on_buttonYes_clicked(object obj, EventArgs args)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonYes_clicked() - BEGIN");
+
+ TreeModel model;
+ TreeIter iter;
+ Console.WriteLine("Manojna........delete");
+ try
+ {
+ if( tvSecretIDMiCasa.Selection.GetSelected (out model, out iter) )
+ {
+ if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(Common.STORE_MICASA, Common.OPERATION_DELETE_SECRET, "", "", ref model, ref iter) )
+ {
+ tsSecretIDMiCasa.Remove(ref iter);
+ tvSecretIDMiCasa.ColumnsAutosize();
+ tsNativeInfoMiCasa.Clear();
+ dialogConfirmDelete.Destroy();
+ Logger.DbgLog("GUI:MiCasa.on_buttonYes_clicked() - DELETE_SECRET_SUCCEEDED");
+
+ }
+ else
+ Logger.DbgLog("GUI:MiCasa.on_buttonYes_clicked() - DELETE_SECRET_FAILED");
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:MiCasa.on_buttonYes_clicked() - EXCEPTION:" + exp.ToString());
+ }
+
+ Logger.DbgLog("GUI:MiCasa.on_buttonYes_clicked() - END");
+ }
+
+ public void on_buttonNo_clicked(object obj, EventArgs args)
+ {
+ dialogConfirmDelete.Destroy();
+ }
+
+ /// LINK
+
+ private void tvKeyValue_RowActivated(object o, RowActivatedArgs args)
+ {
+ TreeModel model;
+ TreeIter iter;
+ string selected=null;
+
+ if(tvKeyValue.Selection.GetSelected (out model, out iter))
+ {
+ selected=(string) model.GetValue (iter, 0);
+ if(selected != null && selected.Length > 0)
+ {
+ Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLinkKeyValue", null);
+ gxmlTemp.Autoconnect (this);
+
+ // show MICASA tab only
+ (notebook2.GetNthPage(Common.STORE_MICASA)).Visible = true;
+ (notebook2.GetNthPage(Common.STORE_FIREFOX)).Visible = false;
+ (notebook2.GetNthPage(Common.STORE_MOZILLA)).Visible = false;
+ (notebook2.GetNthPage(Common.STORE_KDEWALLET)).Visible = false;
+ (notebook2.GetNthPage(Common.STORE_GNOMEKEYRING)).Visible = false;
+
+ // show available secrets
+ tsAvailableSecrets=new TreeStore(typeof(string),typeof(string));
+ tvAvailableSecrets.AppendColumn("Secret-ID",new CellRendererText(),"text",0);
+ tvAvailableSecrets.Model=tsAvailableSecrets;
+ tvAvailableSecrets.ButtonReleaseEvent +=new ButtonReleaseEventHandler(tvAvailableSecrets_ButtonReleaseEvent);
+ // show secretIDs
+ SecretStore ss = GetMiCasaStore();
+ StringCollection sc = ss.enumerateSecretIDs();
+ StringEnumerator se = sc.GetEnumerator();
+ se.Reset();
+ while (se.MoveNext())
+ {
+ tsAvailableSecrets.AppendValues(se.Current);
+ }
+
+ // show available keys
+ tsAvailableKeys=new TreeStore(typeof(string), typeof(string));
+ tvAvailableKeys.AppendColumn("Key", new CellRendererText(), "text", 0);
+ //tvAvailableKeys.AppendColumn("Value", new CellRendererText(), "text", 1);
+ tvAvailableKeys.Model=tsAvailableKeys;
+ tvAvailableKeys.Show();
+
+
+ // populate current linked keys
+ tsLinkedKeys=new TreeStore(typeof(string), typeof(string));
+ tsLinkedKeys.SetSortColumnId(0, Gtk.SortType.Descending);
+
+ tvLinkedKeys.AppendColumn("Secret-ID", new CellRendererText(), "text", 0);
+ tvLinkedKeys.AppendColumn("Key", new CellRendererText(), "text", 1);
+ tvLinkedKeys.Model=tsLinkedKeys;
+
+ Secret secret = ss.getSecret(entrySecretID.Text);
+ ShowLinkedKeys(secret, selected);
+
+ // display info on this secret
+ labelLinkSecretID.Text = entrySecretID.Text;
+ labelLinkKeyID.Text = selected;
+ entryLinkValue.Text = secret.getKeyValue(selected);
+ entryLinkValue.Changed +=new EventHandler(entryLinkValue_Changed);
+ entryLinkValue.LeaveNotifyEvent +=new LeaveNotifyEventHandler(entryLinkValue_LeaveNotifyEvent);
+
+ }
+ }
+ }
+
+ private void ShowLinkedKeys(Secret secret, string keyID)
+ {
+
+ Hashtable htLinkKeys = secret.GetLinkedKeys(keyID);
+ if (htLinkKeys != null)
+ {
+ tsLinkedKeys.Clear();
+ IDictionaryEnumerator ienum = (IDictionaryEnumerator)htLinkKeys.GetEnumerator();
+ ienum.Reset();
+ while (ienum.MoveNext())
+ {
+ LinkedKeyInfo lki = (LinkedKeyInfo) ienum.Value;
+ tsLinkedKeys.AppendValues(lki.GetLinkedSecretID(), lki.GetLinkedKeyID());
+ }
+ }
+ }
+
+ private void tvAvailableSecrets_ButtonReleaseEvent(object o, ButtonReleaseEventArgs args)
+ {
+ TreeModel model;
+ TreeIter iter;
+ string selected=null;
+
+ if(tvAvailableSecrets.Selection.GetSelected (out model, out iter))
+ selected=(string) model.GetValue (iter, 0);
+
+ tsAvailableKeys.Clear();
+
+ if(selected != null && selected.Length > 0)
+ {
+ SecretStore ss = GetMiCasaStore();
+ Secret secret = ss.getSecret(selected);
+ NameValueCollection nvc = secret.getKeyValueCollection();
+ for (int i=0; i 0)
+ bHasLinks = true;
+ else
+ bHasLinks = false;
+
+ if( (null != keys[i]) && (null != values[i]) )
+ if( bHasLinks )
+ {
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false, "Yes");
+ }
+ else
+ {
+ tsKeyValue.AppendValues(keys[i], values[i], "********", false, "No");
+
+ }
+ }*/
+
+ }
+ /// LINK
+
+
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
diff --git a/c_gui/Mozilla.cs b/c_gui/Mozilla.cs
new file mode 100644
index 00000000..c31b917f
--- /dev/null
+++ b/c_gui/Mozilla.cs
@@ -0,0 +1,30 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : Mozilla.cs
+/// DESCRIPTION : GUI implementation of Mozilla store.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 24 Sept, 05
+///#################################################################
+
+namespace Novell.CASA.GUI {
+
+using System;
+using Gtk;
+using Glade;
+
+public class Mozilla : Store
+{
+ public override void AggregateStore()
+ {
+
+ }
+
+ public override void ViewKeyValues()
+ {
+
+ }
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/Store.cs b/c_gui/Store.cs
new file mode 100644
index 00000000..bd23009b
--- /dev/null
+++ b/c_gui/Store.cs
@@ -0,0 +1,37 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : Store.cs
+/// DESCRIPTION : A parent class that abstracts the store classes.
+/// AUTHORS : CSL.Manojna
+/// UPDATED ON : 21 Sept, 05
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+using System;
+using Gtk;
+using Glade;
+
+public abstract class Store
+{
+
+ ///#######################################################################
+ ///
+ /// Clears the TreeStore and invokes ReadStore() to aggregate
+ /// respective stores.
+ ///
+ public abstract void AggregateStore();
+
+
+ ///#######################################################################
+ ///
+ ///
+ ///
+ public abstract void ViewKeyValues();
+
+}
+}
+///##################################################################
+/// END OF FILE
+///##################################################################
\ No newline at end of file
diff --git a/c_gui/StoreDataInterface.cs b/c_gui/StoreDataInterface.cs
new file mode 100644
index 00000000..82154075
--- /dev/null
+++ b/c_gui/StoreDataInterface.cs
@@ -0,0 +1,610 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : StoreDataInterface.cs
+/// DESCRIPTION : Implementation of Store Data Interface for CASA.
+/// Abstracts the back-end and acts as an interface
+/// to the GUI.
+/// AUTHORS : Manohar, CSL.Manojna
+/// UPDATED ON : 24 Sept, 2005
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+ using System;
+ using System.IO;
+ using System.Collections;
+ using System.Xml;
+ using System.Xml.XPath;
+ using System.Xml.Xsl;
+ using GLib;
+ using Gtk;
+ using Novell.CASA.DataEngines;
+
+
+ public class StoreDataInterface
+ {
+
+ private static XmlDocument ccfDoc;
+ private static AD ad;
+
+ private static string CCFXML_ELEMENT_MICASA_KEYCHAIN = "Keychain",
+ CCFXML_ELEMENT_GKEYRING_KEYRING = "Keyring",
+ CCFXML_ELEMENT_KWALLET_WALLET = "Wallet",
+ CCFXML_ELEMENT_SECRET = "Secret",
+ CCFXML_ELEMENT_FOLDER = "Folder",
+ CCFXML_ATTRIBUTE_FOLDERNAME = "Name",
+ CCFXML_ELEMENT_TYPE = "Type",
+ CCFXML_ELEMENT_KEY = "Key",
+ CCFXML_ELEMENT_VALUE = "Value",
+ CCFXML_ELEMENT_TIME = "Time",
+ CCFXML_ELEMENT_TIME_ZONE = "Zone",
+ CCFXML_ELEMENT_TIME_CREATION = "Creation",
+ CCFXML_ELEMENT_TIME_MODIFIED = "Modified",
+ CCFXML_ELEMENT_TIME_ACCESSED = "Accessed",
+ CCFXML_ATTRIBUTE_ID = "ID",
+ CCFXML_ATTRIBUTE_MICASA_SYNCH = "Synch",
+ CCFXML_ATTRIBUTE_GKEYRING_TYPE = "Type";
+
+
+
+ ///#######################################################################
+ /// INIT
+
+ ///
+ /// Initializes the CCF from miCASA-D
+ ///
+ public static int Init()
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.StoreDataInterface() - BEGIN");
+
+ try
+ {
+ ccfDoc = new XmlDocument();
+ ad = new AD();
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.Init() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog( exp );
+ return( Common.STATUS_STORE_ADINITFAILED );
+ }
+
+ Logger.DbgLog("GUI:StoreDataInterface.StoreDataInterface() - END");
+ return( Common.STATUS_SUCCESS );
+ }
+
+
+
+ ///#######################################################################
+ /// AGGREGATE A SPECIFIC STORE
+
+ ///
+ /// Initializes the CCF from miCASA-D
+ ///
+ public static int AggregateStore(int storeIDentifier)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.AggregateStore()");
+
+ try
+ {
+ return( ad.AggregateStore(ccfDoc, storeIDentifier) );
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.AggregateStore() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog(exp);
+ return( Common.STATUS_STORE_AGGREGATEFAILED );
+ }
+ }
+
+
+
+ ///#######################################################################
+ /// REFRESH ALL STORES
+
+ ///
+ /// Initializes the CCF from miCASA-D
+ ///
+ public static int RefreshAllStores()
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.RefreshAllStores() - BEGIN");
+
+ try
+ {
+ ccfDoc = ad.Aggregate();
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.RefreshAllStores() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog(exp);
+ return( Common.STATUS_STORE_AGGREGATEFAILED );
+ }
+ Logger.DbgLog("GUI:StoreDataInterface.RefreshAllStores() - END");
+ return( Common.STATUS_SUCCESS );
+ }
+
+
+
+ ///#######################################################################
+ /// READ STORE
+
+ ///
+ /// Gets the GUI Data store
+ ///
+ public static int ReadStore(int storeIDentifier,ref Gtk.TreeStore ls)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.ReadStore()");
+
+ //Common Keys
+ string storeChainKey = CCFXML_ELEMENT_MICASA_KEYCHAIN;
+
+ //TreeStore structure
+ string secretID = null;
+ string[] strKeyArray = null;
+ string[] strValueArray = null;
+ string storeID = null;
+ string[] strNativeKeyArray = new string[Common.MAX_NATIVE_ELEMENTS];
+ string[] strNativeValueArray = new string[Common.MAX_NATIVE_ELEMENTS];
+
+ //Vars for ccf data
+ string folderName = null;
+ string typeID = null;
+ string modifiedTime = null;
+ string synch = null;
+ string synchType = null;
+
+ //Flags & Variables
+ bool bKey = false;
+ bool bEndOfSecret = false;
+
+ //bool bEndOfTime=false;
+ string ccfPath = null;
+
+ //Counters
+ int noOfSecretsFound = 0;
+ int noOfKeys = 0;
+ int noOfKeysFound = 0;
+
+ //Init Native Information TypeNames
+ strNativeKeyArray[Common.INDEX_NATIVEINFO_FOLDERNAME] = Common.NATIVEINFO_FOLDERNAME;
+ strNativeKeyArray[Common.INDEX_NATIVEINFO_TYPEID] = Common.NATIVEINFO_TYPEID;
+ strNativeKeyArray[Common.INDEX_NATIVEINFO_SYNC] = Common.NATIVEINFO_SYNC;
+ strNativeKeyArray[Common.INDEX_NATIVEINFO_SYNCTYPE] = Common.NATIVEINFO_SYNCTYPE;
+ strNativeKeyArray[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = Common.NATIVEINFO_MODIFIEDTIME;
+
+ //Form the XPATH Query definitions
+ if( storeIDentifier == Common.STORE_MICASA )
+ {
+ ccfPath = "//CCF/miCASA";
+ storeChainKey = CCFXML_ELEMENT_MICASA_KEYCHAIN;
+ }
+ else if( storeIDentifier == Common.STORE_GNOMEKEYRING )
+ {
+ ccfPath = "//CCF/GK";
+ storeChainKey = CCFXML_ELEMENT_GKEYRING_KEYRING;
+ }
+ else if( storeIDentifier == Common.STORE_KDEWALLET )
+ {
+ ccfPath = "//CCF/KWallet";
+ storeChainKey = CCFXML_ELEMENT_KWALLET_WALLET;
+ }
+ else
+ return( Common.STATUS_STORE_INVALIDSTOREID );
+
+ try
+ {
+
+ XPathNavigator nav = ccfDoc.CreateNavigator();
+ XPathNodeIterator iter = null;
+ string ccfExtPath = null;
+
+ //Query on the CCF and point to the store
+ iter = nav.Select(ccfPath);
+ if( 0 == iter.Count )
+ return( Common.STATUS_STORE_DATANOTFOUNDINSTORE );
+
+ //Enumerate all store instances [storeID's-Keychain\Wallet\Profile\Keyring]
+ while( iter.MoveNext() )
+ {//Get Next Store instance. Ideally this should always be 1
+
+ //Get all descendants of this store. Ideally this should always be keychains
+ //So this should get all keychains of this store.
+ XPathNodeIterator iterSecret = iter.Current.SelectDescendants( XPathNodeType.Element,false );
+
+ while( iterSecret.MoveNext() )
+ {//Enumerate this Keychain\Wallet\Profile\Keyring
+
+ if( true == iterSecret.Current.HasAttributes )
+ {//Elements With attributes, get the attributes first before going to next sub element
+
+ if( iterSecret.Current.Name.Equals(storeChainKey) )
+ {//miCASA-KeyChain //GK-Keyring //KWallet-Wallet
+
+ iterSecret.Current.MoveToFirstAttribute();
+ do
+ {
+ //Keychain\Wallet\Profile\Keyring ID
+ if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_ID) )
+ {
+ storeID = iterSecret.Current.Value;
+ }
+
+ }while( iterSecret.Current.MoveToNextAttribute() );
+
+ iterSecret.Current.MoveToParent();
+ }
+ else if( iterSecret.Current.Name.Equals(CCFXML_ELEMENT_SECRET) )
+ {//miCASA-KeyChain-Secret:secretID
+
+ noOfSecretsFound++;
+ iterSecret.Current.MoveToFirstAttribute();
+ do
+ {
+ if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_ID) )
+ {
+ secretID = iterSecret.Current.Value;
+ }
+ else if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_MICASA_SYNCH) )
+ {
+ synch = iterSecret.Current.Value;
+ }
+ else if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_GKEYRING_TYPE) )
+ {
+ synchType = iterSecret.Current.Value;
+ }
+
+ }while( iterSecret.Current.MoveToNextAttribute() );
+
+ iterSecret.Current.MoveToParent();
+
+ //Now get more details about the secret
+ //End of secret is after read of all keys of the secret
+ {
+ XPathNodeIterator secIter;
+ ccfExtPath = "Key";
+ secIter = iterSecret.Current.Select(ccfExtPath);
+ noOfKeys = secIter.Count;
+
+ //Reinit arrays to the no of keys for this secret
+ strKeyArray = new string[noOfKeys];
+ strValueArray = new string[noOfKeys];
+
+ //Get Last Modified Time for the secret
+ ccfExtPath = CCFXML_ELEMENT_TIME + "/" + CCFXML_ELEMENT_TIME_MODIFIED;
+ secIter = iterSecret.Current.Select(ccfExtPath);
+
+ if( 0 != secIter.Count )
+ {
+ while( secIter.MoveNext() )
+ {//Enumerate the Time Nodes of this secret
+ if( secIter.Current.Name.Equals(CCFXML_ELEMENT_TIME_MODIFIED) )
+ {//miCASA-KeyChain-Secret-Key-Value-Time-modified
+
+ modifiedTime = secIter.Current.Value;
+
+ }
+ }
+ }
+ }
+
+
+ }
+ else if( iterSecret.Current.Name.Equals(CCFXML_ELEMENT_KEY) )
+ {//miCASA-KeyChain-Secret-Key:ID
+ iterSecret.Current.MoveToFirstAttribute();
+ do
+ {
+ if( (iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_ID)) && (noOfKeysFound<=noOfKeys) )
+ {
+ bKey = true;
+ strKeyArray[noOfKeysFound] = iterSecret.Current.Value; //KeyName
+ }
+ }while( iterSecret.Current.MoveToNextAttribute() );
+ iterSecret.Current.MoveToParent();
+
+ }
+ else if( iterSecret.Current.Name.Equals(CCFXML_ELEMENT_FOLDER) )
+ {//Folder:
+ iterSecret.Current.MoveToFirstAttribute();
+ do
+ {
+ if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_FOLDERNAME) )
+ {//Folder:Name
+ folderName = iterSecret.Current.Value;
+ }
+ }while( iterSecret.Current.MoveToNextAttribute() );
+ iterSecret.Current.MoveToParent();
+
+ }
+ else if( iterSecret.Current.Name.Equals(CCFXML_ELEMENT_TYPE) )
+ {//Type:
+ iterSecret.Current.MoveToFirstAttribute();
+ do
+ {
+ if( iterSecret.Current.LocalName.Equals(CCFXML_ATTRIBUTE_ID) )
+ {//Type:ID
+ typeID = iterSecret.Current.Value;
+ }
+ }while( iterSecret.Current.MoveToNextAttribute() );
+ iterSecret.Current.MoveToParent();
+
+ }
+ }//Elements Without attributes,Get element values and then go to next subelement
+ else if( iterSecret.Current.Name.Equals(CCFXML_ELEMENT_VALUE) )
+ {//miCASA-KeyChain-Secret-Key-Value:
+ if( true == bKey )
+ {
+ //Update Corresponding KeyValue
+ strValueArray[noOfKeysFound++] = iterSecret.Current.Value; //KeyValue
+ bKey = false;
+
+ //Are alll keys read? If so its the end of the secret
+ if( noOfKeysFound == noOfKeys )
+ bEndOfSecret = true;
+ }
+ }
+
+ //Update this Secret to the GUI Store
+ if( true == bEndOfSecret )
+ {
+ //Updating TreeStore Native Array structure
+ strNativeValueArray = new string[Common.MAX_NATIVE_ELEMENTS];
+
+ strNativeValueArray[Common.INDEX_NATIVEINFO_FOLDERNAME] = folderName;
+ strNativeValueArray[Common.INDEX_NATIVEINFO_TYPEID] = typeID;
+ strNativeValueArray[Common.INDEX_NATIVEINFO_SYNC] = synch;
+ strNativeValueArray[Common.INDEX_NATIVEINFO_SYNCTYPE] = synchType;
+ strNativeValueArray[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = modifiedTime;
+ //Console.WriteLine("folderName="+folderName+"\n"+"typeID="+typeID+"\n"+"synch="+synch+"\n"+"synchType="+synchType+"\n"+"modifiedTime="+modifiedTime);
+
+ ls.AppendValues(secretID,strKeyArray,strValueArray,storeID,strNativeKeyArray,strNativeValueArray);
+
+ //Re-Initialize for next iteration
+ secretID = "";
+ noOfKeysFound = 0;
+ noOfKeys = 0;
+ bKey = false;
+ //bTime=false;- For Use Later
+ bEndOfSecret = false;
+ }
+ }
+ }
+
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.ReadStore() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog( exp );
+ return( Common.STATUS_STORE_READFAILED );
+ }
+ ShowDocOnConsole("READ STORE:");
+ return( Common.STATUS_SUCCESS );
+ }
+
+
+
+ ///#######################################################################
+ /// UPDATE STORE: ADD NEW secret/keyvalue, MODIFY keyvalue, DELETE secret
+
+ ///
+ /// Supported Update Functionalities - on miCASA Store only
+ ///
+ public static int UpdateStore(int storeIDentifier,int operation,string keyID,string valueToBeModfied,ref TreeModel model,ref TreeIter iter)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.UpdateStore()");
+
+ //TreeStore row elements
+ string SecretID = null;
+ string keyChainID = null;
+ string[] strKeyArray = new string[Common.MAX_ARRAY_ELEMENTS];
+ string[] strValueArray = new string[Common.MAX_ARRAY_ELEMENTS];
+
+
+ //XPATH query strings
+ string ccfKeyChainPath = null;
+ string ccfSecretPath = null;
+
+ //Intialization of New Secret\Key elements
+ XmlElement newKeychainElement = ccfDoc.CreateElement(CCFXML_ELEMENT_MICASA_KEYCHAIN);
+ XmlElement newSecretElement = ccfDoc.CreateElement(CCFXML_ELEMENT_SECRET);
+ XmlElement newKeyElement = ccfDoc.CreateElement(CCFXML_ELEMENT_KEY);
+
+
+ //Reading and Initialzing from the passed iter object
+ SecretID = (string) model.GetValue (iter, 0);
+ strKeyArray = (string[]) model.GetValue (iter, 1);
+ strValueArray = (string[]) model.GetValue (iter, 2);
+ keyChainID = (string) model.GetValue (iter, 3);
+
+
+ try
+ {
+
+ //Form the query to reach to an element for modify\delete\add
+ if( Common.STORE_MICASA == storeIDentifier )
+ {
+ if( Common.OPERATION_MODIFY_KEY == operation || Common.OPERATION_DELETE_KEY == operation )
+ {
+ ccfSecretPath = "//CCF/miCASA/Keychain[@ID='" + keyChainID + "']/Secret[@ID='" + SecretID + "']/Key[@ID='" + keyID + "']";
+ }
+ else if( Common.OPERATION_DELETE_SECRET == operation )
+ {
+ //ccfSecretPath="//CCF/miCASA/Keychain[@ID='"+keyChainID+"']/Secret[@ID='"+SecretID+"']";
+ ccfKeyChainPath = "//CCF/miCASA/Keychain[@ID='" + keyChainID + "']";
+ ccfSecretPath = "Secret[@ID='" + SecretID + "']";
+ }
+ else if( Common.OPERATION_ADD_SECRET == operation )
+ {
+ ccfKeyChainPath = "//CCF/miCASA/Keychain[@ID='" + keyChainID + "']";
+ ccfSecretPath = "";
+
+ //Create the Secret element
+ newSecretElement = ccfDoc.CreateElement(CCFXML_ELEMENT_SECRET);
+ newSecretElement.SetAttribute(CCFXML_ATTRIBUTE_ID,SecretID);
+ newSecretElement.SetAttribute(CCFXML_ATTRIBUTE_MICASA_SYNCH,"NSL");
+
+ //Add all keys from strKeyArray to the new secret
+ for( int i=0; i< strKeyArray.Length; i++)
+ {
+ XmlElement newKey = ccfDoc.CreateElement(CCFXML_ELEMENT_KEY);
+ newKey.SetAttribute(CCFXML_ATTRIBUTE_ID,strKeyArray[i]);
+ XmlElement newValue = ccfDoc.CreateElement(CCFXML_ELEMENT_VALUE);
+ newValue.InnerText = strValueArray[i];
+ newKey.AppendChild(newValue);
+ newSecretElement.AppendChild(newKey);
+ }
+
+ //Time
+ XmlElement newTime = ccfDoc.CreateElement(CCFXML_ELEMENT_TIME);
+ XmlElement newZone = ccfDoc.CreateElement(CCFXML_ELEMENT_TIME_ZONE);
+ newZone.InnerText = "IST";
+ newTime.AppendChild(newZone);
+ XmlElement newCreateTime = ccfDoc.CreateElement(CCFXML_ELEMENT_TIME_CREATION);
+ newCreateTime.InnerText = "1234";
+ newTime.AppendChild(newCreateTime);
+ XmlElement newModifiedTime = ccfDoc.CreateElement(CCFXML_ELEMENT_TIME_MODIFIED);
+ newModifiedTime.InnerText = "5678";
+ newTime.AppendChild(newModifiedTime);
+ XmlElement newAccessedTime = ccfDoc.CreateElement(CCFXML_ELEMENT_TIME_ACCESSED);
+ newAccessedTime.InnerText = "9012";
+ newTime.AppendChild(newAccessedTime);
+ newSecretElement.AppendChild(newTime);
+ }
+ else if( Common.OPERATION_ADD_KEY == operation )
+ {
+ ccfKeyChainPath = "//CCF/miCASA/Keychain[@ID='" + keyChainID + "']/Secret[@ID='" + SecretID + "']";
+ ccfSecretPath = "";
+
+ //Create the Key element
+ //strKeyArray[0]-[n] -If Support needed for multiple keys at once
+ newKeyElement = ccfDoc.CreateElement(CCFXML_ELEMENT_KEY);
+ newKeyElement.SetAttribute(CCFXML_ATTRIBUTE_ID,keyID);
+ XmlElement newValue = ccfDoc.CreateElement(CCFXML_ELEMENT_VALUE);
+ newValue.InnerText = valueToBeModfied;
+ newKeyElement.AppendChild(newValue);
+ }
+ }
+ else
+ return( Common.STATUS_STORE_UNSUPPORTEDOPERATION );
+
+ //Execute the query for modify\delete\add
+ if( Common.OPERATION_MODIFY_KEY == operation )
+ {
+ //For Modify operation get to the Node in the tree which needs to be modified
+ XmlNode root = ccfDoc.DocumentElement;
+ XmlNodeList keylist = root.SelectNodes(ccfSecretPath);
+ foreach ( XmlNode key in keylist )
+ {
+ key.ChildNodes[0].InnerText=valueToBeModfied ;
+ ad.SetSecret(key.ParentNode,storeIDentifier);
+ }
+ }
+ else if( Common.OPERATION_DELETE_SECRET == operation )
+ {
+ //Delete the specific secret from the keychain
+ XmlNode root = ccfDoc.DocumentElement;
+ XmlNodeList keychainNodeList = root.SelectNodes(ccfKeyChainPath);
+
+ foreach( XmlNode keychain in keychainNodeList )
+ {
+ XmlNodeList secretNodelist = keychain.SelectNodes(ccfSecretPath);
+ foreach ( XmlNode secret in secretNodelist )
+ {
+ ad.Remove(secret,storeIDentifier);
+ }
+ }
+ }
+ else if( Common.OPERATION_DELETE_KEY == operation )
+ {
+ //For Modify operation get to the Node in the tree which needs to be modified
+ XmlNode root = ccfDoc.DocumentElement;
+ XmlNodeList keylist = root.SelectNodes(ccfSecretPath);
+
+ foreach ( XmlNode key in keylist )
+ {
+ //key.ChildNodes[0].InnerText=valueToBeModfied ;
+ XmlNode keyParentNode = key.ParentNode;
+ key.ParentNode.RemoveChild(key);
+ ad.SetSecret(keyParentNode,storeIDentifier);
+ }
+ }
+ else if( Common.OPERATION_ADD_SECRET == operation )
+ {
+ //Add a new secret to the keychain
+ XmlNode root = ccfDoc.DocumentElement;
+ XmlNodeList keychainNodeList = root.SelectNodes(ccfKeyChainPath);
+
+ if( (null == keychainNodeList) || (0 == keychainNodeList.Count) )
+ {
+ newKeychainElement = ccfDoc.CreateElement(CCFXML_ELEMENT_MICASA_KEYCHAIN);
+ newKeychainElement.SetAttribute(CCFXML_ATTRIBUTE_ID,keyChainID);
+ ccfKeyChainPath = "//CCF/miCASA";
+ keychainNodeList = root.SelectNodes(ccfKeyChainPath);
+ XmlNode miCASANode = keychainNodeList.Item(0);
+
+ if( null != miCASANode )
+ {
+ miCASANode.AppendChild(newKeychainElement);
+ newKeychainElement.AppendChild(newSecretElement);
+ ccfSecretPath = "//CCF/miCASA/Keychain[@ID='" + keyChainID + "']/Secret[@ID='" + SecretID + "']";
+ keychainNodeList = root.SelectNodes(ccfSecretPath);
+ XmlNode SecretNode = keychainNodeList.Item(0);
+ ad.SetSecret(SecretNode,storeIDentifier);
+ }
+ }
+ else
+ {
+ XmlNode keychain = keychainNodeList.Item(0);
+ keychain.AppendChild(newSecretElement);
+ XmlNode lastChild = keychain.LastChild;
+ ad.SetSecret(lastChild,storeIDentifier);
+ }
+ }
+ else if( Common.OPERATION_ADD_KEY == operation )
+ {
+ //Add a new KN\KV to the keychain-Secret
+ XmlNode root = ccfDoc.DocumentElement;
+ XmlNodeList keyNodeList = root.SelectNodes(ccfKeyChainPath);
+ XmlNode keyNode=keyNodeList.Item(0);
+ XmlNode lastChild = keyNode.LastChild;
+ keyNode.InsertBefore(newKeyElement,lastChild);
+ ad.SetSecret(keyNode,storeIDentifier);
+ }
+
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StoreDataInterface.UpdateStore() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog( exp );
+ return( Common.STATUS_STORE_UPDATEFAILED );
+ }
+
+ ShowDocOnConsole("UPDATE STORE:");
+ return( Common.STATUS_SUCCESS );
+ }
+
+
+
+ ///#######################################################################
+ /// DUMP THE XML CCF ON CONSOLE
+
+ ///
+ /// Print Doc to the console for verification
+ ///
+ public static void ShowDocOnConsole(string str)
+ {
+#if DEBUG
+ Console.WriteLine("\n#######################################################");
+ Console.WriteLine(" "+str);
+ Console.WriteLine("\n#######################################################");
+ ccfDoc.Save(Console.Out);
+ Console.WriteLine("\n#######################################################");
+#endif
+ }
+ }
+}
+///###########################################################################
+/// END OF FILE
+///###########################################################################
\ No newline at end of file
diff --git a/c_gui/StorePolicyInterface.cs b/c_gui/StorePolicyInterface.cs
new file mode 100644
index 00000000..b2fa89c5
--- /dev/null
+++ b/c_gui/StorePolicyInterface.cs
@@ -0,0 +1,310 @@
+///#################################################################
+/// PROJECT : CASA - Common Authentication Services Adapter
+/// FILE : StorePolicyInterface.cs
+/// DESCRIPTION : Implementation of Store Policy Interface for CASA.
+/// AUTHORS : Manohar, CSL.Manojna
+/// UPDATED ON : 24 Sept, 2005
+///#################################################################
+
+
+namespace Novell.CASA.GUI {
+
+
+ using System;
+ using System.Collections;
+ using Novell.CASA.CASAPolicy;
+ using Novell.CASA;
+
+
+ public class StorePolicyInterface
+ {
+
+ private static AggregationPol aggPol;
+
+ private static string storeNameFirefox = null;
+ private static string[] storeIdFirefox = new string[Common.MAX_STORES];
+ private static int kFireFoxStoreCounter = 0;
+
+ private static string storeNameMozilla = null;
+ private static string[] storeId_mozilla = new string[Common.MAX_STORES];
+ private static int kMozillaStoreCounter = 0;
+
+ private static string storeNameKwallet = null;
+ private static string[] storeIdKwallet = new string[Common.MAX_STORES];
+ private static int kWalletStoreCounter = 0;
+
+ private static string storeNameGkeyring = null;
+ private static string[] storeIdGkeyring = new string[Common.MAX_STORES];
+ private static int kGkeyringStoreCounter = 0;
+
+
+
+ ///#######################################################################
+ /// INIT
+
+ ///
+ /// Init AggregationPolicy to the respective attributes
+ ///
+ public static int Init()
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - BEGIN");
+
+ try
+ {
+
+ aggPol = (AggregationPol) ICASAPol.GetPolicy(CASAPolType.AGGREGATION_POL);
+ if( null == aggPol )
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - No Aggregation Policy Found.");
+ return( Common.STATUS_POLICY_POLICYNOTFOUND );
+ }
+
+ ArrayList stores = aggPol.StoreList;
+ IEnumerator enumerator = stores.GetEnumerator();
+
+ while( enumerator.MoveNext() )
+ {
+ if( ((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName.Equals(Common.STORENAME_KDEWALLET) )
+ {
+ Common.IS_KDEWALLET = true;
+ storeNameKwallet = ((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName;
+ storeIdKwallet[kWalletStoreCounter++] = ((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreId;
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - miCASA policy = " + Common.IS_MICASA);
+ }
+ else if(((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName.Equals(Common.STORENAME_GNOMEKEYRING))
+ {
+ Common.IS_GNOMEKEYRING=true;
+ storeNameGkeyring=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName;
+ storeIdGkeyring[kGkeyringStoreCounter++]=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreId;
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - GNOMEKEYRING policy = " + Common.IS_GNOMEKEYRING);
+ }
+ else if(((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName.Equals(Common.STORENAME_FIREFOX))
+ {
+ Common.IS_FIREFOX=true;
+ storeNameFirefox=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName;
+ storeIdFirefox[kFireFoxStoreCounter++]=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreId;
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - FIREFOX policy = " + Common.IS_FIREFOX);
+ }
+ else if(((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName.Equals(Common.STORENAME_MOZILLA))
+ {
+ Common.IS_MOZILLA=true;
+ storeNameMozilla=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreName;
+ storeId_mozilla[kMozillaStoreCounter++]=((Novell.CASA.CASAPolicy.Store)(enumerator.Current)).StoreId;
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - MOZILLA policy = " + Common.IS_MOZILLA);
+ }
+ }
+
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog(exp);
+ return( Common.STATUS_POLICY_POLICYNOTFOUND );
+ }
+
+ Logger.DbgLog("GUI:StorePolicyInterface.Init() - END");
+ return( Common.STATUS_SUCCESS );
+ }
+
+
+
+ ///#######################################################################
+ /// IS AGGREGATION POLICY ENABLED FOR STORE ?
+
+ ///
+ /// Reports whether the aggregation policy is set for the store.
+ ///
+ public static bool IsAggregationPolicyEnabledFor(int storeIDentifier)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.isAggregationPolicyEnabledFor()");
+
+ if( Common.STORE_MICASA == storeIDentifier )
+ return( Common.IS_MICASA );
+ else if( Common.STORE_KDEWALLET == storeIDentifier )
+ return( Common.IS_KDEWALLET );
+ else if( Common.STORE_GNOMEKEYRING == storeIDentifier )
+ return( Common.IS_GNOMEKEYRING );
+ else if( Common.STORE_FIREFOX == storeIDentifier )
+ return( Common.IS_FIREFOX );
+ else if( Common.STORE_MOZILLA == storeIDentifier )
+ return( Common.IS_MOZILLA );
+ else
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.isAggregationPolicyEnabledFor() - STATUS_POLICY_POLICYNOTFOUND");
+ //Common.ShowErrorDialog(Common.STATUS_POLICY_POLICYNOTFOUND);
+ return( false );
+ }
+ }
+
+
+
+ ///#######################################################################
+ /// GET LIST OF STORE IDs FOR A STORE
+
+ ///
+ /// Get Aggregation Policy - storeId
+ ///
+ public static string[] GetAggregationPolicyStoreIDFor(int storeIDentifier)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.getAggregationPolicyStoreIDFor()");
+
+ if( Common.STORE_KDEWALLET == storeIDentifier )
+ return( storeIdKwallet );
+ else if( Common.STORE_GNOMEKEYRING == storeIDentifier )
+ return( storeIdGkeyring );
+ else if( Common.STORE_FIREFOX == storeIDentifier )
+ return( storeIdFirefox );
+ else if( Common.STORE_MOZILLA == storeIDentifier )
+ return( storeId_mozilla );
+ else
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.getAggregationPolicyStoreIDFor() - STATUS_POLICY_POLICYNOTFOUND");
+ //Common.ShowErrorDialog(Common.STATUS_POLICY_POLICYNOTFOUND);
+ return( null );
+ }
+ }
+
+
+
+ ///#######################################################################
+ /// SET AGGREGATION POLICY FOR A STORE
+
+ ///
+ /// Set Aggregation Policy for a perticular store.
+ ///
+ public static void SetAggregationPolicy(int storeIDentifier,bool status,string[] storeId,int numberOfStoreIds)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SetAggregationPolicy()");
+
+ try
+ {
+
+ if( storeIDentifier == Common.STORE_KDEWALLET )
+ {
+ Common.IS_KDEWALLET=status;
+ storeNameKwallet=Common.STORENAME_KDEWALLET;
+ storeIdKwallet=storeId;
+ kWalletStoreCounter=numberOfStoreIds;
+ }
+ else if( storeIDentifier == Common.STORE_GNOMEKEYRING )
+ {
+ Common.IS_GNOMEKEYRING=status;
+ storeNameGkeyring=Common.STORENAME_GNOMEKEYRING;
+ storeIdGkeyring=storeId;
+ kGkeyringStoreCounter=numberOfStoreIds;
+ }
+ else if( storeIDentifier == Common.STORE_MOZILLA )
+ {
+ Common.IS_MOZILLA=status;
+ storeNameMozilla=Common.STORENAME_MOZILLA;
+ storeId_mozilla=storeId;
+ kMozillaStoreCounter=numberOfStoreIds;
+ }
+ else if( storeIDentifier == Common.STORE_FIREFOX )
+ {
+ Common.IS_FIREFOX=status;
+ storeNameFirefox=Common.STORENAME_FIREFOX;
+ storeIdFirefox=storeId;
+ kFireFoxStoreCounter=numberOfStoreIds;
+ }
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SetAggregationPolicy() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog(exp);
+ }
+ }
+
+
+
+ ///#######################################################################
+ /// SAVE AGGREGATION POLICY
+
+ ///
+ /// Save Aggregation Policy
+ ///
+ public static int SaveAggregationPolicy()
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SaveAggregationPolicy()");
+
+ ArrayList storeList = new ArrayList();
+ Novell.CASA.CASAPolicy.Store store = null;
+
+ if( true == Common.IS_KDEWALLET )
+ {
+ for(int i=0; i < kWalletStoreCounter; i++)
+ {
+ store = new Novell.CASA.CASAPolicy.Store(storeNameKwallet,storeIdKwallet[i]);
+ storeList.Add(store);
+ }
+ }
+
+ if( true == Common.IS_GNOMEKEYRING )
+ {
+ for(int i=0; i < kGkeyringStoreCounter; i++)
+ {
+ store = new Novell.CASA.CASAPolicy.Store(storeNameGkeyring,storeIdGkeyring[i]);
+ storeList.Add(store);
+ }
+ }
+
+ if( true == Common.IS_FIREFOX )
+ {
+ for(int i=0; i < kFireFoxStoreCounter; i++)
+ {
+ store = new Novell.CASA.CASAPolicy.Store(storeNameFirefox,storeIdFirefox[i]);
+ storeList.Add(store);
+ }
+ }
+
+ if( true == Common.IS_MOZILLA )
+ {
+ for(int i=0; i < kMozillaStoreCounter; i++)
+ {
+ store = new Novell.CASA.CASAPolicy.Store(storeNameMozilla,storeId_mozilla[i]);
+ storeList.Add(store);
+ }
+ }
+
+
+ AggregationPol aggPol = new AggregationPol(storeList);
+
+ if( true == ICASAPol.SetPolicy(aggPol) )
+ return( Common.STATUS_SUCCESS );
+ else
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SaveAggregationPolicy() - STATUS_POLICY_COULDNOTBESAVED");
+ //Common.ShowErrorDialog(Common.STATUS_POLICY_COULDNOTBESAVED);
+ return( Common.STATUS_POLICY_COULDNOTBESAVED );
+ }
+ }
+
+
+
+ ///#######################################################################
+ /// SET MASTER PASSWORD
+
+ ///
+ /// Set Master Password for miCASA persistent store
+ ///
+ public static void SetMasterPassword(string passWord)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SetMasterPassword()");
+
+ try
+ {
+ Novell.CASA.miCASA.SetMasterPassword(0,passWord);
+ }
+ catch(Exception exp)
+ {
+ Logger.DbgLog("GUI:StorePolicyInterface.SetMasterPassword() - EXCEPTION" + exp.ToString());
+ //Common.ShowErrorDialog(exp);
+ }
+ }
+
+ }
+}
+
+///###########################################################################
+/// END OF FILE
+///###########################################################################
diff --git a/c_gui/images/CASA_16.png b/c_gui/images/CASA_16.png
new file mode 100644
index 00000000..18e6a0f9
Binary files /dev/null and b/c_gui/images/CASA_16.png differ
diff --git a/c_gui/images/CASA_32.png b/c_gui/images/CASA_32.png
new file mode 100644
index 00000000..326630eb
Binary files /dev/null and b/c_gui/images/CASA_32.png differ
diff --git a/c_gui/images/CASA_48.png b/c_gui/images/CASA_48.png
new file mode 100644
index 00000000..dc6efcb3
Binary files /dev/null and b/c_gui/images/CASA_48.png differ
diff --git a/c_gui/images/casa-1.5.glade b/c_gui/images/casa-1.5.glade
new file mode 100644
index 00000000..88785068
--- /dev/null
+++ b/c_gui/images/casa-1.5.glade
@@ -0,0 +1,6150 @@
+
+
+
+
+
+
+ Common Authentication Services Adapter
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER
+ False
+ 250
+ 525
+ True
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_NORMAL
+ GDK_GRAVITY_NORTH_WEST
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+
+
+
+ True
+ _File
+ True
+
+
+
+
+
+
+
+ True
+ _New
+ True
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+ True
+ New _Secret
+ True
+
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ New _Key
+ True
+
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _Refresh Stores
+ True
+
+
+
+
+
+ True
+ gtk-refresh
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ _Lock Secrets
+ True
+
+
+
+
+ True
+ gtk-dialog-authentication
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Unlock Secrets
+ True
+
+
+
+ True
+ gtk-open
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Destroy Secrets
+ True
+
+
+
+ True
+ gtk-delete
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ _Quit
+ True
+
+
+
+
+
+ True
+ gtk-quit
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _Edit
+ True
+
+
+
+
+
+
+
+ True
+ _View
+ True
+
+
+
+
+
+ True
+ gtk-zoom-fit
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Link
+ True
+
+
+
+
+ True
+ gtk-jump-to
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Copy
+ True
+
+
+
+
+ True
+ gtk-copy
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ _Delete
+ True
+
+
+
+
+
+ True
+ gtk-delete
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _Options
+ True
+
+
+
+
+
+
+ True
+ Persistent _Storage
+ True
+
+
+
+
+ True
+ gtk-revert-to-saved
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Preferences
+ True
+
+
+
+
+ True
+ gtk-preferences
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _Debug
+ True
+
+
+
+
+
+
+ True
+ _Create Test Secrets
+ True
+
+
+
+
+ True
+ gtk-file
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Remove Test Secrets
+ True
+
+
+
+
+ True
+ gtk-missing-image
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ Enable _Logging
+ True
+ False
+
+
+
+
+
+
+ True
+ _View Log File
+ True
+
+
+
+
+ True
+ gtk-zoom-fit
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _Help
+ True
+
+
+
+
+
+
+ True
+ _Contents
+ True
+
+
+
+
+ True
+ gtk-help
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ _About CASA
+ True
+
+
+
+
+ True
+ gtk-dialog-info
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ casa-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ 8
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ GTK_POS_TOP
+ True
+ False
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>:: Native Information ::</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ True
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ micasa-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ miCASA
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>:: Native Information ::</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ True
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ False
+ 0
+
+
+
+ True
+ firefox-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ Firefox
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>:: Native Information ::</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ True
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ mozilla-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ Mozilla
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>:: Native Information ::</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ True
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ kwallet-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ KDE Wallet
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>:: Native Information ::</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ True
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ keyring-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ GNOME Keyring
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ True
+
+
+ 0
+ False
+ False
+ GTK_PACK_END
+
+
+
+
+
+
+
+ 4
+ True
+ WARNING
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-no
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -9
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ True
+ gtk-yes
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -8
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-question
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Are you sure you want to Refresh
+all the stores?</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ Refreshing stores will fetch Secrets from
+their backend stores.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ 4
+ True
+ NEW SECRET
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ 500
+ True
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -6
+
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-new
+ 5
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ True
+
+
+
+
+ 4
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Add new Secrets or Key-Value pairs</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ Enter the Key-value pairs and click Add button to add Key-Value pairs or click Delete button to remove newly added Key-Value pairs from the list.
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 12
+ True
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ 3
+ 2
+ False
+ 4
+ 4
+
+
+
+ True
+ 0
+ 1
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 6
+ 6
+ 6
+ 6
+
+
+
+ True
+ 5
+ 3
+ False
+ 4
+ 4
+
+
+
+ True
+ <b>Key:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-remove
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+ 2
+ 3
+ 3
+ 4
+ fill
+ fill
+
+
+
+
+
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ 2
+ 3
+ 4
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ 1
+ 1
+ 2
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 1
+ 2
+
+
+
+
+
+
+ True
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-add
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 2
+ 3
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ True
+ <b>Key-Value pairs:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 3
+ 2
+ 3
+ fill
+
+
+
+
+
+
+ True
+ <b>Value:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 1
+ 3
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ Show passwords in clear text.
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+
+ 0
+ 3
+ 4
+ 5
+ fill
+
+
+
+
+
+
+
+
+
+
+ True
+
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ 2
+ 2
+ 3
+ fill
+
+
+
+
+
+ True
+ <b>Secret ID:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ 2
+ 1
+ 2
+
+
+
+
+
+ 6
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ 4
+ True
+ LINK
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ 600
+ True
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-close
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -7
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-jump-to
+ 5
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ True
+
+
+
+
+ 4
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Link Key-Value pairs</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ True
+
+
+
+
+
+ True
+ You can link two or more keys using this dialog. Further, linking two password keys will keep their values synchronized.
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 12
+ True
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ 3
+ 2
+ False
+ 3
+ 6
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 2
+ 3
+
+
+
+
+
+
+ True
+ <b>Key:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+ fill
+
+
+
+
+
+ True
+ <b>Value:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 2
+ 3
+ fill
+ fill
+
+
+
+
+
+ True
+ <b>Secret ID:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+ fill
+
+
+
+
+
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 1
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 1
+ 2
+ 1
+ 2
+ fill
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 6
+ False
+ True
+
+
+
+
+
+ True
+ 0
+ 0
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 10
+ 10
+ 10
+
+
+
+ True
+ 5
+ 3
+ False
+ 4
+ 4
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ Remove the Link of selected Key-Value pair.
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-remove
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+ 2
+ 3
+ 4
+ 5
+ fill
+ fill
+
+
+
+
+
+ True
+ <b>Existing Linked Keys:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 3
+ 3
+ 4
+ fill
+
+
+
+
+
+
+ True
+
+
+ 0
+ 3
+ 2
+ 3
+ 4
+ fill
+ fill
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ Link the selected Key-Value pair.
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-add
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 32
+ False
+ False
+
+
+
+
+ 2
+ 3
+ 1
+ 2
+ fill
+ fill
+
+
+
+
+
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ 2
+ 4
+ 5
+ fill
+
+
+
+
+
+ True
+ <b>Select the Keys to be Linked:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 4
+
+
+ 0
+ 3
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ True
+ False
+ GTK_POS_TOP
+ True
+ False
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ GTK_ARROW_RIGHT
+ GTK_SHADOW_OUT
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ micasa-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ miCASA
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ firefox-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ Firefox
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ mozilla-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ Mozilla
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ kwallet-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ KDE Wallet
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ keyring-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ GNOME Keyring
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ False
+
+
+
+
+ tab
+
+
+
+
+ 0
+ 2
+ 1
+ 2
+
+
+
+
+
+
+
+
+
+ True
+
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 6
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ 4
+ True
+ WARNING
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-no
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -9
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ True
+ gtk-yes
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -8
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-question
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Are you sure you want to Delete the Secret?</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Secret ID : </b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ True
+ False
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ True
+ True
+
+
+
+
+ 6
+ False
+ False
+
+
+
+
+
+ True
+ This will delete the selected Secret
+and all the key-value pairs.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ 4
+ True
+ WARNING
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-no
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -9
+
+
+
+
+
+ True
+ True
+ True
+ True
+ True
+ gtk-yes
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -8
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-question
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Are you sure you want to Quit
+the application?</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ This will quit the CASA Management
+Console.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ True
+ Persistent Storage
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -6
+
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-authentication
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Set Master Password for Persistent Storage</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ The Master Password is used to encrypt and
+secure your persistent credentials. You are
+prompted for the Master Password at startup.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ 6
+ True
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 12
+ 0
+
+
+
+ 6
+ True
+ 3
+ 2
+ False
+ 6
+ 6
+
+
+
+ True
+ Master Password :
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ Re-enter Master Password :
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ Master Password Hint :
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 2
+ 3
+ fill
+
+
+
+
+
+
+ True
+ True
+ True
+ False
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 0
+ 1
+
+
+
+
+
+
+ True
+ True
+ True
+ False
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 1
+ 2
+
+
+
+
+
+
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 2
+ 3
+
+
+
+
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ True
+ Preferences
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -6
+
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ 6
+ True
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 12
+ 0
+
+
+
+ 4
+ True
+ False
+ 0
+
+
+
+ True
+ Firefox password manager
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Mozilla password manager
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ True
+ KDE Wallet
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ True
+ GNOME Keyring
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ <b> Stores supported </b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ 6
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 12
+ 0
+
+
+
+ 6
+ True
+ False
+ 0
+
+
+
+ True
+ Refresh all stores after every
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ True
+
+
+
+
+
+ True
+ True
+ 1
+ 0
+ False
+ GTK_UPDATE_ALWAYS
+ False
+ False
+ 0 0 100 1 10 10
+
+
+ 4
+ False
+ True
+
+
+
+
+
+ True
+ seconds.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ <b> Auto refresh </b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+
+
+
+ True
+ _New
+ True
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+ True
+ New _Secret
+ True
+
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ New _Key
+ True
+
+
+
+
+ True
+ gtk-new
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ True
+ _View
+ True
+
+
+
+
+ True
+ gtk-zoom-fit
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Link
+ True
+
+
+
+
+ True
+ gtk-jump-to
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ _Copy
+ True
+
+
+
+
+ True
+ gtk-copy
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+ True
+ _Delete
+ True
+
+
+
+
+ True
+ gtk-delete
+ 1
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ About
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_EDGE
+
+
+
+ True
+ True
+ True
+ GTK_RELIEF_NONE
+ True
+ -7
+
+
+
+ True
+ novell-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ gtk-close
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -7
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ 4
+ True
+ False
+ 0
+
+
+
+ True
+ casa-logo.png
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ <b>Common Authentication Services Adapter
+Version 1.5</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 10
+ False
+ False
+
+
+
+
+
+ True
+ True
+ True
+ True
+ GTK_POS_TOP
+ False
+ False
+
+
+
+ 4
+ True
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ 4
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+
+
+
+ True
+ <b>.:| CASA |:.</b>
+<b>Common Authentication Services Adapter</b>
+Version 1.5 (c) 2005, Novell Inc.
+...................................................................................
+CASA is the common cross-platform foundation for authentication and Single Sign-On services for the users of Novell Linux Desktop, Microsoft Windows and MAC OS10 operating systems.
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ True
+ False
+ 0.5
+ 0.5
+ 6
+ 6
+
+
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ <b>About</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+
+ 4
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ GTK_SHADOW_NONE
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Jim Norman
+Poorna Pushkala
+Ahmed SK Anis
+Manohar Mathias
+CSL Manojna</b>
+ False
+ True
+ GTK_JUSTIFY_CENTER
+ False
+ False
+ 0.5
+ 0.5
+ 6
+ 6
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ <b>Authors</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+
+ 4
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ GTK_WRAP_NONE
+ True
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ <b>License</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ tab
+
+
+
+
+ 6
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ True
+ CASA Master Password Authentication
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-close
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -7
+
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-authentication
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Set/Verify Master Password</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ The Master Password is used to encrypt and
+secure your persistent credentials. You are
+prompted for the Master Password at startup.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ 6
+ True
+ 0
+ 0.5
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 12
+ 0
+
+
+
+ 6
+ True
+ 2
+ 2
+ False
+ 6
+ 6
+
+
+
+ True
+ Master Password :
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ Re-enter Password :
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 1
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ True
+ True
+ True
+ False
+ 0
+
+ True
+ *
+ False
+
+
+
+ 1
+ 2
+ 0
+ 1
+
+
+
+
+
+
+ True
+ True
+ True
+ False
+ 0
+
+ True
+ *
+ False
+
+
+
+ 1
+ 2
+ 1
+ 2
+
+
+
+
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ True
+ CASA Help
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_NONE
+ False
+ True
+ False
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_NORMAL
+ GDK_GRAVITY_NORTH_WEST
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_ORIENTATION_HORIZONTAL
+ GTK_TOOLBAR_ICONS
+ True
+ True
+
+
+
+ True
+
+ True
+ gtk-home
+ True
+ True
+ False
+
+
+ False
+ True
+
+
+
+
+
+ True
+
+ True
+ gtk-go-back
+ True
+ False
+ False
+
+
+ False
+ True
+
+
+
+
+
+ True
+ gtk-go-forward
+ True
+ True
+ False
+
+
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+ 4
+ True
+ MANAGE SECRET
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ON_PARENT
+ True
+ 500
+ True
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-help
+ True
+ GTK_RELIEF_NONE
+ True
+ -11
+
+
+
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -6
+
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-find-and-replace
+ 5
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 6
+ False
+ True
+
+
+
+
+ 4
+ False
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Manage Secrets and Key-Value pairs</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ To EDIT a Key-Value pair, select and single-click the respective Value and enter the new Value.
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ True
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 12
+ True
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ 3
+ 2
+ False
+ 4
+ 4
+
+
+
+ True
+ 0
+ 1
+ GTK_SHADOW_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 6
+ 6
+ 6
+ 6
+
+
+
+ True
+ 5
+ 3
+ False
+ 4
+ 4
+
+
+
+ True
+ <b>Key:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ Remove the selected Key-Value pair.
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-remove
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+ 2
+ 3
+ 3
+ 4
+ fill
+ fill
+
+
+
+
+
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ False
+ True
+
+
+
+
+ 0
+ 2
+ 3
+ 4
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ 1
+ 1
+ 2
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 1
+ 2
+ 1
+ 2
+
+
+
+
+
+
+ True
+ Add the new Key-Value pair.
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-add
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 2
+ 3
+ 1
+ 2
+ fill
+
+
+
+
+
+
+ True
+ <b>Key-Value pairs:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 3
+ 2
+ 3
+ fill
+
+
+
+
+
+
+ True
+ <b>Value:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 1
+ 3
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ Show Values in clear text.
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+
+ 0
+ 3
+ 4
+ 5
+ fill
+
+
+
+
+
+
+
+
+
+
+ True
+
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ 2
+ 2
+ 3
+ fill
+
+
+
+
+
+ True
+ <b>Secret ID:</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 0
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+
+ True
+ True
+ False
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ 2
+ 1
+ 2
+
+
+
+
+
+ 6
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
+ 4
+ True
+ WARNING
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ALWAYS
+ False
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-close
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -7
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-warning
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Cannot run CASAManager (GUI) as another
+instance is already running.</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+
+
+ True
+ WARNING
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_CENTER_ALWAYS
+ False
+ False
+ True
+ micasa-logo.png
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ GDK_GRAVITY_NORTH_WEST
+ True
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+
+ True
+ True
+ True
+ gtk-close
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -7
+
+
+
+
+
+
+ True
+ True
+ True
+ True
+ True
+ GTK_RELIEF_NORMAL
+ True
+ -5
+
+
+
+
+ True
+ 0.5
+ 0.5
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+ True
+ False
+ 2
+
+
+
+ True
+ gtk-redo
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ _Retry
+ True
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ gtk-dialog-warning
+ 6
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ 0
+ False
+ True
+
+
+
+
+ 4
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ <b>Retry signing in entering the correct
+Master Password.</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 5
+ False
+ False
+
+
+
+
+
+ True
+ Further you can choose to quit the application
+by cilcking the Close button.
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+ 4
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+
+
diff --git a/c_gui/images/casa-1.5.gladep b/c_gui/images/casa-1.5.gladep
new file mode 100644
index 00000000..878e6aa2
--- /dev/null
+++ b/c_gui/images/casa-1.5.gladep
@@ -0,0 +1,9 @@
+
+
+
+
+ Casa-1.5
+ casa-1.5
+
+ FALSE
+
diff --git a/c_gui/images/casa-logo.png b/c_gui/images/casa-logo.png
new file mode 100644
index 00000000..7b7bdbbe
Binary files /dev/null and b/c_gui/images/casa-logo.png differ
diff --git a/c_gui/images/firefox-logo.png b/c_gui/images/firefox-logo.png
new file mode 100644
index 00000000..909ac2f9
Binary files /dev/null and b/c_gui/images/firefox-logo.png differ
diff --git a/c_gui/images/keyring-logo.png b/c_gui/images/keyring-logo.png
new file mode 100644
index 00000000..15c4b1ea
Binary files /dev/null and b/c_gui/images/keyring-logo.png differ
diff --git a/c_gui/images/kwallet-logo.png b/c_gui/images/kwallet-logo.png
new file mode 100644
index 00000000..8ebc39df
Binary files /dev/null and b/c_gui/images/kwallet-logo.png differ
diff --git a/c_gui/images/micasa-logo.png b/c_gui/images/micasa-logo.png
new file mode 100644
index 00000000..409ac5cc
Binary files /dev/null and b/c_gui/images/micasa-logo.png differ
diff --git a/c_gui/images/mozilla-logo.png b/c_gui/images/mozilla-logo.png
new file mode 100644
index 00000000..df3149e9
Binary files /dev/null and b/c_gui/images/mozilla-logo.png differ
diff --git a/c_gui/images/novell-logo.png b/c_gui/images/novell-logo.png
new file mode 100644
index 00000000..8b30d914
Binary files /dev/null and b/c_gui/images/novell-logo.png differ
diff --git a/c_gui/objs.lux b/c_gui/objs.lux
new file mode 100644
index 00000000..d25105e4
--- /dev/null
+++ b/c_gui/objs.lux
@@ -0,0 +1,12 @@
+OBJS=\
+ CasaMain \
+ Firefox \
+ GnomeKeyring \
+ KdeWallet \
+ Logger \
+ MiCasa \
+ Mozilla \
+ Store \
+ StoreDataInterface \
+ StorePolicyInterface \
+ Common
diff --git a/c_gui/src.lux b/c_gui/src.lux
new file mode 100644
index 00000000..304f94a5
--- /dev/null
+++ b/c_gui/src.lux
@@ -0,0 +1,13 @@
+SRC=\
+ CasaMain.cs \
+ Firefox.cs \
+ GnomeKeyring.cs \
+ KdeWallet.cs \
+ Logger.cs \
+ MiCasa.cs \
+ Mozilla.cs \
+ Store.cs \
+ StoreDataInterface.cs \
+ StorePolicyInterface.cs \
+ Common.cs
+
diff --git a/c_jwrapper/c_jwrapper.ipr b/c_jwrapper/c_jwrapper.ipr
new file mode 100644
index 00000000..bb728f9c
--- /dev/null
+++ b/c_jwrapper/c_jwrapper.ipr
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_jwrapper/c_jwrapper.iws b/c_jwrapper/c_jwrapper.iws
new file mode 100644
index 00000000..75931b8b
--- /dev/null
+++ b/c_jwrapper/c_jwrapper.iws
@@ -0,0 +1,512 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ localhost
+ 5050
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_jwrapper/jnsscs/Makefile b/c_jwrapper/jnsscs/Makefile
new file mode 100644
index 00000000..b38fc886
--- /dev/null
+++ b/c_jwrapper/jnsscs/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = jmicasa
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+BIN_NAME = $(TARGET)$(xtra).$(BIN)
+LIB_NAME = $(TARGET)$(xtra).$(LIB)
+
+#
+# target object and source files
+#
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cl
diff --git a/c_jwrapper/jnsscs/jmicasa.c b/c_jwrapper/jnsscs/jmicasa.c
new file mode 100644
index 00000000..a828fc44
--- /dev/null
+++ b/c_jwrapper/jnsscs/jmicasa.c
@@ -0,0 +1,231 @@
+#include "com_novell_casa_MiCasa.h"
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+JNIEXPORT jint JNICALL
+Java_com_novell_casa_MiCasa_jmiCASASetCredential
+ (JNIEnv *env, jobject notused,
+ jint ssFlags,
+ jstring jsAppSecretID,
+ jstring jsSharedSecretID,
+ jint jUsernameType,
+ jstring jsUsername,
+ jstring jsPassword
+ )
+{
+ int rcode = 0;
+ SSCS_SECRET_ID_T appSecretId = {0};
+ SSCS_SECRET_ID_T sharedSecretId = {0};
+ SSCS_BASIC_CREDENTIAL credential = {0};
+
+ const char* utf_string;
+ jboolean isCopy;
+ utf_string = (*env)->GetStringUTFChars(env, jsAppSecretID, &isCopy);
+
+ sscs_Utf8Strcpy((char*)appSecretId.id, utf_string);
+ appSecretId.len = sscs_Utf8Strlen(utf_string) + 1;
+
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env,jsAppSecretID, utf_string);
+
+ // handle sharedsecretid
+ if (jsSharedSecretID)
+ {
+ utf_string = (*env)->GetStringUTFChars(env, jsSharedSecretID, &isCopy);
+ sscs_Utf8Strcpy((char*)sharedSecretId.id, utf_string);
+ sharedSecretId.len = sscs_Utf8Strlen(utf_string)+1;
+
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsSharedSecretID, utf_string);
+ }
+
+ // setup credential
+ utf_string = (*env)->GetStringUTFChars(env, jsUsername, &isCopy);
+ sscs_Utf8Strcpy((char*)credential.username, utf_string);
+ credential.unLen = sscs_Utf8Strlen(utf_string)+1;
+ credential.unFlags = jUsernameType;
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsUsername, utf_string);
+
+ // password
+ utf_string = (*env)->GetStringUTFChars(env, jsPassword, &isCopy);
+ sscs_Utf8Strcpy((char*)credential.password, utf_string);
+ credential.pwordLen = sscs_Utf8Strlen(utf_string)+1;
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsPassword, utf_string);
+
+
+ // make the call
+ if (jsSharedSecretID)
+ rcode = miCASASetCredential(
+ ssFlags,
+ &appSecretId,
+ &sharedSecretId,
+ jUsernameType,
+ &credential,
+ NULL
+ );
+ else
+ rcode = miCASASetCredential(
+ ssFlags,
+ &appSecretId,
+ NULL,
+ jUsernameType,
+ &credential,
+ NULL
+ );
+
+ return rcode;
+}
+
+/*
+ * Class: com_novell_casa_micasa_SecretStore
+ * Method: jmiCASAGetCredential
+ * Signature: (I[B[BILcom/novell/casa/micasa/Secret;)I
+ */
+JNIEXPORT jint JNICALL
+Java_com_novell_casa_MiCasa_jmiCASAGetCredential
+ (JNIEnv *env, jobject unused,
+ jint ssFlags,
+ jstring jsAppSecretID,
+ jstring jsSharedSecretID,
+ jint jUsernameType,
+ jobject jcred)
+{
+ int rcode = 0;
+ SSCS_SECRET_ID_T appSecretId = {0};
+ SSCS_SECRET_ID_T sharedSecretId = {0};
+ SSCS_BASIC_CREDENTIAL credential = {0};
+
+ const char* utf_string;
+ jboolean isCopy;
+ int unType = jUsernameType;
+
+ utf_string = (*env)->GetStringUTFChars(env, jsAppSecretID, &isCopy);
+ sscs_Utf8Strcpy((char*)appSecretId.id, utf_string);
+ appSecretId.len = sscs_Utf8Strlen(utf_string) + 1;
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsAppSecretID, utf_string);
+
+ // handle sharedsecretid
+ if (jsSharedSecretID)
+ {
+ utf_string = (*env)->GetStringUTFChars(env, jsSharedSecretID, &isCopy);
+ sscs_Utf8Strcpy((char*)sharedSecretId.id, utf_string);
+ sharedSecretId.len = sscs_Utf8Strlen(utf_string)+1;
+
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsSharedSecretID, utf_string);
+ }
+
+ // make the call
+ if (jsSharedSecretID)
+ rcode = miCASAGetCredential(
+ ssFlags,
+ &appSecretId,
+ &sharedSecretId,
+ &unType,
+ &credential,
+ NULL
+ );
+ else
+ rcode = miCASAGetCredential(
+ ssFlags,
+ &appSecretId,
+ NULL,
+ &unType,
+ &credential,
+ NULL
+ );
+
+
+ if (rcode == 0)
+ {
+ // we have a credential
+ jclass theclazz;
+ jmethodID mid;
+
+ theclazz = (*env)->GetObjectClass(env, jcred);
+ mid = (*env)->GetMethodID(env, theclazz, "setUsername", "(Ljava/lang/String;)V");
+ if (mid != NULL)
+ {
+ //printf("The Username: %s\r\n", credential.username);
+ jstring jusername = (*env)->NewStringUTF(env, (char *)credential.username);
+ (*env)->CallObjectMethod(env, jcred, mid, jusername);
+ }
+
+ mid = (*env)->GetMethodID(env, theclazz, "setPassword", "(Ljava/lang/String;)V");
+ {
+ jstring jpassword = (*env)->NewStringUTF(env, (char *)credential.password);
+ (*env)->CallObjectMethod(env, jcred, mid, jpassword);
+ }
+ }
+ return rcode;
+}
+
+
+/*
+ * Class: com_novell_casa_micasa_SecretStore
+ * Method: jmiCASARemoveCredential
+ * Signature: (I[B[B)I
+ */
+JNIEXPORT jint JNICALL
+Java_com_novell_casa_MiCasa_jmiCASARemoveCredential
+ (JNIEnv *env, jobject unused,
+ jint ssFlags,
+ jstring jsAppSecretID,
+ jstring jsSharedSecretID)
+{
+ int rcode = 0;
+ SSCS_SECRET_ID_T appSecretId = {0};
+ SSCS_SECRET_ID_T sharedSecretId = {0};
+
+ const char* utf_string;
+ jboolean isCopy;
+
+ utf_string = (*env)->GetStringUTFChars(env, jsAppSecretID, &isCopy);
+ sscs_Utf8Strcpy((char*)appSecretId.id, utf_string);
+ appSecretId.len = sscs_Utf8Strlen(utf_string) + 1;
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsAppSecretID, utf_string);
+
+ // handle sharedsecretid
+ if (jsSharedSecretID)
+ {
+ utf_string = (*env)->GetStringUTFChars(env, jsSharedSecretID, &isCopy);
+ sscs_Utf8Strcpy((char*)sharedSecretId.id, utf_string);
+ sharedSecretId.len = sscs_Utf8Strlen(utf_string)+1;
+
+ if (isCopy == JNI_TRUE)
+ (*env)->ReleaseStringUTFChars(env, jsSharedSecretID, utf_string);
+ }
+
+ // make the call
+ if (jsSharedSecretID)
+ rcode = miCASARemoveCredential(
+ ssFlags,
+ &appSecretId,
+ &sharedSecretId,
+ NULL);
+
+ else
+ rcode = miCASARemoveCredential(
+ ssFlags,
+ &appSecretId,
+ NULL,
+ NULL);
+
+ return rcode;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/c_jwrapper/jnsscs/jmicasa_lux.exp b/c_jwrapper/jnsscs/jmicasa_lux.exp
new file mode 100644
index 00000000..b3578c16
--- /dev/null
+++ b/c_jwrapper/jnsscs/jmicasa_lux.exp
@@ -0,0 +1,9 @@
+jmicasa_1.0.0
+{
+global:
+ Java_com_novell_casa_MiCasa_jmiCASASetCredential;
+ Java_com_novell_casa_MiCasa_jmiCASAGetCredential;
+ Java_com_novell_casa_MiCasa_jmiCASARemoveCredential;
+local:
+ *;
+};
diff --git a/c_jwrapper/jnsscs/jnsscs.ncb b/c_jwrapper/jnsscs/jnsscs.ncb
new file mode 100644
index 00000000..c0f31345
Binary files /dev/null and b/c_jwrapper/jnsscs/jnsscs.ncb differ
diff --git a/c_jwrapper/jnsscs/jnsscs.sln b/c_jwrapper/jnsscs/jnsscs.sln
new file mode 100644
index 00000000..6306f3f5
--- /dev/null
+++ b/c_jwrapper/jnsscs/jnsscs.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jnsscs", "jnsscs.vcproj", "{3CA87960-868D-4F3B-BD21-30062A9F89AD}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {3CA87960-868D-4F3B-BD21-30062A9F89AD}.Debug.ActiveCfg = Debug|Win32
+ {3CA87960-868D-4F3B-BD21-30062A9F89AD}.Debug.Build.0 = Debug|Win32
+ {3CA87960-868D-4F3B-BD21-30062A9F89AD}.Release.ActiveCfg = Release|Win32
+ {3CA87960-868D-4F3B-BD21-30062A9F89AD}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/c_jwrapper/jnsscs/jnsscs.suo b/c_jwrapper/jnsscs/jnsscs.suo
new file mode 100644
index 00000000..d1d755b6
Binary files /dev/null and b/c_jwrapper/jnsscs/jnsscs.suo differ
diff --git a/c_jwrapper/jnsscs/jnsscs.vcproj b/c_jwrapper/jnsscs/jnsscs.vcproj
new file mode 100644
index 00000000..664d1c10
--- /dev/null
+++ b/c_jwrapper/jnsscs/jnsscs.vcproj
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/c_jwrapper/jnsscs/link.lux b/c_jwrapper/jnsscs/link.lux
new file mode 100644
index 00000000..0f2c2cc5
--- /dev/null
+++ b/c_jwrapper/jnsscs/link.lux
@@ -0,0 +1,9 @@
+LINK = $(CC) \
+ -Wl,-Bsymbolic \
+ -shared \
+ -Wl,--version-script=$(TARGET)_$(PLAT).exp \
+ -Wl,-rpath -Wl,/usr/lib$(ARCH_DIR) \
+ -L$(LIBDIR)$(XTRA) -lmicasa \
+ -Wl,-soname -Wl,lib$(TARGET).so.$(PROD_NUM) \
+ -o $(LIBDIR)$(XTRA)/lib$(TARGET).so.$(BLD_VER) \
+ $(OBJDIR)*.$(O)
diff --git a/c_jwrapper/jnsscs/link.w32 b/c_jwrapper/jnsscs/link.w32
new file mode 100644
index 00000000..b358789b
--- /dev/null
+++ b/c_jwrapper/jnsscs/link.w32
@@ -0,0 +1,31 @@
+LINK_DEF_BLD = \
+ echo "$(addprefix $(OBJDIR),$(notdir $(OBJS)))" > $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)lib" >> $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)platformsdk/lib" >> $(LINKDEF);\
+ echo "/LIBPATH:../../lib/w32" >> $(LINKDEF);\
+ echo "kernel32.lib" >> $(LINKDEF);\
+ echo "ole32.lib" >> $(LINKDEF);\
+ echo "micasa.lib" >> $(LINKDEF);\
+ echo "/DLL" >> $(LINKDEF);\
+ echo "/OUT:$(BINDIR)$(basename $(notdir $@)).dll" >> $(LINKDEF);\
+ echo "/MAP:$(BINDIR)$(basename $(notdir $@)).map" >> $(LINKDEF);\
+ echo "/DEBUG" >> $(LINKDEF);\
+ echo "/MACHINE:IX86" >> $(LINKDEF);\
+ echo "/SUBSYSTEM:WINDOWS" >> $(LINKDEF);\
+ echo "/INCREMENTAL:NO" >> $(LINKDEF);\
+ echo "/VERSION:$(BLD_VER)" >> $(LINKDEF);\
+ echo "/FIXED:NO" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:uuid" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libc" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oldnames" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:user32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:gdi32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comdlg32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:winspool" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:shell32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comctl32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:olepro32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:user32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:wininet" >> $(LINKDEF);\
+ echo "/OPT:REF" >> $(LINKDEF);
+
diff --git a/c_jwrapper/jnsscs/link_mdd.w32 b/c_jwrapper/jnsscs/link_mdd.w32
new file mode 100644
index 00000000..8778c1a1
--- /dev/null
+++ b/c_jwrapper/jnsscs/link_mdd.w32
@@ -0,0 +1,31 @@
+LINK_DEF_BLD = \
+ echo "$(addprefix $(OBJDIR),$(notdir $(OBJS)))" > $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)lib" >> $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)platformsdk/lib" >> $(LINKDEF);\
+ echo "/LIBPATH:../../lib/w32" >> $(LINKDEF);\
+ echo "kernel32.lib" >> $(LINKDEF);\
+ echo "ole32.lib" >> $(LINKDEF);\
+ echo "micasa.lib" >> $(LINKDEF);\
+ echo "/DLL" >> $(LINKDEF);\
+ echo "/OUT:$(BINDIR)$(basename $(notdir $@)).dll" >> $(LINKDEF);\
+ echo "/MAP:$(BINDIR)$(basename $(notdir $@)).map" >> $(LINKDEF);\
+ echo "/DEBUG" >> $(LINKDEF);\
+ echo "/MACHINE:IX86" >> $(LINKDEF);\
+ echo "/SUBSYSTEM:WINDOWS" >> $(LINKDEF);\
+ echo "/INCREMENTAL:NO" >> $(LINKDEF);\
+ echo "/VERSION:$(BLD_VER)" >> $(LINKDEF);\
+ echo "/FIXED:NO" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oldnames" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libc" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:uuid" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:MSVCRT" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:user32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:gdi32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comdlg32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:winspool" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:shell32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comctl32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:olepro32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oleaut32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:wininet" >> $(LINKDEF);\
+ echo "/OPT:REF" >> $(LINKDEF);
\ No newline at end of file
diff --git a/c_jwrapper/jnsscs/objs.lux b/c_jwrapper/jnsscs/objs.lux
new file mode 100644
index 00000000..8e3c3553
--- /dev/null
+++ b/c_jwrapper/jnsscs/objs.lux
@@ -0,0 +1,2 @@
+OBJS=\
+ jmicasa.$(O)
diff --git a/c_jwrapper/jnsscs/objs.w32 b/c_jwrapper/jnsscs/objs.w32
new file mode 100644
index 00000000..7ce4a932
--- /dev/null
+++ b/c_jwrapper/jnsscs/objs.w32
@@ -0,0 +1,2 @@
+OBJS=\
+ jmicasa.$(O)
\ No newline at end of file
diff --git a/c_jwrapper/src/com/novell/casa/MiCasa.java b/c_jwrapper/src/com/novell/casa/MiCasa.java
new file mode 100644
index 00000000..ad1f66dd
--- /dev/null
+++ b/c_jwrapper/src/com/novell/casa/MiCasa.java
@@ -0,0 +1,86 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: jnorman@novell.com
+ * Date: Apr 19, 2005
+ * Time: 9:45:02 AM
+ * To change this template use Options | File Templates.
+ */
+package com.novell.casa;
+
+public class MiCasa {
+
+ public static int USERNAME_TYPE_CN_F = 0x00000000;
+ public static int USERNAME_TYPE_NDS_DN_F = 0x00000001;
+ public static int USERNAME_TYPE_NDS_FDN_F = 0x00000002;
+ public static int USERNAME_TYPE_LDAP_DN_F = 0x00000004;
+ public static int USERNAME_TYPE_EMAIL_F = 0x00000008;
+ public static int USERNAME_TYPE_OTHER_F = 0x00000010;
+
+ public static native int jmiCASASetCredential(
+ int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID,
+ int unFlag,
+ String sUsername,
+ String sPassword
+ );
+
+ public static native int jmiCASAGetCredential(
+ int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID,
+ int unFlag,
+ NetCredential credential
+ );
+
+ public static native int jmiCASARemoveCredential(
+ int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID
+ );
+
+ // **********************************************************************************************
+ static {
+ System.loadLibrary("jmicasa");
+ }
+
+ public static void setCredential(int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID,
+ int iUserFlag,
+ String sUsername,
+ String sPassword) throws Exception {
+
+ int rcode = 0;
+ rcode = jmiCASASetCredential(iSSFlags, sAppSecretID, sSharedSecretID, iUserFlag, sUsername, sPassword);
+ if (rcode != 0) {
+ throw new MiCasaException(rcode);
+ }
+ }
+
+ public static NetCredential getCredential(int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID,
+ int iUserFlag) throws Exception {
+ int rcode = 0;
+ NetCredential netCred = new NetCredential();
+ rcode = jmiCASAGetCredential(iSSFlags, sAppSecretID, sSharedSecretID, iUserFlag, netCred);
+ if (rcode != 0) {
+ throw new MiCasaException(rcode);
+ }
+
+ return netCred;
+ }
+
+ public static void removeCredential(int iSSFlags,
+ String sAppSecretID,
+ String sSharedSecretID) throws Exception {
+ int rcode = 0;
+ rcode = jmiCASARemoveCredential(iSSFlags, sAppSecretID, sSharedSecretID);
+ if (rcode != 0) {
+ throw new MiCasaException(rcode);
+ }
+
+ }
+
+}
diff --git a/c_jwrapper/src/com/novell/casa/MiCasaException.java b/c_jwrapper/src/com/novell/casa/MiCasaException.java
new file mode 100644
index 00000000..6d5ac1a3
--- /dev/null
+++ b/c_jwrapper/src/com/novell/casa/MiCasaException.java
@@ -0,0 +1,805 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: admin
+ * Date: Jun 7, 2005
+ * Time: 4:25:07 PM
+ * To change this template use Options | File Templates.
+ */
+package com.novell.casa;
+
+public class MiCasaException extends RuntimeException
+{
+ /**
+ * Can't find the target object DN in NDS.
+ *
+ * @since 3.0
+ */
+ public static final short NSSCS_E_OBJECT_NOT_FOUND = 0xFFFFFCE0; /* -800 */
+
+ /**
+ * NICI operations have failed.
+ */
+ public static final short NSSCS_E_NICI_FAILURE = 0xFFFFFCDF; /* -801 */
+
+ /**
+ * Secret ID is not in the User Secret Store.
+ */
+ public static final short NSSCS_E_INVALID_SECRET_ID = 0xFFFFFCDE; /* -802 */
+
+ /**
+ * Some internal operating system services have not been available.
+ */
+ public static final short NSSCS_E_SYSTEM_FAILURE = 0xFFFFFCDD; /* -803 */
+
+ /**
+ * Access to the target SecretStore has been denied.
+ */
+ public static final short NSSCS_E_ACCESS_DENIED = 0xFFFFFCDC; /* -804 */
+
+ /**
+ * Some internal NDS services have not been available.
+ */
+ public static final short NSSCS_E_NDS_INTERNAL_FAILURE = 0xFFFFFCDB; /* -805 */
+
+ /**
+ * Secret has not been initialized with a write.
+ */
+ public static final short NSSCS_E_SECRET_UNINITIALIZED = 0xFFFFFCDA; /* -806 */
+
+ /**
+ * Size of the buffer is not in a nominal range between minimum and maximum.
+ */
+ public static final short NSSCS_E_BUFFER_LEN = 0xFFFFFCD9; /* -807 */
+
+ /**
+ * Client and server components are not of the compatible versions.
+ */
+ public static final short NSSCS_E_INCOMPATIBLE_VERSION = 0xFFFFFCD8; /* -808 */
+
+ /**
+ * SecretStore data on the server has been corrupted.
+ */
+ public static final short NSSCS_E_CORRUPTED_STORE = 0xFFFFFCD7; /* -809 */
+
+ /**
+ * Secret ID already exists in the Secret Store.
+ */
+ public static final short NSSCS_E_SECRET_ID_EXISTS = 0xFFFFFCD6; /* -810 */
+
+ /**
+ * User NDS password has been changed by the administrator.
+ */
+ public static final short NSSCS_E_NDS_PWORD_CHANGED = 0xFFFFFCD5; /* -811 */
+
+ /**
+ * Target NDS User object not found.
+ */
+ public static final short NSSCS_E_INVALID_TARGET_OBJECT = 0xFFFFFCD4; /* -812 */
+
+ /**
+ * Target NDS User object does not have a SecretStore.
+ */
+ public static final short NSSCS_E_STORE_NOT_FOUND = 0xFFFFFCD3; /* -813 */
+
+ /**
+ * SecretStore not on the Network.
+ */
+ public static final short NSSCS_E_SERVICE_NOT_FOUND = 0xFFFFFCD2; /* -814 */
+
+ /**
+ * Length of the Secret ID buffer exceeds the limit.
+ */
+ public static final short NSSCS_E_SECRET_ID_TOO_LONG = 0xFFFFFCD1; /* -815 */
+
+ /**
+ * User not authenticated.
+ */
+ public static final short NSSCS_E_NOT_AUTHENTICATED = 0xFFFFFCCF; /* -817 */
+
+ /**
+ * Not supported operations.
+ */
+ public static final short NSSCS_E_NOT_SUPPORTED = 0xFFFFFCCE; /* -818 */
+
+ /**
+ * Typed in NDS password not valid.
+ */
+ public static final short NSSCS_E_NDS_PWORD_INVALID = 0xFFFFFCCD; /* -819 */
+
+ /**
+ * Length of the Enumeration buffer too short.
+ */
+ public static final short NSSCS_E_ENUM_BUFF_TOO_SHORT = 0xFFFFFCD0; /* -816 */
+
+ /**
+ * Session keys of the client and server NICI are out of sync.
+ */
+ public static final short NSSCS_E_NICI_OUTOF_SYNC = 0xFFFFFCCC; /* -820 */
+
+ /**
+ * Requested service not supported yet.
+ */
+ public static final short NSSCS_E_SERVICE_NOT_SUPPORTED = 0xFFFFFCCB; /* -821 */
+
+ /**
+ * NDS authentication type not supported.
+ */
+ public static final short NSSCS_E_TOKEN_NOT_SUPPORTED = 0xFFFFFCCA; /* -822 */
+
+ /**
+ * Unicode text conversion operation failed.
+ */
+ public static final short NSSCS_E_UNICODE_OP_FAILURE = 0xFFFFFCC9; /* -823 */
+
+ /**
+ * Connection to server is lost.
+ */
+ public static final short NSSCS_E_TRANSPORT_FAILURE = 0xFFFFFCC8; /* -824 */
+
+ /**
+ * Cryptographic operation failed.
+ */
+ public static final short NSSCS_E_CRYPTO_OP_FAILURE = 0xFFFFFCC7; /* -825 */
+
+ /**
+ * Opening a connection to the server failed.
+ */
+ public static final short NSSCS_E_SERVER_CONN_FAILURE = 0xFFFFFCC6; /* -826 */
+
+ /**
+ * Access to server connection failed.
+ */
+ public static final short NSSCS_E_CONN_ACCESS_FAILURE = 0xFFFFFCC5; /* -827 */
+
+ /**
+ * Size of the enumeration buffer exceeds the limit.
+ */
+ public static final short NSSCS_E_ENUM_BUFF_TOO_LONG = 0xFFFFFCC4; /* -828 */
+
+ /**
+ * Size of the Secret buffer exceeds the limit.
+ */
+ public static final short NSSCS_E_SECRET_BUFF_TOO_LONG = 0xFFFFFCC3; /* -829 */
+
+ /**
+ * Length of the Secret ID should be greater than zero.
+ */
+ public static final short NSSCS_E_SECRET_ID_TOO_SHORT = 0xFFFFFCC2; /* -830 */
+
+ /**
+ * Protocol data corrupted on the wire.
+ */
+ public static final short NSSCS_E_CORRUPTED_PACKET_DATA = 0xFFFFFCC1; /* -831 */
+
+ /**
+ * EP password validation failed. Access to the secret denied!
+ */
+ public static final short NSSCS_E_EP_ACCESS_DENIED = 0xFFFFFCC0; /* -832 */
+
+ /**
+ * Schema is not extended to support SecreStore on the target tree.
+ */
+ public static final short NSSCS_E_SCHEMA_NOT_EXTENDED = 0xFFFFFCBF; /* -833 */
+
+ /**
+ * One of the optional service attributes is not instantiated.
+ */
+ public static final short NSSCS_E_ATTR_NOT_FOUND = 0xFFFFFCBE; /* -834 */
+
+ /**
+ * Server has been upgraded and user SecretStore should be updated.
+ */
+ public static final short NSSCS_E_MIGRATION_NEEDED = 0xFFFFFCBD; /* -835 */
+
+ /**
+ * Master password could not be verified to read or unlock the secrets.
+ */
+ public static final short NSSCS_E_MP_PWORD_INVALID = 0xFFFFFCBC; /* -836 */
+
+ /**
+ * Master password has not been set on the SecretStore.
+ */
+ public static final short NSSCS_E_MP_PWORD_NOT_SET = 0xFFFFFCBB; /* -837 */
+
+ /**
+ * Ability to use master password has been disabled.
+ */
+ public static final short NSSCS_E_MP_PWORD_NOT_ALLOWED = 0xFFFFFCBA; /* -838 */
+
+ /**
+ * Not a writeable replica of NDS.
+ */
+ public static final short NSSCS_E_WRONG_REPLICA_TYPE = 0xFFFFFCB9; /* -839 */
+
+ /**
+ * Target attribute is not instantiated in NDS.
+ *
+ * @since 3.0
+ */
+ public static final short NSSCS_E_ATTR_VAL_NOT_FOUND = 0xFFFFFCB8; /* -840 */
+
+ /**
+ * API parameter is not initialized.
+ *
+ * @since 3.0
+ */
+ public static final short NSSCS_E_INVALID_PARAM = 0xFFFFFCB7; /* -841 */
+
+ /**
+ * Connection to SecretStore needs to be over SSL.
+ *
+ * @since 3.0
+ */
+ public static final short NSSCS_E_NEED_SECURE_CHANNEL = 0xFFFFFCB6; /* -842 */
+
+ /**
+ * No server to support the given override configuration is found.
+ *
+ * @since 3.02
+ */
+ public static final short NSSCS_E_CONFIG_NOT_SUPPORTED = 0xFFFFFCB5; /* -843 */
+
+ /**
+ * Attempt to unlock SecretStore failed because the store is not locked.
+ *
+ * @since 3.02
+ */
+ public static final short NSSCS_E_STORE_NOT_LOCKED = 0xFFFFFCB4; /* -844 */
+
+ /**
+ * NDS Replica on the server that holds SecretStore is out of sync with the replica ring.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_TIME_OUT_OF_SYNC = 0xFFFFFCB3; /* -845 */
+
+ /**
+ * Versions of the client dlls don't match.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_VERSION_MISMATCH = 0xFFFFFCB2; /* -846 */
+
+ /**
+ * Buffer supplied for the secret is too short.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_SECRET_BUFF_TOO_SHORT = 0xFFFFFCB1; /* -847 */
+
+ /**
+ * Shared Secret processing and operations failed.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_SH_SECRET_FAILURE = 0xFFFFFCB0; /* -848 */
+
+ /**
+ * Shared Secret parser operations failed.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_PARSER_FAILURE = 0xFFFFFCAF; /* -849 */
+
+ /**
+ * Utf8 string operations failed.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_UTF8_OP_FAILURE = 0xFFFFFCAE; /* -850 */
+
+ /**
+ * Contextless name for LDAP bind does not resolve to a unique DN.
+ *
+ * @since 3.2
+ */
+ public static final short NSSCS_E_CTX_LESS_CN_NOT_UNIQUE = 0xFFFFFCAD; /* -851 */
+
+ /**
+ * Feature not implemented yet.
+ */
+ public static final short NSSCS_E_NOT_IMPLEMENTED = 0xFFFFFC88; /* -888 */
+
+ /**
+ * Product's BETA life has expired! Official release copy should be purchased.
+ */
+ public static final short NSSCS_E_BETA_EXPIRED = 0xFFFFFC7D; /* -899 */
+
+ /**
+ * The error code.
+ */
+ protected int err;
+
+ /**
+ * Determines if this object has a root exception.
+ */
+ protected boolean hasRoot;
+
+ /**
+ * The root Throwable.
+ */
+ protected Throwable root;
+
+ /**
+ * Constructs an empty SSException object. The error code is set to
+ * the 0.
+ */
+ public MiCasaException()
+ {
+ super("");
+ err = 0;
+ root = this;
+ }
+
+ /**
+ * Constructs a SSException according to the error code.
+ *
+ * @param errCode The error code.
+ */
+ public MiCasaException(int errCode)
+ {
+ super(generateMessage(errCode));
+ err = errCode;
+ root = this;
+ }
+
+ /**
+ * Generates a SSException with the specified message.
+ *
+ * @param errCode The SecretStore error code.
+ * @param message The exception message.
+ */
+ public MiCasaException(int errCode, String message)
+ {
+ super(message);
+ err = errCode;
+ root = this;
+ }
+
+ /**
+ * Generates a SSException object that encapsulates the specified exception.
+ * The error code is set to 0. The message from the
+ * encapsulated exception is set as the message for this object.
+ *
+ * @param root The Throwable that is encapsulated in this object as the root.
+ */
+ public MiCasaException(Throwable root)
+ {
+ this(0, root.getMessage());
+ hasRoot = true;
+ this.root = root;
+ }
+
+ /**
+ * Generates a SSException object that encapsulates the specified exception as
+ * its root. The error code is set to 0. The message from the root exception
+ * is set as the message for this object. The additional message is appended to
+ * the end of the encapsulated exception's message with a whitspace seperating
+ * them.
+ *
+ * @param root The Throwable that is encapsulated in this object as the root.
+ * @param message An additional message.
+ */
+ public MiCasaException(Throwable root, String message)
+ {
+ this(0, message + " " + root.getMessage());
+ hasRoot = true;
+ this.root = root;
+ }
+
+ /**
+ * Generates a SSException object that encapsulates the specified exception as
+ * its root. The message from the root exception
+ * is set as the message for this object. The root message is appended to
+ * the end of the message with a whitspace seperating them.
+ *
+ * @param errCode The SecretStore error code.
+ * @param root The Throwable that is encapsulated in this object as the root.
+ * @param errCode An additional message.
+ * @since 3.2
+ */
+ public MiCasaException(int errCode, Throwable root)
+ {
+ this(errCode, generateMessage(errCode) + " " + root.getMessage());
+ err = errCode;
+ hasRoot = true;
+ this.root = root;
+ }
+
+ /**
+ * Returns the message associated with the error code. Note that the returned
+ * value is not translated.
+ *
+ * @param errCode The Error Code.
+ * @return String The message.
+ */
+ public static final String generateMessage(int errCode)
+ {
+ switch (errCode)
+ {
+ case NSSCS_E_OBJECT_NOT_FOUND:
+ return "Can't find the target object DN in NDS";
+
+ case NSSCS_E_NICI_FAILURE:
+ return "NICI operations have failed";
+
+ case NSSCS_E_INVALID_SECRET_ID:
+ return "Secret ID is not in the User Secret Store";
+
+ case NSSCS_E_SYSTEM_FAILURE:
+ return "Some internal operating system services have not been available";
+
+ case NSSCS_E_ACCESS_DENIED:
+ return "Access to the target SecretStore has been denied";
+
+ case NSSCS_E_NDS_INTERNAL_FAILURE:
+ return "Some internal NDS services have not been available";
+
+ case NSSCS_E_SECRET_UNINITIALIZED:
+ return "Secret has not been initialized with a write";
+
+ case NSSCS_E_BUFFER_LEN:
+ return "Size of the buffer is not in a nominal range between minimum and maximum";
+
+ case NSSCS_E_INCOMPATIBLE_VERSION:
+ return "Client and server components are not of the compatible versions";
+
+ case NSSCS_E_CORRUPTED_STORE:
+ return "SecretStore data on the server has been corrupted";
+
+ case NSSCS_E_SECRET_ID_EXISTS:
+ return "Secret ID is already in SecretStore";
+
+ case NSSCS_E_NDS_PWORD_CHANGED:
+ return "User NDS password has been changed by the administrator";
+
+ case NSSCS_E_INVALID_TARGET_OBJECT:
+ return "Target NDS User object not found";
+
+ case NSSCS_E_STORE_NOT_FOUND:
+ return "Target NDS User object does not have a SecretStore";
+
+ case NSSCS_E_SERVICE_NOT_FOUND:
+ return "SecretStore not on the Network";
+
+ case NSSCS_E_SECRET_ID_TOO_LONG:
+ return "Length of the Secret ID buffer exceeds the limit";
+
+ case NSSCS_E_ENUM_BUFF_TOO_SHORT:
+ return "Length of the Enumeration buffer too short";
+
+ case NSSCS_E_NOT_AUTHENTICATED:
+ return "User not authenticated";
+
+ case NSSCS_E_NOT_SUPPORTED:
+ return "Not supported operations";
+
+ case NSSCS_E_NDS_PWORD_INVALID:
+ return "Typed in NDS password not valid";
+
+ case NSSCS_E_NICI_OUTOF_SYNC:
+ return "Session keys of the client and server NICI are out of sync";
+
+ case NSSCS_E_SERVICE_NOT_SUPPORTED:
+ return "Requested service not supported yet";
+
+ case NSSCS_E_TOKEN_NOT_SUPPORTED:
+ return "NDS authentication type not supported";
+
+ case NSSCS_E_UNICODE_OP_FAILURE:
+ return "Unicode text conversion operation failed";
+
+ case NSSCS_E_TRANSPORT_FAILURE:
+ return "Connection to server is lost";
+
+ case NSSCS_E_CRYPTO_OP_FAILURE:
+ return "Cryptographic operation failed";
+
+ case NSSCS_E_SERVER_CONN_FAILURE:
+ return "Opening a connection to the server failed";
+
+ case NSSCS_E_CONN_ACCESS_FAILURE:
+ return "Access to server connection failed";
+
+ case NSSCS_E_ENUM_BUFF_TOO_LONG:
+ return "Size of the enumeration buffer exceeds the limit";
+
+ case NSSCS_E_SECRET_BUFF_TOO_LONG:
+ return "Size of the Secret buffer exceeds the limit";
+
+ case NSSCS_E_SECRET_ID_TOO_SHORT:
+ return "Length of the Secret ID should be greater than zero";
+
+ case NSSCS_E_CORRUPTED_PACKET_DATA:
+ return "Protocol data corrupted on the wire";
+
+ case NSSCS_E_EP_ACCESS_DENIED:
+ return "EP password validation failed. Access to the secret denied";
+
+ case NSSCS_E_SCHEMA_NOT_EXTENDED:
+ return "Schema is not extended to support SecreStore on the target tree";
+
+ case NSSCS_E_ATTR_NOT_FOUND:
+ return "One of the optional service attributes is not instantiated";
+
+ case NSSCS_E_MIGRATION_NEEDED:
+ return "Server has been upgraded and user SecretStore should be updated";
+
+ case NSSCS_E_MP_PWORD_INVALID:
+ return "Master password could not be verified to read or unlock the secrets";
+
+ case NSSCS_E_MP_PWORD_NOT_SET:
+ return "Master password has not been set on the SecretStore";
+
+ case NSSCS_E_MP_PWORD_NOT_ALLOWED:
+ return "Ability to use master password has been disabled";
+
+ case NSSCS_E_WRONG_REPLICA_TYPE:
+ return "Not a writeable replica of NDS";
+
+ case NSSCS_E_ATTR_VAL_NOT_FOUND:
+ return "Target attribute is not instantiated in NDS";
+
+ case NSSCS_E_INVALID_PARAM:
+ return "API parameter is not initialized";
+
+ case NSSCS_E_NEED_SECURE_CHANNEL:
+ return "Connection to SecretStore needs to be over SSL";
+
+ case NSSCS_E_CONFIG_NOT_SUPPORTED:
+ return "No server to support the given override configuration is found";
+
+ case NSSCS_E_STORE_NOT_LOCKED:
+ return "Attempt to unlock SecretStore failed because the store is not locked";
+
+ case NSSCS_E_TIME_OUT_OF_SYNC:
+ return "NDS Replica on the server that holds SecretStore is out of sync with the replica ring";
+
+ case NSSCS_E_VERSION_MISMATCH:
+ return "Versions of the client dlls don't match";
+
+ case NSSCS_E_SECRET_BUFF_TOO_SHORT:
+ return "Buffer supplied for the secret is too short";
+
+ case NSSCS_E_SH_SECRET_FAILURE:
+ return "Shared Secret processing and operations failed";
+
+ case NSSCS_E_PARSER_FAILURE:
+ return "Shared Secret parser operations failed";
+
+ case NSSCS_E_UTF8_OP_FAILURE:
+ return "Utf8 string operations failed";
+
+ case NSSCS_E_CTX_LESS_CN_NOT_UNIQUE:
+ return "Contextless name for LDAP bind does not resolve to a unique DN";
+
+ case NSSCS_E_NOT_IMPLEMENTED:
+ return "Feature not implemented yet";
+
+ case NSSCS_E_BETA_EXPIRED:
+ return "Product's BETA life has expired! Official release copy should be purchased";
+ }
+
+ return "";
+ }
+
+ /**
+ * Returns the error code.
+ *
+ * @return int - The error code.
+ */
+ public int getErrorCode()
+ {
+ return err;
+ }
+
+ /*
+ public String getLocalizedMessage()
+ {
+ try
+ {
+ if (SecretStore.resourceBundle != null)
+ {
+ switch (err)
+ {
+ case NSSCS_E_OBJECT_NOT_FOUND:
+ return SecretStore.resourceBundle.getString("NSSCS_E_OBJECT_NOT_FOUND");
+
+ case NSSCS_E_NICI_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NICI_FAILURE");
+
+ case NSSCS_E_INVALID_SECRET_ID:
+ return SecretStore.resourceBundle.getString("NSSCS_E_INVALID_SECRET_ID");
+
+ case NSSCS_E_SYSTEM_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SYSTEM_FAILURE");
+
+ case NSSCS_E_ACCESS_DENIED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_ACCESS_DENIED");
+
+ case NSSCS_E_NDS_INTERNAL_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NDS_INTERNAL_FAILURE");
+
+ case NSSCS_E_SECRET_UNINITIALIZED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_UNINITIALIZED");
+
+ case NSSCS_E_BUFFER_LEN:
+ return SecretStore.resourceBundle.getString("NSSCS_E_BUFFER_LEN");
+
+ case NSSCS_E_INCOMPATIBLE_VERSION:
+ return SecretStore.resourceBundle.getString("NSSCS_E_INCOMPATIBLE_VERSION");
+
+ case NSSCS_E_CORRUPTED_STORE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CORRUPTED_STORE");
+
+ case NSSCS_E_SECRET_ID_EXISTS:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_ID_EXISTS");
+
+ case NSSCS_E_NDS_PWORD_CHANGED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NDS_PWORD_CHANGED");
+
+ case NSSCS_E_INVALID_TARGET_OBJECT:
+ return SecretStore.resourceBundle.getString("NSSCS_E_INVALID_TARGET_OBJECT");
+
+ case NSSCS_E_STORE_NOT_FOUND:
+ return SecretStore.resourceBundle.getString("NSSCS_E_STORE_NOT_FOUND");
+
+ case NSSCS_E_SERVICE_NOT_FOUND:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SERVICE_NOT_FOUND");
+
+ case NSSCS_E_SECRET_ID_TOO_LONG:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_ID_TOO_LONG");
+
+ case NSSCS_E_ENUM_BUFF_TOO_SHORT:
+ return SecretStore.resourceBundle.getString("NSSCS_E_ENUM_BUFF_TOO_SHORT");
+
+ case NSSCS_E_NOT_AUTHENTICATED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NOT_AUTHENTICATED");
+
+ case NSSCS_E_NOT_SUPPORTED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NOT_SUPPORTED");
+
+ case NSSCS_E_NDS_PWORD_INVALID:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NDS_PWORD_INVALID");
+
+ case NSSCS_E_NICI_OUTOF_SYNC:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NICI_OUTOF_SYNC");
+
+ case NSSCS_E_SERVICE_NOT_SUPPORTED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SERVICE_NOT_SUPPORTED");
+
+ case NSSCS_E_TOKEN_NOT_SUPPORTED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_TOKEN_NOT_SUPPORTED");
+
+ case NSSCS_E_UNICODE_OP_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_UNICODE_OP_FAILURE");
+
+ case NSSCS_E_TRANSPORT_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_TRANSPORT_FAILURE");
+
+ case NSSCS_E_CRYPTO_OP_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CRYPTO_OP_FAILURE");
+
+ case NSSCS_E_SERVER_CONN_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SERVER_CONN_FAILURE");
+
+ case NSSCS_E_CONN_ACCESS_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CONN_ACCESS_FAILURE");
+
+ case NSSCS_E_ENUM_BUFF_TOO_LONG:
+ return SecretStore.resourceBundle.getString("NSSCS_E_ENUM_BUFF_TOO_LONG");
+
+ case NSSCS_E_SECRET_BUFF_TOO_LONG:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_BUFF_TOO_LONG");
+
+ case NSSCS_E_SECRET_ID_TOO_SHORT:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_ID_TOO_SHORT");
+
+ case NSSCS_E_CORRUPTED_PACKET_DATA:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CORRUPTED_PACKET_DATA");
+
+ case NSSCS_E_EP_ACCESS_DENIED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_EP_ACCESS_DENIED");
+
+ case NSSCS_E_SCHEMA_NOT_EXTENDED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SCHEMA_NOT_EXTENDED");
+
+ case NSSCS_E_ATTR_NOT_FOUND:
+ return SecretStore.resourceBundle.getString("NSSCS_E_ATTR_NOT_FOUND");
+
+ case NSSCS_E_MIGRATION_NEEDED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_MIGRATION_NEEDED");
+
+ case NSSCS_E_MP_PWORD_INVALID:
+ return SecretStore.resourceBundle.getString("NSSCS_E_MP_PWORD_INVALID");
+
+ case NSSCS_E_MP_PWORD_NOT_SET:
+ return SecretStore.resourceBundle.getString("NSSCS_E_MP_PWORD_NOT_SET");
+
+ case NSSCS_E_MP_PWORD_NOT_ALLOWED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_MP_PWORD_NOT_ALLOWED");
+
+ case NSSCS_E_WRONG_REPLICA_TYPE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_WRONG_REPLICA_TYPE");
+
+ case NSSCS_E_ATTR_VAL_NOT_FOUND:
+ return SecretStore.resourceBundle.getString("NSSCS_NSSCS_E_ATTR_VAL_NOT_FOUND");
+
+ case NSSCS_E_INVALID_PARAM:
+ return SecretStore.resourceBundle.getString("NSSCS_NSSCS_E_INVALID_PARAM");
+
+ case NSSCS_E_NEED_SECURE_CHANNEL:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NEED_SECURE_CHANNEL");
+
+ case NSSCS_E_CONFIG_NOT_SUPPORTED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CONFIG_NOT_SUPPORTED");
+
+ case NSSCS_E_STORE_NOT_LOCKED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_STORE_NOT_LOCKED");
+
+ case NSSCS_E_TIME_OUT_OF_SYNC:
+ return SecretStore.resourceBundle.getString("NSSCS_E_TIME_OUT_OF_SYNC");
+
+ case NSSCS_E_VERSION_MISMATCH:
+ return SecretStore.resourceBundle.getString("NSSCS_E_VERSION_MISMATCH");
+
+ case NSSCS_E_SECRET_BUFF_TOO_SHORT:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SECRET_BUFF_TOO_SHORT");
+
+ case NSSCS_E_SH_SECRET_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_SH_SECRET_FAILURE");
+
+ case NSSCS_E_PARSER_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_PARSER_FAILURE");
+
+ case NSSCS_E_UTF8_OP_FAILURE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_UTF8_OP_FAILURE");
+
+ case NSSCS_E_CTX_LESS_CN_NOT_UNIQUE:
+ return SecretStore.resourceBundle.getString("NSSCS_E_CTX_LESS_CN_NOT_UNIQUE");
+
+ case NSSCS_E_NOT_IMPLEMENTED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_NOT_IMPLEMENTED");
+
+ case NSSCS_E_BETA_EXPIRED:
+ return SecretStore.resourceBundle.getString("NSSCS_E_BETA_EXPIRED");
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ //do nothing
+ }
+
+ return getMessage();
+ }
+ */
+
+ /**
+ * Returns the root exception of this object. Objects of this type may not
+ * always have a root exception. This method will return this object if
+ * this object does not have a root exception. Use the method
+ * hasRoot to determine if objects of this class have
+ * a root exception.
+ *
+ * @return Throwable - The root.
+ * @see #hasRoot()
+ */
+ public Throwable getRoot()
+ {
+ return root;
+ }
+
+ /**
+ * Determines if this exception has a root exception. Returns true if it
+ * has a root exception, false if not.
+ *
+ * @return boolean - True if this object has a root exception, false if not.
+ * @see #getRoot()
+ */
+ public boolean hasRoot()
+ {
+ return hasRoot;
+ }
+
+}
diff --git a/c_jwrapper/src/com/novell/casa/MiCasaTest.java b/c_jwrapper/src/com/novell/casa/MiCasaTest.java
new file mode 100644
index 00000000..fc952413
--- /dev/null
+++ b/c_jwrapper/src/com/novell/casa/MiCasaTest.java
@@ -0,0 +1,42 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: admin
+ * Date: Apr 19, 2005
+ * Time: 9:52:58 AM
+ * To change this template use Options | File Templates.
+ */
+package com.novell.casa;
+
+public class MiCasaTest {
+
+ public static void main(String[] args)
+ {
+ MiCasa store = new MiCasa();
+
+ try {
+ store.setCredential(0, "JavaAppID", null, 0, "javaAppID Username", "javaAppID Password");
+ store.setCredential(0, "JavaAppID", "Network", 0, "javaAppID Username", "javaAppID Password");
+ store.setCredential(0, "Groupwise", null, 0, "groupwise Username", "gw Password");
+
+ NetCredential nc = store.getCredential(0, "Groupwise", null, 0);
+ System.out.println("Username: "+nc.getUsername());
+ System.out.println("Password: "+nc.getPassword());
+
+ store.removeCredential(0, "Groupwise", null);
+
+ try {
+ nc = store.getCredential(0, "Groupwise", null, 0);
+ } catch (Exception e) {
+ e.printStackTrace(); //To change body of catch statement use Options | File Templates.
+ }
+
+
+ nc = store.getCredential(0, "nonexist2", null, 0);
+ System.out.println("Username: "+nc.getUsername());
+ System.out.println("Password: "+nc.getPassword());
+
+ } catch (Exception e) {
+ e.printStackTrace(); //To change body of catch statement use Options | File Templates.
+ }
+ }
+}
diff --git a/c_jwrapper/src/com/novell/casa/NetCredential.java b/c_jwrapper/src/com/novell/casa/NetCredential.java
new file mode 100644
index 00000000..da28b67e
--- /dev/null
+++ b/c_jwrapper/src/com/novell/casa/NetCredential.java
@@ -0,0 +1,46 @@
+/**
+ * Created by IntelliJ IDEA.
+ * User: admin
+ * Date: Apr 19, 2005
+ * Time: 9:48:14 AM
+ * To change this template use Options | File Templates.
+ */
+package com.novell.casa;
+
+public class NetCredential {
+
+ private String m_sUsername = "";
+ private String m_sPassword = "";
+
+ public void NetCredential(String username, String password)
+ {
+ m_sUsername = username;
+ m_sPassword = password;
+ }
+
+ public String getUsername()
+ {
+ return m_sUsername;
+ }
+
+ public String getPassword()
+ {
+ return m_sPassword;
+ }
+
+ public void setUsername(String sUsername)
+ {
+ if (sUsername != null)
+ {
+ m_sUsername = sUsername;
+ }
+ }
+
+ public void setPassword(String sPassword)
+ {
+ if (sPassword != null)
+ {
+ m_sPassword = sPassword;
+ }
+ }
+}
diff --git a/c_micasacache/Makefile b/c_micasacache/Makefile
new file mode 100644
index 00000000..9789902a
--- /dev/null
+++ b/c_micasacache/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = micasacache
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+BIN_NAME = $(TARGET)$(xtra).$(BIN)
+LIB_NAME = $(TARGET)$(xtra).$(LIB)
+
+#
+# target object and source files
+#
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cl
diff --git a/c_micasacache/link.lux b/c_micasacache/link.lux
new file mode 100644
index 00000000..e0b138e1
--- /dev/null
+++ b/c_micasacache/link.lux
@@ -0,0 +1,3 @@
+LINK = $(AR) \
+ $(LIBDIR)$(XTRA)/lib$(TARGET).a \
+ $(OBJDIR)/*.$(O)
diff --git a/c_micasacache/link.w32 b/c_micasacache/link.w32
new file mode 100644
index 00000000..55e6c807
--- /dev/null
+++ b/c_micasacache/link.w32
@@ -0,0 +1,51 @@
+LINK_DEF_BLD = \
+ echo "$(addprefix $(OBJDIR),$(notdir $(OBJS)))" > $(LINKDEF);\
+ echo "$(MSC)lib/kernel32.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/msvcrt.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/advapi32.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/ole32.lib" >> $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)lib" >> $(LINKDEF);\
+ echo "/DLL" >> $(LINKDEF);\
+ echo "/PDBTYPE:con" >> $(LINKDEF);\
+ echo "/OUT:$(BINDIR)$(basename $(notdir $@)).dll" >> $(LINKDEF);\
+ echo "/MAP:$(BINDIR)$(basename $(notdir $@)).map" >> $(LINKDEF);\
+ echo "/PDB:$(BINDIR)$(basename $(notdir $@)).pdb" >> $(LINKDEF);\
+ echo "/DEBUG" >> $(LINKDEF);\
+ echo "/DEBUGTYPE:BOTH" >> $(LINKDEF);\
+ echo "/MACHINE:IX86" >> $(LINKDEF);\
+ echo "/SUBSYSTEM:WINDOWS" >> $(LINKDEF);\
+ echo "/INCREMENTAL:NO" >> $(LINKDEF);\
+ echo "/VERSION:$(BLD_VER)" >> $(LINKDEF);\
+ echo "/FIXED:NO" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libc" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oldnames" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comctl32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:olepro32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oleaut32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:wininet" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:uuid" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:user32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libcmt" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libcmtd" >> $(LINKDEF);\
+ echo "/WARN:3" >> $(LINKDEF);\
+ echo "/OPT:REF" >> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecretStore">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheEnumerateKeychainIDs">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheAddKeychain">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveKeychain">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheEnumerateSecretIDs">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheReadSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheWriteSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheGetSecretStoreInfo">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheGetKeychainInfo">> $(LINKDEF);\
+ echo "/EXPORT:sscs_LockCache">> $(LINKDEF);\
+ echo "/EXPORT:sscs_UnlockCache">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_SetMasterPasscode">> $(LINKDEF);\
+ echo "/EXPORT:sscs_SetMasterPassword">> $(LINKDEF);\
+ echo "/EXPORT:sscs_IsSecretPersistent">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheWriteKey">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheReadKey">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheCloseSecretStore">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheOpenSecretStore">> $(LINKDEF);
diff --git a/c_micasacache/link_mdd.w32 b/c_micasacache/link_mdd.w32
new file mode 100644
index 00000000..9c54660d
--- /dev/null
+++ b/c_micasacache/link_mdd.w32
@@ -0,0 +1,52 @@
+LINK_DEF_BLD = \
+ echo "$(addprefix $(OBJDIR),$(notdir $(OBJS)))" > $(LINKDEF);\
+ echo "$(MSC)lib/kernel32.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/msvcrt.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/user32.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/advapi32.lib" >> $(LINKDEF);\
+ echo "$(MSC)lib/ole32.lib" >> $(LINKDEF);\
+ echo "/LIBPATH:$(MSC)lib" >> $(LINKDEF);\
+ echo "/DLL" >> $(LINKDEF);\
+ echo "/PDBTYPE:con" >> $(LINKDEF);\
+ echo "/OUT:$(BINDIR)$(basename $(notdir $@)).dll" >> $(LINKDEF);\
+ echo "/MAP:$(BINDIR)$(basename $(notdir $@)).map" >> $(LINKDEF);\
+ echo "/PDB:$(BINDIR)$(basename $(notdir $@)).pdb" >> $(LINKDEF);\
+ echo "/DEBUG" >> $(LINKDEF);\
+ echo "/DEBUGTYPE:BOTH" >> $(LINKDEF);\
+ echo "/MACHINE:IX86" >> $(LINKDEF);\
+ echo "/SUBSYSTEM:WINDOWS" >> $(LINKDEF);\
+ echo "/INCREMENTAL:NO" >> $(LINKDEF);\
+ echo "/VERSION:$(BLD_VER)" >> $(LINKDEF);\
+ echo "/FIXED:NO" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libc" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oldnames" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:comctl32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:olepro32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:oleaut32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:wininet" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:uuid" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:user32" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libcmt" >> $(LINKDEF);\
+ echo "/NODEFAULTLIB:libcmtd" >> $(LINKDEF);\
+ echo "/WARN:3" >> $(LINKDEF);\
+ echo "/OPT:REF" >> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecretStore">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheEnumerateKeychainIDs">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheAddKeychain">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveKeychain">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheEnumerateSecretIDs">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheReadSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheWriteSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheGetSecretStoreInfo">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheGetKeychainInfo">> $(LINKDEF);\
+ echo "/EXPORT:sscs_LockCache">> $(LINKDEF);\
+ echo "/EXPORT:sscs_UnlockCache">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheRemoveSecret">> $(LINKDEF);\
+ echo "/EXPORT:sscs_SetMasterPasscode">> $(LINKDEF);\
+ echo "/EXPORT:sscs_SetMasterPassword">> $(LINKDEF);\
+ echo "/EXPORT:sscs_IsSecretPersistent">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheWriteKey">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheReadKey">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheCloseSecretStore">> $(LINKDEF);\
+ echo "/EXPORT:sscs_CacheOpenSecretStore">> $(LINKDEF);
diff --git a/c_micasacache/objs.lux b/c_micasacache/objs.lux
new file mode 100644
index 00000000..62b1290f
--- /dev/null
+++ b/c_micasacache/objs.lux
@@ -0,0 +1,4 @@
+OBJS=\
+ sscs_unx_cache.$(O)\
+ sscs_unx_ipc_client.$(O)\
+ sscs_ipc.$(O)
diff --git a/c_micasacache/objs.w32 b/c_micasacache/objs.w32
new file mode 100644
index 00000000..8a344f27
--- /dev/null
+++ b/c_micasacache/objs.w32
@@ -0,0 +1,5 @@
+OBJS=\
+ sscs_unx_cache.$(O)\
+ sscs_unx_ipc_client.$(O)\
+ sscs_ipc.$(O)
+
diff --git a/c_micasacache/sscs_ipc.c b/c_micasacache/sscs_ipc.c
new file mode 100644
index 00000000..04c6d7a6
--- /dev/null
+++ b/c_micasacache/sscs_ipc.c
@@ -0,0 +1,244 @@
+#include "sscs_ipc.h"
+
+#ifdef SSCS_WIN32_PLAT_F
+#include "windows.h"
+#define XTIER_RPC_PIPE TEXT("\\\\.\\PIPE\\SS_RPC_PIPE")
+
+// global
+int firstReadAfterWrite = 0;
+#endif
+
+/*
+ */
+
+#ifdef SSCS_LINUX_PLAT_F
+int ipc_unx_create()
+{
+ int retVal = 0;
+ struct sockaddr_un servAddr;
+ char path[MAX_SOCKET_PATH_LEN];
+ int sockFd = 0;
+ do
+ {
+ sockFd = socket(AF_UNIX,SOCK_STREAM,0);
+ if( sockFd < 0 )
+ {
+ retVal = sockFd;
+ break;
+ }
+ memset(&servAddr,0,sizeof(servAddr));
+ servAddr.sun_family = AF_UNIX;
+
+ strcpy(servAddr.sun_path,"/tmp/.novellCASA");
+ retVal = connect(sockFd,(struct sockaddr*)&servAddr, sizeof(servAddr));
+ if(retVal < 0 )
+ {
+ DMSG(("Connect fails : %s\n",strerror(errno)));
+ DMSG(("Closing socket : %d\n",sockFd));
+ close(sockFd);
+ break;
+ }
+ else
+ retVal = sockFd;
+ }while(0);
+ return retVal;
+}
+
+#else
+
+void * ipc_win_create()
+{
+
+//#ifdef SSCS_WIN32_PLAT_F
+ // connect to the named Pipe
+ HANDLE hPipe = NULL;
+ int rcode;
+ DWORD mode = PIPE_READMODE_MESSAGE;
+
+ hPipe = CreateFile(
+ XTIER_RPC_PIPE,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ NULL, //null,
+ OPEN_EXISTING,
+ 0,
+ 0);
+
+ if (hPipe == INVALID_HANDLE_VALUE)
+ {
+ rcode = GetLastError();
+ return 0;
+ }
+
+ return hPipe;
+}
+
+#endif
+
+#ifdef SSCS_LINUX_PLAT_F
+int ipc_unx_write(int fd, Byte *pData, int bytes)
+{
+ int retVal = write(fd,pData,bytes);
+ if( retVal < 0 )
+ {
+ DMSG(("Write returns error : %d - %s\n",retVal, strerror(errno)));
+ }
+ return retVal;
+
+//#endif
+}
+
+#else
+
+int ipc_win_write(HANDLE hPipe, LPCVOID lpBuffer, DWORD bytesToWrite)
+{
+//#ifdef SSCS_WIN32_PLAT_F
+ BOOL rcode;
+ int icode;
+ DWORD lpBytesWritten = 0;
+ //LPCVOID msgLen = malloc(4);
+
+
+
+// rcode = WaitNamedPipe(
+// XTIER_RPC_PIPE,
+// NMPWAIT_WAIT_FOREVER);
+
+
+
+ // the server expects us to first write the number of bytes in the msg we're about to write.
+ rcode = WriteFile(
+ hPipe,
+ (LPCVOID)&bytesToWrite,
+ 4,
+ &lpBytesWritten,
+ NULL);
+
+ if (!rcode)
+ {
+ icode = GetLastError();
+ return 0;
+ }
+
+
+// rcode = WaitNamedPipe(
+// XTIER_RPC_PIPE,
+// NMPWAIT_WAIT_FOREVER);
+
+ rcode = WriteFile(
+ hPipe,
+ lpBuffer, //LPCVOID lpBuffer,
+ bytesToWrite, //DWORD nNumberOfBytesToWrite,
+ &lpBytesWritten, // LPDWORD lpNumberOfBytesWritten,
+ NULL); //LPOVERLAPPED lpOverlapped
+
+ if (!rcode)
+ {
+ icode = GetLastError();
+
+ }
+
+ firstReadAfterWrite = 1;
+ return lpBytesWritten;
+}
+
+#endif
+
+/*
+ *
+ */
+
+#ifdef SSCS_LINUX_PLAT_F
+
+int ipc_unx_read(int fd, Byte *pData, int bytes)
+{
+
+ int bytesToRead = 0; // Keep track of number of bytes to read
+ int bytesRead = 0; // Number of bytes read
+ int retVal = 0;
+
+ for(bytesToRead = bytes; bytesToRead;)
+ {
+ bytesRead = read(fd, pData, bytesToRead);
+ if(bytesRead < 0)
+ {
+ return -1;
+ }
+ bytesToRead -= bytesRead;
+ pData += bytesRead;
+ }
+ return bytesRead;
+}
+//#endif
+
+
+#else
+
+int ipc_win_read(HANDLE hPipe, LPVOID lpBuffer, DWORD numOfBytesToRead)
+{
+//#ifdef SSCS_WIN32_PLAT_F
+
+ BOOL rcode;
+ DWORD numBytesRead = 0;
+ LPVOID pMsgLen = malloc(4);
+ int icode;
+
+ if (firstReadAfterWrite)
+ {
+ firstReadAfterWrite = 0;
+
+ // server first sends the number of bytes that gets sent.
+ rcode = ReadFile(
+ hPipe, //HANDLE hFile,
+ pMsgLen, //LPVOID lpBuffer,
+ 4, //numOfBytesToRead, //DWORD nNumberOfBytesToRead,
+ &numBytesRead, //LPDWORD lpNumberOfBytesRead,
+ NULL); //LPOVERLAPPED lpOverlapped
+
+ if (!rcode)
+ {
+ icode = GetLastError();
+ return 0;
+ }
+
+ }
+
+ rcode = ReadFile(
+ hPipe, //HANDLE hFile,
+ lpBuffer, //LPVOID lpBuffer,
+ numOfBytesToRead, //DWORD nNumberOfBytesToRead,
+ &numBytesRead, //LPDWORD lpNumberOfBytesRead,
+ NULL); //LPOVERLAPPED lpOverlapped
+
+
+ if (pMsgLen)
+ free(pMsgLen);
+
+ return numBytesRead;
+}
+#endif
+
+
+#ifdef SSCS_LINUX_PLAT_F
+int ipc_unx_close(int fd)
+{
+ return close(fd);
+
+}
+#else
+
+
+int ipc_win_close(HANDLE hPipe)
+{
+//#ifdef SSCS_WIN32_PLAT_F
+
+
+ BOOL rcode;
+ rcode = DisconnectNamedPipe(hPipe);
+ rcode = CloseHandle(hPipe);
+ return 0;
+
+}
+
+
+#endif
diff --git a/c_micasacache/sscs_unx_cache.c b/c_micasacache/sscs_unx_cache.c
new file mode 100644
index 00000000..952c9776
--- /dev/null
+++ b/c_micasacache/sscs_unx_cache.c
@@ -0,0 +1,670 @@
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C"
+{
+#endif
+#include
+
+#ifdef SSCS_WIN32_PLAT_F
+#include
+#include
+#endif
+
+#include "sscs_cache.h"
+
+/* Starts a session with the cache and returns a handle to the cache.
+ * Parametrs:
+ * secretStoreID
+ * (IN) Points to SecretStoreID structure.
+ *
+ * Return Values:
+ * returns a pointer to SecretStoreHandle structure.
+ */
+void* sscs_CacheOpenSecretStore
+(
+ void *secretStoreID,
+ uint32_t ssFlags,
+ void *reserved
+
+)
+{
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
+ SSCS_LINUX_SS_HANDLE_T *platHandle = NULL;
+ int32_t retVal = 0;
+
+ ssHandle = (SSCS_SECRETSTORE_HANDLE_T *)malloc(sizeof(SSCS_SECRETSTORE_HANDLE_T));
+ if(NULL == ssHandle)
+ {
+ return NULL;
+ }
+
+ platHandle = (SSCS_LINUX_SS_HANDLE_T *)malloc(sizeof(SSCS_LINUX_SS_HANDLE_T));
+ if(NULL == platHandle)
+ {
+ free(ssHandle);
+ return NULL;
+ }
+ memset(ssHandle,0,sizeof(SSCS_SECRETSTORE_HANDLE_T));
+ memset(platHandle,0,sizeof(SSCS_LINUX_SS_HANDLE_T));
+
+ ssHandle->platHandle = platHandle;
+
+ retVal = ipc_OpenSecretStore(secretStoreID,ssHandle);
+ if(retVal)
+ {
+ free(platHandle);
+ free(ssHandle);
+ return NULL;
+ }
+
+ return ssHandle;
+}
+
+/* Closes the secretstore and destroys the SecretStore context for that
+ * application.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ *
+ * Return Values
+ *
+ */
+int32_t sscs_CacheCloseSecretStore
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ if(ssHandleCopy->platHandle)
+ {
+ retVal = ipc_CloseSecretStore(ssHandleCopy, ssFlags);
+ free(ssHandleCopy->platHandle);
+ }
+
+ if(ssHandleCopy)
+ free(ssHandleCopy);
+
+ return retVal;
+}
+
+/* Removes all application defined keychains from the store. It also removes
+ * secrets stored in system defined keychains.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ *
+ * Return Values:
+ */
+int32_t sscs_CacheRemoveSecretStore
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_RemoveSecretStore(ssHandleCopy);
+
+ return retVal;
+}
+
+/* Enumerates key chain ids available in the store.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ *
+ * kcIDList
+ * (OUT) Points to the key chain id enumeration structure. Points to
+ * KeyChainIDList structure.
+ *
+ * bytesRequired
+ * (OUT) Specifies the buffer requirement if it is not possible
+ * to copy KeyChain IDs in the buffer passed by the application.
+ *
+ * Return Values:
+ *
+ */
+int32_t sscs_CacheEnumerateKeychainIDs
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_SRCH_KEY_T *searchKey,
+ SSCS_KEYCHAIN_ID_LIST_T *kcIDList,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_EnumerateKeychainIDs(ssHandleCopy,kcIDList);
+
+ return retVal;
+}
+
+/* Creates a new keychain in the store.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * ssFlags
+ * (IN) Can be a combination of follwing flags:
+ * SSCS_HIDDEN_LOCAL_KEY_CHAIN_F
+ * SSCS_SESSION_KEY_CHAIN_F
+ * SSCS_LOCAL_KEY_CHAIN_F
+ * SSCS_REMOTE_KEY_CHAIN_F
+ * SSCS_LOCAL_REMOTE_CHAIN_F
+ * SSCS_RESERVED1_KEY_CHAIN_F
+ * SSCS_RESERVED2_KEY_CHAIN_F
+ * keychainID
+ * (IN) Specifies the unique keychain ID within the secretstore.
+ *
+ */
+int32_t sscs_CacheAddKeychain
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_AddKeychain(ssHandleCopy,ssFlags,keychainID);
+
+ return retVal;
+}
+
+
+/* Removes the specified keychain from the store.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * keychainID
+ * (IN) Specifies the unique keychain ID within the secretstore.
+ *
+ * Return Values:
+ */
+int32_t sscs_CacheRemoveKeychain
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_RemoveKeychain(ssHandleCopy,keyChainID);
+
+ return retVal;
+}
+
+/* Enumerates secret ids in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * keyChainID
+ * (IN) handle obtained during sscs_CacheOpenKeychain.
+ *
+ *
+ * secretIDList
+ * (OUT) Points to the secret id enumeration structure. Points to
+ * SecretIDList structure.
+ *
+ * bytesRequired
+ * (OUT) Specifies the buffer requirement if it is not possible
+ * to copy Secret IDs in the buffer passed by the application.
+ * Return Values:
+ */
+int32_t sscs_CacheEnumerateSecretIDs
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_SRCH_KEY_T *searchKey,
+ SSCS_SECRET_ID_LIST_T *secretIDList,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_EnumerateSecretIDs(ssHandleCopy,keyChainID,secretIDList);
+
+ return retVal;
+}
+
+
+/* Reads Secret value for a given Secret ID in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ * secretID
+ * (IN) Specifies the unique secret ID within the keychain. This data is
+ * encoded in SSCS_SECRET_ID_T.
+ *
+ * secretData
+ * (IN/OUT) Specifies the information of the secret stored w.r.t the secretID.
+ * Points to a SSCS_SECRET_T structure.
+ *
+ * epPassword
+ * (IN) Points to an optional field to pass in the Enhanced Protection Password
+ * for reading a secret.When the password is not present, you can pass in a NULL.
+ *
+ * bytesRequired
+ * (OUT) Specifies the buffer requirement if it is not possible
+ * to copy Secret data in the buffer passed by the application.
+
+ *
+ * Return Values :
+ */
+int32_t sscs_CacheReadSecret
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_SECRET_T *secretData,
+ SSCS_PASSWORD_T *epPassword,
+ uint32_t *bytesRequired,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_ReadSecret(ssHandleCopy,keychainID,secretID,secretData,epPassword,bytesRequired);
+
+ return retVal;
+}
+
+
+/* Writes Secret value for a given Secret ID in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * ssFlags
+ * (IN) ...
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ * secretID
+ * (IN) Specifies the unique secret ID within the keychain. This data is
+ * encoded in SSCS_SECRET_ID_T.
+ *
+ * secretData
+ * (IN) Specifies the information of the secret stored w.r.t the secretID.
+ * Points to a SSCS_SECRET_T structure.
+ *
+ *
+ * epPassword
+ * (IN) Points to an optional field to pass in the Enhanced Protection Password
+ * for reading a secret.When the password is not present, you can pass in a NULL.
+ *
+ *
+ *
+ * Return Values:
+ */
+int sscs_CacheWriteSecret
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_SECRET_T *secretData,
+ SSCS_PASSWORD_T *epPassword,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_WriteSecret(ssHandleCopy,ssFlags,keyChainID,secretID,secretData,epPassword, reserved);
+
+ return retVal;
+}
+
+
+/* Removes Secret for a given Secret ID in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ * secretID
+ * (IN) Specifies the unique secret ID within the keychain. This data is
+ * encoded in SSCS_SECRET_ID_T.
+ *
+ *
+ * epPassword
+ * (IN) Points to an optional field to pass in the Enhanced Protection Password
+ * for reading a secret.When the password is not present, you can pass in a NULL.
+ *
+ * Return Values:
+ */
+int32_t sscs_CacheRemoveSecret
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_SECRET_ID_T *secredID,
+ SSCS_PASSWORD_T *epPassword,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_RemoveSecret(ssHandleCopy,keyChainID,secredID,epPassword);
+
+ return retVal;
+}
+
+/* Returns statistical information regarding the SecretStore and its Keychains.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context with respect to the instance of open cache in it.
+ *
+ *
+ * ssInfo
+ * (OUT) This structure contains the statistical information regarding the
+ * SecretStore and its Keychains.
+ *
+ * Return Values:
+ */
+int32_t sscs_CacheGetSecretStoreInfo
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_SECRETSTORE_INFO_T *ssInfo,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_GetSecretStoreInfo(ssHandleCopy,ssInfo);
+
+ return retVal;
+}
+
+/* Retrieves the statistical information regarding the target Keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context with respect to the instance of open cache in it.
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ *
+ * kcInfo
+ * (OUT) This structure contains the statistical information regarding the
+ * Keychain.
+ *
+ *
+ * Return Values:
+ */
+int32_t sscs_CacheGetKeychainInfo
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_KEYCHAIN_INFO_T *kcInfo,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_GetKeychainInfo(ssHandleCopy,keyChainID,kcInfo);
+
+ return retVal;
+}
+
+/* This call locks that cache to prevent access until the MasterPassword is
+ * supplied.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context with respect to the instance of open cache in it.
+ *
+ * Return Values :
+ */
+int32_t sscs_LockCache
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_LockCache(ssHandleCopy);
+
+ return retVal;
+}
+
+/* This unlocks previously locked cache using the MasterPassword
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context with respect to the instance of open cache in it.
+ * masterPassword
+ *
+ * Return Values :
+ */
+int32_t sscs_UnlockCache
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_PASSCODE_T *passcode,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_UnlockCache(ssHandle,passcode);
+
+ return retVal;
+}
+
+int32_t sscs_SetMasterPasscode
+(
+ void *ssHandle,
+ SSCS_PASSCODE_T *passcode,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ retVal = ipc_SetMasterPasscode(ssHandle,passcode);
+ return retVal;
+}
+
+int32_t sscs_SetMasterPassword
+(
+ void *ssHandle,
+ SSCS_PASSWORD_T *password,
+ SSCS_HINT_T *hint,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ retVal = ipc_SetMasterPassword(ssHandle,password,hint);
+ return retVal;
+}
+
+//#if 0
+/* Writes A key-value for a given Secret ID in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * ssFlags
+ * (IN) ...
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ * secretID
+ * (IN) Specifies the unique secret ID within the keychain. This data is
+ * encoded in SSCS_SECRET_ID_T.
+ *
+ * secretData
+ * (IN) Specifies the information of the secret stored w.r.t the secretID.
+ * Points to a SSCS_SECRET_T structure.
+ *
+ *
+ * epPassword
+ * (IN) Points to an optional field to pass in the Enhanced Protection Password
+ * for reading a secret.When the password is not present, you can pass in a NULL.
+ *
+ *
+ *
+ * Return Values:
+ */
+int sscs_CacheWriteKey
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_SECRET_ID_T *secretID,
+ SS_UTF8_T *key,
+ uint32_t keyLen,
+ uint8_t *val,
+ uint32_t valLen,
+ SSCS_PASSWORD_T *epPassword,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_WriteKey(ssHandleCopy,ssFlags,keyChainID,secretID,key,keyLen,val,valLen,epPassword, reserved);
+
+ return retVal;
+}
+/* Reads Secret value for a given Secret ID in a given keychain.
+ *
+ * Parameters:
+ * ssHandle
+ * (IN) Handle returned by sscs_CacheOpenSecretStore function. This will have
+ * context information regarding the SecretStore.
+ *
+ * keyChainID
+ * (IN) KeyChainID where the specified SecretID stored.
+ *
+ * secretID
+ * (IN) Specifies the unique secret ID within the keychain. This data is
+ * encoded in SSCS_SECRET_ID_T.
+ *
+ * secretData
+ * (IN/OUT) Specifies the information of the secret stored w.r.t the secretID.
+ * Points to a SSCS_SECRET_T structure.
+ *
+ * epPassword
+ * (IN) Points to an optional field to pass in the Enhanced Protection Password
+ * for reading a secret.When the password is not present, you can pass in a NULL.
+ *
+ * bytesRequired
+ * (OUT) Specifies the buffer requirement if it is not possible
+ * to copy Secret data in the buffer passed by the application.
+
+ *
+ * Return Values :
+ */
+int32_t sscs_CacheReadKey
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SS_UTF8_T *key,
+ uint32_t keyLen,
+ uint8_t *val,
+ uint32_t valLen,
+ SSCS_PASSWORD_T *epPassword,
+ uint32_t *bytesRequired,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_ReadKey(ssHandleCopy,keychainID,secretID,key,keyLen,val,valLen,epPassword,bytesRequired);
+
+ return retVal;
+}
+int sscs_IsSecretPersistent
+(
+ void *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keyChainID,
+ SSCS_SECRET_ID_T *secretID,
+ void *reserved
+)
+{
+ int32_t retVal = 0;
+ SSCS_SECRETSTORE_HANDLE_T *ssHandleCopy = (SSCS_SECRETSTORE_HANDLE_T *)ssHandle;
+
+ retVal = ipc_IsSecretPersistent(ssHandleCopy,ssFlags,keyChainID,secretID,reserved);
+
+ return retVal;
+}
+
+//#endif
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+
diff --git a/c_micasacache/sscs_unx_ipc_client.c b/c_micasacache/sscs_unx_ipc_client.c
new file mode 100644
index 00000000..b076ccb1
--- /dev/null
+++ b/c_micasacache/sscs_unx_ipc_client.c
@@ -0,0 +1,2410 @@
+#include "sscs_ipc.h"
+
+#define MAX_RECV_HEAD_LEN 6
+#define WINDOWS_LOGIN_ID 1
+
+// return codes
+#define MAX_RETURN_CODE 21
+int32_t static gReturnCodes[21] = {
+ NSSCS_SUCCESS, //SSCS_REPLY_SUCCESS 0
+ NSSCS_E_INVALID_PARAM, //SSCS_E_INVALID_MESSAGE -1
+ NSSCS_E_INCOMPATIBLE_VERSION, //SSCS_E_VERSION_NOT_SUPPORTED -2
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_SYSTEM_ERROR -3
+ NSSCS_E_SERVICE_NOT_SUPPORTED, //SSCS_E_REPLY_NOT_AVAILABLE -4
+ NSSCS_E_INVALID_SECRET_ID, // REQUIRES New
+ //SSCS_E_INVALID_KEYCHAIN -5
+ NSSCS_E_INVALID_SECRET_ID, //SSCS_E_INVALID_SECRETID -6
+ NSSCS_E_SECRET_ID_EXISTS, // REQUIRES NEW -//SSCS_E_KEYCHAIN_ALREADY_EXISTS -7
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_MAX_KEYCHAINS_REACHED -8
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_ADD_KEYCHAIN_FAILED -9
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_NO_KEYCHAINS_EXIST -10
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_KEYCHAIN_DOES_NOT_EXIST -11
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_REMOVE_KEYCHAIN_FAILED -12
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_WRITE_SECRET_FAILED -13
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_ADDING_DEFAULT_KEYCHAIN_FAILED -14
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_NO_SECRETS_EXIST -15
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_REMOVE_SECRET_FAILED -16
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_GET_SOCKET_PATH_FAILED -17
+ NSSCS_E_SYSTEM_FAILURE, //SSCS_E_CREATE_SOCKET_FAILED -18
+ NSSCS_E_INVALID_SECRET_ID, //SSCS_E_SECRETID_DOES_NOT_EXIST -19
+ NSSCS_E_INVALID_PARAM, //SSCS_E_INVALID_INPUT -20
+};
+
+/*-----------------------------------------------------------------------------
+Function - HexDump
+Description - Dumps the information in Hex and Ascii. (16 Bytes per line).
+Parameters
+ lpBuf (IN) - Data to be dumped.
+ iBytes (IN) - Number of bytes in lpBuf.
+Returns - none
+-----------------------------------------------------------------------------*/
+#ifdef DEBUG
+void HexDump(char *lpBuf, int iBytes)
+{
+ char buffer[17];
+ int count,count1, ch;
+
+ printf("\n\n");
+ for(count = 0; count < iBytes; )
+ {
+ for(count1 = 0; count1 < 16;count1++)
+ {
+ ch = lpBuf[count++];
+ ch &= 0x000000FF;
+ printf("%02x ",ch);
+ if(!(count % 8))
+ printf("- ");
+
+ buffer[count1] = (ch > 0x20) ? ch : '.';
+ }
+ buffer[count1] = '\0';
+ printf(" %s\n",buffer);
+ }
+ return;
+}
+#endif
+
+/* Map the sscs returned return code to NDK error codes */
+int32_t mapReturnCode(int32_t sscsCode)
+{
+ sscsCode *= -1;
+ if(sscsCode < 0 || sscsCode > MAX_RETURN_CODE)
+ return NSSCS_E_SYSTEM_FAILURE;
+ return gReturnCodes[sscsCode];
+}
+
+/* Function name :
+ * Tokenize
+ * Arguments :
+ * tokenType - 0 for keychainids and 1 for secretids
+ * buffer - the buffer to be parsed
+ * idList - the list which needs to be filled with the tokens.
+ * Description:
+ * As Windows does not have strtok_r call, this function would
+ * abstract the tokenizing functionality.
+ * On Linux, this would call strtok_r, whereas on Windows
+ * strtok would be used.
+ */
+int Tokenize( int tokenType, char* buffer, void *idList )
+{
+ int i = 0;
+ char *tok = NULL;
+
+#ifdef SSCS_LINUX_PLAT_F
+
+ char *tmpPtr = NULL;
+
+
+ for (tok = strtok_r((char *)buffer,"*",&tmpPtr);
+ tok != NULL;
+ tok = strtok_r(NULL,"*",&tmpPtr))
+ {
+ if( 0 == tokenType )
+ {
+ sscs_Utf8Strcpy(((SSCS_KEYCHAIN_ID_T*)idList)[i].keychainID,tok);
+ ((SSCS_KEYCHAIN_ID_T*)idList)[i].len = sscs_Utf8StrSize(tok);
+ }
+ else
+ {
+ sscs_Utf8Strcpy(((SSCS_SECRET_ID_T*)idList)[i].id,tok);
+ ((SSCS_SECRET_ID_T*)idList)[i].len = sscs_Utf8StrSize(tok);
+ }
+ i++;
+ }
+#endif
+
+#ifdef SSCS_WIN32_PLAT_F
+ char seps[] = "*";
+
+ /* Establish string and get the first token: */
+ tok = strtok( (char *)buffer, seps );
+ while( tok != NULL )
+ {
+ /* While there are tokens in "string" */
+ if( 0 == tokenType )
+ {
+ sscs_Utf8Strcpy(((SSCS_KEYCHAIN_ID_T*)idList)[i].keychainID,tok);
+ ((SSCS_KEYCHAIN_ID_T*)idList)[i].len = sscs_Utf8StrSize(tok);
+ }
+ else
+ {
+ sscs_Utf8Strcpy(((SSCS_SECRET_ID_T*)idList)[i].id,tok);
+ ((SSCS_SECRET_ID_T*)idList)[i].len = sscs_Utf8StrSize(tok);
+ }
+ i++;
+
+ /* Get next token: */
+ tok = strtok( NULL, seps );
+ }
+
+
+
+#endif
+ return 0;
+}
+
+int32_t ipc_OpenSecretStore
+(
+ void *secretStoreID,
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ SSCS_SECRETSTORE_T *ssID = (SSCS_SECRETSTORE_T *)secretStoreID;
+
+ uint16_t msgid = 0;
+ uint32_t ssNameLen = 0;
+ uint32_t msgLen = 0;
+ uint32_t version = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == secretStoreID) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ *(int *)ssHandle->platHandle = IPC_CREATE();
+ if(*(int *)ssHandle->platHandle < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Prepare Request buffer
+ ssNameLen = sscs_Utf8StrSize(ssID->ssName);
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN +
+ MSG_STRING_LEN +
+ ssNameLen;
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_OPEN_SECRET_STORE_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+
+ memcpy(pReq,&ssID->version,MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ memcpy(pReq,&ssNameLen,MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+
+ memcpy(pReq,ssID->ssName,ssNameLen);
+ pReq += ssNameLen;
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,(char *)gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ DMSG(("Write failed : %s\n",strerror(errno)));
+ DMSG(("Closing socket : %d\n",*(int*)ssHandle->platHandle));
+ DMSG(("ipc_OpenSecretStore:IPC_WRITE returned :%d\n",retVal));
+ IPC_CLOSE(*(int *)ssHandle->platHandle);
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ #ifdef DEBUG
+ //HexDump(gpReqBuf, msgLen);
+ #endif
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_OPENSS);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("ipc_OpenSecretStore:read returned :%d\n",retVal));
+ DMSG(("Read failed : %s\n",strerror(errno)));
+ DMSG(("Closing socket : %d\n",*(int*)ssHandle->platHandle));
+
+ IPC_CLOSE(*(int *)ssHandle->platHandle);
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&version, pReply, MSG_DWORD_LEN);
+ pReply += MSG_DWORD_LEN;
+ // Check for version here.
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ if(sockReturn != SSCS_REPLY_SUCCESS)
+ {
+ DMSG(("ipc_OpenSecretStore:sscs returned :%d\n",sockReturn));
+ DMSG(("Closing socket : %d\n",*(int*)ssHandle->platHandle));
+ IPC_CLOSE(*(int *)ssHandle->platHandle);
+ retCode = mapReturnCode(sockReturn);
+ break;
+ }
+ }while(0);
+
+ return retCode; // map the return code from sockReturn
+}
+
+int32_t ipc_CloseSecretStore
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ uint32_t ssFlags
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN + MSG_DWORD_LEN;
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_CLOSE_SECRET_STORE_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+
+ //marshall ssflags
+ memcpy(pReq, &ssFlags, MSG_DWORD_LEN);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ retVal = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ DMSG(("Closing socket : %d\n",*(int*)ssHandle->platHandle));
+ IPC_CLOSE(*(int *)ssHandle->platHandle);
+ return retCode; // map return code
+}
+
+int32_t ipc_RemoveSecretStore
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN;
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_REMOVE_SECRET_STORE_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ return retCode;
+
+}
+
+
+int32_t ipc_EnumerateKeychainIDs
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_LIST_T *kcIDList
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ SS_UTF8_T nulc = '\0';
+ SS_UTF8_T delimiter = '*';
+ int i = 0,j = 0;
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+ uint32_t bufLen = 0;
+ uint32_t numIds = 0;
+
+ SS_UTF8_T *tmpBuf = NULL;
+ SS_UTF8_T *tmpPtr = NULL;
+ SS_UTF8_T *tok = NULL;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == kcIDList) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN;
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_ENUMERATE_KEYCHAINIDS_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ memset(pReply,0,MIN_REPLY_BUF_LEN);
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ // I would like to get return code here itself
+ // so that I need not check for other things.
+ memcpy(&bufLen,pReply, MSG_DWORD_LEN);
+ if( 0 == bufLen )
+ {
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("Reading retcode::%d\n",retVal));
+ }
+ retCode = mapReturnCode(sockReturn);
+ kcIDList->returnedIDs = 0;
+ break;
+ }
+ // Let me check if the global buffer is sufficient
+ if( bufLen < MIN_REPLY_BUF_LEN/(sizeof(char)) )
+ pReply = gpReplyBuf;
+ else
+ {
+ pReply = (Byte *)malloc( (bufLen+1) * sizeof(char));
+ if( NULL == pReply )
+ {
+ // Cleanup the channel by reading the remaining and return error.
+ int n;
+ n = msgLen - MSG_REPLY_GENERAL;
+ while(n)
+ {
+ int bytes = IPC_READ(*(int *)ssHandle->platHandle, gpReplyBuf, MIN_REPLY_BUF_LEN);
+ if( bytes > 0 )
+ n -= MIN_REPLY_BUF_LEN;
+ else
+ break;
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,
+ &sockReturn, MSG_DWORD_LEN);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("Reading retcode::%d\n",retVal));
+ }
+
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ } //if malloc fail loop ends here
+ else
+ tmpBuf = (SS_UTF8_T *)pReply; // Save this ptr to free later.
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,pReply, bufLen*sizeof(char));
+
+ tmpPtr = (SS_UTF8_T *)pReply;
+ tmpPtr[bufLen] = nulc;
+ #ifdef DEBUG
+ //HexDump(pReply, retVal);
+ #endif
+ // Count number of ids
+ numIds = 1; // Atleast there is one !!
+ while( tmpPtr = sscs_Utf8Strchr(tmpPtr, delimiter) )
+ {
+ numIds++;
+ tmpPtr++;
+ }
+ if( numIds > kcIDList->returnedIDs )
+ {
+ kcIDList->returnedIDs = numIds;
+ if(tmpBuf)
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ kcIDList->enumHandle = 0;
+
+ retCode = NSSS_E_ENUM_BUFF_TOO_SHORT;
+ break;
+ }
+ else
+ {
+ Tokenize( 0, (SS_UTF8_T*)pReply, kcIDList->keyChainIDList );
+ kcIDList->returnedIDs = numIds;
+ kcIDList->enumHandle = 0;
+ if(tmpBuf)
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ }
+
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("Reading retcode::%d\n",retVal));
+
+ }
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ return retCode;
+}
+
+
+int32_t ipc_AddKeychain
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t msgLen = 0;
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == keychainID) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ keychainIDLen = keychainID->len;
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN + // flags
+ MSG_STRING_LEN +
+ keychainIDLen; // Keychain ID
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_ADD_KEYCHAIN_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &ssFlags, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+
+ memcpy((SS_UTF8_T*)pReq,keychainID->keychainID,keychainIDLen);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ return retCode;
+}
+
+int32_t ipc_RemoveKeychain
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t msgLen = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == keychainID) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ keychainIDLen = keychainID->len;
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN +
+ keychainIDLen; // Keychain ID
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_REMOVE_KEYCHAIN_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID, keychainIDLen);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ } while(0);
+
+ return retCode;
+}
+
+
+int32_t ipc_EnumerateSecretIDs
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_LIST_T *secretIDList
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+
+ Byte *pReq = NULL, *pReply = NULL;
+ SS_UTF8_T nulc = '\0';
+ SS_UTF8_T delimiter = '*';
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t msgLen = 0;
+ uint32_t bufLen = 0;
+ uint32_t numIds = 0;
+
+ int i = 0;
+
+ SS_UTF8_T *tmpBuf = NULL;
+ SS_UTF8_T *tmpPtr = NULL;
+ SS_UTF8_T *tok = NULL;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == keychainID) || (NULL == secretIDList) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ keychainIDLen = keychainID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN +
+ keychainIDLen; // Keychain ID
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_ENUMERATE_SECRETIDS_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy((SS_UTF8_T *)pReq,(SS_UTF8_T *)keychainID->keychainID,keychainIDLen);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if( retVal < 0 )
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ // I would like to get return code here itself
+ // so that I need not check for other things.
+ memcpy(&bufLen,pReply, MSG_DWORD_LEN);
+ if( 0 == bufLen )
+ {
+ // Cleanup the channel by reading the return code.
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ secretIDList->returnedIDs = 0;
+ retCode = mapReturnCode(sockReturn);
+ break;
+ }
+ // Let me check if the global buffer is sufficient
+ if(bufLen < MIN_REPLY_BUF_LEN/(sizeof(SS_UTF8_T)))
+ pReply = gpReplyBuf;
+ else
+ {
+ pReply = (Byte *)malloc( (bufLen+1) * sizeof(SS_UTF8_T));
+ if(pReply == NULL)
+ {
+ // Cleanup the channel by reading the remaining and return error.
+ int n;
+ n = msgLen - MSG_REPLY_GENERAL;
+ while(n)
+ {
+ int bytes = IPC_READ((*(int *)ssHandle->platHandle), gpReplyBuf, MIN_REPLY_BUF_LEN);
+ if(bytes > 0 )
+ n -= MIN_REPLY_BUF_LEN;
+ else
+ break;
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,
+ &sockReturn, MSG_DWORD_LEN);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("Reading retcode::%d\n",retVal));
+
+ }
+
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ else
+ tmpBuf = (SS_UTF8_T *)pReply; // Save this ptr to free later.
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,pReply, bufLen*sizeof(SS_UTF8_T));
+ DMSG(("Read returns..%d\n",retVal));
+ tmpPtr = (SS_UTF8_T *)pReply;
+ tmpPtr[bufLen] = nulc;
+ DMSG(("Secretid list is %s\n", pReply));
+
+ // Count number of ids
+ numIds = 1; // Atleast there is one !!
+ while(tmpPtr = sscs_Utf8Strchr(tmpPtr, delimiter))
+ {
+ numIds++;
+ tmpPtr++;
+ }
+ if( numIds > secretIDList->returnedIDs )
+ {
+ secretIDList->returnedIDs = numIds;
+ if(tmpBuf)
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ secretIDList->enumHandle = 0;
+ retCode = NSSS_E_ENUM_BUFF_TOO_SHORT;
+ break;
+ }
+ else
+ {
+ Tokenize( 1, (SS_UTF8_T*)pReply, secretIDList->secIDList );
+ secretIDList->returnedIDs = numIds;
+ secretIDList->enumHandle = 0;
+ if(tmpBuf)
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ }
+
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ if(retVal < 0)
+ {
+ //log debug info here
+ DMSG(("Reading retcode::%d\n",retVal));
+ }
+
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ return retCode;
+}
+
+int32_t ipc_ReadSecret
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_SECRET_T *secretData,
+ SSCS_PASSWORD_T *epPassword,
+ uint32_t *bytesRequired
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ uint32_t dataLen = 0;
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ SSCS_PASSWORD_T myPassword = {0,0,""};
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle) || (NULL == keychainID) || (NULL == secretID) || (NULL == secretData) || (NULL == bytesRequired))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ // epPassword is optional. So, the code should not break.
+ if( NULL == epPassword )
+ epPassword = &myPassword;
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen + // SecretID
+ MSG_STRING_LEN + // epPassword len
+ epPassword->pwordLen;
+
+ pReq = gpReqBuf;
+ msgid = REQ_CACHE_READ_SECRET_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainIDLen);
+ pReq += keychainIDLen ;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id, secretIDLen);
+ pReq += secretIDLen;
+ memcpy(pReq, &(epPassword->pwordLen), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, epPassword->pword, epPassword->pwordLen);
+ pReq += epPassword->pwordLen;
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if( 0 == retVal )
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&dataLen,pReply, MSG_DWORD_LEN);
+ if( 0 == dataLen )
+ {
+ // Cleanup the channel by reading the return code.
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ if( retVal < 0 )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ secretData->len = dataLen;
+ retCode = mapReturnCode(sockReturn);
+ break;
+ }
+ // Let me check if the buffer passed by application is big enough
+ if(dataLen <= (uint32_t)secretData->len)
+ {
+ // Read the secret into application buffer.
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, secretData->data, dataLen);
+ if( retVal < 0 )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ secretData->len = dataLen;
+ }
+ else
+ {
+ //buffer allocated by application is not sufficient to hold the data.
+ *bytesRequired = dataLen;
+ {
+ // Cleanup the channel by reading the remaining and return error.
+ int n;
+ n = dataLen;
+ while(n)
+ {
+ int bytes = IPC_READ(*(int *)ssHandle->platHandle, gpReplyBuf, MIN_REPLY_BUF_LEN);
+ if( bytes > 0)
+ n -= MIN_REPLY_BUF_LEN;
+ else
+ break;
+ }
+ // Read the sscs return code also.
+ IPC_READ(*(int *)ssHandle->platHandle, (Byte *) &sockReturn, MSG_DWORD_LEN);
+ retCode = NSSCS_E_ENUM_BUFF_TOO_SHORT;
+ break;
+ }
+ }
+ // Read the sscs return code also.
+ IPC_READ(*(int *)ssHandle->platHandle, (Byte *) &sockReturn, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ } while(0);
+ return retCode;
+}
+
+int ipc_WriteSecret
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_SECRET_T *secretData,
+ SSCS_PASSWORD_T *epPassword,
+ SSCS_EXT_T *ext
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+ Byte *tmpBuf = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ uint32_t extID = 0;
+ uint32_t luidLen = 0;
+
+
+ SSCS_PASSWORD_T myPassword = {0,0,""};
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle) || (NULL == keychainID) || (NULL == secretID) ||(NULL == secretData))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ // epPassword is optional. So, the code should not break.
+ if(epPassword == NULL)
+ epPassword = &myPassword;
+
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen + // SecretID
+ MSG_STRING_LEN + // Secret Value Length
+ secretData->len +
+ MSG_STRING_LEN + // epPassword len
+ epPassword->pwordLen;
+
+ // is there an ext
+ if (ext)
+ {
+ // The login capture on Windows determines the LUID of the user
+ // and sends it as an Extension, marshall it across the pipe
+ // see the WriteSecret verb for handling it.
+ if (ext->extID == WINDOWS_LOGIN_ID)
+ {
+ // 4 byte ext type, 4 byte len and 8 bytes of LUID
+ msgLen += MSG_DWORD_LEN + MSG_DWORD_LEN + WINDOWS_LUID_LEN;
+ // as setup in the capture module
+ //ext.extID = WINDOWS_LOGON_ID;
+ //ext.version = 0x00010000; // 1.0.0
+ //ext.ext = (void *)lpLogonId;
+ // _LUID { DWORD LowPart; LONG HighPart; // 8 byte
+ }
+ else
+ msgLen += MSG_DWORD_LEN;
+ }
+ else
+ {
+ // the cache daemon expects a ext, add it here
+ msgLen += MSG_DWORD_LEN;
+ }
+
+ if( msgLen > MIN_REQUEST_BUF_LEN )
+ {
+ tmpBuf = (Byte*)malloc(msgLen);
+ if( NULL == tmpBuf )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ memset(tmpBuf,0,msgLen);
+ pReq = tmpBuf;
+ }
+ else
+ {
+ pReq = gpReqBuf;
+ }
+
+ msgid = REQ_CACHE_WRITE_SECRET_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainIDLen );
+ pReq += keychainIDLen;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id,secretIDLen);
+ pReq += secretIDLen;
+ memcpy(pReq, &(secretData->len), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretData->data, secretData->len);
+ pReq += secretData->len;
+ memcpy(pReq, &(epPassword->pwordLen), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, epPassword->pword, epPassword->pwordLen);
+ pReq += epPassword->pwordLen;
+
+ // marshall the extension if there is one
+ if (ext)
+ {
+ if (ext->extID == WINDOWS_LOGIN_ID)
+ {
+ extID = EXT_TYPE_WINDOWS_LUID;
+ memcpy(pReq, &extID, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ luidLen = WINDOWS_LUID_LEN;
+ memcpy(pReq, &luidLen, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ memcpy(pReq, ext->ext, 8);
+ pReq += 8;
+ }
+ else
+ {
+ uint32_t extID = 0;
+ memcpy(pReq,&extID,MSG_DWORD_LEN);
+
+ }
+ }
+ else
+ {
+ uint32_t extID = 0;
+ memcpy(pReq,&extID,MSG_DWORD_LEN);
+ }
+
+ if(tmpBuf != NULL)
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,tmpBuf,msgLen);
+ }
+ else
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,gpReqBuf, msgLen);
+ }
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ if( tmpBuf != NULL )
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ return retCode;
+}
+
+int32_t ipc_RemoveSecret
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_PASSWORD_T *epPassword
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == keychainID) || (NULL == secretID) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen + // SecretID
+ MSG_STRING_LEN ; // epPassword len
+ if( epPassword )
+ {
+ msgLen += epPassword->pwordLen;
+ }
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_CACHE_REMOVE_SECRET_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID, keychainIDLen);
+ pReq += keychainIDLen;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id, secretIDLen);
+ pReq += secretIDLen;
+
+ if(epPassword)
+ {
+ memcpy(pReq, &(epPassword->pwordLen), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, epPassword->pword, epPassword->pwordLen);
+ pReq += epPassword->pwordLen;
+ }
+ else
+ {
+ int pwordlen = 0;
+ memcpy(pReq, &pwordlen, MSG_STRING_LEN);
+ }
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ return retCode;
+}
+
+int32_t ipc_GetSecretStoreInfo
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_SECRETSTORE_INFO_T *ssInfo
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ if( NULL == ssInfo )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN;
+
+ if( msgLen > MIN_REQUEST_BUF_LEN )
+ {
+ //Allocate more memory for gpReqBuf
+ }
+ pReq = gpReqBuf;
+ msgid = REQ_GET_SECRETSTORE_INFO_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = SSCS_E_SYSTEM_ERROR;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply,
+ MSG_REPLY_GETSSINFO);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = SSCS_E_SYSTEM_ERROR;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&(ssInfo->numKeyChains),pReply,MSG_DWORD_LEN);
+ pReply += MSG_DWORD_LEN;
+
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ if(sockReturn != SSCS_REPLY_SUCCESS)
+ {
+ DMSG(("Ret code :%d\n",sockReturn));
+ }
+ retCode = sockReturn;
+ }while(0);
+
+ return retCode; // map return code
+}
+
+int32_t ipc_GetKeychainInfo
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_KEYCHAIN_INFO_T *kcInfo
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+ if( (NULL == keychainID) || (NULL == kcInfo) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN + MSG_DWORD_LEN +
+ (keychainID->len );
+
+ if( msgLen > MIN_REQUEST_BUF_LEN )
+ {
+ //Allocate more memory for gpReqBuf
+ }
+ pReq = gpReqBuf;
+ msgid = REQ_GET_KEYCHAIN_INFO_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq,&(keychainID->len),MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainID->len);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply,MSG_REPLY_GETKEYCHAIN_INFO);
+ if(retVal < 0)
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&(kcInfo->flags),pReply,MSG_DWORD_LEN);
+ pReply += MSG_DWORD_LEN;
+ memcpy(&(kcInfo->numSecrets),pReply,MSG_DWORD_LEN);
+ pReply += MSG_DWORD_LEN;
+ memcpy(&(kcInfo->numOfDeletedSecs),pReply,MSG_DWORD_LEN);
+ pReply += MSG_DWORD_LEN;
+
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ if(sockReturn != SSCS_REPLY_SUCCESS)
+ {
+ DMSG(("Ret code :%d\n",sockReturn));
+ }
+ retCode = sockReturn;
+
+ }while(0);
+
+ return retCode;
+
+}
+
+int32_t ipc_LockCache
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN;
+
+ pReq = gpReqBuf;
+ msgid = REQ_LOCK_CACHE_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL)
+;
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ if(sockReturn != SSCS_REPLY_SUCCESS)
+ {
+ DMSG(("Ret code :%d\n",sockReturn));
+ }
+ retCode = sockReturn;
+
+ }while(0);
+ return retCode; // map return code
+
+}
+
+int32_t ipc_UnlockCache
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_PASSCODE_T *passcode
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t msgLen = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN;
+
+ pReq = gpReqBuf;
+ msgid = REQ_UNLOCK_CACHE_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ // log debug info here
+ retCode = SSCS_E_SYSTEM_ERROR;
+ break;
+ }
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = SSCS_E_SYSTEM_ERROR;
+ break;
+ }
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+
+ if(sockReturn != SSCS_REPLY_SUCCESS)
+ {
+ DMSG(("Ret code :%d\n",sockReturn));
+ }
+ retCode = sockReturn;
+
+ }while(0);
+
+ return retCode; // map return code
+
+}
+
+int32_t ipc_SetMasterPasscode
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_PASSCODE_T *passcode
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ uint16_t msgid = 0;
+ uint32_t passcodeType = 0;
+ uint32_t passcodeLen = 0;
+ uint32_t msgLen = 0;
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == passcode) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ passcodeType = passcode->passcodeType;
+ passcodeLen = ((SSCS_PASSWORD_T*)(passcode->passcodeHandle))->pwordLen;
+
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN + // passcodetype
+ MSG_STRING_LEN + //passcodeLen
+ passcodeLen;
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_SET_MASTER_PASSCODE;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &passcodeType, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+ memcpy(pReq, &passcodeLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+
+ memcpy((SS_UTF8_T*)pReq,((SSCS_PASSWORD_T*)(passcode->passcodeHandle))->pword,passcodeLen);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = sockReturn;
+
+ }while(0);
+
+ return retCode;
+}
+
+int32_t ipc_ReadKey
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SS_UTF8_T *key,
+ uint32_t keyLen,
+ uint8_t *val,
+ uint32_t valLen,
+ SSCS_PASSWORD_T *epPassword,
+ uint32_t *bytesRequired
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ uint32_t dataLen = 0;
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ SSCS_PASSWORD_T myPassword = {0,0,""};
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle) || (NULL == keychainID) || (NULL == secretID) || (NULL == bytesRequired))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ // epPassword is optional. So, the code should not break.
+ if( NULL == epPassword )
+ epPassword = &myPassword;
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen + // SecretID
+ MSG_STRING_LEN + //keyLen
+ keyLen + //key
+ MSG_STRING_LEN + // epPassword len
+ epPassword->pwordLen;
+
+ pReq = gpReqBuf;
+ msgid = REQ_READ_KEY_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainIDLen);
+ pReq += keychainIDLen ;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id, secretIDLen);
+ pReq += secretIDLen;
+
+ memcpy(pReq, &keyLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, key, keyLen);
+ pReq += keyLen;
+
+ memcpy(pReq, &(epPassword->pwordLen), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, epPassword->pword, epPassword->pwordLen);
+ pReq += epPassword->pwordLen;
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if( 0 == retVal )
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&dataLen,pReply, MSG_DWORD_LEN);
+ if( 0 == dataLen )
+ {
+ // Cleanup the channel by reading the return code.
+ retVal = IPC_READ(*(int *)ssHandle->platHandle,&sockReturn, MSG_DWORD_LEN);
+ if( retVal < 0 )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ retCode = mapReturnCode(sockReturn);
+ break;
+ }
+ // Let me check if the buffer passed by application is big enough
+ if(dataLen <= valLen)
+ {
+ // Read the secret into application buffer.
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, val, dataLen);
+ if( retVal < 0 )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ }
+ else
+ {
+ //buffer allocated by application is not sufficient to hold the data.
+ *bytesRequired = dataLen;
+ {
+ // Cleanup the channel by reading the remaining and return error.
+ int n;
+ n = dataLen;
+ while(n)
+ {
+ int bytes = IPC_READ(*(int *)ssHandle->platHandle, gpReplyBuf, MIN_REPLY_BUF_LEN);
+ if( bytes > 0)
+ n -= MIN_REPLY_BUF_LEN;
+ else
+ break;
+ }
+ // Read the sscs return code also.
+ IPC_READ(*(int *)ssHandle->platHandle, (Byte *) &sockReturn, MSG_DWORD_LEN);
+ retCode = NSSCS_E_ENUM_BUFF_TOO_SHORT;
+ break;
+ }
+ }
+ // Read the sscs return code also.
+ IPC_READ(*(int *)ssHandle->platHandle, (Byte *) &sockReturn, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ } while(0);
+ return retCode;
+}
+
+int ipc_WriteKey
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SS_UTF8_T *key,
+ uint32_t keyLen,
+ uint8_t *val,
+ uint32_t valLen,
+ SSCS_PASSWORD_T *epPassword,
+ SSCS_EXT_T *ext
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+ Byte *tmpBuf = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ uint32_t extID = 0;
+ uint32_t luidLen = 0;
+
+
+ SSCS_PASSWORD_T myPassword = {0,0,""};
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle) || (NULL == keychainID) || (NULL == secretID) ||(NULL == key))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ // Prepare Request buffer
+
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ // epPassword is optional. So, the code should not break.
+ if(epPassword == NULL)
+ epPassword = &myPassword;
+
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen + // SecretID
+ MSG_STRING_LEN + // Secret Value Length
+ keyLen +
+ MSG_STRING_LEN +
+ valLen +
+ MSG_STRING_LEN + // epPassword len
+ epPassword->pwordLen;
+
+ // is there an ext, account for it
+ if (ext)
+ {
+ // The login capture on Windows determines the LUID of the user
+ // and sends it as an Extension, marshall it across the pipe
+ // see the WriteSecret verb for handling it.
+ if (ext->extID == WINDOWS_LOGIN_ID)
+ {
+ // 4 byte ext type, 4 byte len and 8 bytes of LUID
+ msgLen += MSG_DWORD_LEN + MSG_DWORD_LEN + WINDOWS_LUID_LEN;
+ // as setup in the capture module
+ //ext.extID = WINDOWS_LOGON_ID;
+ //ext.version = 0x00010000; // 1.0.0
+ //ext.ext = (void *)lpLogonId;
+ // _LUID { DWORD LowPart; LONG HighPart; // 8 byte
+ }
+ else
+ msgLen += MSG_DWORD_LEN;
+ }
+ else
+ {
+ // the cache daemon expects a ext, add it here
+ msgLen += MSG_DWORD_LEN;
+ }
+
+ if( msgLen > MIN_REQUEST_BUF_LEN )
+ {
+ tmpBuf = (Byte*)malloc(msgLen);
+ if( NULL == tmpBuf )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ memset(tmpBuf,0,msgLen);
+ pReq = tmpBuf;
+ }
+ else
+ {
+ pReq = gpReqBuf;
+ }
+
+ msgid = REQ_WRITE_KEY_MSGID;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainIDLen );
+ pReq += keychainIDLen;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id,secretIDLen);
+ pReq += secretIDLen;
+
+ memcpy(pReq,&keyLen,MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,key,keyLen);
+ pReq += keyLen;
+ memcpy(pReq,&valLen,MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,val,valLen);
+ pReq += valLen;
+
+ memcpy(pReq, &(epPassword->pwordLen), MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, epPassword->pword, epPassword->pwordLen);
+ pReq += epPassword->pwordLen;
+
+ // marshall the extension if there is one
+ if (ext)
+ {
+ if (ext->extID == WINDOWS_LOGIN_ID)
+ {
+ extID = EXT_TYPE_WINDOWS_LUID;
+ memcpy(pReq, &extID, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ luidLen = WINDOWS_LUID_LEN;
+ memcpy(pReq, &luidLen, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ memcpy(pReq, ext->ext, 8);
+ pReq += 8;
+ }
+ else
+ {
+ uint32_t extID = 0;
+ memcpy(pReq,&extID,MSG_DWORD_LEN);
+
+ }
+ }
+ else
+ {
+ uint32_t extID = 0;
+ memcpy(pReq,&extID,MSG_DWORD_LEN);
+ }
+
+ if(tmpBuf != NULL)
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,tmpBuf,msgLen);
+ }
+ else
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,gpReqBuf, msgLen);
+ }
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = mapReturnCode(sockReturn);
+
+ }while(0);
+
+ if( tmpBuf != NULL )
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ return retCode;
+}
+
+
+int32_t ipc_SetMasterPassword
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ SSCS_PASSWORD_T *passwd,
+ SSCS_HINT_T *hint
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ uint16_t msgid = 0;
+ uint32_t passwdType = 0;
+ uint32_t passwdLen = 0;
+ uint32_t msgLen = 0;
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if( (NULL == ssHandle) || (NULL == ssHandle->platHandle) ||
+ (NULL == passwd) )
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ passwdType = passwd->pwordType;
+ passwdLen = passwd->pwordLen;
+
+
+ // Prepare Request buffer
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN + // passwdtype
+ MSG_STRING_LEN + //passwdLen
+ passwdLen;
+
+ pReq = gpReqBuf;
+
+ msgid = REQ_SET_MASTER_PASSWORD;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq, &passwdType, MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+ memcpy(pReq, &passwdLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+
+ memcpy((SS_UTF8_T*)pReq,passwd->pword,passwdLen);
+
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle, gpReqBuf, msgLen);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ retCode = sockReturn;
+
+ }while(0);
+
+ return retCode;
+}
+
+int ipc_IsSecretPersistent
+(
+ SSCS_SECRETSTORE_HANDLE_T *ssHandle,
+ uint32_t ssFlags,
+ SSCS_KEYCHAIN_ID_T *keychainID,
+ SSCS_SECRET_ID_T *secretID,
+ SSCS_EXT_T *ext
+)
+{
+ int retVal = 0; //to be used in the function internally
+ int32_t retCode = NSSCS_SUCCESS; //to be returned to caller
+ int32_t sockReturn = 0; //obtained from the server
+
+ Byte gpReqBuf[MIN_REQUEST_BUF_LEN];
+ Byte gpReplyBuf[MIN_REPLY_BUF_LEN];
+ Byte *pReq = NULL, *pReply = NULL;
+ Byte *tmpBuf = NULL;
+
+ uint16_t msgid = 0;
+ uint32_t keychainIDLen = 0;
+ uint32_t secretIDLen = 0;
+ uint32_t msgLen = 0;
+
+ memset(gpReqBuf,0,sizeof(gpReqBuf));
+ memset(gpReplyBuf,0,sizeof(gpReplyBuf));
+
+ do
+ {
+ if((NULL == ssHandle) || (NULL == ssHandle->platHandle))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+
+ if(ssFlags == 0)
+ {
+ if( (NULL == keychainID) || ( NULL == secretID ))
+ {
+ retCode = NSSCS_E_INVALID_PARAM;
+ break;
+ }
+ }
+
+ // Prepare Request buffer
+
+ if( ssFlags == 0 )
+ {
+ keychainIDLen = keychainID->len;
+ secretIDLen = secretID->len;
+
+ if( keychainIDLen > NSSS_MAX_KEYCHAIN_ID_CHARS ||
+ secretIDLen > NSSS_MAX_SECRET_ID_CHARS )
+ {
+ retCode = NSSS_E_SECRET_ID_TOO_LONG;
+ break;
+ }
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN + //ssFlags
+ MSG_STRING_LEN + // KeychainID length
+ keychainIDLen + // Keychain ID
+ MSG_STRING_LEN + // SecretID length
+ secretIDLen; // SecretID
+ }
+ else
+ {
+ msgLen = MSGID_LEN + MSG_LEN +
+ MSG_DWORD_LEN; //ssFlags
+ }
+
+ if( msgLen > MIN_REQUEST_BUF_LEN )
+ {
+ tmpBuf = (Byte*)malloc(msgLen);
+ if( NULL == tmpBuf )
+ {
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+ memset(tmpBuf,0,msgLen);
+ pReq = tmpBuf;
+ }
+ else
+ {
+ pReq = gpReqBuf;
+ }
+
+ msgid = REQ_IS_SECRET_PERSISTENT;
+ memcpy(pReq, &msgid, MSGID_LEN);
+ pReq += MSGID_LEN;
+ memcpy(pReq, &msgLen, MSG_LEN);
+ pReq += MSG_LEN;
+ memcpy(pReq,&ssFlags,MSG_DWORD_LEN);
+ pReq += MSG_DWORD_LEN;
+
+ if( ssFlags == 0 )
+ {
+ memcpy(pReq, &keychainIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq,keychainID->keychainID,keychainIDLen );
+ pReq += keychainIDLen;
+ memcpy(pReq, &secretIDLen, MSG_STRING_LEN);
+ pReq += MSG_STRING_LEN;
+ memcpy(pReq, secretID->id,secretIDLen);
+ pReq += secretIDLen;
+ }
+ if(tmpBuf != NULL)
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,tmpBuf,msgLen);
+ }
+ else
+ {
+ retVal = IPC_WRITE(*(int *)ssHandle->platHandle,gpReqBuf, msgLen);
+ }
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ // Read reply
+ pReply = gpReplyBuf;
+ retVal = IPC_READ(*(int *)ssHandle->platHandle, pReply, MSG_REPLY_GENERAL);
+ if(retVal < 0)
+ {
+ //log debug info here
+ retCode = NSSCS_E_SYSTEM_FAILURE;
+ break;
+ }
+
+ memcpy(&msgid,pReply, MSGID_LEN);
+ pReply += MSGID_LEN;
+ memcpy(&msgLen,pReply, MSG_LEN);
+ pReply += MSG_LEN;
+ memcpy(&sockReturn, pReply, MSG_DWORD_LEN);
+ if( (sockReturn == SSCS_SECRET_IS_PERSISTENT) ||
+ (sockReturn == SSCS_STORE_IS_PERSISTENT) )
+ retCode = 1;
+ else if( (sockReturn == SSCS_SECRET_IS_NOT_PERSISTENT) ||
+ (sockReturn == SSCS_STORE_IS_NOT_PERSISTENT) )
+ retCode = 0;
+ else
+ retCode = mapReturnCode(sockReturn);
+ }while(0);
+
+ if( tmpBuf != NULL )
+ {
+ free(tmpBuf);
+ tmpBuf = NULL;
+ }
+ return retCode;
+}
+
diff --git a/c_micasacache/sscscache.rc b/c_micasacache/sscscache.rc
new file mode 100644
index 00000000..132b1977
--- /dev/null
+++ b/c_micasacache/sscscache.rc
@@ -0,0 +1,79 @@
+/******************************************************************************
+ %name: sscscache.rc %
+ %version: 1 %
+ %date_modified: Tue Apr 05 22:19:55 2005 %
+ *
+ * File Name: ssndk.rc
+ *
+ * Description: This is the win32 client version resource file.
+ *
+ * Author(s): Cameron Mashayekhi
+ *
+ * Modifier(s): None.
+ *
+ * Unpublished Copyright (c) (1998-2003) Novell, All Rights Reserved.
+ *
+ * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
+ * USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT
+ * ACCOMPANYING THE SOFTWARE DEVELOPMENT KIT (SDK) THAT CONTAINS THIS WORK.
+ * PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A
+ * ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS
+ * PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET,
+ * DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S
+ * PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S
+ * CUSTOMERS WITH RESPECT TO THIS CODE.
+ *
+ *****************************************************************************/
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+#include "ssbldver.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION WSS_BLD_NO
+ PRODUCTVERSION WSS_BLD_NO
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", SSS_WCLIENT_STRING "\0"
+ VALUE "CompanyName", SSS_COMPANY_STR "\0"
+ VALUE "FileDescription", SSS_NSSS_PR_STRING "\0"
+ VALUE "FileVersion", WSS_BLD_STR "\0"
+ VALUE "LegalCopyright", SSS_COPYRIGHT_STR "\0"
+ VALUE "LegalTrademarks", SSS_PATENT_STR "\0"
+ VALUE "OriginalFilename", SSS_NSSS_STR "\0"
+ VALUE "ProductName", SSS_PRODUCT_STR "\0"
+ VALUE "ProductVersion", GSS_BLD_STR "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // !_MAC
+
diff --git a/c_micasad/Makefile b/c_micasad/Makefile
new file mode 100644
index 00000000..b89ea246
--- /dev/null
+++ b/c_micasad/Makefile
@@ -0,0 +1,20 @@
+#
+# configure environment
+#
+TARGET = micasad
+CS_NAME = $(TARGET)$(xtra).$(EXE)
+include global.mak
+include defaults.$(PLAT)
+include rules.mak
+
+
+#
+# target object and source files
+#
+include src.$(PLAT)
+include objs.$(PLAT)
+
+#
+# targets
+#
+include target.cs
diff --git a/c_micasad/cache/IKeychain.cs b/c_micasad/cache/IKeychain.cs
new file mode 100644
index 00000000..1b0d278c
--- /dev/null
+++ b/c_micasad/cache/IKeychain.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections;
+namespace sscs.cache
+{
+
+ interface IKeychain
+ {
+
+ void AddSecret(Secret mySecret);
+ void RemoveSecret(String secretID);
+ Secret GetSecret(string secretID);
+// IEnumerator getAllSecrets();
+ }
+
+}
diff --git a/c_micasad/cache/ISecret.cs b/c_micasad/cache/ISecret.cs
new file mode 100644
index 00000000..9820f6f6
--- /dev/null
+++ b/c_micasad/cache/ISecret.cs
@@ -0,0 +1,14 @@
+using System;
+namespace sscs.cache
+{
+ interface ISecret
+ {
+ //Setter methods
+ void SetValue(byte[] key);
+ void SetKey(String newkey);
+
+ //Get methods
+ byte[] GetValue(String key);
+ string GetKey();
+ }
+}
diff --git a/c_micasad/cache/KeyChain.cs b/c_micasad/cache/KeyChain.cs
new file mode 100644
index 00000000..a1ff7cc6
--- /dev/null
+++ b/c_micasad/cache/KeyChain.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections;
+using System.Threading;
+using sscs.common;
+
+namespace sscs.cache
+{
+
+class KeyChain : IKeychain
+{
+ //We can have a Arraylist in case we dont need to look up via SecretID
+ // Hashtable has [SecretID(string), Secret(class)]
+ private Hashtable tSecretList = new Hashtable();
+ private Hashtable SecretList; // = Hashtable.Synchronized(tSecretList);
+
+ private string keyChainId;
+
+ private DateTime createdTime;
+ internal DateTime CreatedTime
+ {
+ get
+ {
+ return createdTime;
+ }
+ set
+ {
+ createdTime = value;
+ }
+ }
+ private DateTime accessedTime;
+ internal DateTime AccessedTime
+ {
+ get
+ {
+ return accessedTime;
+ }
+ set
+ {
+ accessedTime = value;
+ }
+ }
+
+ private DateTime modifiedTime;
+ internal DateTime ModifiedTime
+ {
+ get
+ {
+ return modifiedTime;
+ }
+ set
+ {
+ modifiedTime = value;
+ }
+ }
+
+ internal KeyChain()
+ {
+ SecretList = Hashtable.Synchronized(tSecretList);
+ }
+
+ internal KeyChain(string keyChainId)
+ {
+ SecretList = Hashtable.Synchronized(tSecretList);
+ this.keyChainId = keyChainId;
+ }
+ ~KeyChain()
+ {
+ }
+
+ public void SetKey(string value)
+ {
+ keyChainId = value;
+ }
+
+ public void AddSecret(Secret mySecret)
+ {
+ try
+ {
+ mySecret.CreatedTime = DateTime.Now;
+ SecretList.Add((mySecret.GetKey()), mySecret);
+ this.ModifiedTime = DateTime.Now;
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+ }
+
+ public void RemoveSecret(String secretID)
+ {
+ SecretList.Remove(secretID);
+ this.ModifiedTime = DateTime.Now;
+ }
+
+ public void RemoveAllSecrets()
+ {
+ SecretList.Clear();
+ }
+
+ public Secret GetSecret(string secretID)
+ {
+ if(SecretList.ContainsKey(secretID))
+ {
+ Secret secret = (Secret)SecretList[secretID];
+ secret.AccessedTime = DateTime.Now;
+ return secret;
+ }
+ else
+ throw new SecretNotFoundException(secretID);
+ }
+
+ internal string GetKey()
+ {
+ return keyChainId;
+ }
+
+
+ internal IEnumerator GetAllSecrets()
+ {
+ return SecretList.GetEnumerator();
+ }
+ internal int GetNumSecrets()
+ {
+ return SecretList.Count;
+ }
+
+ internal bool CheckIfSecretExists(string id)
+ {
+ if( SecretList.ContainsKey(id) )
+ return true;
+ else
+ return false;
+ }
+}
+}
diff --git a/c_micasad/cache/KeyValue.cs b/c_micasad/cache/KeyValue.cs
new file mode 100644
index 00000000..276363a2
--- /dev/null
+++ b/c_micasad/cache/KeyValue.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Text;
+using System.Collections;
+
+using Novell.CASA.MiCasa.Common;
+
+namespace sscs.cache
+{
+ public class KeyValue
+ {
+ private string m_key;
+ public string Key
+ {
+ get
+ {
+ return m_key;
+ }
+ set
+ {
+ m_key = value;
+ }
+ }
+ private byte[] m_value;
+
+ public string GetValue()
+ {
+ return (DecryptValue());
+ }
+
+ public void SetValue(string sValue)
+ {
+
+ string oldValue = DecryptValue();
+
+ if (oldValue.Equals(sValue))
+ return;
+ else
+ {
+ byte[] newEncryptedValue = EncryptValue(sValue);
+ m_value = newEncryptedValue;
+ m_modified = DateTime.Now;
+ }
+ }
+
+ /*
+ public string Value
+ {
+ get
+ {
+ // decrypt
+ return (DecryptValue());
+ }
+ set
+ {
+ byte[] newEncrypteValue = EncryptValue(value);
+
+ if ((newEncrypteValue != null) && (newEncrypteValue.Equals(m_value)))
+ return;
+ else
+ {
+ m_value = newEncrypteValue;
+ m_modified = DateTime.Now;
+ }
+ }
+ }
+ */
+
+
+ private Hashtable mLinkedKeys = null; // = new Hashtable();
+
+ public void AddLink(LinkedKeyInfo linkedInfo)
+ {
+ if (mLinkedKeys == null)
+ mLinkedKeys = new Hashtable();
+
+ if(!mLinkedKeys.ContainsKey(linkedInfo.GetLinkID()))
+ mLinkedKeys.Add(linkedInfo.GetLinkID(), linkedInfo);
+ }
+
+ public void RemoveLink(string sLinkID)
+ {
+ // remove link
+ if (mLinkedKeys != null)
+ {
+ mLinkedKeys.Remove(sLinkID);
+ }
+ }
+
+ public Hashtable GetLinkedKeys()
+ {
+ return mLinkedKeys;
+ }
+
+
+ private DateTime m_created;
+ public DateTime CreatedTime
+ {
+ get
+ {
+ return m_created;
+ }
+ }
+
+ private DateTime m_modified;
+ public DateTime ModifiedTime
+ {
+ get
+ {
+ return m_modified;
+ }
+ }
+
+
+ public KeyValue(string sKey, string sValue)
+ {
+ // NOTE: Order is important, do not change
+ m_created = m_modified = DateTime.Now;
+ m_key = sKey;
+ m_value = EncryptValue(sValue);
+ }
+
+ private byte[] EncryptValue(string sValue)
+ {
+ byte[] baValueClear = Encoding.Default.GetBytes(sValue);
+ return (XORValue(baValueClear));
+ }
+
+ private string DecryptValue()
+ {
+ byte[] baValueClear = XORValue(m_value);
+ return Encoding.Default.GetString(baValueClear);
+ }
+
+ private byte[] XORValue(byte[] baInput)
+ {
+
+ byte[] baOutput = new byte[baInput.Length];
+ Random rand = new Random((int)m_created.Ticks);
+
+ for (int i=0; i");
+
+ sb.Append("");
+ sb.Append(m_key);
+ sb.Append("");
+
+ sb.Append("");
+ sb.Append(m_value);
+ sb.Append("");
+
+ sb.Append("");
+ sb.Append(m_modified.Ticks);
+ sb.Append("");
+
+ sb.Append("");
+
+ return sb.ToString();
+ }
+ }
+}
diff --git a/c_micasad/cache/Secret.cs b/c_micasad/cache/Secret.cs
new file mode 100644
index 00000000..e0ecb0a0
--- /dev/null
+++ b/c_micasad/cache/Secret.cs
@@ -0,0 +1,318 @@
+using System;
+using System.Text;
+using System.Collections;
+
+namespace sscs.cache
+{
+ class Secret : ISecret
+ {
+ private string secretID;
+ //private byte[] data;
+ string ePasswd ; // TBD
+
+ DateTime createdTime;
+ public DateTime CreatedTime
+ {
+ get
+ {
+ return createdTime;
+ }
+ set
+ {
+ createdTime = value;
+ }
+ }
+
+ DateTime accessedTime;
+ public DateTime AccessedTime
+ {
+ get
+ {
+ return accessedTime;
+ }
+ set
+ {
+ accessedTime = value;
+ }
+ }
+
+ DateTime modifiedTime;
+ public DateTime ModifiedTime
+ {
+ get
+ {
+ return modifiedTime;
+ }
+ set
+ {
+ modifiedTime = value;
+ }
+ }
+
+
+ private Hashtable htKeyValues = new Hashtable();
+ internal Secret()
+ {
+ }
+
+ internal Secret(string secretID)
+ {
+ this.secretID = secretID;
+ }
+
+ internal Secret(string secretID, byte[] data)
+ {
+ this.secretID = secretID;
+ //this.data = data;
+
+ // parse the data
+ ParseDataBuffer(data);
+
+ }
+
+ internal Secret(string secretID, byte[] data, string ePasswd)
+ {
+ this.secretID = secretID;
+ this.ePasswd = ePasswd;
+ ParseDataBuffer(data);
+ }
+
+ internal void ParseDataBuffer(byte[] data)
+ {
+
+ if (data != null)
+ {
+ UTF8Encoding dec = new UTF8Encoding();
+ string theData = dec.GetString(data);
+
+ char[] theChars = new char[2];
+ theChars[0] = '\n';
+ theChars[1] = '\0';
+ String[] keyValues = theData.Split(theChars);
+
+ char delimiter = '=';
+ foreach (string keyValue in keyValues)
+ {
+ int iLocation = keyValue.IndexOf(delimiter);
+ if (iLocation > 0)
+ {
+ String key = keyValue.Substring(0, iLocation);
+ String value = keyValue.Substring(iLocation + 1);
+
+ if (key != null && value != null)
+ this.SetKeyValue(key, value);
+ }
+ }
+ }
+ }
+
+ internal void SetEpasswd(string value)
+ {
+ ePasswd = value;
+ }
+
+ internal string GetEpasswd()
+ {
+ return ePasswd;
+ }
+
+ public void SetValue(byte[] data)
+ {
+ this.ModifiedTime = DateTime.Now;
+ ParseDataBuffer(data);
+ }
+
+ public void SetKey(String newkey)
+ {
+ //Validation TBD
+ this.secretID = newkey;
+ }
+
+ //Get methods
+ public byte[] GetValue(String key)
+ {
+ //validation TBD
+ //if (data == null)
+ {
+ StringBuilder sb = new StringBuilder();
+
+ IDictionaryEnumerator etor = (IDictionaryEnumerator)this.htKeyValues.GetEnumerator();
+ while(etor.MoveNext())
+ {
+ string sKey = (string)etor.Key;
+ KeyValue kv = (KeyValue)this.htKeyValues[sKey];
+
+ sb.Append(kv.Key);
+ sb.Append("=");
+ sb.Append(kv.GetValue());
+ sb.Append('\n');
+ }
+ //sb.Append('\0');
+
+ UTF8Encoding enc = new UTF8Encoding();
+ this.AccessedTime = DateTime.Now;
+ return (enc.GetBytes(sb.ToString()));
+ }
+ //else
+ // return data;
+ }
+ public byte[] GetValue()
+ {
+ //validation TBD
+ this.AccessedTime = DateTime.Now;
+ return GetValue(null);
+ }
+
+ public string GetKey()
+ {
+ return secretID;
+ }
+ public void SetKeyValue(string key, string value)
+ {
+ KeyValue kv;
+ if (htKeyValues.Contains(key))
+ {
+ kv = (KeyValue)htKeyValues[key];
+ kv.SetValue(value);
+ }
+ else
+ {
+ kv = new KeyValue(key, value);
+ htKeyValues.Add(key, kv);
+ }
+ this.ModifiedTime = DateTime.Now;
+ }
+
+ public KeyValue GetKeyValue(string key)
+ {
+ this.AccessedTime = DateTime.Now;
+ if (htKeyValues.Contains(key))
+ {
+ KeyValue kv = (KeyValue)htKeyValues[key];
+ return kv;
+ }
+ else
+ return null;
+ }
+
+ public void RemoveKeyValue(string key)
+ {
+ if (htKeyValues.Contains(key))
+ {
+ htKeyValues.Remove(key);
+ }
+ }
+
+ public DateTime GetKeyValueCreatedTime(string key)
+ {
+ if (htKeyValues.Contains(key))
+ {
+ KeyValue kv = (KeyValue)htKeyValues[key];
+ return kv.CreatedTime;
+ }
+ else
+ return (new DateTime(0));
+ }
+
+ public Hashtable GetLinkedKeys(string keyId)
+ {
+ if (htKeyValues.Contains(keyId))
+ {
+ KeyValue kv = (KeyValue)htKeyValues[keyId];
+ return kv.GetLinkedKeys();
+ }
+ else
+ return null;
+
+ }
+
+ public DateTime GetKeyValueModifiedTime(string key)
+ {
+ if (htKeyValues.Contains(key))
+ {
+ KeyValue kv = (KeyValue)htKeyValues[key];
+ return kv.ModifiedTime;
+ }
+ else
+ return (new DateTime(0));
+ }
+
+
+ public void MergeSecret(Secret newSecret)
+ {
+ IDictionaryEnumerator etor = (IDictionaryEnumerator)newSecret.htKeyValues.GetEnumerator();
+ while(etor.MoveNext())
+ {
+ string sKey = (string)etor.Key;
+
+ // TODO: When we sync, we should consider modified time as well
+ KeyValue newKV = (KeyValue)newSecret.htKeyValues[sKey];
+ this.SetKeyValue(newKV.Key, newKV.GetValue());
+ }
+ etor = (IDictionaryEnumerator)newSecret.htKeyValues.GetEnumerator();
+ while(etor.MoveNext())
+ {
+ string sKey = (string)etor.Key;
+ if(!htKeyValues.Contains(sKey))
+ this.RemoveKeyValue(sKey);
+ }
+ }
+
+ public ArrayList GetKeyList()
+ {
+ IDictionaryEnumerator etor = (IDictionaryEnumerator)this.htKeyValues.GetEnumerator();
+ ArrayList list = new ArrayList();
+ if( null == etor )
+ {
+ return null;
+ }
+ while(etor.MoveNext())
+ {
+ string key = (string)etor.Key;
+ list.Add(key);
+ }
+ return list;
+ }
+
+ internal IDictionaryEnumerator GetKeyValueEnumerator()
+ {
+ if( htKeyValues != null)
+ return htKeyValues.GetEnumerator();
+ else
+ return null;
+ }
+
+ public string ToXML()
+ {
+ StringBuilder sb = new StringBuilder();
+
+ sb.Append("");
+
+ sb.Append("");
+ sb.Append(secretID);
+ sb.Append("");
+
+ sb.Append("");
+ // enum the htKeyValues list
+ //IDictionaryEnumerator ienum = htKeyValues.GetEnumerator();
+ ICollection coll = htKeyValues.Values;
+
+ IDictionaryEnumerator ienum = (IDictionaryEnumerator)coll.GetEnumerator();
+
+
+ KeyValue kv = (KeyValue)ienum.Current;
+ while (kv != null)
+ {
+ sb.Append(kv.ToXML());
+ if (ienum.MoveNext())
+ kv = (KeyValue)ienum.Value;
+ else
+ kv = null;
+ }
+ sb.Append("");
+ sb.Append("");
+
+ return sb.ToString();
+ }
+ }
+}
diff --git a/c_micasad/cache/SecretStore.cs b/c_micasad/cache/SecretStore.cs
new file mode 100644
index 00000000..086e09c8
--- /dev/null
+++ b/c_micasad/cache/SecretStore.cs
@@ -0,0 +1,603 @@
+using System;
+using System.Collections;
+using System.Threading;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Security.Cryptography;
+using System.Text;
+using sscs.cache;
+using sscs.common;
+using sscs.constants;
+using sscs.lss;
+using sscs.crypto;
+
+namespace sscs.cache
+{
+ class SecretStore
+ {
+ internal string secretStoreName; // User name ?
+ internal int refCount;
+ private uint version;
+ private Hashtable tKeyChainList = new Hashtable();
+ private Hashtable keyChainList; //= Hashtable.Synchronized(tKeyChainList);
+ internal User user;
+ private Mutex ssMutex ; //reqd only for refCount
+ private int state; // Maintains the state of SS ( keychain
+ // type availability). TODO: Convert to a class.
+
+ private static int STATE_NOT_DEFINED = 0;
+ private static int STATE_OK = 1;
+ private static int STATE_LOCKED = 2;
+
+ private LocalStorage lss = null;
+ bool bIsStorePersistent = false;
+
+ private DateTime createTime;
+ public DateTime CreateTime
+ {
+ get
+ {
+ return createTime;
+ }
+ set
+ {
+ createTime = value;
+ }
+ }
+
+ ~SecretStore()
+ {
+ ssMutex.Close();
+ }
+
+ internal SecretStore(User ssUser)
+ {
+ secretStoreName = ssUser.GetUserName();
+ version = 1;
+ state = STATE_NOT_DEFINED;
+ user = ssUser;
+ refCount = 0;
+ keyChainList = Hashtable.Synchronized(tKeyChainList);
+
+ ssMutex = new Mutex();
+ }
+
+ internal bool IsStorePersistent()
+ {
+ return bIsStorePersistent;
+ }
+
+ public bool StopPersistence()
+ {
+ if(lss != null && bIsStorePersistent == true)
+ {
+ lss.StopPersistence();
+ lss = null;
+ bIsStorePersistent = false;
+ }
+ return true;
+ }
+
+ public bool IsStoreLocked()
+ {
+ if (state == STATE_LOCKED)
+ return true;
+ else
+ return false;
+ }
+
+ public void LockStore()
+ {
+ state = STATE_LOCKED;
+ }
+
+ public bool UnlockStore(string sDesktopPassword, string sMasterPassword)
+ {
+ if (sDesktopPassword != null)
+ {
+ // verify Desktop password
+ state = STATE_OK;
+ return true;
+ }
+
+
+ if (sMasterPassword != null)
+ {
+ // verify MasterPassword
+ state = STATE_OK;
+ return true;
+ }
+
+ return false;
+
+ }
+
+ internal bool StartPersistenceByDesktopPasswd(string desktopPasswd)
+ {
+ try
+ {
+ byte[] baPasscode;
+ /* Persistence could have started because the user
+ * could have set master password.
+ */
+ if(lss != null && bIsStorePersistent == true)
+ {
+ /* Verify passcode and if validation fails, rewrite
+ * desktop file.
+ */
+ if(File.Exists(GetPasscodeByDesktopFilePath()))
+ {
+ }
+ else
+ {
+ /* Write the desktop passwd file.
+ */
+ }
+ CSSSLogger.DbgLog(CSSSLogger.GetExecutionPath(this) + " Store is already persistent");
+ return true;
+ }
+
+ if(!File.Exists(GetPasscodeByDesktopFilePath()))
+ {
+ //Else passcode needs to be generated.
+ baPasscode = CASACrypto.GenerateMasterPasscodeUsingString(
+ desktopPasswd,
+ GetPasscodeByDesktopFilePath(),
+ GetValidationFilePath(),
+ user.UserIdentifier);
+
+ if( null == baPasscode )
+ return false;
+
+ if(!File.Exists(GetKeyFilePath()))
+ {
+ RijndaelManaged myRijndael = new RijndaelManaged();
+ byte[] key;
+ byte[] IV = new byte[16];
+ //Create a new key and initialization vector.
+ myRijndael.GenerateKey();
+ key = myRijndael.Key;
+ CASACrypto.StoreKeySetUsingMasterPasscode(key,IV,
+ baPasscode,
+ GetKeyFilePath());
+ }
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ return true;
+ }
+ baPasscode = CASACrypto.GetMasterPasscodeUsingDesktopPasswd(desktopPasswd, GetPasscodeByDesktopFilePath());
+ if(baPasscode != null)
+ {
+ if(CASACrypto.ValidatePasscode(baPasscode,GetValidationFilePath()))
+ {
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ return true;
+ }
+ else
+ {
+ lss = null;
+ bIsStorePersistent = false; //till masterPasswd is verified
+ }
+ return true;
+ }
+ else
+ {
+ CSSSLogger.DbgLog(CSSSLogger.GetExecutionPath(this) + " May be desktop passwd has changed");
+ lss = null;
+ bIsStorePersistent = false;
+ return false;
+ }
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return false;
+ }
+
+ internal bool SetMasterPassword(string mPasswdFromIDK)
+ {
+ try
+ {
+ char[] trimChars = {'\0'};
+ string mPasswd = mPasswdFromIDK.TrimEnd(trimChars);
+ bool isVerifyOperation = false;
+ string mPasswdFileName = GetPasscodeByMasterPasswdFilePath();
+ byte[] baPasscode;
+ if(File.Exists(mPasswdFileName))
+ isVerifyOperation = true; //else it is a set operation.
+
+ string desktopPasswd = GetDesktopPasswd();
+
+ if(isVerifyOperation == false)
+ {
+ /* Here the master password file needs to be generated.
+ */
+ if(desktopPasswd != null)
+ {
+ baPasscode = CASACrypto.GetMasterPasscodeUsingDesktopPasswd(desktopPasswd, GetPasscodeByDesktopFilePath());
+ if(CASACrypto.ValidatePasscode(baPasscode,GetValidationFilePath()))
+ {
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(
+ baPasscode,
+ mPasswd,
+ GetPasscodeByMasterPasswdFilePath());
+ return true;
+ }
+ else
+ {
+ //Probably desktop passwd has changed.
+ //But as even master passwd is being set only now,
+ //the persistent store is lost.
+
+ baPasscode = CASACrypto.GenerateMasterPasscodeUsingString(mPasswd,GetPasscodeByMasterPasswdFilePath(),GetValidationFilePath(), user.UserIdentifier);
+ if(baPasscode != null)
+ {
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(baPasscode,mPasswd,GetPasscodeByMasterPasswdFilePath());
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(baPasscode,desktopPasswd,GetPasscodeByDesktopFilePath());
+ if(File.Exists(GetPersistenceFilePath()))
+ {
+ File.Delete(GetPersistenceFilePath());
+ CSSSLogger.DbgLog("Removing the persistent storeas its meaningless now.");
+ }
+ if( bIsStorePersistent == false )
+ {
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ //return true;
+ }//if a valid desktop Passwd is present - if ends here
+ else
+ {
+ /* If desktop passwd is not there and user sets
+ * master password.
+ */
+ if(File.Exists(GetPersistenceFilePath()))
+ {
+ File.Delete(GetPersistenceFilePath());
+ CSSSLogger.DbgLog("Removing the persistent storeas its meaningless now. - Desktop passwd is not there and Master password is being set");
+ }
+ if(File.Exists((GetPasscodeByDesktopFilePath())))
+ {
+ File.Delete((GetPasscodeByDesktopFilePath()));
+ CSSSLogger.DbgLog("Removing the persistent storeas its meaningless now. - Desktop passwd is not there and Master password is being set");
+ }
+
+
+ baPasscode = CASACrypto.GenerateMasterPasscodeUsingString(mPasswd,GetPasscodeByMasterPasswdFilePath(),GetValidationFilePath(), user.UserIdentifier);
+ if(baPasscode != null)
+ {
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(baPasscode,mPasswd,GetPasscodeByMasterPasswdFilePath());
+ if( bIsStorePersistent == false )
+ {
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ }
+ return true;
+ }
+ return false;
+ }
+ }//end of isVerifyOperation == false
+ else
+ {
+ /* Verify the master password. If verified, and if
+ * persistence has not started, start it.
+ */
+
+ //Get the passcode from master passwd file and validate.
+ //If validation succeeds,start persistence.
+ if(desktopPasswd == null)
+ {
+ baPasscode = CASACrypto.DecryptMasterPasscodeUsingString(mPasswd, GetPasscodeByMasterPasswdFilePath());
+ if(CASACrypto.ValidatePasscode(baPasscode,GetValidationFilePath()))
+ {
+ if(bIsStorePersistent == false)
+ {
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ { //There are 2 cases - either desktop passwd has changed
+ //or it hasnt.
+ baPasscode = CASACrypto.GetMasterPasscodeUsingMasterPasswd(mPasswd, GetPasscodeByMasterPasswdFilePath());
+ if(CASACrypto.ValidatePasscode(baPasscode,GetValidationFilePath()))
+ {
+ RewriteDesktopPasswdFile(baPasscode,desktopPasswd);
+ if(bIsStorePersistent == false)
+ {
+ lss = new LocalStorage(this,baPasscode);
+ bIsStorePersistent = true;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return false;
+ }//End of SetMasterPassword
+
+ internal bool RewriteDesktopPasswdFile(byte[] baPasscode, string desktopPasswd)
+ {
+ try
+ {
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(baPasscode, desktopPasswd, GetPasscodeByDesktopFilePath());
+ CSSSLogger.DbgLog("Re-encryted passcode with desktop passwd");
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return true;
+ }
+
+ internal byte[] GetPasscodeFromOldDesktopPasswd(string oldDesktopPasswd)
+ {
+ try
+ {
+ byte[] baPasscode = CASACrypto.GetMasterPasscodeUsingDesktopPasswd(oldDesktopPasswd, GetPasscodeByDesktopFilePath());
+ if(CASACrypto.ValidatePasscode(baPasscode,GetValidationFilePath()))
+ {
+ return baPasscode;
+ }
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return null;
+ }
+
+ /* This method would be called, when the user is setting his
+ * master passcode for the first time.
+ */
+
+ internal bool SetMasterPasscode(string sMasterPasscode)
+ {
+ return true;
+#if false
+ bool bRet = false;
+ try
+ {
+ if(!CASACrypto.CheckIfMasterPasscodeIsAvailable(desktopPasswd, GetPasswdFilePath()))
+ {
+ RijndaelManaged myRijndael = new RijndaelManaged();
+ byte[] key;
+ byte[] IV = new byte[16];
+ //Create a new key and initialization vector.
+ myRijndael.GenerateKey();
+ key = myRijndael.Key;
+ CASACrypto.StoreKeySetUsingMasterPasscode(key,IV,sMasterPasscode,GetKeyFilePath());
+ //Store the master passcode encrypted with the desktopPasswd
+ CASACrypto.EncryptAndStoreMasterPasscodeUsingString(sMasterPasscode, desktopPasswd, GetPasswdFilePath());
+ lss = new LocalStorage(this,sMasterPasscode);
+ bIsStorePersistent = true;
+ bRet = true;
+ }
+ else
+ {
+ //Console.WriteLine("Master passcode is already set");
+ }
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return bRet;
+#endif
+ }
+
+ internal void IncrRefCount()
+ {
+ try
+ {
+ ssMutex.WaitOne();
+ refCount++;
+ ssMutex.ReleaseMutex();
+ CSSSLogger.DbgLog(CSSSLogger.GetExecutionPath(this) + " : RefCount = " + refCount);
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+ }
+
+ internal void DecrRefCount()
+ {
+ try
+ {
+ ssMutex.WaitOne();
+ refCount--;
+ ssMutex.ReleaseMutex();
+ CSSSLogger.DbgLog(CSSSLogger.GetExecutionPath(this) + " : RefCount = " + refCount);
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+
+ }
+
+ internal bool AddKeyChain(KeyChain keychain)
+ {
+ try
+ {
+ keychain.CreatedTime = DateTime.Now;
+ keyChainList.Add(keychain.GetKey(),keychain);
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.DbgLog(e.ToString());
+ throw e;
+ }
+
+ CSSSLogger.DbgLog(CSSSLogger.GetExecutionPath(this) + " - Succefully added Keychain = "+ keychain.GetKey() + " length = "+ (keychain.GetKey()).Length);
+
+ return true;
+ }
+ internal bool RemoveKeyChain(string id)
+ {
+ keyChainList.Remove(id);
+ return true;
+ }
+ internal KeyChain GetKeyChain(string id)
+ {
+ if(keyChainList.ContainsKey(id))
+ {
+ CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Keychain already exists.");
+ KeyChain kc = (KeyChain)(keyChainList[id]);
+ kc.AccessedTime = DateTime.Now;
+ return kc;
+ }
+ else
+ {
+ CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Keychain doesnot exist.Returning null.");
+ throw new KeyChainDoesNotExistException(id);
+ }
+
+ }
+ internal bool CheckIfKeyChainExists(string id)
+ {
+ if(keyChainList.ContainsKey(id))
+ return true;
+ else
+ return false;
+ }
+
+ /* This function would need to do any storage/cleanup required
+ * before removing a user session.
+ */
+ internal bool CommitStore()
+ {
+ if(lss != null)
+ lss.PersistStore();
+ return true;
+ }
+
+ internal IEnumerator GetKeyChainEnumerator()
+ {
+ //TBD
+ // Return an Enumerator class which has all secrets in this keychain
+ return keyChainList.GetEnumerator();
+ }
+ internal void DumpSecretstore()
+ {
+ lock(keyChainList.SyncRoot)
+ {
+ IDictionaryEnumerator iter = (IDictionaryEnumerator)GetKeyChainEnumerator();
+ while( iter.MoveNext() )
+ {
+ int i = 0;
+ KeyChain kc = (KeyChain)iter.Value;
+ CSSSLogger.DbgLog("\nKeychain id = " + kc.GetKey());
+ CSSSLogger.DbgLog("Secret List is ");
+ IDictionaryEnumerator secIter = (IDictionaryEnumerator)(kc.GetAllSecrets());
+ while(secIter.MoveNext())
+ {
+ Secret secret = (Secret)secIter.Value;
+ CSSSLogger.DbgLog("Secret " + i.ToString() + " id = " + secret.GetKey() + " value = " + secret.GetValue() );
+ IDictionaryEnumerator etor = (IDictionaryEnumerator) secret.GetKeyValueEnumerator();
+ while(etor.MoveNext())
+ {
+ KeyValue kv = (KeyValue)etor.Value;
+ CSSSLogger.DbgLog("Key = " + kv.Key +" Value = " + kv.GetValue());
+ }
+ i++;
+ }
+ }
+ }
+ }
+
+ internal int GetSecretStoreState()
+ {
+ return state;
+ }
+ internal int GetNumKeyChains()
+ {
+ return keyChainList.Count;
+ }
+
+ internal bool SetSecretStoreState(int stateToSet)
+ {
+ //BrainShare Special Only - Only Session keychains state 1
+
+ state = STATE_OK;
+ return true;
+ }
+
+ internal string GetDesktopPasswd()
+ {
+ try
+ {
+ string keyChainId = ConstStrings.SSCS_SESSION_KEY_CHAIN_ID + "\0";
+ KeyChain keyChain = GetKeyChain(keyChainId);
+ Secret secret = keyChain.GetSecret(ConstStrings.MICASA_DESKTOP_PASSWD);
+ string passwd = secret.GetKeyValue(ConstStrings.MICASA_DESKTOP_PASSWD_KEYNAME).GetValue();
+ return passwd;
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return null;
+ }
+
+ internal string GetUserHomeDirectory()
+ {
+ return user.GetUserHomeDir();
+ }
+
+ internal string GetKeyFilePath()
+ {
+ string homeDir = GetUserHomeDirectory();
+ return homeDir + ConstStrings.MICASA_KEY_FILE;
+ }
+ internal string GetPasscodeByDesktopFilePath()
+ {
+ string homeDir = GetUserHomeDirectory();
+ return homeDir + ConstStrings.MICASA_PASSCODE_BY_DESKTOP_FILE;
+ }
+
+ internal string GetPasscodeByMasterPasswdFilePath()
+ {
+ string homeDir = GetUserHomeDirectory();
+ return homeDir + ConstStrings.MICASA_PASSCODE_BY_MASTERPASSWD_FILE;
+ }
+
+ internal string GetPersistenceFilePath()
+ {
+ string homeDir = GetUserHomeDirectory();
+ return homeDir + ConstStrings.MICASA_PERSISTENCE_FILE;
+ }
+ internal string GetValidationFilePath()
+ {
+ string homeDir = GetUserHomeDirectory();
+ return homeDir + ConstStrings.MICASA_VALIDATION_FILE;
+ }
+ }
+}
diff --git a/c_micasad/common/CSSSException.cs b/c_micasad/common/CSSSException.cs
new file mode 100644
index 00000000..c7aa1b9a
--- /dev/null
+++ b/c_micasad/common/CSSSException.cs
@@ -0,0 +1,80 @@
+using System;
+using System.IO;
+
+namespace sscs.common
+{
+
+//TBD
+// All user defined exceptions will extend this class in future
+internal class CSSSException : ApplicationException
+{
+ internal string user;
+ internal CSSSException (string message)
+ {
+
+ }
+}
+
+internal class CommunicationException : ApplicationException
+{
+ internal CommunicationException (String message) : base (message)
+ {
+ }
+ internal CommunicationException (String message, Exception inner) : base(message,inner)
+ {
+
+ }
+}
+
+
+internal class MessageFormatException : Exception
+{
+ internal MessageFormatException (String message) : base (message)
+ {
+
+ }
+
+ internal MessageFormatException (String message, Exception inner) : base(message,inner)
+ {
+ }
+
+}
+
+internal class UserNotInSessionException : Exception
+{
+ internal UserNotInSessionException (String message) : base (message)
+ {
+ CSSSLogger.DbgLog(message);
+ }
+ internal UserNotInSessionException (UserIdentifier user)
+ {
+ CSSSLogger.DbgLog("UserIdentifier is not in session table " + user.GetUID());
+ }
+}
+
+
+internal class KeyChainDoesNotExistException : Exception
+{
+ internal KeyChainDoesNotExistException (String kId)
+ {
+ CSSSLogger.DbgLog("Keychain - " + kId + " not found");
+ }
+}
+
+internal class SecretNotFoundException : Exception
+{
+ internal SecretNotFoundException (String sId)
+ {
+ CSSSLogger.DbgLog("SecretId - " + sId + " not found");
+ }
+
+}
+
+internal class CryptoException : ApplicationException
+{
+ internal CryptoException(string msg)
+ {
+ CSSSLogger.DbgLog("Crypto exception : " + msg );
+ }
+}
+}
diff --git a/c_micasad/common/CSSSLogger.cs b/c_micasad/common/CSSSLogger.cs
new file mode 100644
index 00000000..92fb4562
--- /dev/null
+++ b/c_micasad/common/CSSSLogger.cs
@@ -0,0 +1,211 @@
+using System;
+using System.Text;
+using System.Diagnostics;
+using sscs.common;
+using sscs.constants;
+using System.IO;
+using System.Threading;
+
+namespace sscs.common
+{
+ /*
+ * This ia a common logging facility for windows and Linux.
+ * This also is the common place to log all server logs and debug logs.
+ */
+
+ class CSSSLogger
+ {
+ //private static CSSSLogger csssLog = null;
+ //private static string WINID = "Microsoft";
+ private static string engineLog = null;
+#if DEBUG
+ private static string LINUXID = "Unix";
+ private static string debugLog = null;
+ private static Stream debugStream= null;
+#endif
+ private static StreamWriter serverTrace= null;
+ private static Mutex dbgmutex = new Mutex();
+
+ static CSSSLogger()
+ {
+#if DEBUG
+ if (Environment.OSVersion.ToString().StartsWith(LINUXID))
+ {
+ engineLog = ConstStrings.SSCS_LINUX_ENGINELOG;
+ debugLog = ConstStrings.SSCS_LINUX_DEBUGLOG;
+ }
+ else
+ {
+ engineLog = ConstStrings.SSCS_WIN_ENGINELOG;
+ debugLog = ConstStrings.SSCS_WIN_DEBUGLOG;
+ }
+
+ /* There is no set up for Server Trace
+ * open and close would be done when needed.
+ */
+
+ // Set up for Debug
+
+ if( File.Exists( debugLog ) )
+ {
+ File.Delete( debugLog );
+ }
+
+ debugStream = File.Create(debugLog);
+
+ Debug.Listeners.Add(new TextWriterTraceListener(debugStream));
+ Debug.AutoFlush = true;
+ Debug.Indent();
+ Debug.WriteLine("Debug Log created");
+#endif
+ }
+
+ public static void log(bool criticality, String message)
+ {
+ if (criticality) // Status message
+ WritetoServerLog(message);
+ else
+ DbgLog(message);
+ }
+
+ public static void log(bool criticality, System.Exception e)
+ {
+ if (criticality) // Status message
+ WritetoServerLog(e.ToString());
+ else
+ DbgLog(e.ToString());
+
+ }
+
+ public static void ExecutionTrace(Object obj)
+ {
+#if DEBUG
+ StringBuilder message = null;
+ StackTrace st = null;
+ try
+ {
+ message = new StringBuilder();
+ st = new StackTrace(true);
+ }
+ catch( OutOfMemoryException e )
+ {
+ ExpLog(e.ToString());
+ throw e;
+ }
+ Type type = obj.GetType();
+ StackFrame sf = st.GetFrame(1);
+ message.Append(" ThreadID: ");
+ message.Append(Thread.CurrentThread.GetHashCode().ToString());
+ message.Append(" Executing Path: ");
+ message.Append(type.ToString());
+ message.Append(":");
+ message.Append(sf.GetMethod().ToString());
+ log( ConstStrings.DEBUG,message.ToString() );
+#endif
+ }
+
+ public static void ExecutionTrace(Type type)
+ {
+#if DEBUG
+ StringBuilder message = null;
+ StackTrace st = null;
+ try
+ {
+ message = new StringBuilder();
+ st = new StackTrace(true);
+ }
+ catch( OutOfMemoryException e )
+ {
+ ExpLog(e.ToString());
+ throw e;
+ }
+ StackFrame sf = st.GetFrame(1);
+ message.Append(" ThreadID: ");
+ message.Append(Thread.CurrentThread.GetHashCode().ToString());
+ message.Append(" Executing Path: ");
+ message.Append(type.ToString());
+ message.Append(":");
+ message.Append(sf.GetMethod().ToString());
+ log( ConstStrings.DEBUG,message.ToString() );
+#endif
+ }
+
+
+ public static string GetExecutionPath(Object obj)
+ {
+ StringBuilder message = null;
+ StackTrace st = null;
+ try
+ {
+ message = new StringBuilder();
+ st = new StackTrace(true);
+ }
+ catch( OutOfMemoryException e )
+ {
+ ExpLog(e.ToString());
+ throw e;
+ }
+ Type type = obj.GetType();
+ StackFrame sf = st.GetFrame(1);
+ message.Append(" ThreadID: ");
+ message.Append(Thread.CurrentThread.GetHashCode().ToString());
+ message.Append(" Executing Path: ");
+ message.Append(type.ToString());
+ message.Append("::");
+ message.Append(sf.GetMethod().ToString());
+ return message.ToString();
+ }
+
+
+ public static void logbreak()
+ {
+ dbgmutex.WaitOne();
+ Debug.WriteLine(" ") ;
+ Debug.WriteLine("----------------------------------------------------") ;
+ Debug.WriteLine(" ") ;
+ dbgmutex.ReleaseMutex();
+
+ }
+
+ // The log format is Time stamp : Machine name: Product name: Logging information
+ private static void WritetoServerLog( string message )
+ {
+ serverTrace = File.AppendText(engineLog);
+ serverTrace.Write("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
+ serverTrace.Write("CSSS");
+ serverTrace.Write(message);
+ serverTrace.Flush();
+ serverTrace.Close();
+ }
+
+
+ // The log format is Time stamp :Component name: Error description
+ public static void DbgLog(string message)
+ {
+ dbgmutex.WaitOne();
+
+ Debug.Write(DateTime.Now.ToLongTimeString());
+ Debug.Write(" " + DateTime.Now.ToLongDateString());
+ Debug.Write(":");
+ Debug.WriteLine(message);
+// Debug.WriteLine(" ") ;
+
+ dbgmutex.ReleaseMutex();
+ }
+
+ public static void ExpLog(string message)
+ {
+ dbgmutex.WaitOne();
+
+ Debug.Write(DateTime.Now.ToLongTimeString());
+ Debug.Write(" " + DateTime.Now.ToLongDateString());
+ Debug.Write(": Exception encountered - ");
+ Debug.WriteLine(message);
+ Debug.WriteLine(" ") ;
+ StackTrace st = new StackTrace();
+ Debug.WriteLine(st.ToString());
+
+ dbgmutex.ReleaseMutex();
+ }
+ }
+}
diff --git a/c_micasad/common/Constants.cs b/c_micasad/common/Constants.cs
new file mode 100644
index 00000000..858f40a2
--- /dev/null
+++ b/c_micasad/common/Constants.cs
@@ -0,0 +1,125 @@
+using System;
+namespace sscs.constants
+{
+ class IPCRetCodes
+ {
+ internal static int SSCS_REPLY_SUCCESS = 0;
+ internal static int SSCS_E_INVALID_MESSAGE = -1;
+ internal static int SSCS_E_VERSION_NOT_SUPPORTED = -2;
+ internal static int SSCS_E_SYSTEM_ERROR = -3;
+ internal static int SSCS_E_REPLY_NOT_AVAILABLE = -4;
+ internal static int SSCS_E_INVALID_KEYCHAIN = -5;
+ internal static int SSCS_E_INVALID_SECRETID = -6;
+ internal static int SSCS_E_KEYCHAIN_ALREADY_EXISTS = -7;
+ internal static int SSCS_E_MAX_KEYCHAINS_REACHED = -8;
+ internal static int SSCS_E_ADD_KEYCHAIN_FAILED = -9;
+ internal static int SSCS_E_NO_KEYCHAINS_EXIST = -10;
+ internal static int SSCS_E_KEYCHAIN_DOES_NOT_EXIST = -11;
+ internal static int SSCS_E_REMOVE_KEYCHAIN_FAILED = -12;
+ internal static int SSCS_E_WRITE_SECRET_FAILED = -13;
+ internal static int SSCS_E_ADDING_DEFAULT_KEYCHAIN_FAILED = -14;
+ internal static int SSCS_E_NO_SECRETS_EXIST = -15;
+ internal static int SSCS_E_REMOVE_SECRET_FAILED = -16;
+ internal static int SSCS_E_GET_SOCKET_PATH_FAILED = -17;
+ internal static int SSCS_E_CREATE_SOCKET_FAILED = -18;
+ internal static int SSCS_E_SECRETID_DOES_NOT_EXIST = -19;
+ internal static int SSCS_E_INVALID_INPUT = -20;
+ internal static int SSCS_E_SETTING_PASSCODE_FAILED = -21;
+ internal static int SSCS_PROMPT_PASSCODE = 1;
+ internal static int SSCS_STORE_IS_PERSISTENT = -22;
+ internal static int SSCS_STORE_IS_NOT_PERSISTENT = -23;
+ internal static int SSCS_SECRET_IS_PERSISTENT = -24;
+ internal static int SSCS_SECRET_IS_NOT_PERSISTENT = -25;
+
+ }
+
+ internal class ReqMsgId
+ {
+
+ }
+ internal class RespMsgId
+ {
+
+ }
+
+ internal class RetCodes
+ {
+ internal static int SUCCESS = 0;
+ internal static int FAILURE = -1;
+ internal static int LOAD_HIDDEN_ONLY = 1;
+ internal static int LOAD_ALL_EXCEPT_HIDDEN = 2;
+ internal static int WRITE_HIDDEN_ONLY = 3;
+ internal static int WRITE_ALL_EXCEPT_HIDDEN = 4;
+ internal static int WRITE_ALL = 5;
+ }
+
+ internal class ConstStrings
+ {
+ internal static string SSCS_SESSION_KEY_CHAIN_ID = "SSCS_SESSION_KEY_CHAIN_ID";
+ internal static string SSCS_LOCAL_KEY_CHAIN_ID = "SSCS_LOCAL_KEY_CHAIN_ID";
+ internal static string SSCS_HIDDEN_LOCAL_KEYCHAIN_ID = "SSCS_HIDDEN_LOCAL_KEYCHAIN_ID";
+ internal static string SSCS_REMOTE_KEYCHAIN_ID = "SSCS_REMOTE_KEYCHAIN_ID";
+ internal static string SSCS_LOCAL_REMOTE_KEYCHAIN_ID = "SSCS_LOCAL_REMOTE_KEYCHAIN_ID";
+
+ //TBD , Need to look at Novell standard for the desktop
+ internal static string SSCS_WIN_ENGINELOG = "c:\\CSSS.log";
+ internal static string SSCS_WIN_DEBUGLOG = "c:\\CSSSDEBUG.log";
+
+ //TBD , Need to look at Novell standard for the desktop
+ internal static string SSCS_LINUX_ENGINELOG = "/var/log/localmessages";
+ internal static string SSCS_LINUX_DEBUGLOG = "/var/log/micasad_debug.log";
+ internal static string SSCS_LINUX_PIDFILE = "/var/run/micasad.pid";
+
+
+ internal static bool STATUS = true;
+ internal static bool DEBUG = false;
+
+ internal static string MICASA_DESKTOP_PASSWD = "SS_CredSet:Desktop\0";
+
+// internal static string MICASA_DESKTOP_PASSWD_KEYNAME = "Password\0";
+ internal static string MICASA_DESKTOP_PASSWD_KEYNAME = "Password";
+
+ // The file where the key (encrypted with master passcode)
+ // would be stored
+ internal static string MICASA_PASSCODE_BY_DESKTOP_FILE = "/.miCASAPCByDesktop";
+
+ internal static string MICASA_PASSCODE_BY_MASTERPASSWD_FILE = "/.miCASAPCByMPasswd";
+
+ //The file where all possible passwds are cross encrypted and
+ //stored to provide multiple recovery points.
+ internal static string MICASA_KEY_FILE = "/.miCASAKey";
+
+ //The file where the user's credentials are persisted.
+ internal static string MICASA_PERSISTENCE_FILE = "/.miCASA";
+
+ //The file required to validate the desktop passwd
+ internal static string MICASA_VALIDATION_FILE = "/.miCASAValidate";
+
+ internal static string MICASA_VALIDATION_STRING = "miCASAValidationString";
+
+ }
+
+ internal class ConstFlags
+ {
+ internal static uint SSFLAGS_DESTROY_SESSION_F = 1;
+ }
+ internal class XmlConsts
+ {
+ internal static string miCASANode = "miCASA";
+ internal static string versionAttr = "version";
+ internal static string keyChainNode = "KeyChain";
+ internal static string idAttr = "id";
+ internal static string secretNode = "Secret";
+ internal static string valueNode = "Value";
+ internal static string timeNode = "Time";
+ internal static string createdTimeNode = "created";
+ internal static string modifiedTimeNode = "modified";
+ internal static string keyNode = "Key";
+ internal static string keyValueNode = "KeyValue";
+ internal static string linkedKeyNode = "LinkedKey";
+ internal static string linkedTargetSecretNode = "TargetSecret";
+ internal static string linkedTargetKeyNode = "TargetKey";
+ }
+}
+
+
diff --git a/c_micasad/common/RequestParser.cs b/c_micasad/common/RequestParser.cs
new file mode 100644
index 00000000..db723151
--- /dev/null
+++ b/c_micasad/common/RequestParser.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections;
+using System.Text;
+using System.Threading;
+using sscs.verbs;
+using sscs.common;
+
+/*
+ * After the bytes format is finalized for Windows this class might need to
+ * be modified..
+ * Depending upon impact either a new method can be invoked after platfrom
+ * check or a Factory pattern can be used to redesign this class.
+ */
+
+/*
+ * Namespaces used inside SSCS(main) will be of the following format "sscs.*"
+ * The NameSpaces available are....
+ * sscs.common [session, RequestParser]
+ * sscs.authentication
+ * sscs.verbs;[ssVerb, .......]
+ * sscs.cache [secretstore, keychain, secret]
+ * sscs.lss;
+ * sscs.synchronization;
+ * sscs.crypto
+ */
+
+namespace sscs.common
+{
+ /* This class will be used to convert raw bytes to one of the SecretStore
+ * Verbs. Although there is no need to have many instances,
+ * this class will NOT be singleton class since we
+ * do not want a hit on performance (synchronization, obtaining locks,
+ * releasing locks...etc )
+ * Making it singleton is not giving us any advantage versus performance.
+ */
+ internal class RequestParser
+ {
+ Hashtable msgIdMap = new Hashtable();
+
+ internal RequestParser()
+ {
+ msgIdMap.Add(1,"sscs.verbs.OpenSecretStore");
+ msgIdMap.Add(2,"sscs.verbs.CloseSecretStore");
+ msgIdMap.Add(3,"sscs.verbs.RemoveSecretStore");
+ msgIdMap.Add(4,"sscs.verbs.EnumerateKeyChainIds");
+ msgIdMap.Add(5,"sscs.verbs.AddKeyChain");
+ msgIdMap.Add(6,"sscs.verbs.RemoveKeyChain");
+ msgIdMap.Add(7,"sscs.verbs.EnumerateSecretIds");
+ msgIdMap.Add(8,"sscs.verbs.ReadSecret");
+ msgIdMap.Add(9,"sscs.verbs.WriteSecret");
+ msgIdMap.Add(10,"sscs.verbs.RemoveSecret");
+ msgIdMap.Add(11,"sscs.verbs.GetSecretStoreInfo");
+ msgIdMap.Add(12,"sscs.verbs.GetKeyChainInfo");
+ msgIdMap.Add(13,"sscs.verbs.LockCache");
+ msgIdMap.Add(14,"sscs.verbs.UnLockCache");
+ msgIdMap.Add(15,"sscs.verbs.SetMasterPasscode");
+ msgIdMap.Add(16,"sscs.verbs.ReadKey");
+ msgIdMap.Add(17,"sscs.verbs.WriteKey");
+ msgIdMap.Add(18,"sscs.verbs.SetMasterPassword");
+ msgIdMap.Add(19,"sscs.verbs.IsSecretPersistent");
+ msgIdMap.Add(20,"sscs.verbs.ObjectSerialization");
+ }
+
+
+ /* Processes the request and returns the corrrect SSverb.
+ * This interface works on the class member rawbytes and
+ * returns the result.
+ */
+ internal SSVerb ParseRequest(byte[] rawbytes)
+ {
+ if (rawbytes == null)
+ throw new FormatException("Message format incorrect");
+
+ String className = GetClassName(rawbytes);
+
+ SSVerb theVerb = (SSVerb)Activator.CreateInstance(null, className ).Unwrap();
+ theVerb.SetMessageContent(rawbytes);
+
+ /*
+ * TBD: We can send the activation params in the same call.
+ */
+ //SSVerb theVerb = (SSVerb)Activator.CreateInstance(Type.GetType(className)).Unwrap();
+
+ return theVerb;
+ }
+
+ private string GetClassName(byte[] ipcbytes)
+ {
+ /*
+ * Read first two bytes and get ushort
+ * Look up table and send class name
+ */
+ ushort msgId = BitConverter.ToUInt16(ipcbytes,0);
+ return ((String)(msgIdMap[(int)msgId]));
+ }
+ }
+}
diff --git a/c_micasad/common/SessionManager.cs b/c_micasad/common/SessionManager.cs
new file mode 100644
index 00000000..93b1043d
--- /dev/null
+++ b/c_micasad/common/SessionManager.cs
@@ -0,0 +1,343 @@
+using System;
+using System.Collections;
+using System.Threading;
+using System.IO;
+using sscs.cache;
+using sscs.common;
+using sscs.constants;
+using System.Diagnostics;
+
+namespace sscs.common
+{
+
+ class SessionManager
+ {
+ private static readonly SessionManager sessionManager = new SessionManager();
+ private static Mutex mutex = new Mutex();
+ private static Hashtable sessionTable = new Hashtable();
+ private static Thread tJanitor = null;
+ private static int JANITOR_SLEEP_TIME = 1000*60*5; // 5 minutes
+
+ private SessionManager()
+ {
+#if LINUX
+ if (tJanitor == null)
+ {
+ tJanitor = new Thread(new ThreadStart(CleanUpSessionsThread));
+ tJanitor.Start();
+ }
+#endif
+ }
+ ~SessionManager()
+ {
+ if (tJanitor != null)
+ {
+ tJanitor.Abort();
+ tJanitor.Join();
+ }
+ mutex.Close();
+ }
+ internal static SessionManager GetSessionManager
+ {
+ get
+ {
+ return sessionManager;
+ }
+ }
+
+ internal static SecretStore CreateUserSession(UserIdentifier userId)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ SecretStore ss;
+ userId.PrintIdentifier();
+ try
+ {
+ ss = GetUserSecretStore(userId);
+ ss.IncrRefCount();
+ ss.CreateTime = DateTime.Now;
+ return ss;
+ }
+ catch(UserNotInSessionException e)
+ {
+ // Would create either windows/unix user
+ // depending on the platform.
+ User user = User.CreateUser(userId);
+ mutex.WaitOne();
+ sessionTable.Add(userId,user);
+ mutex.ReleaseMutex();
+ ss = user.GetSecretStore();
+ ss.IncrRefCount();
+ ss.CreateTime = DateTime.Now;
+ return ss;
+ }
+ }
+
+ internal static bool RemoveUserSession(UserIdentifier userId, bool destroySession)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ try
+ {
+ mutex.WaitOne();
+ SecretStore ss = GetUserSecretStore(userId);
+ ss.DecrRefCount();
+
+ // We must keep the cache alive, and destroy it on
+ // a logout event
+
+ //if( 0 == ss.refCount )
+ if (destroySession)
+ {
+ CSSSLogger.DbgLog("Removing the user session of " + userId.GetUID());
+ ss.CommitStore();
+ sessionTable.Remove(userId);
+ }
+
+ mutex.ReleaseMutex();
+ return true;
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ return false;
+ }
+
+ internal static bool CheckIfUserSessionExists(UserIdentifier userId)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ mutex.WaitOne();
+
+ if( sessionTable.ContainsKey(userId) )
+ {
+ mutex.ReleaseMutex();
+ return true;
+ }
+ else
+ {
+ mutex.ReleaseMutex();
+ return false;
+ }
+ }
+
+
+ internal static SecretStore GetUserSecretStore(UserIdentifier userId)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ userId.PrintIdentifier();
+ ListActiveUserSessions();
+ mutex.WaitOne();
+ if( sessionTable.ContainsKey(userId) )
+ {
+ User user = (User)sessionTable[userId];
+ SecretStore ss = user.GetSecretStore();
+ mutex.ReleaseMutex();
+ return ss;
+ }
+ else
+ {
+ mutex.ReleaseMutex();
+ throw new UserNotInSessionException(userId);
+
+ }
+ }
+
+ internal static DateTime GetSessionCreateTime(UserIdentifier userId)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ mutex.WaitOne();
+ if( sessionTable.ContainsKey(userId) )
+ {
+ User user = (User)sessionTable[userId];
+ SecretStore ss = user.GetSecretStore();
+ mutex.ReleaseMutex();
+ return ss.CreateTime;
+ }
+ else
+ {
+ mutex.ReleaseMutex();
+ throw new UserNotInSessionException(userId);
+ }
+ }
+
+ internal static void ListActiveUserSessions()
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ mutex.WaitOne();
+ IDictionaryEnumerator etor = sessionTable.GetEnumerator();
+ int i = 0;
+
+ while(etor.MoveNext())
+ {
+ i++;
+/*
+ CSSSLogger.DbgLog("Listing Active User Sessions");
+ Console.WriteLine(etor.Key);
+ Console.WriteLine((((SecretStore)(etor.Value)).secretStoreName + ":" + ((SecretStore)(etor.Value)).refCount);
+*/
+ }
+ mutex.ReleaseMutex();
+ }
+
+
+ private static void CleanUpSessionsThread()
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ try
+ {
+ while (true)
+ {
+ // enumerate users in the session
+ IEnumerator etor;
+ ICollection keys = sessionTable.Keys;
+ if (keys != null)
+ {
+ etor = keys.GetEnumerator();
+ while(etor.MoveNext())
+ {
+ UserIdentifier userIdentifier = (UserIdentifier)etor.Current;
+
+ // check if this user still has
+ // processes running
+ if(CheckAndDestroySession(userIdentifier,false))
+ {
+ /* If at least 1 session was removed,
+ * the etor must be
+ * re-initiated, else
+ * Invalidoperationexception will be
+ * thrown.
+ */
+ keys = sessionTable.Keys;
+ if( null == keys )
+ break;
+ else
+ {
+ etor = keys.GetEnumerator();
+ }
+ }
+ }//while etor.MoveNext ends here.
+ }
+ Thread.Sleep(JANITOR_SLEEP_TIME);
+ } //while true ends here.
+ }
+ catch(ThreadAbortException e)
+ {
+ CSSSLogger.DbgLog("Janitor thread is going down.");
+ }
+
+ }//Method ends here.
+
+ /* As the pam module does a seteuid(), when is ps is
+ * execed it would appear as if the user owns the process.
+ * Hence, if this method is called from CloseSecretStore
+ * verb ( that would have been initiated from the pam
+ * module with ssFlags = 1), then if number of processes
+ * is one, then delete the session.
+ */
+
+ internal static bool CheckAndDestroySession(UserIdentifier userID, bool calledFromClose)
+ {
+ CSSSLogger.ExecutionTrace(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ int iUID = userID.GetUID();
+ bool retVal = false;
+ Process myProcess = null;
+ StreamReader myStreamReader = null;
+ if (iUID != -1)
+ {
+ // make the 'ps h U UID' call
+ try
+ {
+ myProcess = new Process();
+ ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("ps" );
+
+ myProcessStartInfo.Arguments = "h U " + iUID.ToString();
+ myProcessStartInfo.UseShellExecute = false;
+ myProcessStartInfo.RedirectStandardOutput = true;
+ myProcess.StartInfo = myProcessStartInfo;
+ myProcess.Start();
+ myProcess.WaitForExit();
+
+ myStreamReader = myProcess.StandardOutput;
+
+ // Read the standard output of the spawned process.
+ string myString = myStreamReader.ReadLine();
+ int numProcs = 0;
+ while( myString != null)
+ {
+ if(numProcs > 1)
+ break;
+ numProcs++;
+
+ myString = myStreamReader.ReadLine();
+ }
+
+
+ do
+ {
+ /* If this has been called from
+ * CloseSecretStore verb,
+ * verb, the session must be deleted.
+ */
+ if( calledFromClose )
+ {
+ RemoveUserSession(userID, true);
+ retVal = true;
+ break;
+ }
+ /* If the session was created during login,
+ * and the janitor thread starts processing
+ * before user login is completed, we need
+ * maintain the user session (say for 5 mts).
+ */
+ if( (numProcs == 0) && (CheckIfLoginTimeSession(userID)) )
+ {
+ retVal = false;
+ break;
+ }
+
+ /* If the user does not own any processes and
+ * if this method has not been called from
+ * CloseSecretStore verb, it implies that a user
+ * background process, which existed during user
+ * logout has died now.
+ * So, clean the user session.
+ */
+
+ if ( (numProcs == 0) && (!calledFromClose) )
+ {
+ RemoveUserSession(userID, true);
+ retVal = true;
+ break;
+ }
+ }while(false);
+/*
+ myProcess.Close();
+ myStreamReader.Close();
+*/
+ }
+ catch (Exception e)
+ {
+ CSSSLogger.DbgLog(e.ToString());
+ }
+ finally
+ {
+ if( myProcess != null )
+ myProcess.Close();
+ if( myStreamReader != null )
+ myStreamReader.Close();
+
+ }
+ }
+ return retVal;
+ }
+ internal static bool CheckIfLoginTimeSession(UserIdentifier userId)
+ {
+ if( ((TimeSpan)(DateTime.Now - GetSessionCreateTime(userId))).TotalMinutes < 3 )
+ {
+ return true;
+ }
+ else
+ return false;
+ }
+ }
+}
+
diff --git a/c_micasad/common/UnixUser.cs b/c_micasad/common/UnixUser.cs
new file mode 100644
index 00000000..598d3f35
--- /dev/null
+++ b/c_micasad/common/UnixUser.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections;
+using System.IO;
+using sscs.cache;
+using sscs.common;
+using sscs.constants;
+
+namespace sscs.common
+{
+ internal class UnixUser : User
+ {
+ internal UnixUser()
+ {
+ }
+
+ internal UnixUser(UserIdentifier unixUserId)
+ {
+
+ userId = unixUserId;
+ secretStore = new SecretStore(this);
+
+ }
+
+ override internal void SetUserName(string username)
+ {
+ userName = username;
+ }
+
+ override internal string GetUserName()
+ {
+ return userName;
+ }
+
+ override internal string GetUserHomeDir()
+ {
+ uint uid = (uint)userId.GetUID();
+ return Mono.Unix.UnixUser.GetHomeDirectory(uid);
+ }
+
+
+ }
+}
diff --git a/c_micasad/common/UnixUserIdentifier.cs b/c_micasad/common/UnixUserIdentifier.cs
new file mode 100644
index 00000000..1212044d
--- /dev/null
+++ b/c_micasad/common/UnixUserIdentifier.cs
@@ -0,0 +1,36 @@
+using System;
+
+namespace sscs.common
+{
+ internal class UnixUserIdentifier : UserIdentifier
+ {
+ private int uid;
+
+ internal UnixUserIdentifier(int uid)
+ {
+ this.uid = uid;
+ }
+ public override bool Equals(Object obj)
+ {
+ UnixUserIdentifier u = (UnixUserIdentifier)obj;
+ if (u.uid == uid)
+ return true;
+ else
+ return false;
+ }
+ public override int GetHashCode()
+ {
+ return uid.GetHashCode();
+ }
+ public void PrintIdentifier()
+ {
+// Console.WriteLine("UnixUserIdentifier : uid is {0}",uid);
+ }
+
+ public int GetUID()
+ {
+ return uid;
+ }
+
+ }
+}
diff --git a/c_micasad/common/User.cs b/c_micasad/common/User.cs
new file mode 100644
index 00000000..9c49f35a
--- /dev/null
+++ b/c_micasad/common/User.cs
@@ -0,0 +1,49 @@
+using System;
+using System.IO;
+using sscs.cache;
+
+namespace sscs.common
+{
+ abstract class User
+ {
+ protected UserIdentifier userId;
+ public UserIdentifier UserIdentifier
+ {
+ get
+ {
+ return userId;
+ }
+ }
+
+
+ protected SecretStore secretStore;
+
+ protected string home;
+
+/* Change the protection level after getting the latest requirements */
+
+ protected string userName = null;
+
+ abstract internal void SetUserName(string userName);
+ abstract internal string GetUserName();
+ abstract internal string GetUserHomeDir();
+
+ internal SecretStore GetSecretStore()
+ {
+ return secretStore;
+ }
+
+ internal static User CreateUser(UserIdentifier userId)
+ {
+ User user = null;
+#if LINUX
+ user = new UnixUser(userId);
+#endif
+#if W32
+ user = new WinUser(userId);
+#endif
+ return user;
+
+ }
+ }
+}
diff --git a/c_micasad/common/UserIdentifier.cs b/c_micasad/common/UserIdentifier.cs
new file mode 100644
index 00000000..f3c88667
--- /dev/null
+++ b/c_micasad/common/UserIdentifier.cs
@@ -0,0 +1,12 @@
+using System;
+using System.IO;
+
+namespace sscs.common
+{
+ public interface UserIdentifier
+ {
+ void PrintIdentifier();
+ int GetUID();
+
+ }
+}
diff --git a/c_micasad/common/WinUser.cs b/c_micasad/common/WinUser.cs
new file mode 100644
index 00000000..1a1a9d0d
--- /dev/null
+++ b/c_micasad/common/WinUser.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections;
+using System.IO;
+using Microsoft.Win32;
+
+using sscs.cache;
+using sscs.common;
+using sscs.constants;
+
+namespace sscs.common
+{
+ internal class WinUser : User
+ {
+ private string m_sUserHome = "";
+
+ internal WinUser()
+ {
+ }
+
+ internal WinUser(UserIdentifier winUserId)
+ {
+ userId = winUserId;
+ secretStore = new SecretStore(this);
+ }
+
+ override internal void SetUserName(string username)
+ {
+ userName = username;
+ }
+
+ override internal string GetUserName()
+ {
+ return userName;
+ }
+
+ /* A method to find the user's home dir on windows needs to be added.
+ */
+ override internal string GetUserHomeDir()
+ {
+
+ if (m_sUserHome.Length < 1)
+ {
+ //Console.WriteLine("read registry");
+ // get the users home drive and homepath from the registry
+ //
+ string sSIDString = ((WinUserIdentifier)userId).GetSID();
+
+ // look up Profile path
+ // [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1757981266-436374069-725345543-1006]
+ string sProfile = ReadRegKey(Registry.LocalMachine, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\" + sSIDString, "ProfileImagePath");
+ m_sUserHome = sProfile;
+
+ //string sHomeDrive = ReadRegKey(Registry.Users, sSIDString+"\\Volatile Environment", "HOMEDRIVE");
+ //string sHomeDir = ReadRegKey(Registry.Users, sSIDString+"\\Volatile Environment", "HOMEPATH");
+ //m_sUserHome = sHomeDrive+sHomeDir;
+ //Console.WriteLine("Homedir: "+ m_sUserHome);
+ }
+
+ return m_sUserHome;
+ }
+
+ private string ReadRegKey(RegistryKey rk, string sSubKey, string KeyName)
+ {
+ // Opening the registry key
+ // RegistryKey rk = Registry.Users;
+ // Open a subKey as read-only
+ RegistryKey sk1 = rk.OpenSubKey(sSubKey);
+ // If the RegistrySubKey doesn't exist -> (null)
+ if ( sk1 == null )
+ {
+ return null;
+ }
+ else
+ {
+ try
+ {
+ // If the RegistryKey exists I get its value
+ // or null is returned.
+ return (string)sk1.GetValue(KeyName.ToUpper());
+ }
+ catch (Exception e)
+ {
+ //ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
+ return null;
+ }
+ }
+ }
+
+
+
+ }
+}
diff --git a/c_micasad/common/WinUserIdentifier.cs b/c_micasad/common/WinUserIdentifier.cs
new file mode 100644
index 00000000..19e458ca
--- /dev/null
+++ b/c_micasad/common/WinUserIdentifier.cs
@@ -0,0 +1,51 @@
+using System;
+
+namespace sscs.common
+{
+ internal class WinUserIdentifier : UserIdentifier
+ {
+ private int uidLow;
+ private int uidHigh;
+ private string m_sSID = "";
+
+ internal WinUserIdentifier(int uidLowPart, int uidHighPart, string sSID)
+ {
+ this.uidLow = uidLowPart;
+ this.uidHigh = uidHighPart;
+ this.m_sSID = sSID;
+ }
+ internal WinUserIdentifier(int uidLowPart, int uidHighPart)
+ {
+ this.uidLow = uidLowPart;
+ this.uidHigh = uidHighPart;
+ }
+
+ internal string GetSID()
+ {
+ return m_sSID;
+ }
+
+ public override bool Equals(Object obj)
+ {
+ WinUserIdentifier u = (WinUserIdentifier)obj;
+ if ((u.uidLow == uidLow) && (u.uidHigh == uidHigh))
+ return true;
+ else
+ return false;
+ }
+ public override int GetHashCode()
+ {
+ return uidLow.GetHashCode();
+ }
+ public void PrintIdentifier()
+ {
+ // Console.WriteLine("WinUserIdentifier : uid is {0}",uid);
+ }
+
+ public int GetUID()
+ {
+ return -1;
+ }
+
+ }
+}
diff --git a/c_micasad/communication/CommunicationFactory.cs b/c_micasad/communication/CommunicationFactory.cs
new file mode 100644
index 00000000..687f22f2
--- /dev/null
+++ b/c_micasad/communication/CommunicationFactory.cs
@@ -0,0 +1,30 @@
+using System;
+/* This class would have only static methods.
+ */
+namespace sscs.communication
+{
+
+class CommunicationFactory
+{
+ /* Make the constructor private, to avoid instances of this
+ * class.
+ */
+ private CommunicationFactory()
+ {
+
+ }
+
+ /* This method must check for platform and return
+ * an appropriate class. As of now, it assumes platform as Linux.
+ */
+ public static Communication CreateCommunicationEndPoint()
+ {
+#if LINUX
+ return( new UnixCommunication());
+#endif
+#if W32
+ return (new WinCommunication());
+#endif
+ }
+}
+}
diff --git a/c_micasad/communication/ICommunication.cs b/c_micasad/communication/ICommunication.cs
new file mode 100644
index 00000000..587cd6c8
--- /dev/null
+++ b/c_micasad/communication/ICommunication.cs
@@ -0,0 +1,15 @@
+using System;
+
+/* This is an interface which would be implemented
+ * by UnixCommunication and WinCommunication.
+ */
+
+namespace sscs.communication
+{
+
+interface Communication
+{
+ void StartCommunicationEndPoint();
+ void CloseCommunicationEndPoint();
+}
+}
diff --git a/c_micasad/communication/IPCChannel.cs b/c_micasad/communication/IPCChannel.cs
new file mode 100644
index 00000000..8d84a2f6
--- /dev/null
+++ b/c_micasad/communication/IPCChannel.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+#if W32
+using sscs.communication.win.NamedPipes;
+#endif
+using sscs.common;
+namespace sscs.communication
+{
+
+abstract class IPCChannel
+{
+ /* This must check for the platform and return an
+ * appropriate IPCChannel.
+ */
+#if LINUX
+ internal static IPCChannel Create(Socket socket)
+ {
+ if(( (int)Environment.OSVersion.Platform) == 128)
+ return (new UnixIPCChannel(socket) );
+ else
+ return null;
+ }
+
+#endif
+
+#if W32
+ internal static IPCChannel Create(ServerPipeConnection serverPipe)
+ {
+ return (new WinIPCChannel(serverPipe));
+ }
+#endif
+ abstract internal UserIdentifier GetIPCChannelUserId();
+ abstract internal int Read(byte[] buf);
+ abstract internal byte[] Read();
+ abstract internal int Write(byte[] buf);
+ abstract internal void Close();
+
+}
+}
diff --git a/c_micasad/communication/UnixCommunication.cs b/c_micasad/communication/UnixCommunication.cs
new file mode 100644
index 00000000..7a34a301
--- /dev/null
+++ b/c_micasad/communication/UnixCommunication.cs
@@ -0,0 +1,130 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using Mono.Unix;
+using System.IO;
+using System.Text;
+using System.Threading;
+using sscs.common;
+using sscs.constants;
+
+namespace sscs.communication
+{
+
+/* Platform specific class which implements
+ * the 'Communication' interface.
+ */
+
+ class UnixCommunication : Communication
+ {
+ private Socket listeningSocket;
+ private Socket connectedSocket;
+ private string socketFileName = "/tmp/.novellCASA";
+ private EndPoint sockEndPoint;
+ private ManualResetEvent eventVar = null;
+
+
+ //Methods
+ internal UnixCommunication()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ Syscall.umask(0);
+ if(File.Exists(socketFileName))
+ File.Delete(socketFileName);
+ listeningSocket = new Socket( AddressFamily.Unix,
+ SocketType.Stream,
+ ProtocolType.IP );
+ sockEndPoint = new UnixEndPoint(socketFileName);
+ eventVar = new ManualResetEvent(true);
+
+ }
+
+ ~UnixCommunication()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ eventVar.Close();
+ CloseCommunicationEndPoint();
+
+ }
+
+ // This code executes in the listening thread.
+ public void StartCommunicationEndPoint()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ try
+ {
+ listeningSocket.Bind(sockEndPoint);
+ listeningSocket.Listen(50);
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ while(true)
+ {
+ try
+ {
+ eventVar.Reset();
+ listeningSocket.BeginAccept(new AsyncCallback(ListenCb),
+ listeningSocket);
+ eventVar.WaitOne();
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+ }
+ }
+
+ public void CloseCommunicationEndPoint()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ listeningSocket.Close();
+ if(File.Exists( socketFileName ))
+ File.Delete(socketFileName);
+ }
+
+ // On receipt of a new client, this method is called.
+ private void ListenCb (IAsyncResult state)
+ {
+ try
+ {
+ CSSSLogger.ExecutionTrace(this);
+ connectedSocket = ((Socket)state.AsyncState).EndAccept (state);
+ eventVar.Set();
+ ServiceClient();
+ }
+ catch(Exception e)
+ {
+ /* All resources would have been cleaned up before reaching
+ * here.
+ */
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ /* End of thread function */
+ }
+
+ private void ServiceClient()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ IPCChannel ipcChannel = IPCChannel.Create(connectedSocket);
+ AppHandler appHandler = new AppHandler(ipcChannel);
+
+ try
+ {
+ int retVal = appHandler.ServiceApp();
+ if( retVal != RetCodes.SUCCESS )
+ CSSSLogger.DbgLog("Servicing client failed.");
+ }
+ catch( Exception e )
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ }
+ finally
+ {
+ ipcChannel.Close();
+ }
+ }
+ }
+}
diff --git a/c_micasad/communication/UnixIPCChannel.cs b/c_micasad/communication/UnixIPCChannel.cs
new file mode 100644
index 00000000..5dcd0819
--- /dev/null
+++ b/c_micasad/communication/UnixIPCChannel.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using Mono.Posix;
+using System.IO;
+using System.Text;
+using sscs.common;
+using sscs.verbs;
+using sscs.constants;
+
+
+namespace sscs.communication
+{
+
+class UnixIPCChannel : IPCChannel
+{
+ // Data
+ private Socket clientSocket;
+ private UnixUserIdentifier userId;
+
+ //Methods
+
+ internal UnixIPCChannel(Socket connectedSocket)
+ {
+ CSSSLogger.ExecutionTrace(this);
+ clientSocket = connectedSocket;
+ PeerCred cred = new PeerCred(connectedSocket);
+ userId = new UnixUserIdentifier(cred.UserID);
+ }
+
+ override internal UserIdentifier GetIPCChannelUserId()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ return userId;
+ }
+
+ private UnixIPCChannel()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ }
+ ~UnixIPCChannel()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ clientSocket.Close();
+ }
+ override internal int Read(byte[] buf)
+ {
+ return 0;
+ }
+ override internal byte[] Read()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ int bytesRecvd = 0;
+ try
+ {
+ byte[] msgIdBytes = new byte[2];
+ bytesRecvd = clientSocket.Receive(msgIdBytes);
+ if( 0 == bytesRecvd )
+ {
+ return null;
+ }
+ if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
+ {
+ throw new CommunicationException("Client has not sent data.");
+ }
+
+ byte[] msgLenBytes = new byte[4];
+ bytesRecvd = clientSocket.Receive(msgLenBytes);
+ if( 0 == bytesRecvd )
+ {
+ return null;
+ }
+ if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
+ {
+ throw new CommunicationException("Client has not sent data.");
+ }
+
+ byte[] bufToReturn = null;
+ uint msgLen = BitConverter.ToUInt32(msgLenBytes,0);
+ if( msgLen > 6 )
+ {
+ byte[] buf = new byte[msgLen - 6];
+ bytesRecvd = clientSocket.Receive (buf);
+ CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Bytes received is " + bytesRecvd);
+ if( 0 == bytesRecvd )
+ {
+ return null;
+ }
+
+ if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
+ {
+ throw new CommunicationException("Client has not sent data.");
+ }
+
+ bufToReturn = new byte[msgLen];
+ Array.Copy(msgIdBytes,bufToReturn,2);
+ Array.Copy(msgLenBytes,0,bufToReturn,2,4);
+ Array.Copy(buf,0,bufToReturn,6,buf.Length);
+ return bufToReturn;
+ }
+ else
+ {
+ bufToReturn = new byte[6];
+ Array.Copy(msgIdBytes,bufToReturn,2);
+ Array.Copy(msgLenBytes,0,bufToReturn,2,4);
+ return bufToReturn;
+ }
+ }
+ catch(CommunicationException e)
+ {
+ throw e;
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ throw new CommunicationException(e.ToString());
+ }
+ }
+ override internal int Write(byte[] buf)
+ {
+ try
+ {
+ CSSSLogger.ExecutionTrace(this);
+ int bytesSent = clientSocket.Send(buf);
+ CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " - Bytes sent is " + bytesSent);
+ return bytesSent;
+ }
+ catch(Exception e)
+ {
+ CSSSLogger.ExpLog(e.ToString());
+ return -1;
+ }
+
+
+ }
+ override internal void Close()
+ {
+ CSSSLogger.ExecutionTrace(this);
+ clientSocket.Close();
+ }
+}
+}
diff --git a/c_micasad/communication/WinCommunication.cs b/c_micasad/communication/WinCommunication.cs
new file mode 100644
index 00000000..84b92e4d
--- /dev/null
+++ b/c_micasad/communication/WinCommunication.cs
@@ -0,0 +1,40 @@
+using System;
+using sscs.common;
+using sscs.constants;
+
+using sscs.communication.win.InterProcessComm;
+using sscs.communication.win.NamedPipes;
+
+namespace sscs.communication
+{
+ ///
+ /// Summary description for WinCommunication.
+ ///
+ public class WinCommunication : Communication
+ {
+
+ public static IChannelManager PipeManager;
+
+ public WinCommunication()
+ {
+ PipeManager = new sscs.communication.win.PipeManager();
+ PipeManager.Initialize();
+ }
+
+ public void StartCommunicationEndPoint()
+ {
+ Console.WriteLine("StartCommunctionEndPointed called");
+ //PipeManager = new PipeManager();
+ //PipeManager.Initialize();
+ //PipeManager.Start();
+ PipeManager.Start();
+
+
+ }
+
+ public void CloseCommunicationEndPoint()
+ {
+ PipeManager.Stop();
+ }
+ }
+}
diff --git a/c_micasad/communication/WinIPCChannel.cs b/c_micasad/communication/WinIPCChannel.cs
new file mode 100644
index 00000000..2aa0413a
--- /dev/null
+++ b/c_micasad/communication/WinIPCChannel.cs
@@ -0,0 +1,102 @@
+using System;
+using System.IO;
+using System.Text;
+
+using sscs.communication.win.NamedPipes;
+using sscs.common;
+using sscs.verbs;
+using sscs.constants;
+
+
+namespace sscs.communication
+{
+
+ class WinIPCChannel : IPCChannel
+ {
+ // Data
+ private ServerPipeConnection m_serverPipeConnection;
+ private WinUserIdentifier userId = null;
+
+ //Methods
+
+ public WinIPCChannel(ServerPipeConnection serverPipeConnection)
+ {
+ m_serverPipeConnection = serverPipeConnection;
+ }
+
+ override internal UserIdentifier GetIPCChannelUserId()
+ {
+ CSSSLogger.DbgLog("In WinIPCChannel::GetIPCChannelUserId");
+ return userId;
+ }
+
+ private WinIPCChannel()
+ {
+ CSSSLogger.DbgLog("WinIPCChannel constructor must be called with a serverPipe");
+
+ }
+ ~WinIPCChannel()
+ {
+ // Console.WriteLine("WinIPCChannel::~~WinIPCChannel");
+ }
+
+ override internal byte[] Read()
+ {
+ int localUserIDLow = 0;
+ int localUserIDHigh = 0;
+ string sSIDString = "";
+
+ byte[] incoming = null;
+ try
+ {
+
+ incoming = m_serverPipeConnection.ReadBytes();
+
+ // get local Userid and SID
+ m_serverPipeConnection.GetLocalUserID(ref localUserIDLow, ref localUserIDHigh, ref sSIDString);
+
+ if (localUserIDLow != 0 || localUserIDHigh !=0)
+ {
+ userId = new WinUserIdentifier(localUserIDLow, localUserIDHigh, sSIDString);
+ }
+
+ return incoming;
+ }
+ catch(Exception e)
+ {
+ return null;
+ //CSSSLogger.DbgLog("Exception in reading data from client" + e.ToString());
+ //throw new CommunicationException(e.ToString());
+ }
+ }
+
+ override internal int Read(byte[] buf)
+ {
+ return 0;
+ }
+
+ override internal int Write(byte[] buf)
+ {
+
+ int bytesSent = 0;
+ try
+ {
+ m_serverPipeConnection.WriteBytes(buf);
+ bytesSent = buf.Length;
+ }
+ catch (Exception)
+ {
+
+ }
+ CSSSLogger.DbgLog("WinIPCChannel::Write - Bytes sent is {0}" +bytesSent);
+ return bytesSent;
+
+ }
+ override internal void Close()
+ {
+ CSSSLogger.DbgLog("WinIPCChannel Closed");
+ //clientSocket.Close();
+ m_serverPipeConnection.Close();
+ }
+ }
+}
diff --git a/c_micasad/communication/win/InterProcessComm/IChannelManager.cs b/c_micasad/communication/win/InterProcessComm/IChannelManager.cs
new file mode 100644
index 00000000..8e864b17
--- /dev/null
+++ b/c_micasad/communication/win/InterProcessComm/IChannelManager.cs
@@ -0,0 +1,72 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+
+namespace sscs.communication.win.InterProcessComm {
+ #region Comments
+ ///
+ /// Interface, which defines methods for a Channel Manager class.
+ ///
+ ///
+ /// A Channel Manager is responsible for creating and maintaining channels for inter-process communication. The opened channels are meant to be reusable for performance optimization. Each channel needs to procees requests by calling the HandleRequest method of the Channel Manager.
+ ///
+ #endregion
+ public interface IChannelManager {
+ #region Comments
+ ///
+ /// Initializes the Channel Manager.
+ ///
+ #endregion
+ void Initialize();
+ #region Comments
+ ///
+ /// Closes all opened channels and stops the Channel Manager.
+ ///
+ #endregion
+ void Start();
+
+ void Stop();
+ #region Comments
+ ///
+ /// Handles a request.
+ ///
+ ///
+ /// This method currently caters for text based requests. XML strings can be used in case complex request structures are needed.
+ ///
+ /// The incoming request.
+ /// The resulting response.
+ #endregion
+ string HandleRequest(string request);
+ #region Comments
+ ///
+ /// Indicates whether the Channel Manager is in listening mode.
+ ///
+ ///
+ /// This property is left public so that other classes, like a server channel can start or stop listening based on the Channel Manager mode.
+ ///
+ #endregion
+ bool Listen {get; set;}
+ #region Comments
+ ///
+ /// Forces the Channel Manager to exit a sleeping mode and create a new channel.
+ ///
+ ///
+ /// Normally the Channel Manager will create a number of reusable channels, which will handle the incoming reqiests, and go into a sleeping mode. However if the request load is high, the Channel Manager needs to be asked to create additional channels.
+ ///
+ #endregion
+ void WakeUp();
+ #region Comments
+ ///
+ /// Removes an existing channel.
+ ///
+ /// A parameter identifying the channel.
+ #endregion
+ void RemoveServerChannel(object param);
+ }
+}
diff --git a/c_micasad/communication/win/InterProcessComm/IClientChannel.cs b/c_micasad/communication/win/InterProcessComm/IClientChannel.cs
new file mode 100644
index 00000000..ac927816
--- /dev/null
+++ b/c_micasad/communication/win/InterProcessComm/IClientChannel.cs
@@ -0,0 +1,51 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.IO;
+
+namespace sscs.communication.win.InterProcessComm {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public interface IClientChannel : IDisposable {
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ string HandleRequest(string request);
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ string HandleRequest(Stream request);
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ object HandleRequest(object request);
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ IClientChannel Create();
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/InterProcessComm/IInterProcessConnection.cs b/c_micasad/communication/win/InterProcessComm/IInterProcessConnection.cs
new file mode 100644
index 00000000..95300f1b
--- /dev/null
+++ b/c_micasad/communication/win/InterProcessComm/IInterProcessConnection.cs
@@ -0,0 +1,72 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+
+namespace sscs.communication.win.InterProcessComm {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public interface IInterProcessConnection : IDisposable {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ int NativeHandle{get;}
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ void Connect();
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ void Close();
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ string Read();
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ byte[] ReadBytes();
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ void Write(string text);
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ void WriteBytes(byte[] bytes);
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ InterProcessConnectionState GetState();
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/InterProcessComm/InterProcessConnectionState.cs b/c_micasad/communication/win/InterProcessComm/InterProcessConnectionState.cs
new file mode 100644
index 00000000..93deb3b6
--- /dev/null
+++ b/c_micasad/communication/win/InterProcessComm/InterProcessConnectionState.cs
@@ -0,0 +1,127 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+
+namespace sscs.communication.win.InterProcessComm {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public enum InterProcessConnectionState {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ NotSet = 0,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Error = 1,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Creating = 2,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Created = 3,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ WaitingForClient = 4,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ ConnectedToClient = 5,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ ConnectingToServer = 6,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ ConnectedToServer = 7,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Reading = 8,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ ReadData = 9,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Writing = 10,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ WroteData = 11,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Flushing = 12,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ FlushedData = 13,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Disconnecting = 14,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Disconnected = 15,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Closing = 16,
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ Closed = 17,
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/InterProcessComm/InterProcessIOException.cs b/c_micasad/communication/win/InterProcessComm/InterProcessIOException.cs
new file mode 100644
index 00000000..05764212
--- /dev/null
+++ b/c_micasad/communication/win/InterProcessComm/InterProcessIOException.cs
@@ -0,0 +1,49 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.Runtime.Serialization;
+
+namespace sscs.communication.win.InterProcessComm {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public class InterProcessIOException : Exception {
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public bool IsServerAvailable = true;
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public uint ErrorCode = 0;
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ public InterProcessIOException(String text) : base(text) {
+ }
+ #region Comments
+ ///
+ ///
+ ///
+ ///
+ ///
+ #endregion
+ protected InterProcessIOException(SerializationInfo info, StreamingContext context) : base(info, context) {
+ }
+ }
+}
diff --git a/c_micasad/communication/win/NamedPipes/APipeConnection.cs b/c_micasad/communication/win/NamedPipes/APipeConnection.cs
new file mode 100644
index 00000000..baa2ceef
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/APipeConnection.cs
@@ -0,0 +1,184 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.IO;
+using sscs.communication.win.InterProcessComm;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// An abstract class, which defines the methods for creating named pipes
+ /// connections, reading and writing data.
+ ///
+ ///
+ /// This class is inherited by
+ /// ClientPipeConnection
+ /// and ServerPipeConnection
+ /// classes, used for client and server applications respectively, which communicate
+ /// using NamesPipes.
+ ///
+ #endregion
+ public abstract class APipeConnection : IInterProcessConnection {
+ #region Comments
+ ///
+ /// A PipeHandle object containing
+ /// the native pipe handle.
+ ///
+ #endregion
+ protected PipeHandle Handle = new PipeHandle();
+ #region Comments
+ ///
+ /// The name of the named pipe.
+ ///
+ ///
+ /// This name is used for creating a server pipe and connecting client ones to it.
+ ///
+ #endregion
+ protected string Name;
+ #region Comments
+ ///
+ /// Boolean field used by the IDisposable implementation.
+ ///
+ #endregion
+ protected bool disposed = false;
+ #region Comments
+ ///
+ /// The maximum bytes that will be read from the pipe connection.
+ ///
+ ///
+ /// This field could be used if the maximum length of the client message
+ /// is known and we want to implement some security, which prevents the
+ /// server from reading larger messages.
+ ///
+ #endregion
+ protected int maxReadBytes;
+ #region Comments
+ ///
+ /// Reads a message from the pipe connection and converts it to a string
+ /// using the UTF8 encoding.
+ ///
+ ///
+ /// See the NamedPipeWrapper.Read
+ /// method for an explanation of the message format.
+ ///
+ /// The UTF8 encoded string representation of the data.
+ #endregion
+ public string Read() {
+ CheckIfDisposed();
+ return NamedPipeWrapper.Read(Handle, maxReadBytes);
+ }
+ #region Comments
+ ///
+ /// Reads a message from the pipe connection.
+ ///
+ ///
+ /// See the NamedPipeWrapper.ReadBytes
+ /// method for an explanation of the message format.
+ ///
+ /// The bytes read from the pipe connection.
+ #endregion
+ public byte[] ReadBytes() {
+ CheckIfDisposed();
+ return NamedPipeWrapper.ReadBytes(Handle, maxReadBytes);
+ }
+ #region Comments
+ ///
+ /// Writes a string to the pipe connection/
+ ///
+ /// The text to write.
+ #endregion
+ public void Write(string text) {
+ CheckIfDisposed();
+ NamedPipeWrapper.Write(Handle, text);
+ }
+ #region Comments
+ ///
+ /// Writes an array of bytes to the pipe connection.
+ ///
+ /// The bytes array.
+ #endregion
+ public void WriteBytes(byte[] bytes) {
+ CheckIfDisposed();
+ NamedPipeWrapper.WriteBytes(Handle, bytes);
+ }
+ #region Comments
+ ///
+ /// Closes the pipe connection.
+ ///
+ #endregion
+ public abstract void Close();
+ #region Comments
+ ///
+ /// Connects a pipe connection.
+ ///
+ #endregion
+ public abstract void Connect();
+ #region Comments
+ ///
+ /// Disposes a pipe connection by closing the underlying native handle.
+ ///
+ #endregion
+ public void Dispose() {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+ #region Comments
+ ///
+ /// Disposes a pipe connection by closing the underlying native handle.
+ ///
+ /// A boolean indicating how the method is called.
+ #endregion
+ protected void Dispose(bool disposing) {
+ if(!this.disposed) {
+ NamedPipeWrapper.Close(this.Handle);
+ }
+ disposed = true;
+ }
+ #region Comments
+ ///
+ /// Checks if the pipe connection is disposed.
+ ///
+ ///
+ /// This check is done before performing any pipe operations.
+ ///
+ #endregion
+ public void CheckIfDisposed() {
+ if(this.disposed) {
+ throw new ObjectDisposedException("The Pipe Connection is disposed.");
+ }
+ }
+ #region Comments
+ ///
+ /// Gets the pipe connection state from the PipeHandle
+ /// object.
+ ///
+ /// The pipe connection state.
+ #endregion
+ public InterProcessConnectionState GetState() {
+ CheckIfDisposed();
+ return this.Handle.State;
+ }
+ #region Comments
+ ///
+ /// Retrieved the operating system native handle for the pipe connection.
+ ///
+ #endregion
+ public int NativeHandle {
+ get {
+ CheckIfDisposed();
+ return (int)this.Handle.Handle;
+ }
+ }
+
+ public int GetLocalUserID(ref int lowPart, ref int highPart, ref string sSIDString)
+ {
+ return NamedPipeWrapper.GetLocalUserID(this.Handle, ref lowPart, ref highPart, ref sSIDString);
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/ClientPipeConnection.cs b/c_micasad/communication/win/NamedPipes/ClientPipeConnection.cs
new file mode 100644
index 00000000..1d10cdbc
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/ClientPipeConnection.cs
@@ -0,0 +1,110 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.IO;
+
+using sscs.communication.win.InterProcessComm;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// Used by client applications to communicate with server ones by using named pipes.
+ ///
+ #endregion
+ public sealed class ClientPipeConnection : APipeConnection {
+ #region Comments
+ ///
+ /// The network name of the server where the server pipe is created.
+ ///
+ ///
+ /// If "." is used as a server name then the pipe is connected to the local machine.
+ ///
+ #endregion
+ private string Server = ".";
+ #region Comments
+ ///
+ /// Closes a client named pipe connection.
+ ///
+ ///
+ /// A client pipe connection is closed by closing the underlying pipe handle.
+ ///
+ #endregion
+ public override void Close() {
+ CheckIfDisposed();
+ NamedPipeWrapper.Close(this.Handle);
+ }
+ #region Comments
+ ///
+ /// Connects a client pipe to an existing server one.
+ ///
+ #endregion
+ public override void Connect() {
+ CheckIfDisposed();
+ this.Handle = NamedPipeWrapper.ConnectToPipe(this.Name, this.Server);
+ }
+ #region Comments
+ ///
+ /// Attempts to establish a connection to the a server named pipe.
+ ///
+ ///
+ /// If the attempt is successful the method creates the
+ /// PipeHandle object
+ /// and assigns it to the Handle
+ /// field.
+ /// This method is used when it is not known whether a server pipe already exists.
+ ///
+ /// True if a connection is established.
+ #endregion
+ public bool TryConnect() {
+ CheckIfDisposed();
+ bool ReturnVal = NamedPipeWrapper.TryConnectToPipe(this.Name, this.Server, out this.Handle);
+
+ return ReturnVal;
+ }
+ #region Comments
+ ///
+ /// Creates an instance of the ClientPipeConnection assuming that the server pipe
+ /// is created on the same machine.
+ ///
+ ///
+ /// The maximum bytes to read from the client is set to be Int32.MaxValue.
+ ///
+ /// The name of the server pipe.
+ #endregion
+ public ClientPipeConnection(string name) {
+ this.Name = name;
+ this.Server = ".";
+ this.maxReadBytes = Int32.MaxValue;
+ }
+ #region Comments
+ ///
+ /// Creates an instance of the ClientPipeConnection specifying the network name
+ /// of the server.
+ ///
+ ///
+ /// The maximum bytes to read from the client is set to be Int32.MaxValue.
+ ///
+ /// The name of the server pipe.
+ /// The network name of the machine, where the server pipe is created.
+ #endregion
+ public ClientPipeConnection(string name, string server) {
+ this.Name = name;
+ this.Server = server;
+ this.maxReadBytes = Int32.MaxValue;
+ }
+ #region Comments
+ ///
+ /// Object destructor.
+ ///
+ #endregion
+ ~ClientPipeConnection() {
+ Dispose(false);
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/NamedPipeIOException.cs b/c_micasad/communication/win/NamedPipes/NamedPipeIOException.cs
new file mode 100644
index 00000000..2b6211e5
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/NamedPipeIOException.cs
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.Runtime.Serialization;
+
+using sscs.communication.win.InterProcessComm;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// This exception is thrown by named pipes communication methods.
+ ///
+ #endregion
+ public class NamedPipeIOException : InterProcessIOException {
+ #region Comments
+ ///
+ /// Creates a NamedPipeIOException instance.
+ ///
+ /// The error message text.
+ #endregion
+ public NamedPipeIOException(String text) : base(text) {
+ }
+ #region Comments
+ ///
+ /// Creates a NamedPipeIOException instance.
+ ///
+ /// The error message text.
+ /// The native error code.
+ #endregion
+ public NamedPipeIOException(String text, uint errorCode) : base(text) {
+ this.ErrorCode = errorCode;
+ if (errorCode == NamedPipeNative.ERROR_CANNOT_CONNECT_TO_PIPE) {
+ this.IsServerAvailable = false;
+ }
+ }
+ #region Comments
+ ///
+ /// Creates a NamedPipeIOException instance.
+ ///
+ /// The serialization information.
+ /// The streaming context.
+ #endregion
+ protected NamedPipeIOException(SerializationInfo info, StreamingContext context) : base(info, context) {
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/NamedPipeNative.cs b/c_micasad/communication/win/NamedPipes/NamedPipeNative.cs
new file mode 100644
index 00000000..4d989b9f
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/NamedPipeNative.cs
@@ -0,0 +1,641 @@
+using System;
+using System.Text;
+using System.Security;
+using System.Runtime.InteropServices;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// This utility class exposes kernel32.dll methods for named pipes communication.
+ ///
+ ///
+ /// Use the following links for complete information about the exposed methods:
+ ///
+ ///
+ /// Named Pipe Functions
+ ///
+ ///
+ /// File Management Functions
+ ///
+ ///
+ /// Handle and Object Functions
+ ///
+ ///
+ /// System Error Codes
+ ///
+ ///
+ ///
+ #endregion
+ [SuppressUnmanagedCodeSecurity]
+ public sealed class NamedPipeNative {
+ #region Comments
+ ///
+ /// Outbound pipe access.
+ ///
+ #endregion
+ public const uint PIPE_ACCESS_OUTBOUND = 0x00000002;
+ #region Comments
+ ///
+ /// Duplex pipe access.
+ ///
+ #endregion
+ public const uint PIPE_ACCESS_DUPLEX = 0x00000003;
+ #region Comments
+ ///
+ /// Inbound pipe access.
+ ///
+ #endregion
+ public const uint PIPE_ACCESS_INBOUND = 0x00000001;
+ #region Comments
+ ///
+ /// Pipe blocking mode.
+ ///
+ #endregion
+ public const uint PIPE_WAIT = 0x00000000;
+ #region Comments
+ ///
+ /// Pipe non-blocking mode.
+ ///
+ #endregion
+ public const uint PIPE_NOWAIT = 0x00000001;
+ #region Comments
+ ///
+ /// Pipe read mode of type Byte.
+ ///
+ #endregion
+ public const uint PIPE_READMODE_BYTE = 0x00000000;
+ #region Comments
+ ///
+ /// Pipe read mode of type Message.
+ ///
+ #endregion
+ public const uint PIPE_READMODE_MESSAGE = 0x00000002;
+ #region Comments
+ ///
+ /// Byte pipe type.
+ ///
+ #endregion
+ public const uint PIPE_TYPE_BYTE = 0x00000000;
+ #region Comments
+ ///
+ /// Message pipe type.
+ ///
+ #endregion
+ public const uint PIPE_TYPE_MESSAGE = 0x00000004;
+ #region Comments
+ ///
+ /// Pipe client end.
+ ///
+ #endregion
+ public const uint PIPE_CLIENT_END = 0x00000000;
+ #region Comments
+ ///
+ /// Pipe server end.
+ ///
+ #endregion
+ public const uint PIPE_SERVER_END = 0x00000001;
+ #region Comments
+ ///
+ /// Unlimited server pipe instances.
+ ///
+ #endregion
+ public const uint PIPE_UNLIMITED_INSTANCES = 255;
+ #region Comments
+ ///
+ /// Waits indefinitely when connecting to a pipe.
+ ///
+ #endregion
+ public const uint NMPWAIT_WAIT_FOREVER = 0xffffffff;
+ #region Comments
+ ///
+ /// Does not wait for the named pipe.
+ ///
+ #endregion
+ public const uint NMPWAIT_NOWAIT = 0x00000001;
+ #region Comments
+ ///
+ /// Uses the default time-out specified in a call to the CreateNamedPipe method.
+ ///
+ #endregion
+ public const uint NMPWAIT_USE_DEFAULT_WAIT = 0x00000000;
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public const uint GENERIC_READ = (0x80000000);
+ #region Comments
+ ///
+ /// Generic write access to the pipe.
+ ///
+ #endregion
+ public const uint GENERIC_WRITE = (0x40000000);
+ #region Comments
+ ///
+ /// Generic execute access to the pipe.
+ ///
+ #endregion
+ public const uint GENERIC_EXECUTE = (0x20000000);
+ #region Comments
+ ///
+ /// Read, write, and execute access.
+ ///
+ #endregion
+ public const uint GENERIC_ALL = (0x10000000);
+ #region Comments
+ ///
+ /// Create new file. Fails if the file exists.
+ ///
+ #endregion
+ public const uint CREATE_NEW = 1;
+ #region Comments
+ ///
+ /// Create new file. Overrides an existing file.
+ ///
+ #endregion
+ public const uint CREATE_ALWAYS = 2;
+ #region Comments
+ ///
+ /// Open existing file.
+ ///
+ #endregion
+ public const uint OPEN_EXISTING = 3;
+ #region Comments
+ ///
+ /// Open existing file. If the file does not exist, creates it.
+ ///
+ #endregion
+ public const uint OPEN_ALWAYS = 4;
+ #region Comments
+ ///
+ /// Opens the file and truncates it so that its size is zero bytes.
+ ///
+ #endregion
+ public const uint TRUNCATE_EXISTING = 5;
+ #region Comments
+ ///
+ /// Invalid operating system handle.
+ ///
+ #endregion
+ public const int INVALID_HANDLE_VALUE = -1;
+ #region Comments
+ ///
+ /// The operation completed successfully.
+ ///
+ #endregion
+ public const ulong ERROR_SUCCESS = 0;
+ #region Comments
+ ///
+ /// The system cannot find the file specified.
+ ///
+ #endregion
+ public const ulong ERROR_CANNOT_CONNECT_TO_PIPE = 2;
+ #region Comments
+ ///
+ /// All pipe instances are busy.
+ ///
+ #endregion
+ public const ulong ERROR_PIPE_BUSY = 231;
+ #region Comments
+ ///
+ /// The pipe is being closed.
+ ///
+ #endregion
+ public const ulong ERROR_NO_DATA = 232;
+ #region Comments
+ ///
+ /// No process is on the other end of the pipe.
+ ///
+ #endregion
+ public const ulong ERROR_PIPE_NOT_CONNECTED = 233;
+ #region Comments
+ ///
+ /// More data is available.
+ ///
+ #endregion
+ public const ulong ERROR_MORE_DATA = 234;
+ #region Comments
+ ///
+ /// There is a process on other end of the pipe.
+ ///
+ #endregion
+ public const ulong ERROR_PIPE_CONNECTED = 535;
+ #region Comments
+ ///
+ /// Waiting for a process to open the other end of the pipe.
+ ///
+ #endregion
+ public const ulong ERROR_PIPE_LISTENING = 536;
+ #region Comments
+ ///
+ ///
+ ///
+ #endregion
+ public const int TOKEN_QUERY = 0X00000008;
+
+ public enum TOKEN_INFORMATION_CLASS
+ {
+ TokenUser = 1,
+ TokenGroups,
+ TokenPrivileges,
+ TokenOwner,
+ TokenPrimaryGroup,
+ TokenDefaultDacl,
+ TokenSource,
+ TokenType,
+ TokenImpersonationLevel,
+ TokenStatistics,
+ TokenRestrictedSids,
+ TokenSessionId
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct TOKEN_USER
+ {
+ public _SID_AND_ATTRIBUTES User;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct _SID_AND_ATTRIBUTES
+ {
+ public IntPtr Sid;
+ public int Attributes;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct _LUID
+ {
+ public int LowPart ;
+ public int HighPart;
+ } //LUID, *PLUID;
+
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct TOKEN_STATISTICS
+ {
+ public _LUID TokenId;
+ public _LUID AuthenticationId;
+ public int ExpirationTime;
+ public int TokenType; // enum ini in 1 TOKEN_TYPE
+ public int ImpersonationLevel; //SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ public int DynamicCharged; ////DWORD
+ public int DynamicAvailable; //DWORD
+ public int GroupCount; //DWORD
+ public int PrivilegeCount; //DWORD
+ public _LUID ModifiedId;
+ }// TOKEN_STATISTICS, *PTOKEN_STATISTICS;
+
+
+ #region Comments
+ ///
+ /// Creates an instance of a named pipe and returns a handle for
+ /// subsequent pipe operations.
+ ///
+ /// Pointer to the null-terminated string that
+ /// uniquely identifies the pipe.
+ /// Pipe access mode, the overlapped mode,
+ /// the write-through mode, and the security access mode of the pipe handle.
+ /// Type, read, and wait modes of the pipe handle.
+ /// Maximum number of instances that can be
+ /// created for this pipe.
+ /// Number of bytes to reserve for the output buffer.
+ /// Number of bytes to reserve for the input buffer.
+ /// Default time-out value, in milliseconds.
+ /// Pointer to a
+ /// SecurityAttributes
+ /// object that specifies a security descriptor for the new named pipe.
+ /// If the function succeeds, the return value is a handle
+ /// to the server end of a named pipe instance.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern IntPtr CreateNamedPipe(
+ String lpName, // pipe name
+ uint dwOpenMode, // pipe open mode
+ uint dwPipeMode, // pipe-specific modes
+ uint nMaxInstances, // maximum number of instances
+ uint nOutBufferSize, // output buffer size
+ uint nInBufferSize, // input buffer size
+ uint nDefaultTimeOut, // time-out interval
+ IntPtr pipeSecurityDescriptor // SD
+ );
+ #region Comments
+ ///
+ /// Enables a named pipe server process to wait for a client
+ /// process to connect to an instance of a named pipe.
+ ///
+ /// Handle to the server end of a named pipe instance.
+ /// Pointer to an
+ /// Overlapped object.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool ConnectNamedPipe(
+ IntPtr hHandle, // handle to named pipe
+ Overlapped lpOverlapped // overlapped structure
+ );
+ #region Comments
+ ///
+ /// Connects to a message-type pipe (and waits if an instance of the
+ /// pipe is not available), writes to and reads from the pipe, and then closes the pipe.
+ ///
+ /// Pointer to a null-terminated string
+ /// specifying the pipe name.
+ /// Pointer to the buffer containing the data written
+ /// to the pipe.
+ /// Size of the write buffer, in bytes.
+ /// Pointer to the buffer that receives the data
+ /// read from the pipe.
+ /// Size of the read buffer, in bytes.
+ /// Pointer to a variable that receives the number
+ /// of bytes read from the pipe.
+ /// Number of milliseconds to wait for the
+ /// named pipe to be available.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool CallNamedPipe(
+ string lpNamedPipeName,
+ byte[] lpInBuffer,
+ uint nInBufferSize,
+ byte[] lpOutBuffer,
+ uint nOutBufferSize,
+ byte[] lpBytesRead,
+ int nTimeOut
+ );
+ #region Comments
+ ///
+ /// Creates or opens a file, directory, physical disk, volume, console buffer,
+ /// tape drive, communications resource, mailslot, or named pipe.
+ ///
+ /// Pointer to a null-terminated string that
+ /// specifies the name of the object to create or open.
+ /// Access to the object (reading, writing, or both).
+ /// Sharing mode of the object (reading, writing, both, or neither).
+ /// Pointer to a
+ /// SecurityAttributes
+ /// object that determines whether the returned handle can be inherited
+ /// by child processes.
+ /// Action to take on files that exist,
+ /// and which action to take when files do not exist.
+ /// File attributes and flags.
+ /// Handle to a template file, with the GENERIC_READ access right.
+ /// If the function succeeds, the return value is an open handle to the specified file.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern IntPtr CreateFile(
+ String lpFileName, // file name
+ uint dwDesiredAccess, // access mode
+ uint dwShareMode, // share mode
+ SecurityAttributes attr, // SD
+ uint dwCreationDisposition, // how to create
+ uint dwFlagsAndAttributes, // file attributes
+ uint hTemplateFile); // handle to template file
+ #region Comments
+ ///
+ /// Reads data from a file, starting at the position indicated by the file pointer.
+ ///
+ /// Handle to the file to be read.
+ /// Pointer to the buffer that receives the data read from the file.
+ /// Number of bytes to be read from the file.
+ /// Pointer to the variable that receives the number of bytes read.
+ /// Pointer to an
+ /// Overlapped object.
+ /// The ReadFile function returns when one of the following
+ /// conditions is met: a write operation completes on the write end of
+ /// the pipe, the number of bytes requested has been read, or an error occurs.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool ReadFile(
+ IntPtr hHandle, // handle to file
+ byte[] lpBuffer, // data buffer
+ uint nNumberOfBytesToRead, // number of bytes to read
+ byte[] lpNumberOfBytesRead, // number of bytes read
+ uint lpOverlapped // overlapped buffer
+ );
+ #region Comments
+ ///
+ /// Writes data to a file at the position specified by the file pointer.
+ ///
+ /// Handle to the file.
+ /// Pointer to the buffer containing the data to be written to the file.
+ ///
+ /// Pointer to the variable that receives the number of bytes written.
+ /// Pointer to an
+ /// Overlapped object.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool WriteFile(
+ IntPtr hHandle, // handle to file
+ byte[] lpBuffer, // data buffer
+ uint nNumberOfBytesToWrite, // number of bytes to write
+ byte[] lpNumberOfBytesWritten, // number of bytes written
+ uint lpOverlapped // overlapped buffer
+ );
+ #region Comments
+ ///
+ /// Retrieves information about a specified named pipe.
+ ///
+ /// Handle to the named pipe for which information is wanted.
+ /// Pointer to a variable that indicates the current
+ /// state of the handle.
+ /// Pointer to a variable that receives the
+ /// number of current pipe instances.
+ /// Pointer to a variable that receives
+ /// the maximum number of bytes to be collected on the client's computer
+ /// before transmission to the server.
+ /// Pointer to a variable that receives
+ /// the maximum time, in milliseconds, that can pass before a remote named
+ /// pipe transfers information over the network.
+ /// Pointer to a buffer that receives the
+ /// null-terminated string containing the user name string associated
+ /// with the client application.
+ /// Size of the buffer specified by the
+ /// lpUserName parameter.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool GetNamedPipeHandleState(
+ IntPtr hHandle,
+ IntPtr lpState,
+ ref uint lpCurInstances,
+ IntPtr lpMaxCollectionCount,
+ IntPtr lpCollectDataTimeout,
+ IntPtr lpUserName,
+ IntPtr nMaxUserNameSize
+ );
+ #region Comments
+ ///
+ /// Cancels all pending input and output (I/O) operations that were
+ /// issued by the calling thread for the specified file handle.
+ ///
+ /// Handle to a file.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool CancelIo(
+ IntPtr hHandle
+ );
+ #region Comments
+ ///
+ /// Waits until either a time-out interval elapses or an instance
+ /// of the specified named pipe is available for connection.
+ ///
+ /// Pointer to a null-terminated string that specifies
+ /// the name of the named pipe.
+ /// Number of milliseconds that the function will
+ /// wait for an instance of the named pipe to be available.
+ /// If an instance of the pipe is available before the
+ /// time-out interval elapses, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool WaitNamedPipe(
+ String name,
+ int timeout);
+ #region Comments
+ ///
+ /// Retrieves the calling thread's last-error code value.
+ ///
+ /// The return value is the calling thread's last-error code value.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern uint GetLastError();
+ #region Comments
+ ///
+ /// Flushes the buffers of the specified file and causes all buffered data to be written to the file.
+ ///
+ /// Handle to an open file.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool FlushFileBuffers(
+ IntPtr hHandle);
+ #region Comments
+ ///
+ /// Disconnects the server end of a named pipe instance from a client process.
+ ///
+ /// Handle to an instance of a named pipe.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool DisconnectNamedPipe(
+ IntPtr hHandle);
+ #region Comments
+ ///
+ /// Sets the read mode and the blocking mode of the specified named pipe.
+ ///
+ ///
+ /// If the specified handle is to the client end of a named pipe and if
+ /// the named pipe server process is on a remote computer, the function
+ /// can also be used to control local buffering.
+ ///
+ /// Handle to the named pipe instance.
+ /// Pointer to a variable that supplies the new mode.
+ /// Pointer to a variable that specifies the maximum
+ /// number of bytes collected on the client computer before
+ /// transmission to the server.
+ /// Pointer to a variable that specifies the
+ /// maximum time, in milliseconds, that can pass before a remote
+ /// named pipe transfers information over the network.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool SetNamedPipeHandleState(
+ IntPtr hHandle,
+ ref uint mode,
+ IntPtr cc,
+ IntPtr cd);
+ #region Comments
+ ///
+ /// Closes an open object handle.
+ ///
+ /// Handle to an open object.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("kernel32.dll")]
+ public static extern bool CloseHandle(
+ IntPtr hHandle);
+
+ [DllImport("kernel32.dll")]
+ public static extern IntPtr GetCurrentThread();
+
+ // native for named pipes
+ #region Comments
+ ///
+ /// Closes an open object handle.
+ ///
+ /// Handle to an open object.
+ /// If the function succeeds, the return value is nonzero.
+ #endregion
+ [DllImport("advapi32" )]
+ public static extern int ImpersonateNamedPipeClient(
+ IntPtr hHandle);
+
+ [DllImport("advapi32" )]
+ public static extern bool RevertToSelf();
+
+ [DllImport("advapi32", SetLastError=true)]
+ public static extern bool OpenThreadToken(
+ IntPtr hThread,
+ uint desiredInfo,
+ bool openAsSelf,
+ out IntPtr TokenHandle); // handle to open access token
+
+ [DllImport("advapi32")]
+ public static extern bool OpenProcessToken(
+ IntPtr ProcessHandle, // handle to process
+ int DesiredAccess, // desired access to process
+ ref IntPtr TokenHandle // handle to open access token
+ );
+
+ [DllImport("advapi32", CharSet=CharSet.Auto)]
+ public static extern bool GetTokenInformation(
+ IntPtr hToken,
+ TOKEN_INFORMATION_CLASS tokenInfoClass,
+ IntPtr TokenInformation,
+ int tokeInfoLength,
+ ref int reqLength);
+
+
+ [DllImport("advapi32", CharSet=CharSet.Auto)]
+ public static extern bool LookupAccountSid
+ (
+ [In,MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, // name of local or remote computer
+ IntPtr pSid, // security identifier
+ StringBuilder Account, // account name buffer
+ ref int cbName, // size of account name buffer
+ StringBuilder DomainName, // domain name
+ ref int cbDomainName, // size of domain name buffer
+ ref int peUse // SID type
+ // ref _SID_NAME_USE peUse // SID type
+ );
+
+ [DllImport("advapi32", CharSet=CharSet.Auto)]
+ public static extern bool ConvertSidToStringSid(
+ IntPtr pSID,
+ [In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);
+
+ #region Comments
+ ///
+ /// Private constructor.
+ ///
+ #endregion
+ private NamedPipeNative() {}
+ }
+ #region Comments
+ ///
+ /// This class is used as a dummy parameter only.
+ ///
+ #endregion
+ [StructLayout(LayoutKind.Sequential)]
+ public class SecurityAttributes {
+ }
+ #region Comments
+ ///
+ /// This class is used as a dummy parameter only.
+ ///
+ #endregion
+ [StructLayout(LayoutKind.Sequential)]
+ public class Overlapped {
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/NamedPipeWrapper.cs b/c_micasad/communication/win/NamedPipes/NamedPipeWrapper.cs
new file mode 100644
index 00000000..4f2335c9
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/NamedPipeWrapper.cs
@@ -0,0 +1,628 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+
+using sscs.communication.win.InterProcessComm;
+using System.Runtime.InteropServices;
+using System.Text;
+
+using HANDLE = System.IntPtr;
+
+namespace sscs.communication.win.NamedPipes
+{
+ #region Comments
+ ///
+ /// A utility class that exposes named pipes operations.
+ ///
+ ///
+ /// This class uses the exposed exposed kernel32.dll methods by the
+ /// NamedPipeNative class
+ /// to provided controlled named pipe functionality.
+ ///
+ #endregion
+ public sealed class NamedPipeWrapper
+ {
+
+ public const int TOKEN_QUERY = 0X00000008;
+
+ const int ERROR_NO_MORE_ITEMS = 259;
+
+ #region Comments
+ ///
+ /// The number of retries when creating a pipe or connecting to a pipe.
+ ///
+ #endregion
+ private const int ATTEMPTS = 2;
+ #region Comments
+ ///
+ /// Wait time for the
+ /// NamedPipeNative.WaitNamedPipe
+ /// operation.
+ ///
+ #endregion
+ private const int WAIT_TIME = 5000;
+ #region Comments
+ ///
+ /// Reads a string from a named pipe using the UTF8 encoding.
+ ///
+ /// The pipe handle.
+ /// The maximum bytes to read.
+ /// A UTF8 string.
+ /// This function uses
+ /// AppModule.NamedPipes.ReadBytes
+ /// to read the bytes from the pipe and then converts them to string.
+ /// The first four bytes of the pipe data are expected to contain
+ /// the data length of the message. This method first reads those four
+ /// bytes and converts them to integer. It then continues to read from the pipe using
+ /// the extracted data length.
+ ///
+ #endregion
+ public static string Read(PipeHandle handle, int maxBytes)
+ {
+ string returnVal = "";
+ byte[] bytes = ReadBytes(handle, maxBytes);
+ if (bytes != null)
+ {
+ returnVal = System.Text.Encoding.UTF8.GetString(bytes);
+ }
+
+ return returnVal;
+ }
+ #region Comments
+ ///
+ /// Reads the bytes from a named pipe.
+ ///
+ /// The pipe handle.
+ /// The maximum bytes to read.
+ /// An array of bytes.
+ /// This method expects that the first four bytes in the pipe define
+ /// the length of the data to read. If the data length is greater than
+ /// maxBytes the method returns null.
+ /// The first four bytes of the pipe data are expected to contain
+ /// the data length of the message. This method first reads those four
+ /// bytes and converts them to integer. It then continues to read from the pipe using
+ /// the extracted data length.
+ ///
+ #endregion
+ public static byte[] ReadBytes(PipeHandle handle, int maxBytes)
+ {
+ byte[] numReadWritten = new byte[4];
+ byte[] intBytes = new byte[4];
+ byte[] msgBytes = null;
+ int len;
+
+ // Set the Handle state to Reading
+ handle.State = InterProcessConnectionState.Reading;
+ // Read the first four bytes and convert them to integer
+ bool bReadSuccessful = true;
+
+ try
+ {
+ bReadSuccessful = NamedPipeNative.ReadFile(handle.Handle, intBytes, 4, numReadWritten, 0);
+ }
+ catch (Exception)
+ {
+ // Console.WriteLine("Error on ReadFile "+e.ToString());
+ }
+
+ if (bReadSuccessful)
+ {
+ len = BitConverter.ToInt32(intBytes, 0);
+ msgBytes = new byte[len];
+ // Read the rest of the data
+ if (!NamedPipeNative.ReadFile(handle.Handle, msgBytes, (uint)len, numReadWritten, 0))
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error reading from pipe. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ else
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error reading from pipe. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ handle.State = InterProcessConnectionState.ReadData;
+ if (len > maxBytes)
+ {
+ return null;
+ }
+ return msgBytes;
+ }
+ #region Comments
+ ///
+ /// Writes a string to a named pipe.
+ ///
+ /// The pipe handle.
+ /// The text to write to the pipe.
+ /// This method converts the text into an array of bytes, using the
+ /// UTF8 encoding and the uses
+ /// AppModule.NamedPipes.WriteBytes
+ /// to write to the pipe.
+ /// When writing to a pipe the method first writes four bytes that define the data length.
+ /// It then writes the whole message.
+ #endregion
+ public static void Write(PipeHandle handle, string text)
+ {
+ WriteBytes(handle, System.Text.Encoding.UTF8.GetBytes(text));
+ }
+ #region Comments
+ ///
+ /// Writes an array of bytes to a named pipe.
+ ///
+ /// The pipe handle.
+ /// The bytes to write.
+ /// If we try bytes array we attempt to write is empty then this method write a space character to the pipe. This is necessary because the other end of the pipe uses a blocking Read operation so we must write someting.
+ /// The bytes length is restricted by the maxBytes parameter, which is done primarily for security reasons.
+ /// When writing to a pipe the method first writes four bytes that define the data length.
+ /// It then writes the whole message.
+ #endregion
+ public static void WriteBytes(PipeHandle handle, byte[] bytes)
+ {
+ byte[] numReadWritten = new byte[4];
+ uint len;
+
+ if (bytes == null)
+ {
+ bytes = new byte[0];
+ }
+ if (bytes.Length == 0)
+ {
+ bytes = new byte[1];
+ bytes = System.Text.Encoding.UTF8.GetBytes(" ");
+ }
+ // Get the message length
+ len = (uint)bytes.Length;
+ handle.State = InterProcessConnectionState.Writing;
+ // Write four bytes that define the message length
+ if (NamedPipeNative.WriteFile(handle.Handle, BitConverter.GetBytes(len), 4, numReadWritten, 0)) {
+ // Write the whole message
+ if (!NamedPipeNative.WriteFile(handle.Handle, bytes, len, numReadWritten, 0)) {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error writing to pipe. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ else {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error writing to pipe. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ handle.State = InterProcessConnectionState.Flushing;
+ Flush(handle);
+ handle.State = InterProcessConnectionState.FlushedData;
+ }
+ #region Comments
+ ///
+ /// Tries to connect to a named pipe on the same machine.
+ ///
+ /// The name of the pipe.
+ /// The resulting pipe handle.
+ /// Return true if the attempt succeeds.
+ /// This method is used mainly when stopping the pipe server. It unblocks the existing pipes, which wait for client connection.
+ #endregion
+ public static bool TryConnectToPipe(string pipeName, out PipeHandle handle)
+ {
+ return TryConnectToPipe(pipeName, ".", out handle);
+ }
+ #region Comments
+ ///
+ /// Tries to connect to a named pipe.
+ ///
+ /// The name of the pipe.
+ /// The name of the server.
+ /// The resulting pipe handle.
+ /// Return true if the attempt succeeds.
+ /// This method is used mainly when stopping the pipe server. It unblocks the existing pipes, which wait for client connection.
+ #endregion
+ public static bool TryConnectToPipe(string pipeName, string serverName, out PipeHandle handle)
+ {
+ handle = new PipeHandle();
+ // Build the pipe name string
+ string name = @"\\" + serverName + @"\pipe\" + pipeName;
+ handle.State = InterProcessConnectionState.ConnectingToServer;
+ // Try to connect to a server pipe
+ handle.Handle = NamedPipeNative.CreateFile(name, NamedPipeNative.GENERIC_READ | NamedPipeNative.GENERIC_WRITE, 0, null, NamedPipeNative.OPEN_EXISTING, 0, 0);
+ if (handle.Handle.ToInt32() != NamedPipeNative.INVALID_HANDLE_VALUE)
+ {
+ handle.State = InterProcessConnectionState.ConnectedToServer;
+ return true;
+ }
+ else
+ {
+ handle.State = InterProcessConnectionState.Error;
+ return false;
+ }
+ }
+ #region Comments
+ ///
+ /// Connects to a server named pipe on the same machine.
+ ///
+ /// The pipe name.
+ /// The pipe handle, which also contains the pipe state.
+ /// This method is used by clients to establish a pipe connection with a server pipe.
+ #endregion
+ public static PipeHandle ConnectToPipe(string pipeName)
+ {
+ return ConnectToPipe(pipeName, ".");
+ }
+ #region Comments
+ ///
+ /// Connects to a server named pipe.
+ ///
+ /// The pipe name.
+ /// The server name.
+ /// The pipe handle, which also contains the pipe state.
+ /// This method is used by clients to establish a pipe connection with a server pipe.
+ #endregion
+ public static PipeHandle ConnectToPipe(string pipeName, string serverName)
+ {
+ PipeHandle handle = new PipeHandle();
+ // Build the name of the pipe.
+ string name = @"\\" + serverName + @"\PIPE\" + pipeName;
+
+ for (int i = 1; i<=ATTEMPTS; i++)
+ {
+ handle.State = InterProcessConnectionState.ConnectingToServer;
+ // Try to connect to the server
+ handle.Handle = NamedPipeNative.CreateFile(name, NamedPipeNative.GENERIC_READ | NamedPipeNative.GENERIC_WRITE, 0, null, NamedPipeNative.OPEN_EXISTING, 0, 0);
+ if (handle.Handle.ToInt32() != NamedPipeNative.INVALID_HANDLE_VALUE)
+ {
+ // The client managed to connect to the server pipe
+ handle.State = InterProcessConnectionState.ConnectedToServer;
+ // Set the read mode of the pipe channel
+ uint mode = NamedPipeNative.PIPE_READMODE_MESSAGE;
+ if (NamedPipeNative.SetNamedPipeHandleState(handle.Handle, ref mode, IntPtr.Zero, IntPtr.Zero))
+ {
+ break;
+ }
+ if (i >= ATTEMPTS)
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error setting read mode on pipe " + name + " . Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ if (i >= ATTEMPTS)
+ {
+ if (NamedPipeNative.GetLastError() != NamedPipeNative.ERROR_PIPE_BUSY)
+ {
+ handle.State = InterProcessConnectionState.Error;
+ // After a certain number of unsuccessful attempt raise an exception
+ throw new NamedPipeIOException("Error connecting to pipe " + name + " . Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ else
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Pipe " + name + " is too busy. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ else
+ {
+ // The pipe is busy so lets wait for some time and try again
+ if (NamedPipeNative.GetLastError() == NamedPipeNative.ERROR_PIPE_BUSY)
+ NamedPipeNative.WaitNamedPipe(name, WAIT_TIME);
+ }
+ }
+
+ return handle;
+ }
+ #region Comments
+ ///
+ /// Creates a server named pipe.
+ ///
+ /// The name of the pipe.
+ /// The size of the outbound buffer.
+ /// The size of the inbound buffer.
+ /// The pipe handle.
+ #endregion
+ public static PipeHandle Create(string name, uint outBuffer, uint inBuffer)
+ {
+ if ((name.IndexOf("pipe") < 0) && (name.IndexOf("PIPE") < 0))
+ name = @"\\.\pipe\" + name;
+
+ PipeHandle handle = new PipeHandle();
+ for (int i = 1; i<=ATTEMPTS; i++)
+ {
+ handle.State = InterProcessConnectionState.Creating;
+ handle.Handle = NamedPipeNative.CreateNamedPipe(
+ name,
+ NamedPipeNative.PIPE_ACCESS_DUPLEX,
+ NamedPipeNative.PIPE_TYPE_MESSAGE | NamedPipeNative.PIPE_READMODE_MESSAGE | NamedPipeNative.PIPE_WAIT,
+ NamedPipeNative.PIPE_UNLIMITED_INSTANCES,
+ outBuffer,
+ inBuffer,
+ NamedPipeNative.NMPWAIT_WAIT_FOREVER,
+ IntPtr.Zero);
+ if (handle.Handle.ToInt32() != NamedPipeNative.INVALID_HANDLE_VALUE)
+ {
+ handle.State = InterProcessConnectionState.Created;
+ break;
+ }
+ if (i >= ATTEMPTS)
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error creating named pipe " + name + " . Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+
+ return handle;
+ }
+ #region Comments
+ ///
+ /// Starts waiting for client connections.
+ ///
+ ///
+ /// Blocks the current execution until a client pipe attempts to establish a connection.
+ ///
+ /// The pipe handle.
+ #endregion
+ public static void Connect(PipeHandle handle)
+ {
+ handle.State = InterProcessConnectionState.WaitingForClient;
+ bool connected = NamedPipeNative.ConnectNamedPipe(handle.Handle, null);
+ handle.State = InterProcessConnectionState.ConnectedToClient;
+ if (!connected && NamedPipeNative.GetLastError() != NamedPipeNative.ERROR_PIPE_CONNECTED)
+ {
+ handle.State = InterProcessConnectionState.Error;
+ throw new NamedPipeIOException("Error connecting pipe. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ #region Comments
+ ///
+ /// Returns the number of instances of a named pipe.
+ ///
+ /// The pipe handle.
+ /// The number of instances.
+ #endregion
+ public static uint NumberPipeInstances(PipeHandle handle)
+ {
+ uint curInstances = 0;
+
+ if (NamedPipeNative.GetNamedPipeHandleState(handle.Handle, IntPtr.Zero, ref curInstances, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero))
+ {
+ return curInstances;
+ }
+ else
+ {
+ throw new NamedPipeIOException("Error getting the pipe state. Internal error: " + NamedPipeNative.GetLastError().ToString(), NamedPipeNative.GetLastError());
+ }
+ }
+ #region Comments
+ ///
+ /// Closes a named pipe and releases the native handle.
+ ///
+ /// The pipe handle.
+ #endregion
+ public static void Close(PipeHandle handle)
+ {
+ handle.State = InterProcessConnectionState.Closing;
+ NamedPipeNative.CloseHandle(handle.Handle);
+ handle.Handle = IntPtr.Zero;
+ handle.State = InterProcessConnectionState.Closed;
+ }
+ #region Comments
+ ///
+ /// Flushes all the data in a named pipe.
+ ///
+ /// The pipe handle.
+ #endregion
+ public static void Flush(PipeHandle handle)
+ {
+ handle.State = InterProcessConnectionState.Flushing;
+ NamedPipeNative.FlushFileBuffers(handle.Handle);
+ handle.State = InterProcessConnectionState.FlushedData;
+ }
+ #region Comments
+ ///
+ /// Disconnects a server named pipe from the client.
+ ///
+ ///
+ /// Server pipes can be reused by first disconnecting them from the client and then
+ /// calling the Connect
+ /// method to start listening. This improves the performance as it is not necessary
+ /// to create new pipe handles.
+ ///
+ /// The pipe handle.
+ #endregion
+ public static void Disconnect(PipeHandle handle)
+ {
+ handle.State = InterProcessConnectionState.Disconnecting;
+ NamedPipeNative.DisconnectNamedPipe(handle.Handle);
+ handle.State = InterProcessConnectionState.Disconnected;
+ }
+ #region Comments
+ ///
+ /// Private constructor.
+ ///
+ #endregion
+ private NamedPipeWrapper() {}
+
+
+ // Client USERID stuff
+ // 1. call ImpersonateNamedPipeClient(hPipe)
+ // 2. call OpenThreadToken(GetCurrentThread(),
+ // TOKEN_QUERY | TOKEN_QUERY_SOURCE,
+ // FALSE,
+ // phUserToken);
+
+ public static int ImpersonateNamePipeClient(IntPtr hPipeHandle)
+ {
+ int rcode = NamedPipeNative.ImpersonateNamedPipeClient(hPipeHandle);
+ return rcode;
+ }
+
+
+ static int PerformDump(HANDLE token)
+ {
+ StringBuilder sb = new StringBuilder();
+ NamedPipeNative.TOKEN_USER tokUser;
+ const int bufLength = 256;
+ IntPtr tu = Marshal.AllocHGlobal( bufLength );
+ int cb = bufLength;
+ if (NamedPipeNative.GetTokenInformation( token, NamedPipeNative.TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb ))
+ Console.WriteLine("GetTokenInformation successful");
+ else
+ {
+ Console.WriteLine("GetTokenInformation NOT successful");
+ uint error = NamedPipeNative.GetLastError();
+ Console.WriteLine("error" + error.ToString());
+ }
+
+ tokUser = (NamedPipeNative.TOKEN_USER) Marshal.PtrToStructure(tu, typeof(NamedPipeNative.TOKEN_USER) );
+ //sb.Append(DumpAccountSid(tokUser.User.Sid));
+ IntPtr pUserID = tokUser.User.Sid;
+ //Console.WriteLine("UserID: " + pUserID);
+
+ DumpAccountSid(pUserID);
+ Marshal.FreeHGlobal( tu );
+
+
+ tu = Marshal.AllocHGlobal(bufLength);
+ cb = bufLength;
+
+ // get token states
+ NamedPipeNative.TOKEN_STATISTICS stats;
+
+ if (NamedPipeNative.GetTokenInformation(token, NamedPipeNative.TOKEN_INFORMATION_CLASS.TokenStatistics, tu, cb, ref cb))
+ {
+ stats = (NamedPipeNative.TOKEN_STATISTICS) Marshal.PtrToStructure(tu, typeof(NamedPipeNative.TOKEN_STATISTICS));
+ Console.WriteLine("UserLow: "+stats.AuthenticationId.LowPart.ToString());
+ Console.WriteLine("UserHigh: "+stats.AuthenticationId.HighPart.ToString());
+ }
+ else
+ {
+ Console.WriteLine("failed");
+ }
+
+ return (int)pUserID;
+ }
+
+
+ static string DumpAccountSid(IntPtr SID)
+ {
+ int cchAccount = 0;
+ int cchDomain = 0;
+ int snu = 0 ;
+ StringBuilder sb = new StringBuilder();
+
+ // Caller allocated buffer
+ StringBuilder Account= null;
+ StringBuilder Domain = null;
+ bool ret = NamedPipeNative.LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);
+ if ( ret == true )
+ if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )
+ return "Error";
+ try
+ {
+ Account = new StringBuilder( cchAccount );
+ Domain = new StringBuilder( cchDomain );
+ ret = NamedPipeNative.LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);
+ if (ret)
+ {
+ sb.Append(Domain);
+ sb.Append(@"\\");
+ sb.Append(Account);
+ }
+ else
+ Console.WriteLine("logon account (no name) ");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ finally
+ {
+ }
+ string SidString = null;
+ NamedPipeNative.ConvertSidToStringSid(SID, ref SidString);
+ sb.Append("\nSID: ");
+ sb.Append(SidString);
+
+
+ Console.WriteLine("Acct info: "+ sb.ToString());
+ return sb.ToString();
+ }
+
+ public static int GetLocalUserID(PipeHandle handle, ref int lowPart, ref int highPart, ref string SidString)
+ {
+ int rcode = -1;
+ // get client userID
+ int code = NamedPipeNative.ImpersonateNamedPipeClient(handle.Handle);
+ if (code == 0)
+ {
+ uint lastError = NamedPipeNative.GetLastError();
+ Console.WriteLine("ImpersonateNamedPipeClient Error: "+rcode.ToString());
+ return -1;
+ }
+
+ try
+ {
+ IntPtr hThread = NamedPipeNative.GetCurrentThread();
+ uint iDesiredInfo = 24; //TOKEN_QUERY | TOKEN_QUERY_SOURCE;
+ IntPtr userToken = Marshal.AllocHGlobal(4);
+
+ if (NamedPipeNative.OpenThreadToken(hThread, iDesiredInfo, true, out userToken))
+ {
+
+ StringBuilder sb = new StringBuilder();
+ NamedPipeNative.TOKEN_USER tokUser;
+ const int bufLength = 256;
+ IntPtr tu = Marshal.AllocHGlobal( bufLength );
+ int cb = bufLength;
+ if (NamedPipeNative.GetTokenInformation( userToken, NamedPipeNative.TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb ))
+ {
+ tokUser = (NamedPipeNative.TOKEN_USER) Marshal.PtrToStructure(tu, typeof(NamedPipeNative.TOKEN_USER) );
+ IntPtr pUserID = tokUser.User.Sid;
+ Marshal.FreeHGlobal( tu );
+
+ // get SID
+ //string SidString = null;
+ NamedPipeNative.ConvertSidToStringSid(pUserID, ref SidString);
+
+ // get token states
+ tu = Marshal.AllocHGlobal(bufLength);
+ cb = bufLength;
+ NamedPipeNative.TOKEN_STATISTICS stats;
+ if (NamedPipeNative.GetTokenInformation(userToken, NamedPipeNative.TOKEN_INFORMATION_CLASS.TokenStatistics, tu, cb, ref cb))
+ {
+ stats = (NamedPipeNative.TOKEN_STATISTICS) Marshal.PtrToStructure(tu, typeof(NamedPipeNative.TOKEN_STATISTICS));
+ // copy low and high part
+ lowPart = stats.AuthenticationId.LowPart;
+ highPart = stats.AuthenticationId.HighPart;
+ rcode = -1;
+ }
+ }
+ else
+ {
+ Console.WriteLine("GetTokenInformation NOT successful");
+ uint error = NamedPipeNative.GetLastError();
+ Console.WriteLine("error" + error.ToString());
+ }
+
+ // close handle
+ NamedPipeNative.CloseHandle(hThread);
+ NamedPipeNative.RevertToSelf();
+ }
+ else
+ {
+ int lastError = Marshal.GetLastWin32Error();
+ uint errorcode = NamedPipeNative.GetLastError();
+ Console.WriteLine("OpenThreadToken Error: "+ errorcode.ToString() + " code2: "+rcode.ToString());
+ }
+ }
+ catch (Exception ex)
+ {
+ int error = Marshal.GetLastWin32Error();
+ Console.WriteLine(ex.ToString());
+ return rcode;
+ }
+ // end
+
+ return rcode;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/PipeHandle.cs b/c_micasad/communication/win/NamedPipes/PipeHandle.cs
new file mode 100644
index 00000000..a560ac19
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/PipeHandle.cs
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+
+using sscs.communication.win.InterProcessComm;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// Holds the operating system native handle and the current state of the pipe connection.
+ ///
+ #endregion
+ public sealed class PipeHandle {
+ #region Comments
+ ///
+ /// The operating system native handle.
+ ///
+ #endregion
+ public IntPtr Handle;
+ #region Comments
+ ///
+ /// The current state of the pipe connection.
+ ///
+ #endregion
+ public InterProcessConnectionState State;
+ #region Comments
+ ///
+ /// Creates a PipeHandle instance using the passed native handle.
+ ///
+ /// The native handle.
+ #endregion
+ public PipeHandle (int hnd) {
+ this.Handle = new IntPtr(hnd);
+ this.State = InterProcessConnectionState.NotSet;
+ }
+ #region Comments
+ ///
+ /// Creates a PipeHandle instance using the provided native handle and state.
+ ///
+ /// The native handle.
+ /// The state of the pipe connection.
+ #endregion
+ public PipeHandle (int hnd, InterProcessConnectionState state) {
+ this.Handle = new IntPtr(hnd);
+ this.State = state;
+ }
+ #region Comments
+ ///
+ /// Creates a PipeHandle instance with an invalid native handle.
+ ///
+ #endregion
+ public PipeHandle () {
+ this.Handle = new IntPtr(NamedPipeNative.INVALID_HANDLE_VALUE);
+ this.State = InterProcessConnectionState.NotSet;
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/PipeManager.cs b/c_micasad/communication/win/NamedPipes/PipeManager.cs
new file mode 100644
index 00000000..0cc6290e
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/PipeManager.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections;
+using System.Threading;
+using System.Web;
+using System.IO;
+using System.Configuration;
+using System.Diagnostics;
+
+using sscs.communication.win.InterProcessComm;
+using sscs.communication.win.NamedPipes;
+
+namespace sscs.communication.win {
+
+ public class PipeManager : IChannelManager {
+
+ public Hashtable Pipes;
+
+ private uint NumberPipes = 5;
+ private uint OutBuffer = 65536; //512;
+ private uint InBuffer = 65536; //512;
+ private const int MAX_READ_BYTES = 5000;
+ private bool _listen = true;
+ public bool Listen {
+ get {
+ return _listen;
+ }
+ set {
+ _listen=value;
+ }
+ }
+ private int numChannels = 0;
+ private Hashtable _pipes = new Hashtable();
+ //private Thread MainThread;
+ //private string PipeName = XTIER_RPC_PIPE;
+ private string XTIER_RPC_PIPE = "\\\\.\\PIPE\\SS_RPC_PIPE";
+ private ManualResetEvent Mre;
+ private const int PIPE_MAX_STUFFED_TIME = 5000;
+
+ public object SyncRoot = new object();
+
+ public void Initialize() {
+ Pipes = Hashtable.Synchronized(_pipes);
+ Mre = new ManualResetEvent(false);
+ /*
+ MainThread = new Thread(new ThreadStart(Start));
+ MainThread.IsBackground = true;
+ MainThread.Name = "Main Pipe Thread";
+ MainThread.Start();
+ */
+ Thread.Sleep(1000);
+ }
+ public string HandleRequest(string request) {
+ string returnVal;
+
+ //Form1.ActivityRef.AppendText(request + Environment.NewLine);
+ returnVal = "Response to: " + request;
+
+ return returnVal;
+ }
+
+ public void Start() {
+ try {
+ while (_listen) {
+ int[] keys = new int[Pipes.Keys.Count];
+ Pipes.Keys.CopyTo(keys,0);
+ foreach (int key in keys) {
+ ServerNamedPipe serverPipe = (ServerNamedPipe)Pipes[key];
+ if (serverPipe != null && DateTime.Now.Subtract(serverPipe.LastAction).Milliseconds > PIPE_MAX_STUFFED_TIME && serverPipe.PipeConnection.GetState() != InterProcessConnectionState.WaitingForClient) {
+ serverPipe.Listen = false;
+ serverPipe.PipeThread.Abort();
+ RemoveServerChannel(serverPipe.PipeConnection.NativeHandle);
+ }
+ }
+ if (numChannels <= NumberPipes) {
+ ServerNamedPipe pipe = new ServerNamedPipe(XTIER_RPC_PIPE, OutBuffer, InBuffer, MAX_READ_BYTES);
+ try {
+ pipe.Connect();
+ pipe.LastAction = DateTime.Now;
+ System.Threading.Interlocked.Increment(ref numChannels);
+ pipe.Start();
+ Pipes.Add(pipe.PipeConnection.NativeHandle, pipe);
+ }
+ catch (InterProcessIOException) {
+ RemoveServerChannel(pipe.PipeConnection.NativeHandle);
+ pipe.Dispose();
+ }
+ }
+ else {
+ Mre.Reset();
+ Mre.WaitOne(1000, false);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Exception starting server: "+e.ToString());
+ // Log exception
+ }
+ }
+ public void Stop() {
+ _listen = false;
+ Mre.Set();
+ try {
+ int[] keys = new int[Pipes.Keys.Count];
+ Pipes.Keys.CopyTo(keys,0);
+ foreach (int key in keys) {
+ ((ServerNamedPipe)Pipes[key]).Listen = false;
+ }
+ int i = numChannels * 3;
+ for (int j = 0; j < i; j++) {
+ StopServerPipe();
+ }
+ Pipes.Clear();
+ Mre.Close();
+ Mre = null;
+ }
+ catch {
+ // Log exception
+ }
+ }
+
+ public void WakeUp() {
+ if (Mre != null) {
+ Mre.Set();
+ }
+ }
+ private void StopServerPipe() {
+ try {
+ ClientPipeConnection pipe = new ClientPipeConnection(XTIER_RPC_PIPE);
+ if (pipe.TryConnect()) {
+ pipe.Close();
+ }
+ } catch {
+ // Log exception
+ }
+ }
+
+ public void RemoveServerChannel(object param) {
+ int handle = (int)param;
+ System.Threading.Interlocked.Decrement(ref numChannels);
+ Pipes.Remove(handle);
+ this.WakeUp();
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/ServerNamedPipe.cs b/c_micasad/communication/win/NamedPipes/ServerNamedPipe.cs
new file mode 100644
index 00000000..0f0b1752
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/ServerNamedPipe.cs
@@ -0,0 +1,105 @@
+using System;
+using System.Threading;
+using System.IO;
+
+using sscs.communication.win.InterProcessComm;
+using sscs.communication.win.NamedPipes;
+
+namespace sscs.communication.win {
+
+ public sealed class ServerNamedPipe : IDisposable {
+ internal Thread PipeThread;
+ internal ServerPipeConnection PipeConnection;
+ internal bool Listen = true;
+ internal DateTime LastAction;
+ private bool disposed = false;
+
+ private void PipeListener() {
+ CheckIfDisposed();
+ try {
+ Listen = true;
+ while (Listen) {
+ LastAction = DateTime.Now;
+
+ // Service Client (new code)
+ IPCChannel ipcChannel = IPCChannel.Create(PipeConnection);
+ AppHandler appHandler = new AppHandler(ipcChannel);
+
+ try
+ {
+ int retVal = appHandler.ServiceApp();
+ }
+ catch(Exception)
+ {
+ ipcChannel.Close();
+ }
+
+ LastAction = DateTime.Now;
+ PipeConnection.Disconnect();
+ if (Listen) {
+ Connect();
+ }
+ WinCommunication.PipeManager.WakeUp();
+ }
+ }
+ catch (System.Threading.ThreadAbortException) { }
+ catch (System.Threading.ThreadStateException) { }
+ catch (Exception) {
+ // Log exception
+
+ }
+ finally {
+ this.Close();
+ }
+ }
+ internal void Connect() {
+ CheckIfDisposed();
+ PipeConnection.Connect();
+ }
+ internal void Close() {
+ CheckIfDisposed();
+ this.Listen = false;
+ WinCommunication.PipeManager.RemoveServerChannel(this.PipeConnection.NativeHandle);
+ this.Dispose();
+ }
+ internal void Start() {
+ CheckIfDisposed();
+ PipeThread.Start();
+ }
+ private void CheckIfDisposed() {
+ if(this.disposed) {
+ throw new ObjectDisposedException("ServerNamedPipe");
+ }
+ }
+ public void Dispose() {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+ private void Dispose(bool disposing) {
+ if(!this.disposed) {
+ PipeConnection.Dispose();
+ if (PipeThread != null) {
+ try {
+ PipeThread.Abort();
+ }
+ catch (System.Threading.ThreadAbortException) { }
+ catch (System.Threading.ThreadStateException) { }
+ catch (Exception) {
+ // Log exception
+ }
+ }
+ }
+ disposed = true;
+ }
+ ~ServerNamedPipe() {
+ Dispose(false);
+ }
+ internal ServerNamedPipe(string name, uint outBuffer, uint inBuffer, int maxReadBytes) {
+ PipeConnection = new ServerPipeConnection(name, outBuffer, inBuffer, maxReadBytes);
+ PipeThread = new Thread(new ThreadStart(PipeListener));
+ PipeThread.IsBackground = true;
+ PipeThread.Name = "Pipe Thread " + this.PipeConnection.NativeHandle.ToString();
+ LastAction = DateTime.Now;
+ }
+ }
+}
\ No newline at end of file
diff --git a/c_micasad/communication/win/NamedPipes/ServerPipeConnection.cs b/c_micasad/communication/win/NamedPipes/ServerPipeConnection.cs
new file mode 100644
index 00000000..728f91f6
--- /dev/null
+++ b/c_micasad/communication/win/NamedPipes/ServerPipeConnection.cs
@@ -0,0 +1,85 @@
+//////////////////////////////////////////////////
+// Created by Ivan Latunov - IvanWeb.com //
+//----------------------------------------------//
+// This program is free software. You can //
+// redistribute it and/or modify it as you wish //
+//////////////////////////////////////////////////
+
+
+using System;
+using System.IO;
+
+using sscs.communication.win.InterProcessComm;
+
+namespace sscs.communication.win.NamedPipes {
+ #region Comments
+ ///
+ /// Used by server applications to communicate with client ones by using named pipes.
+ ///
+ #endregion
+ public sealed class ServerPipeConnection : APipeConnection {
+ #region Comments
+ ///
+ /// Disconnects a client named pipe.
+ ///
+ ///
+ /// When a client named pipe is disconnected, the server one is not closed.
+ /// The latter can later be reused by starting to listen again.
+ /// In a message oriented protocol the server will disconnect the client when the
+ /// response is sent and all the data is flushed. The same server named pipe
+ /// could then be reused by calling the
+ /// Connect method.
+ ///
+ #endregion
+ public void Disconnect() {
+ CheckIfDisposed();
+ NamedPipeWrapper.Disconnect(this.Handle);
+ }
+ #region Comments
+ ///
+ /// Closes the operating system native handle of the named pipe.
+ ///
+ #endregion
+ public override void Close() {
+ CheckIfDisposed();
+ NamedPipeWrapper.Close(this.Handle);
+ }
+ #region Comments
+ ///
+ /// Starts listening to client pipe connections.
+ ///
+ ///
+ /// This method will block the program execution until a client pipe attempts
+ /// to establish a connection.
+ /// When a client named pipe is disconnected, the server one is not closed.
+ /// The latter can later be reused by starting to listen again.