Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DataSnap veröffentlicht Class-Helper (https://www.delphipraxis.net/206249-datasnap-veroeffentlicht-class-helper.html)

himitsu 3. Dez 2020 17:03

Delphi-Version: 10.4 Sydney

DataSnap veröffentlicht Class-Helper
 
Moin Moin,

ist schon jemandem aufgefallen, dass DataSnap und bestimmt auch der RAD-Server "fremde" Methoden veröffentlicht?

Mein Problem, oder vielleicht auch Glück ist es, das ich in einem Class-Helper eine "doppelte" Methode habe,
sonst wäre mir das Verhalten garnicht aufgefallen. (Die ClientMethoden-Klassen wurden über einen XE-Server generiert und selbst die neuen TestMethoden hatte ich über einem separaten TestServer vom D10.4 generieren lassen, so dass diese "zusätzlichen" Methoden nicht in den neuen Client-Klassen auftauchten)

Zitat:

Zitat von TDBXError
Methode TDSSERVICEMETHODS.TRYGETCOMPONENTNAME wurde bereits zur Servermethodenliste hinzugefügt

Leider lässt sich dadurch aber der DataSnap-Server in der entgültigen Anwendung nun nicht mehr starten.
Dachte erst die Methoden-Klasse wird doppelt registiert, als es beim Start als Windows-Service, während der DataSnap-Klassen-Registrierung knallte.
Im alten Delphi XE funktioniert alles noch ohne Probleme und jetzt, nach wochenlanger Umstellung auf 10.4, raucht Alles im allerletzten Schritt ab. :wall: :evil:

Es existieren ein paar Helper, welche zum Debuggen und in der Fehlerbehandlung an zuvielen Stellen verwendet werden, so dass sie nicht weg einfach mal können.
Delphi-Quellcode:
type
  TObjectHelper = class helper for TObject
    ...
  public
    ...
  end;

  TComponentHelper = class helper for TComponent
    ...
  public
    ...
    function TryGetComponentName: string; overload;
    ...
    class function TryGetComponentName(Component: TComponent): string; overload;
    ...
  end;
Während dem Start des DataSnap-Servers wird über ObjAuto.GetMethods eine Liste der "zu veröffentlichenden" Methoden gesucht
( TDSServerMethodProvider.AddAllMethods -> TDSClass.GetMethods -> System.ObjAuto.GetMethods )
und in dieser Liste sind nicht nur meine Methoden aus den DataSnap-Klassen drin, sondern erschreckender Weise auch die Helper.
Zitat:

Zitat von Methoden-Liste vom Debugger aus TDSServerMethodProvider.AddAllMethods
Code:
BuiltinMethods   (

 *** aus der einen DataSnap-MethodenKlasse ***
 ($630B9C6, (), (), 'ServiceName', $EEF03E8, $EEF0460, True, False, False, False),
 ($630B9FC, (), (), 'ServicePath', $EEF03E8, $EEF04D8, True, False, False, False),
 ($630BA32, (), (), 'ActiveOptions', $EEF03E8, $EEF0528, True, False, False, False),
 ($630BA6A, (), (), 'StartDuration', $EEF03E8, $EEF0578, True, False, False, False),
 ($630BAA2, (), (), 'ServerTime', $EEF03E8, $EEF0618, True, False, False, False),
 ($630BACC, (), (), 'ServerComputerName', $EEF03E8, $EEF0668, True, False, False, False),
 ($630BB09, (), (), 'ServerIPs', $EEF03E8, $EEF06E0, True, False, False, False),
 ($630BB3D, (), (), 'ServerClientList', $EEF03E8, $EEF0730, True, False, False, False),
 ($630BB78, (), (), 'HelpPort', $EEF03E8, $EEF07A8, True, False, False, False),
 ($630BBAB, (), (), 'DBServer', $EEF03E8, $EEF0820, True, False, False, False),
 ($630BBDE, (), (), 'DBServerID', $EEF03E8, $EEF0898, True, False, False, False),
 ($631792E, ($EEF0910), ('S'), 'ReverseString', $EEF03E8, $EEF08E8, True, False, False, False),
 ($6317971, ($EEF0988), ('S'), 'CallTestException', $EEF03E8, $EEF0960, True, False, False, False),
 ($63179AD, ($EEF0A00, $EEF0A28), ('VarName', 'Value'), 'SetSessionVar', $EEF03E8, $EEF09D8, True, False, False, False),
 ($63179FA, ($EEF0AA0), ('VarName'), 'GetSessionVar', $EEF03E8, $EEF0A78, True, False, False, False),

 *** von den Helpern ***
 ($6317A43, (), (), 'SecureName', $EEF03E8, $EEF0B18, True, False, False, False),
 ($6317A78, (), (), 'SecureOwner', $EEF03E8, $EEF0BB8, True, False, False, False),
 ($6317AA3, (), (), 'SecureParent', $EEF03E8, $EEF0C30, True, False, False, False),
 ($6317ACF, ($EEF0CD0), ('Caption'), 'GetFullInfo', $EEF03E8, $EEF0CA8, True, False, False, False),
 ($6317B16, ($EEF0D48, $EEF0D70, $EEF0DC0, $EEF0E10), ('Caption', 'WithOwners', 'WithParents', 'WithClassHierarchy'), 'GetInfo', $EEF03E8, $EEF0D20, True, False, False, False),
 ($6317B9E, (), (), 'TryGetComponentName', $EEF03E8, $EEF0E60, True, False, False, False),
 ($6317BDC, (), (), 'GetOwnerPath', $EEF03E8, $EEF0EB0, True, False, False, False),
 ($6317C13, (), (), 'GetParentPath', $EEF03E8, $EEF0F00, True, False, False, False),

 ($6317C4B, ($EEF0FA0), ('Component'), 'TryGetComponentName', $EEF03E8, $EEF0F50, True, False, False, False),
 ($6317C9C, ($EEF1068), ('Component'), 'GetOwnerPath', $EEF03E8, $EEF1018, True, False, False, False),
 ($6317CE6, ($EEF1130), ('Component'), 'GetParentPath', $EEF03E8, $EEF10E0, True, False, False, False),
 ($6317D31, ($EEF11D0), ('NewName'), 'SetErrorName', $EEF03E8, $EEF11A8, True, False, False, False))

.

Fragen:

Wieso um Himmels Willen sind überhaupt diese Helper-Methoden dort drin, bzw. wie kann man auf die schwachsinnige Idee kommen sie zu veröffentlichen?

Wie bekomme ich die da raus?
(der erste Blick in TDSServerMethodProvider.AddAllMethods würde mich vermuten lassen, dass ich irgendwie TDSServerMethodProvider.IsCallableMethod überschreiben könnte, aber das ist leider nicht virtual, ebenso wie schainbar alles Andere auch, was mit dem Auslisten und Registrieren der Methoden nicht beeinflussbar ist)

Da die "Vererbung" bei den Class-Helpern ja eh total misslungen ist, hatte ich gehofft durch weitere Helper an den DataSnap-Klassen die anderen Helper loszuwerden (zu verdecken).
Delphi-Quellcode:
type
  TDSFileMethods = class(TDSServerMethods)
    ...
  end;

  TDSFileMethodsBlock = class helper for TDSFileMethods
  end;
Ich selber sehe an diesen Klassen nun in der Codevervollständigung keine der Helper-Methoden mehr, aber DataSnap findet sie dennoch.


Ich könnte jetzt vermutlich "unschön" die "doppelten" Methode umbenennen/verschieben/sonstwas und hoffen ich bekomm es dann zum Laufen,
aber das wiederspricht sämtlichen Sicherheitsmaßnahmen, weil diese Methoden dann öffentlich und ohne Zugriffskontrolle sind.
(ich hatte gerade erst schön mit [TRoleAuth] alles bissl abgesichert, aber gerade da bekomme ich keine Rollen-Berechtigungen dran)




Es wäre zu schön morgen noch eine Lösung zu finden, dann könnte ich in Ruhe in Urlaub, während die Anderen "endlich" schonmal mit dem neuen Delphi spielen können. (nach dem alle unsere Projekte von XE zu 10.2 10.3 10.4 migriert wurden)

Stellt euch mal vor jemand käme auf die Idee eine supercoole Komponente zu bauen, die sofort jeder in seinen Programmen benutzt.
Über einen heimlichen Class-Helper kann man sich dann in DataSnap/RADServer/UndAllesWasAuchDieseSuchmethodeNutzt reinhacken und in alle Server wunderhübsche Backdoors einfügen.
Ich fang dann mal an ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz