| [453] | 1 | { **************************************************************
 | 
|---|
 | 2 |         Package: XWB - Kernel RPCBroker
 | 
|---|
 | 3 |         Date Created: Sept 18, 1997 (Version 1.1)
 | 
|---|
 | 4 |         Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
 | 
|---|
 | 5 |         Developers: Danila Manapsal, Don Craven, Joel Ivey
 | 
|---|
 | 6 |         Description: Contains TRPCBroker and related components.
 | 
|---|
 | 7 |         Current Release: Version 1.1 Patch 40 (January 7, 2005)
 | 
|---|
 | 8 | *************************************************************** }
 | 
|---|
 | 9 | 
 | 
|---|
 | 10 | {**************************************************
 | 
|---|
 | 11 | This is the hierarchy of things:
 | 
|---|
 | 12 |    TRPCBroker contains
 | 
|---|
 | 13 |       TParams, which contains
 | 
|---|
 | 14 |          array of TParamRecord each of which contains
 | 
|---|
 | 15 |                   TMult
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | v1.1*4 Silent Login changes (DCM) 10/22/98
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | 1.1*6 Polling to support terminating arphaned server jobs. (P6)
 | 
|---|
 | 20 |       == DPC 4/99
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 | 1.1*8 Check for Multi-Division users. (P8) - REM 7/13/99
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | 1.1*13 More silent login code; deleted obsolete lines (DCM) 9/10/99  // p13
 | 
|---|
 | 25 | LAST UPDATED: 5/24/2001   // p13  JLI
 | 
|---|
 | 26 | 
 | 
|---|
 | 27 | 1.1*31 Added new read only property BrokerVersion to TRPCBroker which
 | 
|---|
 | 28 |        should contain the version number for the RPCBroker
 | 
|---|
 | 29 |        (or SharedRPCBroker) in use.
 | 
|---|
 | 30 | **************************************************}
 | 
|---|
 | 31 | unit CCOWRPCBroker;
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | interface
 | 
|---|
 | 34 | 
 | 
|---|
 | 35 | {$I IISBase.inc}
 | 
|---|
 | 36 | 
 | 
|---|
 | 37 | uses
 | 
|---|
 | 38 |   {Delphi standard}
 | 
|---|
 | 39 |   Classes, Controls, Dialogs, {DsgnIntf,} Forms, Graphics, Messages, SysUtils,
 | 
|---|
 | 40 |   WinProcs, WinTypes, Windows,
 | 
|---|
 | 41 |   extctrls, {P6}
 | 
|---|
 | 42 |   {VA}
 | 
|---|
 | 43 |   XWBut1, {RpcbEdtr,} MFunStr, Hash,
 | 
|---|
 | 44 |   ComObj, ActiveX, OleCtrls, trpcb,
 | 
|---|
 | 45 |     VERGENCECONTEXTORLib_TLB;
 | 
|---|
 | 46 | 
 | 
|---|
 | 47 | const
 | 
|---|
 | 48 |   NoMore: boolean = False;
 | 
|---|
 | 49 |   MIN_RPCTIMELIMIT: integer = 30;
 | 
|---|
 | 50 |   CURRENT_RPC_VERSION: String = 'XWB*1.1*36T1';
 | 
|---|
 | 51 | 
 | 
|---|
 | 52 | type
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 | TCCOWRPCBroker = class(TRPCBroker)
 | 
|---|
 | 55 | private
 | 
|---|
 | 56 | protected
 | 
|---|
 | 57 |   FCCOWLogonIDName: String;
 | 
|---|
 | 58 |   FCCOWLogonIDValue: String;
 | 
|---|
 | 59 |   FCCOWLogonName: String;
 | 
|---|
 | 60 |   FCCOWLogonNameValue: String;
 | 
|---|
 | 61 |   FContextor: TContextorControl;  //CCOW
 | 
|---|
 | 62 |   FCCOWtoken: string;              //CCOW
 | 
|---|
 | 63 |   FVistaDomain: String;
 | 
|---|
 | 64 |   FCCOWLogonVpid: String;
 | 
|---|
 | 65 |   FCCOWLogonVpidValue: String;
 | 
|---|
 | 66 |   FWasUserDefined: Boolean;
 | 
|---|
 | 67 |   procedure   SetConnected(Value: Boolean); override;
 | 
|---|
 | 68 |   function  GetCCOWHandle(ConnectedBroker: TCCOWRPCBroker): string;
 | 
|---|
 | 69 |   procedure CCOWsetUser(Uname, token, Domain, Vpid: string; Contextor:
 | 
|---|
 | 70 |     TContextorControl);
 | 
|---|
 | 71 |   function  GetCCOWduz( Contextor: TContextorControl): string;
 | 
|---|
 | 72 | public
 | 
|---|
 | 73 |   function GetCCOWtoken(Contextor: TContextorControl): string;
 | 
|---|
 | 74 |   function IsUserCleared: Boolean;
 | 
|---|
 | 75 |   function WasUserDefined: Boolean;
 | 
|---|
 | 76 |   function IsUserContextPending(aContextItemCollection: IContextItemCollection):
 | 
|---|
 | 77 |       Boolean;
 | 
|---|
 | 78 |   property   Contextor: TContextorControl
 | 
|---|
 | 79 |                           read Fcontextor write FContextor;  //CCOW
 | 
|---|
 | 80 |   property CCOWLogonIDName: String read FCCOWLogonIDName;
 | 
|---|
 | 81 |   property CCOWLogonIDValue: String read FCCOWLogonIDValue;
 | 
|---|
 | 82 |   property CCOWLogonName: String read FCCOWLogonName;
 | 
|---|
 | 83 |   property CCOWLogonNameValue: String read FCCOWLogonNameValue;
 | 
|---|
 | 84 |   property CCOWLogonVpid: String read FCCOWLogonVpid;
 | 
|---|
 | 85 |   property CCOWLogonVpidValue: String read FCCOWLogonVpidValue;
 | 
|---|
 | 86 | published
 | 
|---|
 | 87 |   property    Connected: boolean read FConnected write SetConnected;
 | 
|---|
 | 88 |  end;
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | procedure AuthenticateUser(ConnectingBroker: TCCOWRPCBroker);
 | 
|---|
 | 91 | 
 | 
|---|
 | 92 | implementation
 | 
|---|
 | 93 | 
 | 
|---|
 | 94 | uses
 | 
|---|
 | 95 |   Loginfrm, RpcbErr, WSockc, SelDiv{p8}, RpcSLogin{p13}, fRPCBErrMsg,
 | 
|---|
 | 96 |   CCOW_const;
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | var
 | 
|---|
 | 99 |   CCOWToken: String;
 | 
|---|
 | 100 |   Domain: String;
 | 
|---|
 | 101 |   PassCode1: String;
 | 
|---|
 | 102 |   PassCode2: String;
 | 
|---|
 | 103 | 
 | 
|---|
 | 104 | 
 | 
|---|
 | 105 | {--------------------- TCCOWRPCBroker.SetConnected --------------------
 | 
|---|
 | 106 | ------------------------------------------------------------------}
 | 
|---|
 | 107 | procedure TCCOWRPCBroker.SetConnected(Value: Boolean);
 | 
|---|
 | 108 | var
 | 
|---|
 | 109 |   BrokerDir, Str1, Str2, Str3 :string;
 | 
|---|
 | 110 |   RPCBContextor: TContextorControl;
 | 
|---|
 | 111 | begin
 | 
|---|
 | 112 |   RPCBError := '';
 | 
|---|
 | 113 |   Login.ErrorText := '';
 | 
|---|
 | 114 |   if (Connected <> Value) and not(csReading in ComponentState) then begin
 | 
|---|
 | 115 |     if Value and (FConnecting <> Value) then begin                 {connect}
 | 
|---|
 | 116 |       FSocket := ExistingSocket(Self);
 | 
|---|
 | 117 |       FConnecting := True; // FConnected := True;
 | 
|---|
 | 118 |       try
 | 
|---|
 | 119 |         if FSocket = 0  then
 | 
|---|
 | 120 |         begin
 | 
|---|
 | 121 |           {Execute Client Agent from directory in Registry.}
 | 
|---|
 | 122 |           BrokerDir := ReadRegData(HKLM, REG_BROKER, 'BrokerDr');
 | 
|---|
 | 123 |           if BrokerDir <> '' then
 | 
|---|
 | 124 |             ProcessExecute(BrokerDir + '\ClAgent.Exe', sw_ShowNoActivate)
 | 
|---|
 | 125 |           else
 | 
|---|
 | 126 |             ProcessExecute('ClAgent.Exe', sw_ShowNoActivate);
 | 
|---|
 | 127 |           if DebugMode and (not OldConnectionOnly) then
 | 
|---|
 | 128 |           begin
 | 
|---|
 | 129 |             Str1 := 'Control of debugging FOR UCX OR NON-CALLBACK CONNECTIONS has been moved from the client to the server. To start a Debug session, do the following:'+#13#10#13#10;
 | 
|---|
 | 130 |             Str2 := '1. On the server, set initial breakpoints where desired.'+#13#10+'2. DO DEBUG^XWBTCPM.'+#13#10+'3. Enter a unique Listener port number (i.e., a port number not in general use).'+#13#10;
 | 
|---|
 | 131 |             Str3 := '4. Connect the client application using the port number entered in Step #3.';
 | 
|---|
 | 132 |             ShowMessage(Str1 + Str2 + Str3);
 | 
|---|
 | 133 |           end;
 | 
|---|
 | 134 |           TXWBWinsock(XWBWinsock).IsBackwardsCompatible := IsBackwardCompatibleConnection;
 | 
|---|
 | 135 |           TXWBWinsock(XWBWinsock).OldConnectionOnly := OldConnectionOnly;
 | 
|---|
 | 136 |           FSocket := TXWBWinsock(XWBWinsock).NetworkConnect(DebugMode, FServer,
 | 
|---|
 | 137 |                                     ListenerPort, FRPCTimeLimit);
 | 
|---|
 | 138 |           AuthenticateUser(Self);
 | 
|---|
 | 139 |           StoreConnection(Self);  //MUST store connection before CreateContext()
 | 
