Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Motivate extensions to upgrade to MarkdownString #33577

Closed
jrieken opened this issue Aug 31, 2017 · 17 comments
Closed

Motivate extensions to upgrade to MarkdownString #33577

jrieken opened this issue Aug 31, 2017 · 17 comments
Assignees
Labels
debt Code quality issues
Milestone

Comments

@jrieken
Copy link
Member

jrieken commented Aug 31, 2017

We will disable command-links in the (deprecated) MarkedString and extension should use the new MarkdownString for command-links.

Background

When using markdown-formatted content, VS Code supports "links" that invoke a command, like so: [Hello](command:myExt.myCommand). This is a powerful feature but has a security concern: With a carefully crafted document and an extension that creates a markdown-string from that content users can be tricked into clicking on what appears to be a link but actually executed a command. Consider the following sample:

  • I happen to know that you use an extension that includes potential dangers commands, e.g. running arbitrary commands in a shell
  • I make you use my library file that contains a jsdoc-comment invoking such a command via a command-link
  • While coding you get a hover saying "click here for more info" which in reality runs a command

untitled

To tackle this, we ask extensions to identify their markdown contents as trusted or not. E.g. TypeScript will say it don't trust markdown contents because it doesn't generate it, it just forwards. Other extensions, esp. those that generate command-links on purpose will mark their contents as trusted. To support that we have introduced a new type, MarkdownString. The MarkdownString can be used wherever the MarkedString can be used and when constructing it, you can say if you trust the contents, e.g.

// trusted
const md = new MarkdownString('[My Cool Feature](command:myTrustedContents)')
md.isTrusted = true;

// not trusted
new MarkdownString(forgeinContentsLikeJsDoc)
@jrieken jrieken self-assigned this Aug 31, 2017
@jrieken jrieken added the debt Code quality issues label Aug 31, 2017
@jrieken jrieken added this to the September 2017 milestone Aug 31, 2017
@jrieken jrieken closed this as completed Sep 7, 2017
@jrieken
Copy link
Member Author

jrieken commented Sep 7, 2017

Extensions that are known to use command-links and that need updating during the September timeframe:

@ArtemGovorov
Copy link
Contributor

// trusted
new MarkdownString('[My Cool Feature](command:myTrustedContents)', true)

The MarkdownString constructor only has one parameter. Should it be:

// trusted
const md = new MarkdownString('[My Cool Feature](command:myTrustedContents)');
md.isTrusted = true;

?

@castwide
Copy link

castwide commented Sep 7, 2017

TypeScript does not recognize MarkdownString, either as a stand-alone constant or inside the vscode namespace.

import * as vscode from 'vscode';
new MarkdownString // <- unrecognized
new vscode.MarkdownString // <- unrecognized

I'm using vscode module 1.1.5 and engine 1.5.0. I fetched vscode.d.ts from https://raw.githubusercontent.com/Microsoft/vscode/4fc690be310dd02e0ab6529c0b9bf348a8b26a19/src/vs/vscode.d.ts. Is there something I'm missing?

@jrieken
Copy link
Member Author

jrieken commented Sep 7, 2017

Good catch @ArtemGovorov - me thinking about new ideas that aren't implemented yet... Yeah, today we only have the property. I'll update the samples...

@jrieken
Copy link
Member Author

jrieken commented Sep 7, 2017

@castwide We will ship the 1.16 release today, then you can get the latest API by setting the engine-field in package.json to 1.16. Run npm i after that and our scripts will download the latest version of vscode.d.ts

@metaleap
Copy link

metaleap commented Sep 12, 2017

MarkedString had a property language that was actually supremely handy and that I used quite a bit. MarkdownString no longer has that. Is that coming back by any chance? It wasn't harmful and it actually proved useful. Kinda 'tabula rasa' to just throw it out and have everyone code-bloat / wheel-reinvent their own workaround via markdown's triple-backtick syntax, when vscode used to readily handle it so smoothly before.

@jrieken
Copy link
Member Author

jrieken commented Sep 13, 2017

MarkedString had a property language that was actually supremely handy and that I used quite a bit. MarkdownString no longer has that.

It has it. The {language, value} part of MarkedString is nothing else than a triple back-tic and text. Like you have code blocks inside markdown, just more verbose. The string portion of both (MarkedString and Markdown) support this, like all the other markdown things (bullet list, links, inline code, italic, bold, etc...). The only reason the verbose-part exists is that in beginning we didn't support any markdown but stuff was just a string or a code block. Ever since we started to support more markdown the verbose variant as been obsolete.

@jrieken jrieken modified the milestones: September 2017, October 2017 Sep 25, 2017
@jrieken jrieken assigned seanmcbreen and unassigned jrieken Oct 2, 2017
@KamasamaK
Copy link

KamasamaK commented Oct 8, 2017

I was looking for an example to replace the language-highlighted version, but found that VS Code's own extensions still use {language, value} (Example).

Are you saying this would be replaced with something like new MarkdownString('```' + language + ' ' + value + '```') (or the template string equivalent)?

@jrieken
Copy link
Member Author

jrieken commented Oct 9, 2017

Are you saying this would be replaced with something like new MarkdownString('' + language + ' ' + value + '') (or the template string equivalent)?

Almost, newline character after language and the value are missing

@abe33
Copy link

abe33 commented Oct 9, 2017

Hi all, Kite's maintainer here, I didn't noticed that issue until recently and I just wanted to let you know that our next release will include the change to use MarkdownString instead of MarkedString.

@KamasamaK
Copy link

@jrieken Thanks for clarifying. You're right, it is a bit verbose. What do you think about adding a new method to MarkdownString called something like appendLanguageBlock?

@jrieken
Copy link
Member Author

jrieken commented Oct 9, 2017

Yeah, we can do that. Actually, internally we have it already and I just didn't know what all to expose in the API...

@KamasamaK
Copy link

Sounds great! Actually, after thinking about it a bit more, perhaps it should just be appendCodeBlock which optionally takes a language.

@jrieken
Copy link
Member Author

jrieken commented Oct 9, 2017

done

jrieken added a commit that referenced this issue Oct 9, 2017
@KamasamaK
Copy link

@jrieken Wow, that was fast! A bit nit picky, but since "code block" is generally written as two words, shouldn't the b be upper case?

@jrieken
Copy link
Member Author

jrieken commented Oct 9, 2017

Yeah, did that on purpose because it somehow felt better...

sandy081 pushed a commit that referenced this issue Oct 16, 2017
@jrieken jrieken modified the milestones: October 2017, November 2017 Nov 8, 2017
@seanmcbreen
Copy link

I think this issue can now be closed - LMK if that was the wrong call.

Sean
VS Code

@vscodebot vscodebot bot locked and limited conversation to collaborators Jan 21, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
debt Code quality issues
Projects
None yet
Development

No branches or pull requests

7 participants