Kbase P126837: Character solution for creating/maintaining audit policies
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  02/12/2008 |
|
Status: Verified
GOAL:
Character solution for creating/maintaining audit policies
GOAL:
TTY solution for creating/maintaining audit policies
GOAL:
UNIX solution for creating/maintaining audit policies
GOAL:
How can I create or maintain audit policies in a TTY environment?
GOAL:
Is there an Audit Policy Maintenance Tool (APMT) for UNIX?
GOAL:
How do I implement an auditing solution in a character UI?
FACT(s) (Environment):
All Supported Operating Systems
OpenEdge 10.x
UNIX
CAUSE:
The OpenEdge Release 10.1A Database introduced an internally supported Auditing framework along with Tools support that allow you to setup Audit Policies for Tables, Fields and Events. The tool that was created to support this is called the Audit Policy Maintenance Tool (APMT) and was only released for the Windows GUI environment.
Additional tools support was also added at that time which allows managing pre-constructed policies by allowing them to be imported and exported, as well as maintaining auditing security policies. For the Character world an API was published, with built in AppServer support, and documented with best practices on its use so that Database Managers can implement their own front-end in any technology they chose.
The following is an example of a rudimentary interface written in OpenEdge ABL, which will run in either a Windows or TTY environment and allows creation and maintenance of Audit Policies, Table Policies and Field Policies. This solution does not take into account custom event maintenance or event policy maintenance but should serve as a good example of how to create a user interface, using the published APMT API for maintaining audit policy data.
FIX:
&ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 Character
&ANALYZE-RESUME
&Scoped-define WINDOW-NAME C-Win
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS C-Win
/*------------------------------------------------------------------------
File:
Description:
Input Parameters:
<none>
Output Parameters:
<none>
Author:
Created:
------------------------------------------------------------------------*/
/* This .W file was created with the Progress AppBuilder. */
/*----------------------------------------------------------------------*/
/* Create an unnamed pool to store all the widgets created
by this procedure. This is a good default which assures
that this procedure's triggers and internal procedures
will execute in this procedure's storage, and that proper
cleanup will occur on deletion of the procedure. */
CREATE WIDGET-POOL.
/* *************************** Definitions ************************** */
/* Parameters Definitions --- */
/* Local Variable Definitions --- */
DEFINE VARIABLE ghAuditDset AS HANDLE NO-UNDO.
{src/auditing/include/_aud-utils.i}
/* Main frame update definitions - Local tt used because dynamic browsers are not
supported on TTY */
DEFINE TEMP-TABLE ttFilePolicy NO-UNDO
FIELD tcPolicyGuid AS CHARACTER
FIELD tcFileName AS CHARACTER LABEL "Table" FORMAT "x(25)"
FIELD tcCreateLevel AS CHARACTER LABEL "Create Level" FORMAT "x(10)"
FIELD tcUpdateLevel AS CHARACTER LABEL "Update Level" FORMAT "x(10)"
FIELD tcDeleteLevel AS CHARACTER LABEL "Delete Level" FORMAT "x(10)"
INDEX idxFile IS PRIMARY UNIQUE tcPolicyGuid tcFileName.
DEFINE TEMP-TABLE ttFieldPolicy NO-UNDO
FIELD tcPolicyGuid AS CHARACTER
FIELD tcFileName AS CHARACTER
FIELD tcFieldName AS CHARACTER LABEL "Field" FORMAT "x(25)"
FIELD tcCreateLevel AS CHARACTER LABEL "Create Level" FORMAT "x(10)"
FIELD tcUpdateLevel AS CHARACTER LABEL "Update Level" FORMAT "x(10)"
FIELD tcDeleteLevel AS CHARACTER LABEL "Delete Level" FORMAT "x(10)"
INDEX idxField IS PRIMARY UNIQUE tcPolicyGuid tcFileName tcFieldName.
DEFINE QUERY qFilePolicy FOR ttFilePolicy SCROLLING.
DEFINE QUERY qFieldPolicy FOR ttFieldPolicy SCROLLING.
DEFINE BROWSE bFilePolicy QUERY qFilePolicy
DISPLAY ttFilePolicy.tcFileName
. ttFilePolicy.tcCreateLevel
ttFilePolicy.tcUpdateLevel
ttFilePolicy.tcDeleteLevel
WITH 4 DOWN TITLE "File Policies" WIDTH 71.
DEFINE BROWSE bFieldPolicy QUERY qFieldPolicy
DISPLAY ttFieldPolicy.tcFieldName
ttFieldPolicy.tcCreateLevel
ttFieldPolicy.tcUpdateLevel
ttFieldPolicy.tcDeleteLevel
WITH 4 DOWN TITLE "Field Policies" WIDTH 71.
/* Policy Update Definitions */
DEFINE VARIABLE fiPolicyName AS CHARACTER NO-UNDO.
DEFINE VARIABLE fiPolicyDesc AS CHARACTER NO-UNDO.
DEFINE VARIABLE cbSecurityLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE rsCustomDetailLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE tbPolicyActive AS LOGICAL NO-UNDO.
DEFINE BUTTON btnOkName LABEL "OK" AUTO-GO.
DEFINE BUTTON btnCancelName LABEL "Cancel" AUTO-ENDKEY.
DEFINE FRAME updatePolicy SKIP(1)
fiPolicyName FORMAT "x(45)" COLON 26
LABEL "Audit policy name"
VIEW-AS FILL-IN SIZE 40 BY 1 SKIP(1)
fiPolicyDesc FORMAT "x(255)" COLON 26
LABEL "Audit policy description"
VIEW-AS EDITOR SIZE 40 BY 3 SKIP(1)
cbSecurityLevel FORMAT ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
COLON 26
VIEW-AS COMBO-BOX SIZE 40 BY 1 INNER-LINES 4
&nb.sp; LIST-ITEM-PAIRS "No Additional Security",0,
"Message Digest",1,
"DB Passkey", 2
LABEL "Data security level" SKIP(1)
rsCustomDetailLevel COLON 26
VIEW-AS RADIO-SET HORIZONTAL
RADIO-BUTTONS "Off",0,"On",1
LABEL "Audit custom detail level"
tbPolicyActive VIEW-AS TOGGLE-BOX LABEL "Policy active" SKIP(1)
btnOkName AT 25 btnCancelName
WITH OVERLAY TITLE "Audit Policy Details" SIDE-LABELS ROW 2 CENTERED.
/* File Policy Update Definitions */
DEFINE VARIABLE cbTableName AS CHARACTER NO-UNDO.
DEFINE VARIABLE gcFileNames AS CHARACTER NO-UNDO.
DEFINE VARIABLE cbFileCreateLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE fiCreateEventId AS INTEGER NO-UNDO INITIAL 5100.
DEFINE VARIABLE cbFileUpdateLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE fiUpdateEventId AS INTEGER NO-UNDO INITIAL 5101.
DEFINE VARIABLE cbFileDeleteLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE fiDeleteEventId AS INTEGER NO-UNDO INITIAL 5102.
DEFINE FRAME updateFile SKIP(1)
cbTableName FORMAT "x(45)" COLON 19
&nbs.p; VIEW-AS COMBO-BOX SIZE 40 BY 1
INNER-LINES 5
LABEL "Table Name" SKIP(1)
cbFileCreateLevel COLON 19 FORMAT ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 4
LIST-ITEM-PAIRS
"Do not audit this table (Off)",0,
"Audit table but do not store initial values (Min)",1,
"Audit table and store initial values (Std)",12
SIZE 52 BY 1 LABEL "Audit create level" SKIP
fiCreateEventId COLON 19 VIEW-AS FILL-IN SIZE 17 BY 1
LABEL "Create Event ID" SKIP(1)
cbFileUpdateLevel COLON 19 FORMAT ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 5
LIST-ITEM-PAIRS
&n.bsp; "Do not audit this table (Off)",0,
"Audit table but do not store old and new values (Min)",1,
"Audit table and store new values (Std)",12,
"Audit table and store old and new values (Full)",13
SIZE 52 BY 1 LABEL "Audit update level" SKIP
fiUpdateEventId COLON 19 VIEW-AS FILL-IN SIZE 17 BY 1
LABEL "Update Event ID" SKIP(1)
cbFileDeleteLevel COLON 19 FORMAT ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 4
LIST-ITEM-PAIRS
"Do not audit this table (Off)",0,
"Audit table but do not store deleted record (Min)",1,
"Audit table and store deleted record (Std)",12
 .; SIZE 52 BY 1 LABEL "Audit delete level" SKIP
