microsoftgraph / msgraph-cli

CLI tool for Microsoft Graph based on .NET
MIT License
97 stars 22 forks source link

attachment in send-email is causing an error "argument list too long" in docker #459

Open brotherko opened 6 months ago

brotherko commented 6 months ago

There is a limit in linux that only allow certain amount of bytes in the argument of a single command I'm not sure if this is an issue with my specific my environment but a 200KB attachment could break this limit

To reproduce

  1. mgc login
  2. generate a file that is ~ 200kb
  3. update the command in contentBytes then run it
    mgc users send-mail post \
    --body '{
    "message": {
    "subject": "hi",
    "body": {
    "contentType": "text",
    "content": "test"
    },
    "toRecipients": [
    {
    "emailAddress": {
      "address": "abc@abc.com"
    }
    }
    ],
    "attachments": [
    {
    "@odata.type": "#microsoft.graph.fileAttachment",
    "name": "screenshot.png",
    "contentBytes": "'"$(cat ./file.png | base64)"'",
    "contentId": "screenshot"
    }]
    },
    "saveToSentItems": "false"
    }'

Fix Allow user to supply the their --body payload in a separate file like what CURL did? see @filename in the below doc https://everything.curl.dev/http/post/simple.html

calebkiage commented 6 months ago

Hello @brotherko, thanks for reporting this issue. The CLI supports using response files to get around argument limits in shells. You can create a text file (e.g. args.rsp), enter each arg separated by spaces, then use mgc users send-mail post @args.rsp.

The syntax rules for response files are defined in the page linked above.

Let me know if this information helps with your issue.

brotherko commented 6 months ago

Hi @calebkiage Thanks! I'm wondering if this is a well known pattern for a .NET application to support syntax like this by default? I think it might be helpful to put it in the README for anyone who didn't work on a .NET application before(like myself)

However, still, I had a hard time crafting a JSON string that works.

  1. Double quote is automatically removed during execution even when I escape it with back slash
  2. Space is treated as a new token

This is what I've tried (I know it's not a valid request for the send-mail api. I just want to see if it parses the string properly)

--user-id
1234567
--body
"{\"name\":\"test\"\}"

This is what I got: Unrecognized command or argument 'name\:\test\\}'.

calebkiage commented 6 months ago

Hello @brotherko, this is a limitation of the commandline parser we use currently. It doesn't support escaping quotes very well. See https://github.com/dotnet/command-line-api/issues/1755 and https://github.com/dotnet/command-line-api/issues/1758

We might need to customize the response file parsing logic like the .NET team did for the dotnet cli (https://github.com/dotnet/runtime/pull/76271)

brotherko commented 6 months ago

Understood so I assume there is no work around for this issue? Would it be on the road map anytime soon?

calebkiage commented 6 months ago

Hi @brotherko, for now there's no workaround without a code change. Would you be willing to contribute code for this? We accept community contributions, and it would be the fastest way to get this change out. I'm happy to guide you through the process.