|---|
 | 140 |           //CCOW start
 | 
|---|
 | 141 |           if (FContextor <> nil) and (length(CCOWtoken) = 0) then
 | 
|---|
 | 142 |           begin
 | 
|---|
 | 143 |           //Get new CCOW token
 | 
|---|
 | 144 |             CCOWToken := GetCCOWHandle(Self);
 | 
|---|
 | 145 |             if Length(CCOWToken) > 0 then
 | 
|---|
 | 146 |             begin
 | 
|---|
 | 147 |               try
 | 
|---|
 | 148 |                 RPCBContextor := TContextorControl.Create(Application);
 | 
|---|
 | 149 |                 RPCBContextor.Run('BrokerLoginModule#', PassCode1+PassCode2, TRUE, '*');
 | 
|---|
 | 150 |                 CCOWsetUser(user.name, CCOWToken, Domain, user.Vpid, RPCBContextor);  //Clear token
 | 
|---|
 | 151 |                 FCCOWLogonIDName := CCOW_LOGON_ID;
 | 
|---|
 | 152 |                 FCCOWLogonIdValue := Domain;
 | 
|---|
 | 153 |                 FCCOWLogonName := CCOW_LOGON_NAME;
 | 
|---|
 | 154 |                 FCCOWLogonNameValue := user.name;
 | 
|---|
 | 155 |                 if user.name <> '' then
 | 
|---|
 | 156 |                   FWasUserDefined := True;
 | 
|---|
 | 157 |                 FCCOWLogonVpid := CCOW_LOGON_VPID;
 | 
|---|
 | 158 |                 FCCOWLogonVpidValue := user.Vpid;
 | 
|---|
 | 159 |                 RPCBContextor.Free;
 | 
|---|
 | 160 |                 RPCBContextor := nil;
 | 
|---|
 | 161 |               except
 | 
|---|
 | 162 |                 ShowMessage('Problem with Contextor.Run');
 | 
|---|
 | 163 |                 FreeAndNil(RPCBContextor);
 | 
|---|
 | 164 |               end;
 | 
|---|
 | 165 |             end;   // if Length(CCOWToken) > 0
 | 
|---|
 | 166 |           end;  //if
 | 
|---|
 | 167 |           //CCOW end
 | 
|---|
 | 168 |           FPulse.Enabled := True; //P6 Start heartbeat.
 | 
|---|
 | 169 |           CreateContext('');      //Closes XUS SIGNON context.
 | 
|---|
 | 170 |         end
 | 
|---|
 | 171 |         else
 | 
|---|
 | 172 |         begin                     //p13
 | 
|---|
 | 173 |           StoreConnection(Self);
 | 
|---|
 | 174 |           FPulse.Enabled := True; //p13
 | 
|---|
 | 175 |         end;                      //p13
 | 
|---|
 | 176 |         FConnected := True;         // jli mod 12/17/01
 | 
|---|
 | 177 |         FConnecting := False;
 | 
|---|
 | 178 |       except
 | 
|---|
 | 179 |         on E: EBrokerError do begin
 | 
|---|
 | 180 |           if E.Code = XWB_BadSignOn then
 | 
|---|
 | 181 |             TXWBWinsock(XWBWinsock).NetworkDisconnect(FSocket);
 | 
|---|
 | 182 |           FSocket := 0;
 | 
|---|
 | 183 |           FConnected := False;
 | 
|---|
 | 184 |           FConnecting := False;
 | 
|---|
 | 185 |           FRPCBError := E.Message;               // p13  handle errors as specified
 | 
|---|
 | 186 |           if Login.ErrorText <> '' then
 | 
|---|
 | 187 |             FRPCBError := E.Message + chr(10) + Login.ErrorText;
 | 
|---|
 | 188 |           if Assigned(FOnRPCBFailure) then       // p13
 | 
|---|
 | 189 |             FOnRPCBFailure(Self)                 // p13
 | 
|---|
 | 190 |           else if ShowErrorMsgs = semRaise then
 | 
|---|
 | 191 |             Raise;                               // p13
 | 
|---|
 | 192 | //          raise;   {this is where I would do OnNetError}
 | 
|---|
 | 193 |         end{on};
 | 
|---|
 | 194 |       end{try};
 | 
|---|
 | 195 |     end{if}
 | 
|---|
 | 196 |     else if not Value then
 | 
|---|
 | 197 |     begin                           //p13
 | 
|---|
 | 198 |       FConnected := False;          //p13
 | 
|---|
 | 199 |       FPulse.Enabled := False;      //p13
 | 
|---|
 | 200 |       if RemoveConnection(Self) = NoMore then begin
 | 
