Case Study - Custom User Sync Integration

KB Home   |   Case Study - Custom User Sync Integration

Main.CaseStudyCustomUserSyncIntegration History

Hide minor edits - Show changes to output

August 23, 2019, at 05:02 PM by 24.116.246.88 -
Changed lines 252-253 from:
A: Internal users is disabled by default.  Internal users are mutually exclusive form the sync source and only exist in the PaperCut database.  PaperCut will not call any workflow operations on any internal users if define.
to:
A: Internal users is disabled by default.  Internal users are mutually exclusive from the sync source and only exist in the PaperCut database.  PaperCut will not call any workflow operations on any internal users if defined.
Changed line 255 from:
A: Yes. In many environments there are often thousands of groups in the user directory.  Most are defined for purposes such as file permissions, etc. and are not relevant to printing.  Each group added into PaperCut adds some sync overhead as users and groups are match up in the database.  For this reason the administrators must select the groups appropriate for printing (e.g. rules, reports, filters, ...).  Automatically importing all groups would cause performance problems.
to:
A: Yes. In many environments there are often thousands of groups in the user directory.  Most are defined for purposes such as file permissions, etc. and are not relevant to printing.  Each group added into PaperCut adds some sync overhead as users and groups are matched up in the database.  For this reason the administrators must select the groups appropriate for printing (e.g. rules, reports, filters, ...).  Automatically importing all groups would cause performance problems.
Added lines 207-208:

'''NOTE''': The fields must be supplied in the correct order.
Changed line 100 from:
-->List of user details (see below for more information)
to:
-->User details (see below for more information) for the specific user, UTF-8 encoded and terminated with a newline.
Changed lines 178-180 from:
The user details is an ordered list of fields each separated by a tab character and terminated with a newline. The text should be UTF-8.

Each field is optional and may be supplied as a zero length string [@@\t\t@@]. Only the username is a mandatory.
to:
The user details is an ordered list of fields each separated by a tab character and terminated with a newline. The text should be UTF-8 encoded.

Each field is optional and may be supplied as a zero length string @@\t\t@@. Only the username is a mandatory.
August 23, 2019, at 04:55 AM by Alec - Majore update on user details
Changed lines 21-24 from:
to:
# From the Actions menu select @@Config editor (advanced)@@
# In the search box enter the text @@user-source.update-user-details-card-id@@ and select the search button
# Assign the value of "Y" to the @@user-source.update-user-details-card-id@@ config key

Changed lines 57-64 from:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for each user.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.

to:

--> List of user details (see below for more information)
Changed lines 99-108 from:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.


to:

-->List of user details (see below for more information)
Changed lines 121-128 from:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.

to:

-->List of usernames, each one separated by a newline UTF-8 encoded
Changed lines 143-151 from:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails"\t''secondaryCardNumber''\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.


to:

-->List of user details (see below for more information)
Changed lines 174-208 from:
to:
!! List of user details

The custom user program must provide a list of user details in response to the @@all-users@@, @@get-user-details@@ and @@group-members@@ requests.

The user details is an ordered list of fields each separated by a tab character and terminated with a newline. The text should be UTF-8.

Each field is optional and may be supplied as a zero length string [@@\t\t@@]. Only the username is a mandatory.

The complete list of fields is

* User Name
* Full Name
* Email
* Department
* Office
* Primary Card Number
* Other Emails
* Secondary Card Number
* Username  Alias (secondary username)
* Home Directory
* PIN

For example

@@janer\tJane Rodgers\tjaner@here.com\tSales\tDocklands\n@@


@@jane\tJane Rodgers\tjaner@here.com\tSales\tDocklands\t5678\tpersonal2@webmail.com\t05678\tuser2\t\\server\dfs\homedirs\user2\t1234\n@@

or

@@jane\tJane Rodgers\tjaner@here.com\tSales\tDocklands\t5678\tpersonal2@webmail.com\t05678\t\t\t1234\n@@


