Проблема более или менее была решена. Возможно не совсем правильно. По отпечатку ключа каждой персоне присваивался ip. А в CommandGet опрашивался ip и от этого уже работала. А потом появилась другая Часть пользователей сидела за маршрутизатором и соответственно все они имели один внешний ip, но права должны были быть разными. Пришлось задействовать куки. Правда уже прошло 5 лет и честно говоря я уже плохо помню что сделал. Из программы надёргал кусков.
Код | type TIdSSLIOHandlerSocketOpenSSLA=class (TIdSSLIOHandlerSocketOpenSSL) protected function DoVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean; override;//, AError end;
TIdServerIOHandlerSSLOpenSSLA=class (TIdServerIOHandlerSSLOpenSSL) constructor Create(AOwner: TComponent); function Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread; AYarn: TIdYarn): TIdIOHandler; override; function VerifyPeerProc(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError end;
|
Код | ... var id2: TIdServerIOHandlerSSLOpenSSLA; ...
|
Код | constructor TIdServerIOHandlerSSLOpenSSLA.Create(AOwner: TComponent ); begin inherited Create(AOwner); OnVerifyPeer:=VerifyPeerProc; end;
function TIdServerIOHandlerSSLOpenSSLA.VerifyPeerProc(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError begin result:=true; end;
function TIdServerIOHandlerSSLOpenSSLA.Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread; AYarn: TIdYarn): TIdIOHandler; var LIO: TIdSSLIOHandlerSocketOpenSSLA; s: string; begin Assert(ASocket<>nil); Assert(fSSLContext<>nil); LIO:=TIdSSLIOHandlerSocketOpenSSLA.Create(nil); LIO.PassThrough:=True; LIO.Open; if LIO.Binding.Accept(ASocket.Handle) then begin s:=LIO.Binding.PeerIP; FreeAndNil(LIO.fxSSLOptions); LIO.IsPeer:=True; LIO.fxSSLOptions:=fxSSLOptions; LIO.fSSLSocket:=TIdSSLSocket.Create(LIO); LIO.fSSLContext:=fSSLContext; end else FreeAndNil(LIO); Result:=LIO; end;
|
Код | procedure TForm1.FormCreate(Sender: TObject); ... // создаём хендлер ssl id2:=TIdServerIOHandlerSSLOpenSSLA.Create(self); IdHTTPServer.IOHandler:=id2;
id2.SSLOptions.CertFile:='server.crt'; id2.SSLOptions.KeyFile:='server.key'; id2.SSLOptions.RootCertFile:='ca.crt'; id2.SSLOptions.Method:=sslvTLSv1;//sslvSSLv3; id2.SSLOptions.Mode:=sslmBoth; id2.SSLOptions.VerifyDepth:=0; id2.SSLOptions.VerifyMode:=id2.SSLOptions.VerifyMode +[sslvrfPeer, sslvrfFailIfNoPeerCert, sslvrfClientOnce]; id2.OnVerifyPeer:=IdSSLIOHandlerSocketOpenSSL1VerifyPeer; ...
|
Код | function TIdSSLIOHandlerSocketOpenSSLA.DoVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError var s,port: String; ... s:=self.binding.peerip; try port:=IntToStr(self.binding.PeerPort); except port:='0'; end; L1:=Length(Certificate.Fingerprints.SHA1AsString); s:=Certificate.Fingerprints.SHA1AsString; ...
|
Код | procedure TForm1.idHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); ... RemoteIP:=ARequestInfo.RemoteIP;
|
|