|---|
 | 201 |         {FPulse.Enabled := False;  ///P6;p13 }
 | 
|---|
 | 202 |         TXWBWinsock(XWBWinsock).NetworkDisconnect(Socket);   {actually disconnect from server}
 | 
|---|
 | 203 |         FSocket := 0;                {store internal}
 | 
|---|
 | 204 |         //FConnected := False;      //p13
 | 
|---|
 | 205 |       end{if};
 | 
|---|
 | 206 |     end; {else}
 | 
|---|
 | 207 |   end{if};
 | 
|---|
 | 208 | end;
 | 
|---|
 | 209 | 
 | 
|---|
 | 210 | function TCCOWRPCBroker.WasUserDefined: Boolean;
 | 
|---|
 | 211 | begin
 | 
|---|
 | 212 |   Result := FWasUserDefined;
 | 
|---|
 | 213 | end;
 | 
|---|
 | 214 | 
 | 
|---|
 | 215 | function TCCOWRPCBroker.IsUserCleared: Boolean;
 | 
|---|
 | 216 | var
 | 
|---|
 | 217 |   CCOWcontextItem: IContextItemCollection;      //CCOW
 | 
|---|
 | 218 |   CCOWdataItem1: IContextItem;                  //CCOW
 | 
|---|
 | 219 |   Name: String;
 | 
|---|
 | 220 | begin
 | 
|---|
 | 221 |   Result := False;
 | 
|---|
 | 222 |   Name := CCOW_LOGON_ID;
 | 
|---|
 | 223 |   if (Contextor <> nil) then
 | 
|---|
 | 224 |   try
 | 
|---|
 | 225 |     //See if context contains the ID item
 | 
|---|
 | 226 |     CCOWcontextItem := Contextor.CurrentContext;
 | 
|---|
 | 227 |     CCOWDataItem1 := CCowContextItem.Present(Name);
 | 
|---|
 | 228 |     if (CCOWdataItem1 <> nil) then    //1
 | 
|---|
 | 229 |     begin
 | 
|---|
 | 230 |       If CCOWdataItem1.Value = '' then
 | 
|---|
 | 231 |         Result := True
 | 
|---|
 | 232 |       else
 | 
|---|
 | 233 |         FWasUserDefined := True;
 | 
|---|
 | 234 |     end
 | 
|---|
 | 235 |     else
 | 
|---|
 | 236 |       Result := True;
 | 
|---|
 | 237 |   finally
 | 
|---|
 | 238 |   end; //try
 | 
|---|
 | 239 | end;
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 | {------------------------ AuthenticateUser ------------------------
 | 
|---|
 | 242 | ------------------------------------------------------------------}
 | 
|---|
 | 243 | procedure AuthenticateUser(ConnectingBroker: TCCOWRPCBroker);
 | 
|---|
 | 244 | var
 | 
|---|
 | 245 |   SaveClearParmeters, SaveClearResults: boolean;
 | 
|---|
 | 246 |   SaveParam: TParams;
 | 
|---|
 | 247 |   SaveRemoteProcedure, SaveRpcVersion: string;
 | 
|---|
 | 248 |   SaveResults: TStrings;
 | 
|---|
 | 249 |   blnSignedOn: boolean;
 | 
|---|
 | 250 |   SaveKernelLogin: boolean;
 | 
|---|
 | 251 |   SaveVistaLogin: TVistaLogin;
 | 
|---|
 | 252 |   OldExceptionHandler: TExceptionEvent;
 | 
|---|
 | 253 |   OldHandle: THandle;
 | 
|---|
 | 254 | begin
 | 
|---|
 | 255 |   With ConnectingBroker do
 | 
|---|
 | 256 |   begin
 | 
|---|
 | 257 |     SaveParam := TParams.Create(nil);
 | 
|---|
 | 258 |     SaveParam.Assign(Param);                  //save off settings
 | 
|---|
 | 259 |     SaveRemoteProcedure := RemoteProcedure;
 | 
|---|
 | 260 |     SaveRpcVersion := RpcVersion;
 | 
|---|
 | 261 |     SaveResults := Results;
 | 
|---|
 | 262 |     SaveClearParmeters := ClearParameters;
 | 
|---|
 | 263 |     SaveClearResults := ClearResults;
 | 
|---|
 | 264 |     ClearParameters := True;                  //set'em as I need'em
 | 
|---|
 | 265 |     ClearResults := True;
 | 
|---|
 | 266 |     SaveKernelLogin := KernelLogin;     //  p13
 | 
|---|
 | 267 |     SaveVistaLogin := Login;            //  p13
 | 
|---|
 | 268 |   end;
 | 
|---|
 | 269 | 
 | 
|---|
 | 270 |   blnSignedOn := False;                       //initialize to bad sign-on
 | 
|---|
 | 271 |   
 | 
|---|
 | 272 |   if ConnectingBroker.AccessVerifyCodes <> '' then   // p13 handle as AVCode single signon
 | 
|---|
 | 273 |   begin
 | 
|---|
 | 274 |     ConnectingBroker.Login.AccessCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 1);
 | 
|---|
 | 275 |     ConnectingBroker.Login.VerifyCode := Piece(ConnectingBroker.AccessVerifyCodes, ';', 2);
 | 
|---|
 | 276 |     ConnectingBroker.Login.Mode := lmAVCodes;
 | 
|---|
 | 277 |     ConnectingBroker.KernelLogIn := False;
 | 
|---|
 | 278 |   end;
 | 
|---|
 | 279 | 
 | 
|---|
 | 280 |     //CCOW start
 | 
|---|
 | 281 |     if ConnectingBroker.KernelLogIn and (not (ConnectingBroker.Contextor = nil)) then
 | 
|---|
 | 282 |     begin
 | 
|---|
 | 283 |       CCOWtoken := ConnectingBroker.GetCCOWtoken(ConnectingBroker.Contextor);
 | 
|---|
 | 284 |       if length(CCOWtoken)>0 then
 | 
|---|
 | 285 |         begin
 | 
|---|
 | 286 |           ConnectingBroker.FKernelLogIn := false;
 | 
|---|
 | 287 |           ConnectingBroker.Login.Mode := lmAppHandle;
 | 
|---|
 | 288 |           ConnectingBroker.Login.LogInHandle := CCOWtoken;
 | 
|---|
 | 289 |         end;
 | 
|---|
 | 290 |      end;
 | 
|---|
 | 291 |      //CCOW end
 | 
|---|
 | 292 |    //CCOW Start                                // p13  following section for silent signon
 | 
|---|
 | 293 |   if not ConnectingBroker.FKernelLogIn then
 | 
|---|
 | 294 |     if ConnectingBroker.FLogin <> nil then     //the user.  vistalogin contains login info
 | 
|---|
 | 295 |     begin
 | 
|---|
 | 296 |       blnsignedon := SilentLogin(ConnectingBroker);    // RpcSLogin unit
 | 
|---|
 | 297 |       if not blnSignedOn then
 | 
|---|
 | 298 |       begin     //Switch back to Kernel Login
 | 
|---|
 | 299 |         ConnectingBroker.FKernelLogIn := true;
 | 
|---|
 | 300 |         ConnectingBroker.Login.Mode := lmAVCodes;
 | 
|---|
 | 301 |       end;
 | 
|---|
 | 302 |     end;
 | 
|---|
 | 303 |    //CCOW end
 | 
|---|
 | 304 | 
 | 
|---|
 | 305 |   if ConnectingBroker.FKernelLogIn then
 | 
|---|
 | 306 |   begin   //p13
 | 
|---|
 | 307 |     if Assigned(Application.OnException) then
 | 
|---|
 | 308 |       OldExceptionHandler := Application.OnException
 | 
|---|
 | 309 |     else
 | 
|---|
 | 310 |       OldExceptionHandler := nil;
 | 
|---|
 | 311 |     Application.OnException := TfrmErrMsg.RPCBShowException;
 | 
|---|
 | 312 |     frmSignon := TfrmSignon.Create(Application);
 | 
|---|
 | 313 |     try
 | 
|---|
 | 314 | 
 | 
|---|
 | 315 |   //    ShowApplicationAndFocusOK(Application);
 | 
|---|
 | 316 |       OldHandle := GetForegroundWindow;
 | 
|---|
 | 317 |       SetForegroundWindow(frmSignon.Handle);
 | 
|---|
 | 318 |       PrepareSignonForm(ConnectingBroker);
 | 
|---|
 | 319 |       if SetUpSignOn then                       //SetUpSignOn in loginfrm unit.
 | 
|---|
 | 320 |       begin                                     //True if signon needed
 | 
|---|
 | 321 | 
 | 
|---|
 | 322 |         if frmSignOn.lblServer.Caption <> '' then
 | 
|---|
 | 323 |         begin
 | 
|---|
 | 324 |           frmSignOn.ShowModal;                    //do interactive logon   // p13
 | 
|---|
 | 325 |           if frmSignOn.Tag = 1 then               //Tag=1 for good logon
 | 
|---|
 | 326 |             blnSignedOn := True;                   //Successfull logon
 | 
|---|
 | 327 |         end
 | 
|---|
 | 328 |       end
 | 
|---|
 | 329 |       else                                      //False when no logon needed
 | 
|---|
 | 330 |         blnSignedOn := NoSignOnNeeded;          //Returns True always (for now!)
 | 
|---|
 | 331 |       if blnSignedOn then                       //P6 If logged on, retrieve user info.
 | 
|---|
 | 332 |       begin
 | 
|---|
 | 333 |         GetBrokerInfo(ConnectingBroker);
 | 
|---|
 | 334 |         if not SelDiv.ChooseDiv('',ConnectingBroker) then
 | 
|---|
 | 335 |         begin
 | 
|---|
 | 336 |           blnSignedOn := False;//P8
 | 
|---|
 | 337 |           {Select division if multi-division user.  First parameter is 'userid'
 | 
|---|
 | 338 |           (DUZ or username) for future use. (P8)}
 | 
|---|
 | 339 |           ConnectingBroker.Login.ErrorText := 'Failed to select Division';  // p13 set some text indicating problem
 | 
|---|
 | 340 |         end;
 | 
|---|
 | 341 |       end;
 | 
|---|
 | 342 |       SetForegroundWindow(OldHandle);
 | 
|---|
 | 343 |     finally
 | 
|---|
 | 344 |       frmSignon.Free;
 | 
|---|
 | 345 | //      frmSignon.Release;                        //get rid of signon form
 | 
|---|
 | 346 | 
 | 
|---|
 | 347 | //      if ConnectingBroker.Owner is TForm then
 | 
