Jump to content

mjustin

Members
  • Content Count

    80
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by mjustin


  1. Habarisoft released new versions of the native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    Release notes: https://www.habarisoft.com/release_notes.html


  2. ScroogeXHTML for Object Pascal converts RTF (Rich Text Format) documents to HTML5 and other markup formats.

     

    This release adds BMP picture data extraction, a new option to handle invalid RTF headers, and many minor code and documentation improvements.

     

    Features

    • Exports to stand-alone documents or embeddable fragments.
    • Minimizes documents using CSS and default font definitions.
    • Supports hyperlink fields, bookmarks, multi-language, and LTR/RTL text.
    • Includes complimentary code for converting and embedding images as Data URIs. Conversion of pictures to a web-ready format may require third-party libraries.
    • Includes an API for post-processing of the intermediate DOM-like document.
    • Supports logging via the open source slf4p logging facade.
    • Compatible with Delphi 2009 and newer and Free Pascal 3.2.2.
    • Includes full source code.

     

    Resources
    Home page: https://www.scroogexhtml.com/object_pascal.html
    Demo version: https://www.habarisoft.com/scroogexhtml/8.7/ScroogeXHTMLDemo.zip
    User guide: https://www.habarisoft.com/scroogexhtml/8.7/docs/ScroogeXHTMLGettingStarted.pdf
    Release notes: https://www.habarisoft.com/scroogexhtml/8.7/docs/api/version.html

     

    Other platforms
    ScroogeXHTML is also available for the Java platform. (different feature set)

     

     


  3. ScroogeXHTML for Object Pascal converts RTF (Rich Text Format) documents to HTML5 and other markup formats.

    This release fixes minor code issues and includes more unit tests and API documentation.

     

    Features
    * Exports to stand-alone documents or fragments for embedding in existing documents.
    * Minimizes documents using CSS and default font definitions.
    * Supports hyperlink fields, bookmarks, multi-language and LTR/RTL text.
    * Includes complimentary code for converting and embedding images as Data URIs. Conversion of pictures to a web-ready format may require third-party libraries.
    * Includes an API for post-processing of the intermediate DOM-like document.
    * Supports logging via the open source slf4p logging facade.
    * Compatible with Delphi 2009 and newer and Free Pascal 3.2.2.
    * Includes full source code.

     

    Resources
    * Home page: https://www.scroogexhtml.com/object_pascal.html
    * Demo version: https://www.habarisoft.com/scroogexhtml/8.5/ScroogeXHTMLDemo.zip
    * User guide: https://www.habarisoft.com/scroogexhtml/8.5/docs/ScroogeXHTMLGettingStarted.pdf
    * Release notes: https://www.habarisoft.com/scroogexhtml/8.5/docs/api/version.html

     

    Other platforms
    ScroogeXHTML is also available for the Java platform. (different feature set)

    • Haha 1

  4. Meanwhile I managed to send email using MS Graph API. The example project with full source code is described here:

     

    Microsoft identity platform and OAuth 2.0 authorization code flow example for Daraja HTTP Framework

     

    The Authorization Code Flow with Proof Key for Code Exchange (PKCE) is a recommended OAuth 2.0 flow for native apps. No client secret is required in this flow. Instead, a secret is created by the calling application that can be verified by the authorization server.

     

    The example application requests an authorization code, redeems the code for an access token, and then calls the Microsoft Graph API to retrieve user profile data, and to send an email on behalf of the signed-in user.

     

    It may be a starting point for a ICS based application.

     

    • Like 1

  5. Update / new blog post:

    Microsoft identity platform and OAuth 2.0 authorization code flow example for Daraja HTTP Framework

    The Authorization Code Flow with Proof Key for Code Exchange (PKCE) is a recommended OAuth 2.0 flow for native apps. No client secret is required in this flow. Instead, a secret is created by the calling application that can be verified by the authorization server.

    The example application requests an authorization code, redeems the code for an access token, and then calls the Microsoft Graph API to retrieve user profile data, and to send an email on behalf of the signed-in user.

    Software requirements
    * Daraja HTTP Framework (https://github.com/michaelJustin/daraja-framework). The example code is located in the entra_auth_code_flow folder of the master branch.
    * Indy (https://github.com/IndySockets) with OpenSSL DLLs for Indy (https://github.com/IndySockets/OpenSSL-Binaries)
    * JsonDataObjects (https://github.com/ahausladen/JsonDataObjects)

    Daraja HTTP Framework download:
    - https://github.com/michaelJustin/daraja-framework


  6. Send mails via the Graph API: a new example project for the Daraja HTTP Framework demonstrates how to get an access token using the implicit grant flow, and how to invoke the Graph API to send an email. No additional configuration is required, as the project uses an existing Microsoft Entra App registration , which is limited to the permissions for reading the user profile and sending emails.

     

    image.thumb.png.77c5434135aca5839b128f4b674ceb7b.png

     

    You may configure your own App registration and use its Application (client) ID in the source code of unit MainUnit, or contact me to provide a modified App registration.

     

     

     

     

     


  7. Using ChatGPT I got some helpful basic steps:

     

    Q: How can a Delphi application use the Outlook.Application ActiveX to read a user calendar?

    A: To use the Outlook.Application ActiveX in a Delphi application to read a user's calendar, you can follow these general steps. Please note that you need to have Outlook installed on the machine where your Delphi application is running.

    (Steps and source code omitted)

     


    Q: Is it also possible to read the calendar of a different user?

    A: Accessing the calendar of a different user using the Outlook.Application ActiveX in Delphi depends on the permissions and configuration of the Outlook profile. Generally, the ability to access another user's calendar requires the appropriate permissions and security settings.
    (Again, steps and code omitted here, except the following two lines:
     
        // Replace 'otheruser@example.com' with the email address of the user whose calendar you want to access
        OtherUserCalendar := Namespace.GetSharedDefaultFolder('otheruser@example.com', olFolderCalendar);


    I do not post more as I am not sure if AI-generated answers are acceptable in this forum

     

    ----

    Note: using the MS Graph API (or EWS) may be also an option, with the advantage that no local Outlook is required.

     


  8. Habarisoft released new versions of the native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    Release notes: https://www.habarisoft.com/release_notes.html


  9. On 11/9/2023 at 9:54 PM, Officeapi said:

    Here is the info I get from Charles Proxy

    The Content-Type header value looks suspicious:

     

    application%2Fjson

     

     

    RESTListResGroupResponse.JSONValue maybe is empty because the content type is not the expected one, application/json

     

    As can be seen in the screen shot, all other slashes are not encoded as #2F.

     

    If the request header Content-Type is not required, just remove it from the request setup and try if this helps.


  10. Sorry for my mistake, I mistook a post of a different user as being from you.

     

    If the postman call succeeds, I'd check every single HTTP element and modify the Delphi request to be the same. Postman shows all headers and payloads. 

     

    One header, which is frequently said to be causing errors, is the User-Agent. So I'd check and use the same header that Postman uses.


  11. Did you check https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http#permissions?

     

    A potential reasons for the 401 is the missing scope User.ReadAll.

     

    You wrote that you use Application type. For the Application permission type, the table says that the "Least privileged permission" is User.Read.All, however, yor code uses User.Read:

    RESTTokenRequest.Params.AddItem('scope', 'openid profile offline_access Mail.Read Mail.Send User.Read', TRestRequestParameterKind.pkREQUESTBODY);  

    Also, for testing user profile access, there is no need to include the scopes profile, offline_access, Mail.Read and Mail.Send.

     

    Try this:

    RESTTokenRequest.Params.AddItem('scope', 'openid User.ReadAll', TRestRequestParameterKind.pkREQUESTBODY);  

     

    The API documentation also explains that with Application permission type, only the admin can consent. Calling the API endpoint https://graph.microsoft.com/v1.0/me may return the admin user profile only.

     

    If you need the user profile of other users, use the HTTP request described in https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http#http-request

    /users/{id | userPrincipalName}

     

    Hope this helps


  12. Habarisoft released new versions of the native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    Release notes: https://www.habarisoft.com/release_notes.html


  13. 21 hours ago, limelect said:

    I suspect it is not possible to send from server text to a specific Client.

    A solution is to embed in the message a sign that a specific client will recognize.

    Any other solution in your opinion?

     

    With Indy, the recommended way to send a message to a specific client is to assign an unique client id to new connections in the OnConnect method of the server. The server application then can use the client id to limit the message to one (or some) of the connected clients. Technically, the client id would be a property in a subclass of the TIdContext class, and this class must be "registered" with the Indy TCP server. There are plenty of articles on the web covering this technique.


  14. Habari STOMP Client libraries release 2023.08

    Habarisoft released new versions of its native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    Release notes: https://www.habarisoft.com/release_notes.html


  15. It is a very simple POST method request to a HTTPS address and with a JSON body.

    A small example how this can be done with Indy (included in Delphi) is here:

     

    https://mikejustin.wordpress.com/2015/03/14/indy-10-6-https-post/

     

    Line 16 defines the body of the message. Replace it with your required JSON string.

    Line 21 send the message, change the server address to your destination server.

     

    It requires the OpenSSL DLLs which can be downloaded from https://github.com/IndySockets/OpenSSL-Binaries


  16. ScroogeXHTML for Object Pascal 8.4 released

     

    ScroogeXHTML for Object Pascal is a library which supports a subset of the Rich Text Format (RTF) standard. It converts RTF to HTML5 and XHTML stand-alone documents, or to fragments which can be embedded in other documents.

    The library is compatible with Delphi 2009+ and Free Pascal 3.2.0.

     

    The 8.4 release fixes some minor issues. Full release notes are at https://www.habarisoft.com/scroogexhtml/8.4/docs/api/version.html

     

    Home page, Getting Started PDF, and demo download:
     https://www.scroogexhtml.com/object_pascal.html
    API online:
     https://www.habarisoft.com/scroogexhtml/8.4/docs/api/


  17. Habari STOMP Client libraries release 2023.06

    Habarisoft released new versions of its native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    This version contains a new decoder for STOMP header lines.


  18. The Daraja HTTP Server Framework is a free open source library for Object Pascal (Free Pascal 3.2.0 or Delphi 2009+), based on the HTTP server component in Internet Direct (Indy).

    New: the 2.6-SNAPSHOT includes a first implementation of the Web Filter API, which allows pre- and postprocessing of HTTP requests and responses.
    Web Filters are useful for example to add logging and auditing, input validation, or authentication.
    Filters may be composed in filter chains, where the order of filter execution is defined by the order of registration. Web Filter instances may configured through init parameters.

    Example code
    In the test example below, the Web Component TExamplePage returns the plain-text response "example", and the filters (TTestFilterA and TTestFilterB) add the texts " (A)" and " (B)" to the response. The client therefore receives the response "example (A) (B)".
     

    Code: Pascal  [Select][+]
    1. procedure TAPIConfigTests.TestTwoFilters;
    2. var
    3.   Server: TdjServer;
    4.   Context: TdjWebAppContext;
    5. begin
    6.   Server := TdjServer.Create;
    7.   try
    8.     Context := TdjWebAppContext.Create('web'); // Context located at http://<server:port>/web/
    9.     Context.AddWebComponent(TExamplePage, '*.txt'); // Web Component responds to all requests for txt documents
    10.     Context.AddWebFilter(TTestFilterA, TExamplePage); // Web Filter A will be processed first and appends " (A)"
    11.     Context.AddWebFilter(TTestFilterB, TExamplePage); // Web Filter B will be processed second and appends " (B)"
    12.     Server.Add(Context);
    13.     Server.Start;
    14.  
    15.     CheckGETResponseEquals('example (A) (B)', '/web/test.txt');
    16.  
    17.   finally
    18.     Server.Free;
    19.   end;
    20. end;
    21.  



     

    Code for the DoFilter method of TTestFilterA:

     

    procedure TTestFilterA.DoFilter(Context: TdjServerContext; Request: TdjRequest;
      Response: TdjResponse; const Chain: IWebFilterChain);
    begin
      Chain.DoFilter(Context, Request, Response);  // invoke other filters and eventually the Web Component 
      Response.ContentText := Response.ContentText + ' (A)';
    end;

     

    Full source code, including DUnit and FPCUnit tests, is available at GitHub. The Web Filter API specification is still in development and may still see minor and major changes.

    More information
    - GitHub: https://github.com/michaelJustin/daraja-framework
    - 2.6-SNAPSHOT API documentation: https://michaeljustin.github.io/daraja-framework/2.6-SNAPSHOT/
    - Project home page: https://www.habarisoft.com/daraja_framework.html


  19. Habari STOMP Client libraries release 2023.04

    Habarisoft released new versions of its native STOMP client libraries for Delphi / Object Pascal for integration with popular open source message brokers:

    This version is mainly a maintenance release and tested with the latest message broker versions.

    Full release notes can be found at: https://www.habarisoft.com/release_notes.html

    Home page: https://www.habarisoft.com/


  20. 18 hours ago, DelphiUdIT said:

    1) Create a different user ....I see it as a real complication for management

    Yes, this would cause more work / administration.

    But maybe you missed the last part: "The accepted answer describes a different solution, using a 'user cert store. (...)"

    With this solution, no additional user would be needed. The certificate will reside in a user cert store, and is readable only for the user, inaccessible for other users..

    18 hours ago, DelphiUdIT said:

    2) Indy does not support access to the Windows Cert Store ... at least as far as I know, until the keys are exportable ....

    Currenly the client is in Python:

     

    > For the client I use python while the server is done with Indy 10 using TIdTCPServer.

     

    So if there is Python support for cert stores it should be solvable.

    Alternatively, with Delphi, other HTTP clients may support reading from cert stores (TNetHTTPClient or others).

     

     

×