----
Changed line 243 from:
* A sample Python script that shows a simple implementation for both custom user sync and custom authentication is [[https://github.com/PaperCutSoftware/PaperCutExamples/tree/master/Authentication|available]]. Please note this is a simple example and is not indented for production use.
to:
* A sample Python script and a Go program that shows a simple implementation for both custom user sync and custom authentication is [[https://github.com/PaperCutSoftware/PaperCutExamples/tree/master/Authentication|available]]. Please note these are simple example and is not indented for production use.
Changed lines 58-59 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@
Changed lines 101-102 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed lines 105-106 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@
Changed lines 130-131 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed lines 134-135 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails''\t''secondaryCardNumber''\n@@
Changed lines 157-158 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed line 161 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t''otherEmails"\t''secondaryCardNumber''\n@@
Changed line 157 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed lines 54-61 from:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for each user.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.

August 21, 2019, at 05:57 AM by Alec - Change notes about Loading card numbers
Changed lines 94-103 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.


Changed lines 123-130 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.

Added lines 151-158:

NOTE: If the advanced configuration [@key user-source.update-user-details-card-id@] is set to "Y" then additional user details may be provided.

* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''primaryCardNumber''\t"otherEmails"\t"secondaryCardNumber"\n@@

If "Other Emails" is not required, but a Secondary Card number is required, then pass an empty string in place of the other emails value.

August 21, 2019, at 02:25 AM by Alec - Remove confusing information
Deleted lines 208-210:

Q:  Why is my Custom Sync Source ignoring my card ids?
A: There is a hidden config key called, [@user-source.update-user-details-card-id@](Which takes a '''Y''' to enable and an '''N''' to disable), that is disabled by default. Once enabling this, the custom sync source will pull in what it believes to be unique primary card ids. i.e not 1234.
August 12, 2019, at 05:04 AM by Ryan Reichenberg -
Changed line 211 from:
A: There is a hidden config key called, [@user-source.update-user-details-card-id@](Which takes a '''Y''' to enable and an '''N''' to disable), that is to be disabled by default. Once enabling this, the custom sync source will pull in what it believes to be unique primary card ids. i.e not 1234.
to:
A: There is a hidden config key called, [@user-source.update-user-details-card-id@](Which takes a '''Y''' to enable and an '''N''' to disable), that is disabled by default. Once enabling this, the custom sync source will pull in what it believes to be unique primary card ids. i.e not 1234.
August 12, 2019, at 04:58 AM by Ryan Reichenberg - Fix wording and explain in a little more detail
Changed line 211 from:
A: There is a hidden config key called, "user-source.update-user-details-card-id", that appeared to be disabled by default. Once enabling this, the custom sync source pulled in what it believed to be unique primary card ids. i.e not 1234.
to:
A: There is a hidden config key called, [@user-source.update-user-details-card-id@](Which takes a '''Y''' to enable and an '''N''' to disable), that is to be disabled by default. Once enabling this, the custom sync source will pull in what it believes to be unique primary card ids. i.e not 1234.
August 12, 2019, at 04:31 AM by Ryan Reichenberg - Custom Sync Source ignoring card ids
August 12, 2019, at 04:31 AM by Ryan Reichenberg - Custom Sync Source ignoring card ids
Deleted lines 211-213:

For example, if a secondary card id needs to be passed in, a blank 'other emails' parameter must be passed:

August 12, 2019, at 04:30 AM by Ryan Reichenberg - Custom Sync Source ignoring card ids
Added lines 209-213:

Q:  Why is my Custom Sync Source ignoring my card ids?
A: There is a hidden config key called, "user-source.update-user-details-card-id", that appeared to be disabled by default. Once enabling this, the custom sync source pulled in what it believed to be unique primary card ids. i.e not 1234.

For example, if a secondary card id needs to be passed in, a blank 'other emails' parameter must be passed:
November 10, 2017, at 12:05 AM by Willem Groenewald -
Added line 175:
* Or; @@OK\nusername\n@@ when authentication is successful. This is useful for removing diacritic marks from usernames. PaperCut will use the username returned instead.
May 09, 2017, at 04:40 AM by peterf - Removed reference to 32-bit Linux binaries.
Changed line 22 from:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@ or @@[install-path]/server/examples/@@.
to:
Source code for an example program which utilizes this feature is provided with the PaperCut installation and can be found at @@[install-path]/server/bin/linux-x64/src/@@ or @@[install-path]/server/examples/@@.
March 29, 2017, at 03:08 AM by Alec - Add additional keywords
Changed line 213 from:
[-keywords: userdir.exe, custom synchronization, user plugin-]
to:
[-keywords: userdir.exe, custom synchronization, user plugin,integration, technical integration-]
July 20, 2016, at 01:07 AM by Alec - Added a note about sample code
Added line 197:
* A sample Python script that shows a simple implementation for both custom user sync and custom authentication is [[https://github.com/PaperCutSoftware/PaperCutExamples/tree/master/Authentication|available]]. Please note this is a simple example and is not indented for production use.
July 19, 2016, at 04:48 AM by Alec - Incorrect edit
Changed lines 22-23 from:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/examples/providers@@.
to:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@ or @@[install-path]/server/examples/@@.
Changed line 90 from:
-->@@`MyCustomUserProgram.exe - get-user-details  ahmedk@@
to:
-->@@`MyCustomUserProgram.exe - get-user-details@@
Changed line 90 from:
-->@@`MyCustomUserProgram.exe - get-user-details@@
to:
-->@@`MyCustomUserProgram.exe - get-user-details  ahmedk@@
July 12, 2016, at 12:39 AM by Alec - Fix location of example code
Changed line 22 from:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@ or @@[install-path]/server/examples/@@.
to:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/examples/providers@@.
Changed line 74 from:
* @@''groupName''\n@@ for each group.
to:
* @@''groupName''\n@@ for each group.  The output must be UTF-8 encoded.
Changed line 94 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed line 114 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed line 134 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.  The output must be UTF-8 encoded.
Changed line 172 from:
* @@''username''\n''plaintextPassword''@@
to:
* @@''username''\n''plaintextPassword''@@.  The input must be UTF-8 encoded.
Changed line 174 from:
* @@OK\n@@ when authentication is successful.
to:
* @@OK\n@@ when authentication is successful. 
May 18, 2015, at 06:54 AM by matt - Fix up case on function names.
Changed lines 28-29 from:
!!!Function: Is-Valid
to:
!!!Function: is-valid
Changed line 44 from:
!!!Function: All-Users
to:
!!!Function: all-users
Changed lines 63-64 from:
!!!Function: All-Groups
to:
!!!Function: all-groups
Changed lines 83-84 from:
!!!Function: Get-User-Details
to:
!!!Function: get-user-details
Changed lines 103-104 from:
!!!Function: Group-Member-Names
to:
!!!Function: group-member-names
Changed lines 123-124 from:
!!! Function: Group-Members
to:
!!! Function: group-members
Changed lines 143-144 from:
!!! Function: Is-User-In-Group
to:
!!! Function: is-user-in-group
February 04, 2015, at 08:20 PM by Rick - cleaned up formating
Changed lines 17-21 from:
# Navigate to the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab.
# The settings in the @@'''Sync Source'''@@ section defines where PaperCut imports users and groups from. Change the @@'''Primary sync source'''@@ to @@'''Custom program'''@@.
# Enter in the path to the program that enumerates user and group information in the field @@'''Custom user program'''@@.
# Enter in the path to the program that handles user authentication in the field @@'''Custom auth program'''@@.
to:
# Navigate to the @@Options@@ → @@User/Group Sync@@ tab.
# The settings in the @@Sync Source@@ section defines where PaperCut imports users and groups from. Change the @@Primary sync source@@ to @@Custom program@@.
# Enter in the path to the program that enumerates user and group information in the field @@Custom user program@@.
# Enter in the path to the program that handles user authentication in the field @@Custom auth program@@.
Changed lines 60-61 from:
-->The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually using @@'''Synchronize Now'''@@ under the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab, or overnight as part of the automated sync.
to:
-->The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually using @@Synchronize Now@@ under the @@Options@@ → @@User/Group Sync@@ tab, or overnight as part of the automated sync.
April 23, 2014, at 02:09 AM by TimBentley - Minor rewording
Changed line 56 from:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error. Return an error message @@''[error message string/description]\n''@@. An error may be an event such as the inability to contact the directory server.
April 23, 2014, at 02:07 AM by TimBentley - Corrected minor typo
Changed line 179 from:
-->The exist code should always be zero (0).
to:
-->The exit code should always be zero (0).
Added lines 208-210:

''PaperCut would like thank Jarad for his contribution to this article.''

Changed lines 8-9 from:
This type of integration utilizes PaperCut's support for custom user directory and authentication programs.  More information on this can be found in the PaperCut manual [[https://www.papercut.com/products/ng/manual/ch-linux-user-providers.html|Chapter 24]].  You'll also find some example source code in [@[install-path]/server/examples/@].
to:
This type of integration utilizes PaperCut's support for custom user directory and authentication programs.  More information on this can be found in the PaperCut manual [[https://www.papercut.com/products/ng/manual/ch-linux-user-providers.html|Chapter 24]].
Changed lines 22-23 from:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@.
to:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@ or @@[install-path]/server/examples/@@.
Changed lines 200-201 from:
A: The account will be left and not deleted from PaperCut.  To delete these accounts, run a sync with the delete option selected, or manually delete the user via the interface (or via [[@server-command.exe@])
to:
A: The account will be left and not deleted from PaperCut.  To delete these accounts, run a sync with the delete option selected, or manually delete the user via the interface (or via [@server-command.exe@]).
Changed lines 8-9 from:
This type of integration utilizes PaperCut's support for custom user directory and authentication programs.  More information on this can be found in the PaperCut manual [[https://www.papercut.com/products/ng/manual/ch-linux-user-providers.html|Chapter 24]].
to:
This type of integration utilizes PaperCut's support for custom user directory and authentication programs.  More information on this can be found in the PaperCut manual [[https://www.papercut.com/products/ng/manual/ch-linux-user-providers.html|Chapter 24]].  You'll also find some example source code in [@[install-path]/server/examples/@].
Changed lines 184-188 from:
The following is the order each step occurs in during a synchronisation run.
# all-groups
# all-users
TODO:(differs between "Test Settings", "Synchronise Now" and batch job overnight?
)
to:
The following is the order each step occurs in during a typical manual or overnight use synchronisation run.
# [@all-users@] or [@group-members@] (if syncing against a group
)
# [@group-member-names@] called for each active group listed in PaperCut

!! Individual User Addition Workflow
The following is the order each step occurs during an event where are new user is added on demand (say on first print or first login).
# [@get-user-details@] called for the supplied user
# [@is-user-in-group@] called for the supplied user for each group defined in PaperCut


Changed lines 196-201 from:
* TODO:(What happens to "External User Lookup" feature for Cards? It is still used? Which takes precedence?)
* TODO:(What happens to @@[install-path]\server\data\conf\additional-
groups.txt@@ during sync? Still used? Appears to be, merged with groups taken from custom program)
* TODO:(`CardNumber
is not shown in user details from "Test Settings". Is it being used?)
* TODO
:(If "Delete users that do not exist in the selected source" is disabled, what happens if User is missing from selected source? Is account disabled?)
* TODO:(What happens when "Enable internal users" is disabled?)
* TODO:(Groups still must be added manually through
"Add/Remove Groups"?)
to:
* If groups are defined in @@[install-path]\server\data\conf\additional-groups.txt@@ this will override the custom auth program and it will not be called for any groups defined in this file.

!! FAQ
Q: If "Delete users that do not exist in the selected source"
is disabled, what happens if User is missing from selected source? Is account disabled?
A: The account will be left and not deleted from PaperCut.  To delete these accounts, run a sync with the delete option selected, or manually delete the user via the interface (or via [[@server-command.exe@])

Q: What happens when "Enable internal users
" is disabled?
A: Internal users is disabled by default.  Internal users are mutually exclusive form the sync source and only exist in the PaperCut database.  PaperCut will not call any workflow operations on any internal users if define.

Q: Groups still must be added manually through "Add/Remove Groups"?
A: Yes. In many environments there are often thousands of groups in the user directory.  Most are defined for purposes such as file permissions, etc. and are not relevant to printing.  Each group added into PaperCut adds some sync overhead as users and groups are match up in the database.  For this reason the administrators must select the groups appropriate for printing (e.g. rules, reports, filters, ...
).  Automatically importing all groups would cause performance problems.

----
[-keywords: userdir.exe, custom synchronization, user plugin-]
August 30, 2012, at 12:17 AM by 203.208.66.27 -
Changed line 54 from:
-->''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
to:
-->@@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
Changed line 56 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@. An error may be an event such as the inability to contact the directory server.
Added lines 8-9:
This type of integration utilizes PaperCut's support for custom user directory and authentication programs.  More information on this can be found in the PaperCut manual [[https://www.papercut.com/products/ng/manual/ch-linux-user-providers.html|Chapter 24]].
Changed line 74 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@.
Changed line 94 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@.
Changed line 114 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
Changed line 134 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
Changed line 155 from:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent user.
to:
-->Only on error return on standard error an error message @@''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent user.
Changed lines 163-164 from:
Below is a table containing the different calls Papercut will make to a configured Custom auth program as well as the valid and expected inputs and output.
to:
Below is a table containing the different calls PaperCut will make to a configured Custom auth program as well as the valid and expected inputs and output.  A custom authentication program is used to validate a user's username and password.
Changed lines 166-167 from:
* @@''[`CustomAuthProgram]''@@
* Or; to enable debugging @@''[`CustomAuthProgram]'' d
@@
to:
-->@@''[`CustomAuthProgram]''@@
Changed lines 173-177 from:
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure.
to:
* Or; @@ERROR\n@@ if the username and password is invalid, or a general error of any description occurs.
'''Standard-error'''
-->Only on error or invalid authentication return on standard error an error message @@''[error message string/description]\n''@@.  In line with best security practice on authentication failure return "Invalid username or password\n".  Do not disclose the existing of a valid username or invalid password via independent messages.
'''Exit Code'''
-->The exist code should always be zero (0)
.
Changed lines 179-180 from:
-->Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)
to:
-->Program is called only when authentication of a user is required.
Changed line 54 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@. An error may be an event such as the inability to contact the directory server.
Changed line 74 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.
Changed line 94 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.
Changed line 114 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
Changed line 134 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent group.
Changed line 155 from:
-->Only on error return on standard error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
to:
-->Only on error return on standard error an error message ''[error message string/description]\n''@@.  An error may include a event such as a call for a non-existent user.
Changed lines 52-53 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
* Or; @@Error: ''[error message string/description]''@@ in the event of an error. An error may be an event such as the inability to contact the directory server.
to:
-->''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed lines 73-76 from:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
to:
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed lines 93-96 from:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
to:
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed lines 113-116 from:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
to:
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed lines 133-136 from:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
to:
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed lines 154-157 from:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
to:
'''Standard-error'''
-->Only on error return on standard
error @@Error: ''[error message string/description]''@@. An error may be an event such as the inability to contact the directory server.
'''Exit Code'''
-->Zero on success and non-zero on error (combine with error message on STDERR)
.
Changed line 174 from:
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure. TODO
to:
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure.
Added lines 27-29:

Test to see if the custom command is valid and appropriately configured for use.

Added lines 43-44:
List all users on the network and their information (e.g. email address, office, department, ...).
Changed line 53 from:
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error. An error may be an event such as the inability to contact the directory server.
Added lines 59-61:

List all user directory groups available.

Changed line 70 from:
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
Changed lines 72-73 from:
-->TODO, TODO:(Triggered on "Import users from" query?)
to:
-->This command is called when PaperCut needs to list all groups on the network. Primarily it's called when the system Administrator attempts to add groups to the ''Groups'' section so they can use this group for reporting or rules.
Added lines 76-78:

List details about an individual user (e.g. email address, office, department, ...).

Changed lines 86-87 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
Changed line 89 from:
-->TODO
to:
-->This command is called to fetch information about a single use.  It's called when a user is created in an individual operation (e.g. on first print) rather than a batch operation (e.g. a full user/group sync).
Added lines 93-95:

List all members of a group. This command produces a list of usernames only. No user information is provided.

Changed lines 103-104 from:
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
Changed line 106 from:
-->TODO
to:
-->This command is called to list all members in a group.  It's called as part of a full user/group sync.
Added lines 110-112:

This command is similar to Group-Member-Names, however it returns user information as well as the username. 

Changed lines 120-121 from:
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.  At a minimum username must be returned. The other fields are optional and may be left empty.
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
Changed line 123 from:
--> TODO
to:
-->This command is called if the administrator has selected a group as a sync source.
Added lines 127-129:

Test to see if a user is in a given group.

Changed line 139 from:
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* Or; @@Error: ''[error message string/description]''@@ in the event of an error.
Changed line 141 from:
-->TODO
to:
-->This command is called when a user is added to the system in an individual even such as a on-first-print event. The information is used to see if group based setup rules should apply to this user.
Changed line 74 from:
-->'''Standard-output'''
to:
'''Standard-output'''
Changed line 124 from:
!!! Custom auth program
to:
!! Custom auth program
Changed lines 126-128 from:
(:table:)
(:cell:)
'''Program Call'''
(:cell:)
to:

'''Program Call'''
Changed lines 130-133 from:
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomAuthProgram.exe@@
(:cellnr:) '''Standard-input'''
(:cell:)
to:
'''Example Program Call'''
-->@@`MyCustomAuthProgram.exe@@
'''Standard-input'''
Changed lines 134-135 from:
(:cellnr:) '''Standard-output'''
(:cell:)
to:
'''Standard-output'''
Changed lines 137-141 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)
(:tableend:)

!
!! Synchronisation Workflow
to:
'''Trigger(s)'''
-->
Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)

!! Synchronisation Workflow
Changed line 146 from:
!!! Notes
to:
!! Notes
Changed lines 25-26 from:

!!! Is-Valid
to:
----
!!!Function: Is-Valid
Changed lines 38-39 from:

!!! All-Users
to:
----
!!!Function: All-Users
Changed lines 52-62 from:
!!!! All-Groups
(:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - all-groups@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - all-groups@@
(:cellnr:) '''Standard-input'''
(:cell:)
*
''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
to:
----
!!!Function: All-Groups
'''Program Call'''
-->@@''[`CustomUserProgram]'' - all-groups@@
'''Example Program Call'''
-->@@`MyCustomUserProgram.exe - all-groups@@
'''Standard-input'''
-->''N/A''
'''Standard-output'''
Changed lines 63-74 from:
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO, TODO:(Triggered on "Import users from" query?)
(:tableend:)

!!!! Get
-User-Details
(:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - get-user-details@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - get-user-details@@
(:cellnr:) '''Standard-input'''
(:cell:)
to:
'''Trigger(s)'''
-->TODO, TODO:
(Triggered on "Import users from" query?)

----
!!!Function: Get-User-Details
'''Program Call'''
-->@@''[`CustomUserProgram]'' - get-user-details@@
'''Example Program Call'''
-->@@`MyCustomUserProgram.exe - get
-user-details@@
'''Standard-input'''
Changed lines 74-75 from:
(:cellnr:) '''Standard-output'''
(:cell:)
to:
-->'''Standard-output'''
Changed lines 77-91 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
TODO
(:tableend:)

!!!!
Group-Member-Names
(:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - group-member-names ''[groupName]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - group-member-names "Engineering"@@
(:cellnr:) '''Standard-input'''
(:cell:)
*
''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
to:
'''Trigger(s)'''
-->
TODO
----

!!!Function
: Group-Member-Names
'''Program Call'''
-->@@''[`CustomUserProgram]'' - group-member-names ''[groupName]''@@
'''Example Program Call'''
-->@@`MyCustomUserProgram.exe - group-member-names "Engineering"@@
'''Standard-input'''
-->''N/A''
'''Standard-output'''
Changed lines 91-102 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
TODO
(:tableend:)

!!!! Group
-Members
(
:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - group-members ''[groupName]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - group-members "Engineering"@@
(:cellnr:) '''Standard-input'''
(:cell:)
to:
'''Trigger(s)'''
-->
TODO
----

!!! Function
: Group-Members
'''Program Call'''
-->@@''[`CustomUserProgram]'' - group-members ''[groupName]''@@
'''Example Program Call'''
-->@@`MyCustomUserProgram.exe - group-members "Engineering"@@
'''Standard-input'''
Changed lines 102-103 from:
(:cellnr:) '''Standard-output'''
(:cell:)
to:
'''Standard-output'''
Changed lines 105-116 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
TODO
(:tableend:)

!!!! Is
-User-In-Group
(
:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - is-user-in-group ''[groupName]'' ''[username]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - is-user-in-group "Engineering" "bobsmith"@@
(:cellnr:) '''Standard-input'''
(:cell:)
to:
'''Trigger(s)'''
-->
TODO
----

!!! Function
: Is-User-In-Group
'''Program Call'''
-->@@''[`CustomUserProgram]'' - is-user-in-group ''[groupName]'' ''[username]''@@
'''Example Program Call'''
-->@@`MyCustomUserProgram.exe - is-user-in-group "Engineering" "bobsmith"@@
'''Standard-input'''
Changed lines 116-117 from:
(:cellnr:) '''Standard-output'''
(:cell:)
to:
'''Standard-output'''
Changed lines 120-123 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
TODO
(:tableend:)
to:
'''Trigger(s)'''
-->
TODO
----
Changed line 22 from:
!!! Custom user program
to:
!! Custom user program
Changed lines 25-35 from:
!!!! Is-Valid
(:table:)
(:cell:)
'''Program Call'''
(:cell:) @@''[`CustomUserProgram]'' - is-valid@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - is-valid@@
(:cellnr:) '''Standard-input'''
(:cell:)
''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
to:

!!! Is-Valid
'''Program Call'''
--> @@''[`CustomUserProgram]'' - is-valid@@
'''Example Program Call'''
--> @@`MyCustomUserProgram.exe - is-valid@@
'''Standard-input'''
-->''N/A''
'''Standard-output'''
Changed lines 36-40 from:
(:cellnr:) '''Trigger(s)'''
(:cell:)
This is called on application server start, or setting page access and is used to validate that the custom provider is functional and working as expected.  An example maybe to say check that the directory source is reachable.  Most custom implementations will simply return @@Y\n@@.
(:tableend:)

!!!! All-Users
to:
'''Trigger(s)'''
-->
This is called on application server start, or setting page access and is used to validate that the custom provider is functional and working as expected.  An example maybe to say check that the directory source is reachable.  Most custom implementations will simply return @@Y\n@@.

!!! All-Users
'''Program Call'''
--> @@''[`CustomUserProgram]'' - all-users@@
'''Example Program Call'''
--> @@`MyCustomUserProgram.exe - all-users@@
'''Standard-input'''
-->''N/A''
'''Standard-output'''
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
'''Trigger(s)'''
-->The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually using @@'''Synchronize Now'''@@ under the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab, or overnight as part of the automated sync.

!!!! All-Groups
Changed line 55 from:
(:cell:) @@''[`CustomUserProgram]'' - all-users@@
to:
(:cell:) @@''[`CustomUserProgram]'' - all-groups@@
Changed line 57 from:
(:cell:) @@`MyCustomUserProgram.exe - all-users@@
to:
(:cell:) @@`MyCustomUserProgram.exe - all-groups@@
Changed line 60 from:
''N/A''
to:
* ''N/A''
Changed line 63 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
to:
* @@''groupName''\n@@ for each group.
Changed line 66 from:
(:cell:) The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually using @@'''Synchronize Now'''@@ under the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab, or overnight as part of the automated sync.
to:
(:cell:) TODO, TODO:(Triggered on "Import users from" query?)
Changed line 69 from:
!!!! All-Groups
to:
!!!! Get-User-Details
Changed line 72 from:
(:cell:) @@''[`CustomUserProgram]'' - all-groups@@
to:
(:cell:) @@''[`CustomUserProgram]'' - get-user-details@@
Changed line 74 from:
(:cell:) @@`MyCustomUserProgram.exe - all-groups@@
to:
(:cell:) @@`MyCustomUserProgram.exe - get-user-details@@
Changed line 77 from:
* ''N/A''
to:
* Single @@''username''\n@@
Changed line 80 from:
* @@''groupName''\n@@ for each group.
to:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.
Changed line 83 from:
(:cell:) TODO, TODO:(Triggered on "Import users from" query?)
to:
(:cell:) TODO
Changed line 86 from:
!!!! Get-User-Details
to:
!!!! Group-Member-Names
Changed line 89 from:
(:cell:) @@''[`CustomUserProgram]'' - get-user-details@@
to:
(:cell:) @@''[`CustomUserProgram]'' - group-member-names ''[groupName]''@@
Changed line 91 from:
(:cell:) @@`MyCustomUserProgram.exe - get-user-details@@
to:
(:cell:) @@`MyCustomUserProgram.exe - group-member-names "Engineering"@@
Changed line 94 from:
* Single @@''username''\n@@
to:
* ''N/A''
Changed line 97 from:
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.
to:
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
Changed line 103 from:
!!!! Group-Member-Names
to:
!!!! Group-Members
Changed line 106 from:
(:cell:) @@''[`CustomUserProgram]'' - group-member-names ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' - group-members ''[groupName]''@@
Changed line 108 from:
(:cell:) @@`MyCustomUserProgram.exe - group-member-names "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe - group-members "Engineering"@@
Changed line 120 from:
!!!! Group-Members
to:
!!!! Is-User-In-Group
Changed line 123 from:
(:cell:) @@''[`CustomUserProgram]'' - group-members ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' - is-user-in-group ''[groupName]'' ''[username]''@@
Changed line 125 from:
(:cell:) @@`MyCustomUserProgram.exe - group-members "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe - is-user-in-group "Engineering" "bobsmith"@@
Changed lines 131-132 from:
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
to:
* @@Y\n@@ when valid.
* Or; @@N\n@@ when invalid
.
Changed lines 138-139 from:
!!!! Is-User-In-Group
to:
!!! Custom auth program
Below is a table containing the different calls Papercut will make to a configured Custom auth program as well as the valid and expected inputs and output.
Deleted lines 141-144:
(:cell:) @@''[`CustomUserProgram]'' - is-user-in-group ''[groupName]'' ''[username]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomUserProgram.exe - is-user-in-group "Engineering" "bobsmith"@@
(:cellnr:) '''Standard-input'''
Changed lines 143-144 from:
* ''N/A''
(:cellnr:) '''Standard-output'''
to:
* @@''[`CustomAuthProgram]''@@
* Or; to enable debugging @@
''[`CustomAuthProgram]'' d@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomAuthProgram.exe@@
(:cellnr:) '''Standard-input
'''
Changed lines 149-151 from:
* @@Y\n@@ when valid.
* Or;
@@N\n@@ when invalid.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
to:
* @@''username''\n''plaintextPassword''@@
(:cellnr:) '''Standard-output'''
(:cell:)
*
@@OK\n@@ when authentication is successful.
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure. TODO
Changed line 155 from:
(:cell:) TODO
to:
(:cell:) Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)
Deleted lines 157-176:
!!! Custom auth program
Below is a table containing the different calls Papercut will make to a configured Custom auth program as well as the valid and expected inputs and output.
(:table:)
(:cell:) '''Program Call'''
(:cell:)
* @@''[`CustomAuthProgram]''@@
* Or; to enable debugging @@''[`CustomAuthProgram]'' d@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@`MyCustomAuthProgram.exe@@
(:cellnr:) '''Standard-input'''
(:cell:)
* @@''username''\n''plaintextPassword''@@
(:cellnr:) '''Standard-output'''
(:cell:)
* @@OK\n@@ when authentication is successful.
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)
(:tableend:)

August 23, 2012, at 07:45 AM by JLS - Modified Notes.
August 23, 2012, at 07:45 AM by JLS - Modified Notes.
Changed lines 177-178 from:
* TODO:(What happens when "Enable internal users" is disabled?)
to:
* TODO:(What happens when "Enable internal users" is disabled?)
* TODO:(Groups still must be added manually through "Add/Remove Groups"
?)
August 23, 2012, at 07:01 AM by JLS - Modified Notes.
Changed lines 176-177 from:
* TODO:(If "Delete users that do not exist in the selected source" is disabled, what happens if User is missing from selected source? Is account disabled?)
to:
* TODO:(If "Delete users that do not exist in the selected source" is disabled, what happens if User is missing from selected source? Is account disabled?)
* TODO:(What happens when "Enable internal users" is
disabled?)
August 23, 2012, at 06:31 AM by JLS - Modified Notes.
Changed lines 175-176 from:
* TODO:(`CardNumber is not shown in user details from "Test Settings". Is it being used?)
to:
* TODO:(`CardNumber is not shown in user details from "Test Settings". Is it being used?)
* TODO:(If "Delete users that do not exist in the selected source" is disabled, what happens if User is missing from selected source? Is account disabled
?)
August 23, 2012, at 06:23 AM by JLS - Modified Notes.
Changed lines 174-175 from:
* TODO:(What happens to @@[install-path]\server\data\conf\additional-groups.txt@@ during sync? Still used?)
* TODO:(CardNumber
is not shown in user details from "Test Settings". Is it being used?)
to:
* TODO:(What happens to @@[install-path]\server\data\conf\additional-groups.txt@@ during sync? Still used? Appears to be, merged with groups taken from custom program)
* TODO:(`CardNumber
is not shown in user details from "Test Settings". Is it being used?)
August 23, 2012, at 06:20 AM by JLS - Added TODO questions to be answered.
Changed lines 174-175 from:
* TODO:(What happens to @@[install-path]\server\data\conf\additional-groups.txt@@ during sync? Still used?)
to:
* TODO:(What happens to @@[install-path]\server\data\conf\additional-groups.txt@@ during sync? Still used?)
* TODO:(CardNumber is not shown in user details from "Test Settings". Is it being
used?)
August 23, 2012, at 06:17 AM by JLS - Added TODO questions to be answered.
Changed lines 172-174 from:
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)
to:
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)
* TODO:(What happens to "External User Lookup" feature for Cards? It is still used? Which takes precedence?)
* TODO:(What happens to @@[install-path]\server\data\conf\additional-groups.txt@@ during sync? Still used?
)
August 23, 2012, at 05:17 AM by JLS - Corrected Synchronisation Workflow
Deleted lines 164-166:
!!! Notes
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)

Added lines 166-167:
The following is the order each step occurs in during a synchronisation run.
# all-groups
Changed lines 169-172 from:
# all-groups
to:
TODO:(differs between "Test Settings", "Synchronise Now" and batch job overnight?)

!!! Notes
* The working
-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)
August 23, 2012, at 05:12 AM by JLS - Added Synchronisation Workflow (Based on "Test Settings" for sync)
Changed lines 166-170 from:
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)
to:
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@)

!!! Synchronisation Workflow
# all-users
# all-groups
August 23, 2012, at 03:28 AM by JLS - Changed command-line info and added working dir info
Changed line 28 from:
(:cell:) @@''[`CustomUserProgram]'' is-valid@@
to:
(:cell:) @@''[`CustomUserProgram]'' - is-valid@@
Changed line 30 from:
(:cell:) @@`MyCustomUserProgram.exe is-valid@@
to:
(:cell:) @@`MyCustomUserProgram.exe - is-valid@@
Changed line 45 from:
(:cell:) @@''[`CustomUserProgram]'' all-users@@
to:
(:cell:) @@''[`CustomUserProgram]'' - all-users@@
Changed line 47 from:
(:cell:) @@`MyCustomUserProgram.exe all-users@@
to:
(:cell:) @@`MyCustomUserProgram.exe - all-users@@
Changed line 62 from:
(:cell:) @@''[`CustomUserProgram]'' all-groups@@
to:
(:cell:) @@''[`CustomUserProgram]'' - all-groups@@
Changed line 64 from:
(:cell:) @@`MyCustomUserProgram.exe all-groups@@
to:
(:cell:) @@`MyCustomUserProgram.exe - all-groups@@
Changed line 79 from:
(:cell:) @@''[`CustomUserProgram]'' get-user-details@@
to:
(:cell:) @@''[`CustomUserProgram]'' - get-user-details@@
Changed line 81 from:
(:cell:) @@`MyCustomUserProgram.exe get-user-details@@
to:
(:cell:) @@`MyCustomUserProgram.exe - get-user-details@@
Changed line 96 from:
(:cell:) @@''[`CustomUserProgram]'' group-member-names ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' - group-member-names ''[groupName]''@@
Changed line 98 from:
(:cell:) @@`MyCustomUserProgram.exe group-member-names "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe - group-member-names "Engineering"@@
Changed line 113 from:
(:cell:) @@''[`CustomUserProgram]'' group-members ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' - group-members ''[groupName]''@@
Changed line 115 from:
(:cell:) @@`MyCustomUserProgram.exe group-members "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe - group-members "Engineering"@@
Changed line 130 from:
(:cell:) @@''[`CustomUserProgram]'' is-user-in-group ''[groupName]'' ''[username]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' - is-user-in-group ''[groupName]'' ''[username]''@@
Changed line 132 from:
(:cell:) @@`MyCustomUserProgram.exe is-user-in-group "Engineering" "bobsmith"@@
to:
(:cell:) @@`MyCustomUserProgram.exe - is-user-in-group "Engineering" "bobsmith"@@
Changed lines 163-166 from:
(:tableend:)
to:
(:tableend:)

!!! Notes
* The working-directory of the program(s) when called is @@[install-path]\server\@@ (Eg: @@C:\Program Files (x86)\PaperCut MF\server\@@
)
August 22, 2012, at 02:03 AM by JLS - New and updated information. Formatting correction.
Changed lines 36-37 from:
* @@Y\n@@ when valid.
* Or; @@N\n@@ when invalid
.
to:
* @@Y\n@@ when custom provider is functioning and valid.
* Or; @@N\n@@ when is not functioning and valid
.
Changed line 39 from:
(:cell:) This is called on application server start, or setting page access and is used to validate that the custom provider is functional and working as expected.  An example maybe to say check that the directory source is reachable.  Most custom implementations will simply return "Y".
to:
(:cell:) This is called on application server start, or setting page access and is used to validate that the custom provider is functional and working as expected.  An example maybe to say check that the directory source is reachable.  Most custom implementations will simply return @@Y\n@@.
Changed line 56 from:
(:cell:) The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually on system administrator instigated sync, or overnight as part of the automated sync.
to:
(:cell:) The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually using @@'''Synchronize Now'''@@ under the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab, or overnight as part of the automated sync.
Changed line 73 from:
(:cell:) TODO
to:
(:cell:) TODO, TODO:(Triggered on "Import users from" query?)
Changed line 33 from:
* ''N/A''
to:
''N/A''
Changed line 39 from:
(:cell:) TODO
to:
(:cell:) This is called on application server start, or setting page access and is used to validate that the custom provider is functional and working as expected.  An example maybe to say check that the directory source is reachable.  Most custom implementations will simply return "Y".
Changed line 50 from:
* ''N/A''
to:
''N/A''
Changed line 56 from:
(:cell:) TODO
to:
(:cell:) The command is called when PaperCut needs to list all system users.  For example during a full network wide group sync.  It many be called manually on system administrator instigated sync, or overnight as part of the automated sync.
Changed lines 6-7 from:
If one is lucky, the backend of such systems can be directly accessed or the software vendor provides utilities to allow for integration with external systems. This case study is a starting point to allow developers to integrate these custom and unique systems into Papercut.
to:
If one is lucky, the backend of such systems can be directly accessed or the software vendor provides utilities to allow for integration with external systems. This case study is a starting point to allow developers to integrate these custom and unique systems into PaperCut.
Changed lines 9-13 from:
Programs on the server can be specified in Papercut to import users and groups and another for authentication. Depending on the request, parameters are passed to the program via command line arguments and [[http://en.wikipedia.org/wiki/Stdin#Standard_input_.28stdin.29|standard-input]]. Information on data formats and triggers are available below. This allows developers to make utilities to bridge their system and Papercut together to the extent of user information and authentication.

!! Papercut Sync Source
To achieve the above, we rely on the [[https://www.papercut.com/products/ng/manual/ch-sys-mgmt-user-group-sync.html|Sync Source]] feature in Papercut, specifically, the @@Custom program@@ option.
to:
Programs on the server can be specified in PaperCut to import users and groups and another for authentication. Depending on the request, parameters are passed to the program via command line arguments and [[http://en.wikipedia.org/wiki/Stdin#Standard_input_.28stdin.29|standard-input]]. Information on data formats and triggers are available below. This allows developers to make utilities to bridge their system and Papercut together to the extent of user information and authentication.

!! PaperCut Sync Source
To achieve the above, we rely on the [[https://www.papercut.com/products/ng/manual/ch-sys-mgmt-user-group-sync.html|Sync Source]] feature in PaperCut, specifically, the @@Custom program@@ option.
Changed lines 23-24 from:
Below are the different calls Papercut will make to a configured Custom user program as well as the valid and expected inputs and output.
to:
Below are the different calls PaperCut will make to a configured custom user program as well as the valid and expected inputs and output.
Changed line 28 from:
(:cell:) @@''[customUserProgram]'' is-valid@@
to:
(:cell:) @@''[`CustomUserProgram]'' is-valid@@
Changed line 30 from:
(:cell:) @@PapercutCustomUserProgram.exe is-valid@@
to:
(:cell:) @@`MyCustomUserProgram.exe is-valid@@
Changed line 45 from:
(:cell:) @@''[customUserProgram]'' all-users@@
to:
(:cell:) @@''[`CustomUserProgram]'' all-users@@
Changed line 47 from:
(:cell:) @@PapercutCustomUserProgram.exe all-users@@
to:
(:cell:) @@`MyCustomUserProgram.exe all-users@@
Changed line 62 from:
(:cell:) @@''[customUserProgram]'' all-groups@@
to:
(:cell:) @@''[`CustomUserProgram]'' all-groups@@
Changed line 64 from:
(:cell:) @@PapercutCustomUserProgram.exe all-groups@@
to:
(:cell:) @@`MyCustomUserProgram.exe all-groups@@
Changed line 79 from:
(:cell:) @@''[customUserProgram]'' get-user-details@@
to:
(:cell:) @@''[`CustomUserProgram]'' get-user-details@@
Changed line 81 from:
(:cell:) @@PapercutCustomUserProgram.exe get-user-details@@
to:
(:cell:) @@`MyCustomUserProgram.exe get-user-details@@
Changed line 96 from:
(:cell:) @@''[customUserProgram]'' group-member-names ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' group-member-names ''[groupName]''@@
Changed line 98 from:
(:cell:) @@PapercutCustomUserProgram.exe group-member-names "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe group-member-names "Engineering"@@
Changed line 113 from:
(:cell:) @@''[customUserProgram]'' group-members ''[groupName]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' group-members ''[groupName]''@@
Changed line 115 from:
(:cell:) @@PapercutCustomUserProgram.exe group-members "Engineering"@@
to:
(:cell:) @@`MyCustomUserProgram.exe group-members "Engineering"@@
Changed line 130 from:
(:cell:) @@''[customUserProgram]'' is-user-in-group ''[groupName]'' ''[username]''@@
to:
(:cell:) @@''[`CustomUserProgram]'' is-user-in-group ''[groupName]'' ''[username]''@@
Changed line 132 from:
(:cell:) @@PapercutCustomUserProgram.exe is-user-in-group "Engineering" "bobsmith"@@
to:
(:cell:) @@`MyCustomUserProgram.exe is-user-in-group "Engineering" "bobsmith"@@
Changed lines 150-151 from:
* @@''[customAuthProgram]''@@
* Or; to enable debugging @@''[customAuthProgram]'' d@@
to:
* @@''[`CustomAuthProgram]''@@
* Or; to enable debugging @@''[`CustomAuthProgram]'' d@@
Changed line 153 from:
(:cell:) @@PapercutCustomAuthProgram.exe@@
to:
(:cell:) @@`MyCustomAuthProgram.exe@@
August 21, 2012, at 06:13 AM by JLS - Addition to overview and grammar correction.
Changed lines 4-5 from:
This is a case study of an operating environment revolves around a proprietary software system that is the primary handler of authentication and maintains and stores user records. Such systems can include proprietary industry-specific ERP and workflow systems that entire companies centralize around and can be difficult to interface with.
to:
This is a case study of an operating environment that revolves around a proprietary software system which is the primary handler of authentication and maintains and stores user records. Such systems can include proprietary industry-specific ERP and workflow systems that entire companies centralize around and can be difficult to interface with.
Changed lines 9-10 from:
Programs on the server can be specified in Papercut to import users and groups and another for authentication. Depending on the request, parameters are passed to the program via command line arguments and [[http://en.wikipedia.org/wiki/Stdin#Standard_input_.28stdin.29|standard-input]]. Information on data formats and triggers are available below.
to:
Programs on the server can be specified in Papercut to import users and groups and another for authentication. Depending on the request, parameters are passed to the program via command line arguments and [[http://en.wikipedia.org/wiki/Stdin#Standard_input_.28stdin.29|standard-input]]. Information on data formats and triggers are available below. This allows developers to make utilities to bridge their system and Papercut together to the extent of user information and authentication.
August 21, 2012, at 06:09 AM by JLS - Spelling (inc. american english spelling)
Changed lines 6-7 from:
If one is lucky, the backend of such systems can be directly accessed or the software vendor provides utilities to allow for integration with external systems. This case study is a starting point to allow developers to integrate this custom and unique systems into Papercut.
to:
If one is lucky, the backend of such systems can be directly accessed or the software vendor provides utilities to allow for integration with external systems. This case study is a starting point to allow developers to integrate these custom and unique systems into Papercut.
Changed lines 20-21 from:
Source code for an example program which utilises this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@.
to:
Source code for an example program which utilizes this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@.
August 21, 2012, at 06:03 AM by JLS - Initial Draft
Changed lines 3-5 from:
TODO page content here.

to:
!! Overview
This is a case study of an operating environment revolves around a proprietary software system that is the primary handler of authentication and maintains and stores user records. Such systems can include proprietary industry-specific ERP and workflow systems that entire companies centralize around and can be difficult to interface with.

If one is lucky, the backend of such systems can be directly accessed or the software vendor provides utilities to allow for integration with external systems. This case study is a starting point to allow developers to integrate this custom and unique systems into Papercut.

!!! Technical Overview
Programs on the server can be specified in Papercut to import users and groups and another for authentication. Depending on the request, parameters are passed to the program via command line arguments and [[http://en.wikipedia.org/wiki/Stdin#Standard_input_.28stdin.29|standard-input]]. Information on data formats and triggers are available below.

!! Papercut Sync Source
To achieve the above, we rely on the [[https://www.papercut.com/products/ng/manual/ch-sys-mgmt-user-group-sync.html|Sync Source]] feature in Papercut, specifically, the @@Custom program@@ option.

This can be accessed and enabled by doing the following:
# Navigate to the @@'''Options'''@@ → @@'''User/Group Sync'''@@ tab.
# The settings in the @@'''Sync Source'''@@ section defines where PaperCut imports users and groups from. Change the @@'''Primary sync source'''@@ to @@'''Custom program'''@@.
# Enter in the path to the program that enumerates user and group information in the field @@'''Custom user program'''@@.
# Enter in the path to the program that handles user authentication in the field @@'''Custom auth program'''@@.

Source code for an example program which utilises this feature is provided with the Papercut installation and can be found at @@[install-path]/server/bin/linux-i686/src/@@.

!!! Custom user program
Below are the different calls Papercut will make to a configured Custom user program as well as the valid and expected inputs and output.

!!!! Is-Valid
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' is-valid@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe is-valid@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@Y\n@@ when valid.
* Or; @@N\n@@ when invalid.
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! All-Users
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' all-users@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe all-users@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for each user.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! All-Groups
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' all-groups@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe all-groups@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@''groupName''\n@@ for each group.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! Get-User-Details
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' get-user-details@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe get-user-details@@
(:cellnr:) '''Standard-input'''
(:cell:)
* Single @@''username''\n@@
(:cellnr:) '''Standard-output'''
(:cell:)
* @@''username''\t''fullName''\t''emailAddress''\t''department''\t''office''\t''cardNumber''\n@@ for standard-input specified username.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! Group-Member-Names
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' group-member-names ''[groupName]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe group-member-names "Engineering"@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! Group-Members
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' group-members ''[groupName]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe group-members "Engineering"@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@''username''\t\t\n@@ for each username belonging to the group. TODO
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!!! Is-User-In-Group
(:table:)
(:cell:) '''Program Call'''
(:cell:) @@''[customUserProgram]'' is-user-in-group ''[groupName]'' ''[username]''@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomUserProgram.exe is-user-in-group "Engineering" "bobsmith"@@
(:cellnr:) '''Standard-input'''
(:cell:)
* ''N/A''
(:cellnr:) '''Standard-output'''
(:cell:)
* @@Y\n@@ when valid.
* Or; @@N\n@@ when invalid.
* Or; @@Error: ''[string]''@@ in the event of an error. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) TODO
(:tableend:)

!!! Custom auth program
Below is a table containing the different calls Papercut will make to a configured Custom auth program as well as the valid and expected inputs and output.
(:table:)
(:cell:) '''Program Call'''
(:cell:)
* @@''[customAuthProgram]''@@
* Or; to enable debugging @@''[customAuthProgram]'' d@@
(:cellnr:) '''Example Program Call'''
(:cell:) @@PapercutCustomAuthProgram.exe@@
(:cellnr:) '''Standard-input'''
(:cell:)
* @@''username''\n''plaintextPassword''@@
(:cellnr:) '''Standard-output'''
(:cell:)
* @@OK\n@@ when authentication is successful.
* Or; @@ERROR\n@@ in the event of an error, such as authentication failure. TODO
(:cellnr:) '''Trigger(s)'''
(:cell:) Program is called with provided standard-input only when authentication of a user is required. TODO:(Debug mode?)
(:tableend:)
Added lines 1-5:
(:title Case Study - Custom User Sync Integration:)

TODO page content here.

Comments

Share your findings and experience with other PaperCut users. Feel free to add comments and suggestions about this Knowledge Base article. Please don't use this for support requests.

Article last modified on August 23, 2019, at 05:02 PM
Printable View   |   Article History   |   Edit Article