|---|
 | 348 | //        SetForegroundWindow(TForm(ConnectingBroker.Owner).Handle)
 | 
|---|
 | 349 | //      else
 | 
|---|
 | 350 | //        SetForegroundWindow(ActiveWindow);
 | 
|---|
 | 351 |         ShowApplicationAndFocusOK(Application);
 | 
|---|
 | 352 |     end ; //try
 | 
|---|
 | 353 |     if Assigned(OldExceptionHandler) then
 | 
|---|
 | 354 |       Application.OnException := OldExceptionHandler;
 | 
|---|
 | 355 |    end;   //if kernellogin
 | 
|---|
 | 356 |                                                  // p13  following section for silent signon
 | 
|---|
 | 357 |   if (not ConnectingBroker.KernelLogIn) and (not blnsignedon) then     // was doing the signon twice if already true
 | 
|---|
 | 358 |     if ConnectingBroker.Login <> nil then     //the user.  vistalogin contains login info
 | 
|---|
 | 359 |       blnsignedon := SilentLogin(ConnectingBroker);    // RpcSLogin unit
 | 
|---|
 | 360 |   if not blnsignedon then
 | 
|---|
 | 361 |   begin
 | 
|---|
 | 362 | //    ConnectingBroker.Login.FailedLogin(ConnectingBroker.Login);
 | 
|---|
 | 363 |     TXWBWinsock(ConnectingBroker.XWBWinsock).NetworkDisconnect(ConnectingBroker.Socket);
 | 
|---|
 | 364 |   end
 | 
|---|
 | 365 |   else
 | 
|---|
 | 366 |     GetBrokerInfo(ConnectingBroker);
 | 
|---|
 | 367 | 
 | 
|---|
 | 368 |   //reset the Broker
 | 
|---|
 | 369 |   with ConnectingBroker do
 | 
|---|
 | 370 |   begin
 | 
|---|
 | 371 |     ClearParameters := SaveClearParmeters;
 | 
|---|
 | 372 |     ClearResults := SaveClearResults;
 | 
|---|
 | 373 |     Param.Assign(SaveParam);                  //restore settings
 | 
|---|
 | 374 |     SaveParam.Free;
 | 
|---|
 | 375 |     RemoteProcedure := SaveRemoteProcedure;
 | 
|---|
 | 376 |     RpcVersion := SaveRpcVersion;
 | 
|---|
 | 377 |     Results := SaveResults;
 | 
|---|
 | 378 |     FKernelLogin := SaveKernelLogin;         // p13
 | 
|---|
 | 379 |     FLogin := SaveVistaLogin;                // p13
 | 
|---|
 | 380 |   end;
 | 
|---|
 | 381 | 
 | 
|---|
 | 382 |   if not blnSignedOn then                     //Flag for unsuccessful signon.
 | 
|---|
 | 383 |     TXWBWinsock(ConnectingBroker.XWBWinsock).NetError('',XWB_BadSignOn);               //Will raise error.
 | 
|---|
 | 384 | 
 | 
|---|
 | 385 | end;
 | 
|---|
 | 386 | 
 | 
|---|
 | 387 | {----------------------- GetCCOWHandle --------------------------
 | 
|---|
 | 388 | Private function to return a special CCOW Handle from the server
 | 
|---|
 | 389 | which is set into the CCOW context.
 | 
|---|
 | 390 | The Broker of a new application can get the CCOWHandle from the context
 | 
|---|
 | 391 | and use it to do a ImAPPHandle Sign-on.
 | 
|---|
 | 392 | ----------------------------------------------------------------}
 | 
|---|
 | 393 | function  TCCOWRPCBroker.GetCCOWHandle(ConnectedBroker : TCCOWRPCBroker): String;   // p13
 | 
|---|
 | 394 | begin
 | 
|---|
 | 395 |   Result := '';
 | 
|---|
 | 396 |   with ConnectedBroker do
 | 
|---|
 | 397 |   try                          // to permit it to work correctly if CCOW is not installed on the server.
 | 
|---|
 | 398 |     begin
 | 
|---|
 | 399 |       RemoteProcedure := 'XUS GET CCOW TOKEN';
 | 
|---|
 | 400 |       Call;
 | 
|---|
 | 401 |       Result := Results[0];
 | 
|---|
 | 402 |       Domain := Results[1];
 | 
|---|
 | 403 |       RemoteProcedure := 'XUS CCOW VAULT PARAM';
 | 
|---|
 | 404 |       Call;
 | 
|---|
 | 405 |       PassCode1 := Results[0];
 | 
|---|
 | 406 |       PassCode2 := Results[1];
 | 
|---|
 | 407 |     end;
 | 
|---|
 | 408 |   except
 | 
|---|
 | 409 |     Result := '';
 | 
|---|
 | 410 |   end;
 | 
|---|
 | 411 | end;
 | 
|---|
 | 412 | 
 | 
|---|
 | 413 | //CCOW start
 | 
|---|
 | 414 | procedure TCCOWRPCBroker.CCOWsetUser(Uname, token, Domain, Vpid: string; Contextor:
 | 
|---|
 | 415 |     TContextorControl);
 | 
