AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DataSnap veröffentlicht Class-Helper

Ein Thema von himitsu · begonnen am 3. Dez 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.363 Beiträge
 
Delphi 12 Athens
 
#1

DataSnap veröffentlicht Class-Helper

  Alt 3. Dez 2020, 17:03
Delphi-Version: 10.4 Sydney
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 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.

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 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 ....
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Dez 2020 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 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