[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Objekt-Eigenschaften über Text-Datei bestimmen?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Objekt-Eigenschaften über Text-Datei bestimmen?

peterhenrich
Beiträge gesamt: 139

3. Jan 2014, 17:04
Beitrag # 1 von 20
Bewertung:
(4117 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

in einer Textdatei liegen die Attribute zeilenweise in dieser Form vor:
.strokeWeight = 3;
.strokeColor = "Black";
.strokeTint = 44;
Diese Werte sollen in ein Array _cmds eingelesen werden (im folgenden Script gilt das als geschehen, um es einfach zu halten). Dann sollen die Werte auf eine in InDesign bestehende Variable gesetzt werden.

Code
var _newFrame = app.activeDocument.rectangles.add(); //neuen Rahmen anlegen 
_newFrame.geometricBounds = [ 10 , 10 , 100 , 100 ];

var _cmds = [ ".strokeWeight = 3;" , ".strokeColor = \"Black\"" , ".strokeTint = 44;" ]; //Werte wurden zuvor z.B. aus einer Textdatdei eingelesen

_applyCmds(_newFrame,_cmds);


function _applyCmds (_toObject,_theCmds)
{
for (var _i = 0; _i < _theCmds.length; _i++)
{
eval(_toObject.toSource()+_theCmds[_i]);
}
}


Das funktioniert soweit auch ganz gut und ist sehr einfach. Allerdings habe ich die Worte im Ohr: "Eine Lösung mit eval() ist keine Lösung!" Gibt es ein Vorgehen, das ähnlich komfortabel ist, aber ohne eval() auskommt?

Aus verschiedenen Gründen ist das Vorgehen über eine einfache Textdatei am sinnvollsten. In dieser Datei würde nur jeweils die rechte Seite vom Gleichheitszeichen vom User zu beeinflussen sein (also "3"). Die Werte links, also z. B. ".strokeWeight = " würden von Admin-Seite gesetzt. Ist dann EInschleusen von Schadcode überhaupt möglich?
X

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 17:18
Beitrag # 2 von 20
Beitrag ID: #521526
Bewertung:
(4114 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Ich glaube, das Problem mit eval() ist nur für webbasierendes JavaScript ein Sicherheitsproblem. Klar, "schön" ist das nicht.

Aber wie sollte denn ein mögliches Exploit von eval() mit ExtendScript aussehen? Du steuerst das ja nicht über 'ne Website als Frontend, oder?


als Antwort auf: [#521525]

Objekt-Eigenschaften über Text-Datei bestimmen?

WernerPerplies
Beiträge gesamt: 2772

3. Jan 2014, 17:59
Beitrag # 3 von 20
Beitrag ID: #521529
Bewertung:
(4097 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

ich persönlich ziehe JSON vor.

Das würde bei Dir dann als Text so aussehen:

Code
var cmd = {strokeWeight: 3, strokeColor: "Black", strokeTint: 44}; 


solch eine Zeile kannst Du direkt mit eval oder doScript verarbeiteten:
Code
var c = "var cmd = {strokeWeight: 3, strokeColor: \"Black\", strokeTint: 44}"; 
app.doScript(c); // eval(c);
alert(cmd.strokeWeight+"\n"+cmd.strokeColor+"\n"+cmd.strokeTint);


Sowohl app.doScript als auch eval bergen die Gefahr, dass unerlaubter JavaScript-Code eingeschleust wird, denn jede Varable kann auch einen Funktionsaufruf enthalten.

Wenn Du das vermeiden willst, schreibst Du Dir einen eigenen JSON-Parser, der nur das durchlässt, was Du erlauben möchtest. Das ist wirklich nicht schwer.


als Antwort auf: [#521525]

Objekt-Eigenschaften über Text-Datei bestimmen?

WernerPerplies
Beiträge gesamt: 2772

3. Jan 2014, 18:06
Beitrag # 4 von 20
Beitrag ID: #521530
Bewertung:
(4090 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,
Code
Aber wie sollte denn ein mögliches Exploit von eval() mit ExtendScript aussehen? 


;-)
Na ja, da die Daten als Text angeliefert werden:

Ein kleines rekursives Scipt mit Error-Handler, das alle Daten löscht, auf die das Skript mit den Rechten des Users zugreifen kann.

Und da viele Anwender immer noch mit Adminrechten arbeiten, könnte das sehr wirkungsvoll sein. ;-)

Und ob das ein Virenscanner in einer Textdatei erkennt?

Aber Du hast recht, wahrscheinlich ist das nicht.


als Antwort auf: [#521526]

Objekt-Eigenschaften über Text-Datei bestimmen?

peterhenrich
Beiträge gesamt: 139

3. Jan 2014, 18:16
Beitrag # 5 von 20
Beitrag ID: #521531
Bewertung:
(4085 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,
hallo Werner,

mit Schadcode habe ich überhaupt keine Erfahrung. Gehen wir doch mal von diesem Szenario aus:

- Auf der Website tolletshirtsselbergestalten.net (gibt's nicht, ist nur ein Beispiel :-) kann ein User einen Text eingeben und die Rahmenstärke des umgebenden Rahmens festlegen.

- Die Werte werden über PHP in eine TXT-Datei geschrieben (wie oben beschrieben). Dort stehen dann die Rahmenstärke sowie in einer zusätzlichen Zeile auch noch das, was gedruckt werden soll: ".contents = "Mein toller Spruch für mein T-Shirt"". ID-Server greift die Textdatei auf und erstellt in Zusammenhang mit einem bestehenden ID-Dokument ein PDF, das dann auf ein Shirt gedruckt wird.

Nun läuft das ganze mit eval().

Wichtig bei dieser Betrachtung scheint mir: Die Ausdrücke auf der linken Seite des Gleichheitszeichens kommen von uns. Von außen kann das also niemand steuern.

Auf der rechten Seite kann natürlich Schadcode stehen. Oder gehen wir mal von einem ID-Scripter aus, der es lustig fände, auf seinem T-Shirt stehen zu haben: "app.pageItems.everyItem.remove()"

Dann würde in meiner Textzeile stehen, die ich dann mit eval auf ein Objekt anwende:
".contents = "app.pageItems.everyItem.remove()""

Das dürfte m. E. doch keine Auswirkung auf die Funktionalität haben, oder? Es wird ein T-Shirt erstellt, auf der Spruch steht, der als Befehl alle Elemente des Dokuments löschen würde.

Schreibe ich einen Filter, der als Werte auf der rechten Seite viele Sachen wie z. B. alle JS-Befehle nicht zulässt oder rausfiltert, verliere ich als T-Shirt-Hersteller doch viele Kunden.

Wie gefährlich können denn Strings sein, die definitiv nur den Content eines TextFrames betreffen. Oder anders gefragt: Könnte ich auch ein InDesign-Dokument ganz normal in InDesign erstellen und dort in einen Textrahmen etwas reinschreiben, das dann etwas unzulässiges auslöst?

Gruß

Peter


als Antwort auf: [#521529]

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 18:31
Beitrag # 6 von 20
Beitrag ID: #521532
Bewertung:
(4076 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nun ja, wenn schon Schadcode auf einen Rechner gelangen kann, dann kann der sich auch als unsichtbare ExtendScript-Datei in einen Startup-Ordner reinkopieren und nach einer Weile alle besuchten Verzeichnisse oder "zur Not" auch das ganze Root löschen. Oder Dateien umbenennen oder, oder…

Per ExtendScript ja durchaus möglich…
Da braucht's kein eval()-Exploit.

Jedes irgendwo runtergeladene ExtendScript-Script, das über InDesign, PhotoShop, Illustrator, Dreamweaver ausgeführt wird, könnte diesen Code enthalten. Und die hier genannten apps dürfen ja Dateien schreiben, umbenennen und auch überschreiben (auch wenn sie diese nicht löschen dürfen). Welche Dateiarten davon betroffen wären: alle, die mit diesen Programmen bearbeitet werden können. Und das sind 'ne ganze Menge.

Verdeckt (unleserlich im Code) erst recht jede jsxbin-Datei (nur bei InDesign verwendbar).

Huch, was hab' ich denn hier für ein Szenarium aufgemacht ;-)


als Antwort auf: [#521530]

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 18:35
Beitrag # 7 von 20
Beitrag ID: #521533
Bewertung:
(4075 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!
Unsere beiden letzten Posts haben sich überschnitten.
Vielleicht kann ja Werner noch was zum eval()-Problem beitragen.

Und ja: die Gefahr über ein Webinterface infiziert zu werden, könnte bestehen.
Aber wie willst Du das abdichten, wenn sich der Anwender selber von irgendwoher ein Script lädt und dann ausführt?


als Antwort auf: [#521531]

Objekt-Eigenschaften über Text-Datei bestimmen?

WernerPerplies
Beiträge gesamt: 2772

3. Jan 2014, 18:44
Beitrag # 8 von 20
Beitrag ID: #521535
Bewertung:
(4053 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

ich verstehe einfach nicht, warum Du eval verwendest.

Links hast Du eine begrenzte Anzahl von Eigenschaften, rechts Zahlen oder Strings.

Lese den rechten Teil als String aus und weise Ihn der zugehörigen Eingenschaft zu. Dafür braucht es doch weder Eval noch DoScript, sondern einige Methoden zur Stringbearbeitung, wie .substr(), .indexOf() oder als Erweiterung der Stringklasse z. B. hier:
JavaScriptClassEnhancements als jsx


als Antwort auf: [#521531]

Objekt-Eigenschaften über Text-Datei bestimmen?

WernerPerplies
Beiträge gesamt: 2772

3. Jan 2014, 18:51
Beitrag # 9 von 20
Beitrag ID: #521536
Bewertung:
(4049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Zitat Huch, was hab' ich denn hier für ein Szenarium aufgemacht ;-)


;-)
Ja, jetzt benutzt niemand mehr Scripts, aber InDesign, das kann ja auch auch schon ganz schön unangenehm werden, ich sag nur:
unvollständige PDF-Dateien. -;)


als Antwort auf: [#521532]

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 19:23
Beitrag # 10 von 20
Beitrag ID: #521539
Bewertung:
(3997 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Jetzt aber mal zurück zum Problem, dass eval() umschifft werden soll.

Eine Eigenschaft kann ja auch folgendermaßen zugewiesen werden (Beispiel mit einer Textauswahl, deren erstes Zeichen horizontal auf 200% skaliert werden soll):

Code
var myProperty = "horizontalScale"; 
var myValue = 200;

app.selection[0].characters[0][myProperty] = myValue;


Kann man auch so schreiben:

Code
var myArray = ["horizontalScale",200]; 
app.selection[0].characters[0][myArray[0]] = myArray[1];



als Antwort auf: [#521531]
(Dieser Beitrag wurde von Uwe Laubender am 3. Jan 2014, 19:27 geändert)

Objekt-Eigenschaften über Text-Datei bestimmen?

peterhenrich
Beiträge gesamt: 139

3. Jan 2014, 19:40
Beitrag # 11 von 20
Beitrag ID: #521540
Bewertung:
(3962 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ WernerPerplies ] Hallo Peter,

ich verstehe einfach nicht, warum Du eval verwendest.

Links hast Du eine begrenzte Anzahl von Eigenschaften, rechts Zahlen oder Strings.

Lese den rechten Teil als String aus und weise Ihn der zugehörigen Eingenschaft zu. Dafür braucht es doch weder Eval noch DoScript, sondern einige Methoden zur Stringbearbeitung, wie .substr(), .indexOf() oder als Erweiterung der Stringklasse z. B. hier:
JavaScriptClassEnhancements als jsx


Hallo Werner,

danke für den Tipp mit der String-Klasse. Ich hänge nicht auf dem eval-Befehl fest und suchte ja von Anfang an eine Alternative zu diesem Konstrukt.

Ich versuche nur zu verstehen, wo die Gefahren bestehen. Gibt es irgendwo eine Diskussion/Übersicht, was einen alles zu erwarten hat und wie man das am besten bekämpft? Wir haben derzeit nicht das Problem, dass wir einen Server im Netz ansteuern lassen wollen. Ich wollte nur die Script von Anfang an wasserdicht haben.

Gruß

Peter


als Antwort auf: [#521535]

Objekt-Eigenschaften über Text-Datei bestimmen?

peterhenrich
Beiträge gesamt: 139

3. Jan 2014, 19:43
Beitrag # 12 von 20
Beitrag ID: #521541
Bewertung:
(3955 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Uwe Laubender ] Hallo, Peter!

Jetzt aber mal zurück zum Problem, dass eval() umschifft werden soll.

Eine Eigenschaft kann ja auch folgendermaßen zugewiesen werden (Beispiel mit einer Textauswahl, deren erstes Zeichen horizontal auf 200% skaliert werden soll):

Code
var myProperty = "horizontalScale"; 
var myValue = 200;

app.selection[0].characters[0][myProperty] = myValue;


Kann man auch so schreiben:

Code
var myArray = ["horizontalScale",200]; 
app.selection[0].characters[0][myArray[0]] = myArray[1];



Hallo Uwe,

wusste gar nicht, dass das auch so geht - danke für den Hinweis. Ist viel eleganter als die eval-Lösung.

Prinzipiell befreit aber auch das nicht von den Gefahren durch eingeschleusten Schadcode, oder? In myArray[1] kann ja auch Zeugs stehen. Aber das muss ich mir wohl anderweitig zusammensuchen und hatte gerade Werner schon danach gefragt, ob sich irgendwo eine Übersicht befindet.

Gruß

Peter


als Antwort auf: [#521539]

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 19:48
Beitrag # 13 von 20
Beitrag ID: #521543
Bewertung:
(3952 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!
Ich hab' Dir ja vorhin gezeigt wie's auch ohne eval() geht. :-)

Hier ein Beispiel, das nicht mit der Auswahl, sondern mit einem beliebigen pageItem arbeitet. Im Erfolgsfall wird der Text dieses pageItems auf 200% horizontal skaliert. Das pageItem kann ein Textrahmen oder ein Textpfad sein. Halt alles, was die Eigenschaft "texts" kennt und gleichzeitig ein pageItem ist (also diese beiden Objekte nach Stand der Dinge).

Code
var myPageItem = app.documents[0].pageItems[0]; 
$.writeln(myPageItem);

var myProperty = "horizontalScale";
var myValue = 200;

var whatItReallyIs = myPageItem.getElements()[0];
$.writeln(whatItReallyIs);

if(whatItReallyIs.hasOwnProperty("texts")){
whatItReallyIs.texts[0][myProperty] = myValue;
};


//EDIT: Hab noch ein $.writeln() oben ergänzt, um zu zeigen, dass myPageItem erst mal nur als [object pageItem] begriffen wird, bis über getElements()[0] das Objekt dann konkretisiert wird. Im Idealfall hier im Beispiel als [object textFrame] oder [object textPath]. Und damit auch die Objekteigenschaften erreichbar sind wie gewünscht.


als Antwort auf: [#521539]
(Dieser Beitrag wurde von Uwe Laubender am 3. Jan 2014, 19:58 geändert)

Objekt-Eigenschaften über Text-Datei bestimmen?

Uwe Laubender
Beiträge gesamt: 5321

3. Jan 2014, 20:01
Beitrag # 14 von 20
Beitrag ID: #521544
Bewertung:
(3924 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ peterhenrich ] … wusste gar nicht, dass das auch so geht - danke für den Hinweis. Ist viel eleganter als die eval-Lösung.


Ja, das funktioniert wie ein assoziatives Array.


als Antwort auf: [#521541]

Objekt-Eigenschaften über Text-Datei bestimmen?

WernerPerplies
Beiträge gesamt: 2772

3. Jan 2014, 20:21
Beitrag # 15 von 20
Beitrag ID: #521545
Bewertung:
(3906 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

Zitat Gibt es irgendwo eine Diskussion/Übersicht, was einen alles zu erwarten hat und wie man das am besten bekämpft?


Gibt es ganz bestimmt, kenne ich aber nicht.

Ich habe mich bisher auch nicht sonderlich mit dem Thema beschäftigt, weiß aber, dass da einiges geht.

Ich selber setzte für manche meiner Settingdateien auch eval ein, erzeuge diese Dateien aber selbst und weiß beim Wiedereinlesen genau, was vorkommen darf und wo es genutzt wird.

Ich denke, Deine Anwendung ist relativ unkritisch, denn es können nur bestimmte Parameter vorkommen (linke Seite) die wiederum vermutlich auch nur bestimmte Datentypen zur Zuweisung erlauben.

Wenn dabei bestimmte Werte gefährliche Akrionen auslösen können, so musst Du diese Werte herausprüfen, aber die Werteprüfung ist in der Regel immer notwendig, weil meistens nur bestimmte Wertebereiche erlaubt sind.

Als kritisch könnten sich Funktionen erweisen, die aber auch interpretiert und aufgerufen werden müssen. Ein Funktions- oder Methodenaufruf sieht so aus: name().

Deine Parameterprüfung sollte Datentyp, instanceOf und/oder constructor.name und Wertebereich des Parameters umfassen, dann kann eigentlich nichts schiefgehen.

Wenn Du Deine bisherige Syntax beibehalten willst, solltest Du Deine Textdatei per split("\n") in ein Array einlesen - bei möglichen, anderen Zeilenenden ("\r\n"|"\r") normierst Du erst mit replace auf "\n".

Danach splittest Du jedes Arrayelement mit split("="), normierst beide Arrayelemente und kannst dann mit array.indexOf(Parametername) das passende Arrayelement suchen und hast dann im zweiten Element des gefundenen Arrays den gewünschten Parameter für den Du dann eventuell noch eine Typumwandlung machen musst.

Alles klar? ;-)

Da kann dann eigentlich nichts passieren.


als Antwort auf: [#521540]
X

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
20.06.2024

Online
Donnerstag, 20. Juni 2024, 15.00 - 15.45 Uhr

Webinar

Etiketten-Workflows gehören zu den anspruchsvollsten in der grafischen Industrie. Ihre PDF-Dateien sind oft sehr komplex und erfordern eine spezielle Vorbereitung. pdfToolbox bietet viele Möglichkeiten, um diese Arbeit zu automatisieren. Nehmen Sie an unserem Webinar "pdfToolbox für den Etikettendruck" teil und lernen Sie einige der Funktionen kennen, die Ihren Etiketten-Workflow effizienter gestalten. Einige der Bereiche, die Sie kennenlernen werden, sind: Beschnitt erzeugen Beim Etikettendruck ist das Druckmotiv oft nicht rechteckig. Lernen Sie, wie Sie einen passenden Beschnitt für alle Arten von Formen hinzufügen können. Produktionsreife Dateien erstellen nutzen Sie bereits vorliegende Inhalte oder Seiteninformationen, um eine Weißform hinter dem Seiteninhalt hinzuzufügen, eine passgenaue Lackform für bestimmte Objekte zu erzeugen oder eine Stanzlinie mit korrektem Sonderfarbnamen zu erstellen. Ausschießen, Step & Repeat, N-Up Mit der Ausschieß-Engine von pdfToolbox lassen sich Seiten zu größeren Druckbögen zusammenfassen, wobei verschiedene Layouts und Komplexitäten unterstützt werden. Hochwertige Freigabe-Bögen Erstellen Sie automatisch Freigabe-Bögen mit Vorschaubildern Ihrer Produktionsdatei und Auftragsdaten aus dem MIS. Qualitätskontrolle pdfToolbox enthält Standard-Preflight-Profile, die die grundlegenden Anforderungen an PDF-Dateien in Etiketten-Workflows abdecken. Prüfen Sie ob Ihre Dokumente internationalen Standards wie ISO PDF/X oder GWG (Ghent Workgroup) Spezifikationen entspricht. Verpackungs- und etikettenspezifische Vorgaben, wie der ISO-Standard „Processing Steps“, werden ebenfalls unterstützt.

kostenlos

Ja

Organisator: callassoftware

https://www.impressed.de/schulung.php?c=sDetail&sid=322

pdfToolbox für den Ettikettendruck
Veranstaltungen
02.07.2024

Online
Dienstag, 02. Juli 2024, 10.00 - 10.30 Uhr

Webinar

In diesen beiden kostenlose Webinaren erfahren Sie, wie Sie mit Hilfe von Enfocus Griffin und dem Impressed Workflow Server Ihren LFP-Workflows optimieren können. 18.06.2024: So optimieren Sie Ihre Prozesse mit Enfocus Griffin 02.07.2024: So sparen Sie Zeit und Geld mit Impressed Workflow Server in der LFP-Edition Griffin: Griffin ist das leistungsstarke Kraftpaket für das automatische Nesting im Großformatdruck. Dank eines ausgeklügelten, KI-basierten Nesting-Algorithmus können Sie mit Griffin Vorlagen schnell und effizient vernutzen – und das klappt auch mit unregelmäßigen Formen perfekt. Das spart Ihnen unzählige Stunden, die Sie bisher mit dem manuellen Nesting und Ausschießen verbracht haben. Einige wichtige Funktionen ≡ Anlage von Beschnittzugaben ≡ Automatische Erzeugung der Schnittkontur ≡ Erstellung von Strichcodes, Textmarkierungen und Registrierungen IWS LFP Edition: Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Mit dem IWS LFP Edition automatisieren Sie Ihre Produktion von der Übernahme der Daten aus dem ERP-System bis zur Erzeugung der verschachtelten Druckform und der Übergabe an den RIP. Phoenix Core ist eine hochentwickelte KI-Technologie für die Planung und das Nesting von Druckerzeugnissen. Anders als herkömmliche Ausschießlösungen arbeitet Phoenix nicht auf Basis von Vorlagen, sondern erzeugt entsprechend der Maschinen- und Produktionsanforderungen druckfertige Layouts „on-the-fly“.

kostenlos

Ja

Organisator: Impressed GmbH

Kontaktinformation: E-Mailschulungen AT impressed DOT de

https://www.impressed.de/schulung.php?c=sDetail&sid=328

So optimieren Sie Ihren LFP-Workflow