|---|
 | 416 | var
 | 
|---|
 | 417 |   CCOWdata: IContextItemCollection;             //CCOW
 | 
|---|
 | 418 |   CCOWdataItem1,CCOWdataItem2,CCOWdataItem3: IContextItem;
 | 
|---|
 | 419 |   CCOWdataItem4,CCOWdataItem5: IContextItem;    //CCOW
 | 
|---|
 | 420 |   Cname: string;
 | 
|---|
 | 421 | begin
 | 
|---|
 | 422 |     if Contextor <> nil then
 | 
|---|
 | 423 |     begin
 | 
|---|
 | 424 |       try
 | 
|---|
 | 425 |          //Part 1
 | 
|---|
 | 426 |          Contextor.StartContextChange;
 | 
|---|
 | 427 |          //Part 2 Set the new proposed context data
 | 
|---|
 | 428 |          CCOWdata := CoContextItemCollection.Create;
 | 
|---|
 | 429 |          CCOWdataItem1 := CoContextItem.Create;
 | 
|---|
 | 430 |          Cname := CCOW_LOGON_ID;
 | 
|---|
 | 431 |          CCOWdataItem1.Name := Cname;
 | 
|---|
 | 432 |          CCOWdataItem1.Value := domain;
 | 
|---|
 | 433 |          CCOWData.Add(CCOWdataItem1);
 | 
|---|
 | 434 |          CCOWdataItem2 := CoContextItem.Create;
 | 
|---|
 | 435 |          Cname := CCOW_LOGON_TOKEN;
 | 
|---|
 | 436 |          CCOWdataItem2.Name := Cname;
 | 
|---|
 | 437 |          CCOWdataItem2.Value := token;
 | 
|---|
 | 438 |          CCOWdata.Add(CCOWdataItem2);
 | 
|---|
 | 439 |          CCOWdataItem3 := CoContextItem.Create;
 | 
|---|
 | 440 |          Cname := CCOW_LOGON_NAME;
 | 
|---|
 | 441 |          CCOWdataItem3.Name := Cname;
 | 
|---|
 | 442 |          CCOWdataItem3.Value := Uname;
 | 
|---|
 | 443 |          CCOWdata.Add(CCOWdataItem3);
 | 
|---|
 | 444 |          //
 | 
|---|
 | 445 |          CCOWdataItem4 := CoContextItem.Create;
 | 
|---|
 | 446 |          Cname := CCOW_LOGON_VPID;
 | 
|---|
 | 447 |          CCOWdataItem4.Name := Cname;
 | 
|---|
 | 448 |          CCOWdataItem4.Value := Vpid;
 | 
|---|
 | 449 |          CCOWdata.Add(CCOWdataItem4);
 | 
|---|
 | 450 |          //
 | 
|---|
 | 451 |          CCOWdataItem5 := CoContextItem.Create;
 | 
|---|
 | 452 |          Cname := CCOW_USER_NAME;
 | 
|---|
 | 453 |          CCOWdataItem5.Name := Cname;
 | 
|---|
 | 454 |          CCOWdataItem5.Value := Uname;
 | 
|---|
 | 455 |          CCOWdata.Add(CCOWdataItem5);
 | 
|---|
 | 456 |          //Part 3 Make change
 | 
|---|
 | 457 |          Contextor.EndContextChange(true, CCOWdata);
 | 
|---|
 | 458 |          //We don't need to check CCOWresponce
 | 
|---|
 | 459 |        finally
 | 
|---|
 | 460 |        end;  //try
 | 
|---|
 | 461 |     end; //if
 | 
|---|
 | 462 | end;
 | 
|---|
 | 463 | 
 | 
|---|
 | 464 | //Get Token from CCOW context
 | 
|---|
 | 465 | function TCCOWRPCBroker.GetCCOWtoken(Contextor: TContextorControl): string;
 | 
|---|
 | 466 | var
 | 
|---|
 | 467 |   CCOWdataItem1: IContextItem;                 //CCOW
 | 
|---|
 | 468 |   CCOWcontextItem: IContextItemCollection;      //CCOW
 | 
|---|
 | 469 |   name: string;
 | 
|---|
 | 470 | begin
 | 
|---|
 | 471 |   result := '';
 | 
|---|
 | 472 |   name := CCOW_LOGON_TOKEN;
 | 
|---|
 | 473 |   if (Contextor <> nil) then
 | 
|---|
 | 474 |   try
 | 
|---|
 | 475 |     CCOWcontextItem := Contextor.CurrentContext;
 | 
|---|
 | 476 |     //See if context contains the ID item
 | 
|---|
 | 477 |     CCOWdataItem1 := CCOWcontextItem.Present(name);
 | 
|---|
 | 478 |     if (CCOWdataItem1 <> nil) then    //1
 | 
|---|
 | 479 |     begin
 | 
|---|
 | 480 |       result := CCOWdataItem1.Value;
 | 
|---|
 | 481 |       if not (result = '') then
 | 
|---|
 | 482 |         FWasUserDefined := True;
 | 
|---|
 | 483 |     end;
 | 
|---|
 | 484 |     FCCOWLogonIDName := CCOW_LOGON_ID;
 | 