fiDeleteEventId COLON 19 VIEW-AS FILL-IN SIZE 17 BY 1
LABEL "Delete Event ID" SKIP(1)
btnOkName AT 25 btnCancelName
WITH OVERLAY TITLE "File Policy Details" SIDE-LABELS ROW 2 CENTERED.
/* Field Policy Update Definitions */
DEFINE VARIABLE cbFieldName AS CHARACTER NO-UNDO.
DEFINE VARIABLE gcFieldNames AS CHARACTER NO-UNDO.
DEFINE VARIABLE cbFieldCreateLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE cbFieldUpdateLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE cbFieldDeleteLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE cbFieldReadLevel AS INTEGER NO-UNDO.
DEFINE VARIABLE fiIdentifyingField AS INTEGER NO-UNDO.
DEFINE VARIABLE tbIdentifyingField AS LOGICAL NO-UNDO.
DEFINE FRAME updateField SKIP(1)
cbFieldName FORMAT "x(45)" COLON 19
VIEW-AS COMBO-BOX SIZE 40 BY 1
INNER-LINES 5
LABEL "Field Name" SKIP(1)
cbFieldCreateLevel COLON 19 FORMAT "->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 5
LIST-ITEM-PAIRS
"Do not audit this field (Off)",-1,
&.nbsp; "Use the audit level set for the table (Use Table)",0,
"Do not audit this field's value (Min)",1,
"Audit this field's value (Std)",12
SIZE 52 BY 1 LABEL "Audit create level" SKIP
cbFieldUpdateLevel COLON 19 FORMAT "->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 5
LIST-ITEM-PAIRS
"Do not audit this field (Off)",-1,
"Use the audit level set for the table (Use Table)",0,
"Audit this field; do not record the field's value (Min)",1,
"Audit this field; record the updated field value (Std)",12,
"Audit this field; record old and updated field values(Full)",13
SIZE 52 BY 1 LABEL "Audit update level" SKIP
&n.bsp; cbFieldDeleteLevel COLON 19 FORMAT "->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 5
LIST-ITEM-PAIRS
"Do not audit this field (Off)",-1,
"Use the audit level set for the table (Use Table)",0,
"Do not audit this field's value (Min)",1,
"Audit this field's value (Std)",12
SIZE 52 BY 1 LABEL "Audit delete level" SKIP(1)
cbFieldReadLevel COLON 19 FORMAT ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
VIEW-AS COMBO-BOX INNER-LINES 4
LIST-ITEM-PAIRS "Use Table",0,
"Minimum Audit Data",1,
&nbs.p; "Standard Audit Data",2
SIZE 36 BY 1 LABEL "Audit read level" SKIP(1)
tbIdentifyingField COLON 19 VIEW-AS TOGGLE-BOX
LABEL "Identifying Field" SKIP
fiIdentifyingField COLON 40 VIEW-AS FILL-IN SIZE 4 BY 1
LABEL "Ordinal Position" SKIP(1)
btnOkName AT 25 btnCancelName
WITH OVERLAY TITLE "Field Policy Details" SIDE-LABELS ROW 2 CENTERED.
SESSION:DEBUG-ALERT = TRUE.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK
/* ******************** Preprocessor Definitions ******************** */
&Scoped-define PROCEDURE-TYPE Window
&Scoped-define DB-AWARE no
&Scoped-define LAYOUT-VARIABLE C-Win-layout
/* Name of designated FRAME-NAME and/or first browse and/or first query */
&Scoped-define FRAME-NAME DEFAULT-FRAME
/* Standard List Definitions */
&Scoped-Define ENABLED-OBJECTS cbDatabase cbPolicies btnAddPolicy ~
btnUpdatePolicy btnNewFilePolicy btnNewFieldPolicy btnSave btnDone
&Scoped-Define DISPLAYED-OBJECTS cbDatabase cbPolicies
/* Custom List Definitions */
/* List-1,List-2,List-3,List-4,List-5,List-6 */
/* _UIB-PREPROCESSOR-BLOCK-END */
&ANALYZE-RESUME
/* Define a variable to store the name of the active layout. */
DEFINE VAR C-Win-layout AS CHAR INITIAL "Master Layout":U NO-UNDO.
/* *********************** Control Definitions ********************** */
/* Define the widget handle for the window */
DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.
/* Definitions of the field level widgets &nbs.p; */
DEFINE BUTTON btnAddPolicy
LABEL "Add"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 6 BY 1
&ELSE SIZE 6 BY 1 &ENDIF.
DEFINE BUTTON btnDone
LABEL "Done"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 10 BY 1
&ELSE SIZE 10 BY 1 &ENDIF.
DEFINE BUTTON btnNewFieldPolicy
LABEL "New"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 8 BY 1
&ELSE SIZE 8 BY 1 &ENDIF.
DEFINE BUTTON btnNewFilePolicy
LABEL "New"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 8 BY 1
&ELSE SIZE 8 BY 1 &ENDIF.
DEFINE BUTTON btnSave
LABEL "Save Changes"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 15 BY 1
&ELSE SIZE 15 BY 1 &ENDIF.
DEFINE BUTTON btnUpdatePolicy
LABEL "Update"
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 8 BY 1
&ELSE SIZE 8 BY 1 &ENDIF.
DEFINE VARIABLE cbDatabase AS CHARACTER FORMAT "X(256)":U
LABEL "Databases"
VIEW-AS COMBO-BOX INNER-LINES 5
DROP-DOWN-LIST
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 38 BY 1
&ELSE SIZE 38 BY 1 &ENDIF NO-UNDO.
DEFINE VARIABLE cbPolicies AS CHARACTER FORMAT "X(256)":U
LABEL "Policies"
VIEW-AS COMBO-BOX INNER-LINES 5
DROP-DOWN-LIST
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN SIZE 38 BY 1
&ELSE SIZE 38 BY 1 &ENDIF NO-UNDO.
/* ************************ Frame Definitions *********************** */
DEFINE FRAME DEFAULT-FRAME
cbDatabase
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 1 COL 11 COLON-ALIGNED
&ELSE AT ROW 1 COL 11 COLON-ALIGNED &ENDIF WIDGET-ID 8
cbPolicies
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 3 COL 11 COLON-ALIGNED
&ELSE AT ROW 3 COL 11 COLON-ALIGNED &ENDIF WIDGET-ID 6
btnAddPolicy
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 3 COL 52
&ELSE AT ROW 3 COL 52 &ENDIF WIDGET-ID 10
btnUpdatePolicy
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 3 COL 59
&ELSE AT ROW 3 COL 59 &ENDIF
btnNewFilePolicy
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 8 COL 72
&ELSE AT ROW 8 COL 72 &ENDIF
btnNewFieldPolicy
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 16 COL 72
&ELSE A.T ROW 16 COL 72 &ENDIF
btnSave
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 21 COL 46
&ELSE AT ROW 21 COL 46 &ENDIF WIDGET-ID 2
btnDone
&IF '{&WINDOW-SYSTEM}' = 'TTY':U &THEN AT ROW 21 COL 62
&ELSE AT ROW 21 COL 62 &ENDIF
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 80 BY 21 WIDGET-ID 100.
/* *********************** Procedure Settings ************************ */
&ANALYZE-SUSPEND _PROCEDURE-SETTINGS
/* Settings for THIS-PROCEDURE
Type: Window
Allow: Basic,Browse,DB-Fields,Window,Query
Other Settings: COMPILE
*/
&ANALYZE-RESUME _END-PROCEDURE-SETTINGS
/* ************************* Create Window ************************** */
&ANALYZE-SUSPEND _CREATE-WINDOW
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "<insert window title>"
HEIGHT = 21.07
WIDTH = 79.86
MAX-HEIGHT = 21.07
MAX-WIDTH = 79.86
VIRTUAL-HEIGHT = 21.07
VIRTUAL-WIDTH = 79.86
RESIZE = yes
SCROLL-BARS = no
STATUS-AREA = no
BGCOLOR = ?
FGCOLOR = ?
KEEP-FRAME-Z-ORDER = yes
THREE-D = yes
MESSAGE-AREA = no
SENSITIVE = yes.
ELSE {&WINDOW-NAME} = CURRENT-WINDOW.
/* END WINDOW DEFINITION */
&ANALYZE-RESUME
/* *********** Runtime Attributes and AppBuilder Settings ********.*** */
&ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES
/* SETTINGS FOR WINDOW C-Win
VISIBLE,,RUN-PERSISTENT */
/* SETTINGS FOR FRAME DEFAULT-FRAME
FRAME-NAME */
/* _MULTI-LAYOUT-RUN-TIME-ADJUSTMENTS */
/* LAYOUT-NAME: "Standard Character"
LAYOUT-TYPE: CHARACTER
EXPRESSION: SESSION:DISPLAY-TYPE = 'TTY':U
COMMENT: This layout is the standard layout specification for
a customized Character based terminal. It is usually
selected to modify a window that has a GUI based
master layout.
*/
IF SESSION:DISPLAY-TYPE = 'TTY':U THEN
RUN C-Win-layouts (INPUT 'Standard Character':U) NO-ERROR.
/* LAYOUT-NAME: "winlayout"
LAYOUT-TYPE: GUI
EXPRESSION: FALSE
COMMENT:
*/
ELSE IF FALSE THEN
RUN C-Win-layouts (INPUT 'winlayout':U) NO-ERROR.
/* END-OF-LAYOUT-DEFINITIONS */
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.
/* _RUN-TIME-ATTRIBUTES-END */
&ANALYZE-RESUME
/* ************************ Control Triggers ************************ */
&Scoped-define SELF-NAME C-Win
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win
ON END-ERROR OF C-Win /* <insert window title> */
OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:
/* This case occurs when the user presses the "Esc" key.
In a persistently run window, just ignore this. If we did not, the
application would exit. */
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win
ON WINDOW-CLOSE OF C-Win /* <insert window title> */
DO:
/* This event will close the window and terminate the procedure. */
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE.-RESUME
&Scoped-define SELF-NAME btnAddPolicy
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnAddPolicy C-Win
ON CHOOSE OF btnAddPolicy IN FRAME DEFAULT-FRAME /* Add */
DO:
DEFINE VARIABLE lCancelled AS LOGICAL NO-UNDO.
ASSIGN fiPolicyName = ""
fiPolicyDesc = ""
cbSecurityLevel = 0
rsCustomDetailLevel = 0
tbPolicyActive = FALSE.
lCancelled = FALSE.
ON CHOOSE OF btnCancelName IN FRAME updatePolicy
lCancelled = TRUE.
UPDATE fiPolicyName fiPolicyDesc cbSecurityLevel rsCustomDetailLevel
tbPolicyActive btnOkName btnCancelName
WITH FRAME updatePolicy.
HIDE FRAME updatePolicy.
RUN localEnable.
IF lCancelled THEN
RETURN NO-APPLY.
RUN addNewPolicy ( INPUT fiPolicyName,
INPUT fiPolicyDesc,
INPUT cbSecurityLevel,
INPUT rsCustomDetailLevel,
INPUT tbPolicyActive,
INPUT cbPolicies:HANDLE IN FRAME {&FRAME-NAME} ).
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&Scoped-define SELF-NAME btnDone
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnDone C-Win
ON CHOOSE OF btnDone IN FRAME DEFAULT-FRAME /* Done */
DO:
APPLY "CLOSE" TO THIS-PROCEDURE.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&Scoped-define SELF-NAME btnNewFieldPolicy
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnNewFieldPolicy C-Win
ON CHOOSE OF btnNewFieldPolicy IN FRAME DEFAULT-FRAME /* New */
DO:
DEFINE VARIABLE hFieldBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE lCancelled AS LOGICAL NO-UNDO.
DEFINE VARIABLE rowNewPolicy AS ROWID NO-UNDO.
IF NOT AVAILABLE ttFilePolicy THEN
RETURN NO-APPLY.
hFieldBuffer = ghAuditDset::ttAuditFieldPolicy.
rowNewPolicy = ?.
ASSIGN cbFieldName:LIST-ITEMS IN FRAME updateField = gcFieldNames
cbFieldName = ""
cbFieldCreateLevel = 0
cbFieldUpdateLevel = 0
cbFieldDeleteLevel  .; = 0
cbFieldReadLevel = 0
fiIdentifyingField = 0
tbIdentifyingField = FALSE.
ON CHOOSE OF btnCancelName IN FRAME updateField
lCancelled = TRUE.
ON VALUE-CHANGED OF tbIdentifyingField IN FRAME updateField DO:
fiIdentifyingField:SENSITIVE IN FRAME updateField = (SELF:CHECKED).
fiIdentifyingField:SCREEN-VALUE = '0'.
END.
UPDATE cbFieldName cbFieldCreateLevel cbFieldUpdateLevel cbFieldDeleteLevel
cbFieldReadLevel tbIdentifyingField fiIdentifyingField WHEN tbIdentifyingField
btnOkName btnCancelName
WITH FRAME updateField.
ASSIGN fiIdentifyingField.
HIDE FRAME updateField.
RUN localEnable.
IF lCancelled THEN
RETURN NO-APPLY.
RUN addFieldPolicy ( INPUT ttFilePolicy.tcPolicyGuid,
INPUT ttFilePolicy.tcFileName,
INPUT cbFieldName,
INPUT cbFieldCreateLevel,
INPUT cbFieldUpdateLevel,
INPUT cbFieldDeleteLevel,
INPUT cbFieldReadLevel,
INPUT fiIdentifyingField,
OUTPUT rowNewPolicy ).
OPEN QUERY qFieldPolicy FOR EACH ttFieldPolicy NO-LOCK
WHERE ttFieldPolicy.tcPolicyGuid EQ ttFilePolicy.tcPolicyGuid AND
ttFieldPolicy.tcFileName EQ ttFilePolicy.tcFileName.
IF rowNewPolicy NE ? THEN
REPOSITION qFieldPolicy TO ROWID rowNewPolicy.
APPLY "VALUE-CHANGED" TO BROWSE bFieldPolicy.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&Scoped-define SELF-NAME btnNewFilePolicy
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnNewFilePolicy C-Win
ON CHOOSE OF btnNewF.ilePolicy IN FRAME DEFAULT-FRAME /* New */
DO:
DEFINE VARIABLE hFileBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE lCancelled AS LOGICAL NO-UNDO.
DEFINE VARIABLE rowNewPolicy AS ROWID NO-UNDO.
hFileBuffer = ghAuditDset::ttAuditFilePolicy.
ASSIGN cbTableName:LIST-ITEMS IN FRAME updateFile = gcFileNames
cbTableName = ""
cbFileCreateLevel = 0
fiCreateEventId = 5100
cbFileUpdateLevel = 0
fiUpdateEventId = 5101
cbFileDeleteLevel = 0
fiDeleteEventId = 5102.
ON CHOOSE OF btnCancelName IN FRAME updateFile
lCancelled = TRUE.
UPDATE cbTableName cbFileCreateLevel fiCreateEventId cbFileUpdateLevel
fiUpdateEventId cbFileDeleteLevel fiDeleteEventId
btnOkName btnCancelName
WITH FRAME updateFile.
HIDE FRAME updateFile.
RUN localEnable.
IF lCancelled THEN
RETURN NO-APPLY.
RUN addFilePolicy ( INPUT cbPolicies:SCREEN-VALUE IN FRAME {&FRAME-NAME},
INPUT cbTableName,
INPUT cbFileCreateLevel,
INPUT fiCreateEventId,
INPUT cbFileUpdateLevel,
INPUT fiUpdateEventId,
INPUT cbFileDeleteLevel,
INPUT fiDeleteEventId,
OUTPUT rowNewPolicy ).
&.nbsp; OPEN QUERY qFilePolicy FOR EACH ttFilePolicy NO-LOCK
WHERE ttFilePolicy.tcPolicyGuid EQ
cbPolicies:SCREEN-VALUE IN FRAME {&FRAME-NAME}.
IF rowNewPolicy NE ? THEN
REPOSITION qFilePolicy TO ROWID rowNewPolicy.
APPLY "VALUE-CHANGED" TO BROWSE bFilePolicy.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&Scoped-define SELF-NAME btnSave
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnSave C-Win
ON CHOOSE OF btnSave IN FRAME DEFAULT-FRAME /* Save Changes */
DO:
RUN writeChanges.
END.
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
&Scoped-define SELF-NAME btnUpdatePolicy
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL btnUpdatePolicy C-Win
ON CHOOSE OF btnUpdatePolicy IN FRAME DEFAULT-FRAME /* Update */
DO:
DEFINE VARIABLE hPolicyBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE lCancelled AS LOGICAL NO-UNDO.
hPolicyBuffer = ghAuditDset::ttAuditPolicy.
hPolicyBuffer:FIND-FIRST("WHERE " + hPolicyBuffer:NAME +
"._audit-policy-guid EQ ~'" +
cbPolicies:SCREEN-VALUE + "~'",
NO-LOCK) NO-ERROR.
IF NOT hPolicyBuffer:AVAILABLE THEN
RETURN NO-APPLY.
ASSIGN fiPolicyName = hPolicyBuffer::_audit-policy-name
fiPolicyDesc = hPolicyBuffer::_audit-policy-description
cbSecurityLevel = hPolicyBuffer::_audit-data-security-level
rsCustomDetailLevel = hPolicyBuffer::_audit-custom-detail-level
tbPolicyActive = hPolicyBuffer::_audit-policy-active.
ON CHOOSE OF btnCancelName IN FRAME updatePolicy
lCancelled = TRUE.
lCancelled = FALSE.
UPDATE fiPolicyName fiPolicyDesc cbSecurityLevel rsCustomDetailLevel
tbPolicyActive btnOkName btnCancelName
WITH FRAME updatePolicy.
HIDE FRAME updatePolicy.
RUN localEnable.
IF lCancelled THEN
RETURN NO-APPLY.
RUN updatePolicy ( INPUT cbPolicies:SCREEN-VALUE,
INPUT fiPolicyName,
INPUT fiPolicyDesc,
INPUT cbSecurityLevel,
INPU.