|---|
 | 485 |     FCCOWLogonName := CCOW_LOGON_NAME;
 | 
|---|
 | 486 |     FCCOWLogonVpid := CCOW_LOGON_VPID;
 | 
|---|
 | 487 |     CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_ID);
 | 
|---|
 | 488 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 489 |       FCCOWLogonIdValue := CCOWdataItem1.Value;
 | 
|---|
 | 490 |     CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_NAME);
 | 
|---|
 | 491 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 492 |       FCCOWLogonNameValue := CCOWdataItem1.Value;
 | 
|---|
 | 493 |     CCOWdataItem1 := CCOWcontextItem.Present(CCOW_LOGON_VPID);
 | 
|---|
 | 494 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 495 |       FCCOWLogonVpidValue := CCOWdataItem1.Value;
 | 
|---|
 | 496 |     finally
 | 
|---|
 | 497 |   end; //try
 | 
|---|
 | 498 | end;
 | 
|---|
 | 499 | 
 | 
|---|
 | 500 | //Get Name from CCOW context
 | 
|---|
 | 501 | function TCCOWRPCBroker.GetCCOWduz(Contextor: TContextorControl): string;
 | 
|---|
 | 502 | var
 | 
|---|
 | 503 |   CCOWdataItem1: IContextItem;                  //CCOW
 | 
|---|
 | 504 |   CCOWcontextItem: IContextItemCollection;      //CCOW
 | 
|---|
 | 505 |   name: string;
 | 
|---|
 | 506 | begin
 | 
|---|
 | 507 |   result := '';
 | 
|---|
 | 508 |   name := CCOW_LOGON_ID;
 | 
|---|
 | 509 |   if (Contextor <> nil) then
 | 
|---|
 | 510 |   try
 | 
|---|
 | 511 |       CCOWcontextItem := Contextor.CurrentContext;
 | 
|---|
 | 512 |       //See if context contains the ID item
 | 
|---|
 | 513 |       CCOWdataItem1 := CCOWcontextItem.Present(name);
 | 
|---|
 | 514 |       if (CCOWdataItem1 <> nil) then    //1
 | 
|---|
 | 515 |       begin
 | 
|---|
 | 516 |            result := CCOWdataItem1.Value;
 | 
|---|
 | 517 |            if result <> '' then
 | 
|---|
 | 518 |              FWasUserDefined := True;
 | 
|---|
 | 519 |       end;
 | 
|---|
 | 520 |   finally
 | 
|---|
 | 521 |   end; //try
 | 
|---|
 | 522 | end;
 | 
|---|
 | 523 | 
 | 
|---|
 | 524 | function TCCOWRPCBroker.IsUserContextPending(aContextItemCollection: 
 | 
|---|
 | 525 |     IContextItemCollection): Boolean;
 | 
|---|
 | 526 | var
 | 
|---|
 | 527 |   CCOWdataItem1: IContextItem;                  //CCOW
 | 
|---|
 | 528 |   Val1: String;
 | 
|---|
 | 529 | begin
 | 
|---|
 | 530 |   result := false;
 | 
|---|
 | 531 |   if WasUserDefined() then // indicates data was defined
 | 
|---|
 | 532 |   begin
 | 
|---|
 | 533 |     Val1 := '';  // look for any USER Context items defined
 | 
|---|
 | 534 |     result := True;
 | 
|---|
 | 535 |     //
 | 
|---|
 | 536 |     CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_ID);
 | 
|---|
 | 537 |     if (CCOWdataItem1 <> nil) then    //1
 | 
|---|
 | 538 |       Val1 := CCOWdataItem1.Value;
 | 
|---|
 | 539 |     //
 | 
|---|
 | 540 |     CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_ID);
 | 
|---|
 | 541 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 542 |       Val1 := Val1 + '^' + CCOWdataItem1.Value;
 | 
|---|
 | 543 |     //
 | 
|---|
 | 544 |     CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_NAME);
 | 
|---|
 | 545 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 546 |       Val1 := Val1 + '^' + CCOWdataItem1.Value;
 | 
|---|
 | 547 |     //
 | 
|---|
 | 548 |     CCOWdataItem1 := aContextItemCollection.Present(CCOW_LOGON_VPID);
 | 
|---|
 | 549 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 550 |       Val1 := Val1 + '^' + CCOWdataItem1.Value;
 | 
|---|
 | 551 |     //
 | 
|---|
 | 552 |     CCOWdataItem1 := aContextItemCollection.Present(CCOW_USER_NAME);
 | 
|---|
 | 553 |     if CCOWdataItem1 <> nil then
 | 
|---|
 | 554 |       Val1 := Val1 + '^' + CCOWdataItem1.Value;
 | 
|---|
 | 555 |     //
 | 
|---|
 | 556 |     if Val1 <> '' then    // something defined, so not user context change
 | 
|---|
 | 557 |       result := False;
 | 
|---|
 | 558 |   end;
 | 
|---|
 | 559 | end;
 | 
|---|
 | 560 | 
 | 
|---|
 | 561 | end.
 | 
|---|
 | 562 | 
 | 
|---|