Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add spec for proxy support by florelis · Pull Request #4152 · microsoft/winget-cli · GitHub
Skip to content

Add spec for proxy support - #4152

Merged
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec
Mar 15, 2024
Merged

Add spec for proxy support#4152
Flor Chacón (florelis) merged 8 commits into
microsoft:masterfrom
florelis:proxy-spec

Conversation

@florelis

@florelisFlor Chacón (florelis) commented Feb 7, 2024

Copy link
Copy Markdown
Member

Adding spec for #190

Microsoft Reviewers: Open in CodeFlow

@florelis
Flor Chacón (florelis) requested a review from a team as a code ownerFebruary 7, 2024 22:34
@github-actions

This comment has been minimized.

New Group Policy will also be added for IT admins to control the use of proxies.
The policies will be similar to those we already have for sources, so that a specific proxy can be required or only a predefined set of proxies can be allowed.

Proxies will not be used for the configuration features for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we do the proxy configuration at wininet, DO, restclient level, then winget configuration should already be covered. Is there something I missed?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the configuration code so I may be wrong, but the way I understand it is that that part of the code is mostly independent of the "package manager" side of things and some of it is written in .net. That's why I didn't include it in this.

I also don't know what network connections are done on that side. The only one that comes to mind is downloading the PS modules for each resource. If that's the only one, I don't see much case on going through the work of making it available on that side

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If PowerShell allows control over a proxy, then we could tunnel settings along to it. Currently, the proxy would only affect the ability to retrieve a configuration document from the internet.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with extending the use of proxies to configuration, but it doesn't make much sense to me if it will only affect retrieving the configuration file.

The Install-Module cmdlet has a -Proxy argument but it "ignores this parameter since it's not supported by Install-PSResource," so it doesn't really help.

Apparently we could also set the WebRequest.DefaultWebProxy property to set it for the whole PSSession, but we'd need to try it to be sure it works for this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, I'm fine with leaving configuration as future. I was just asking a naive question and I did not mean to add scope on this work.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md
@github-actions

This comment has been minimized.

yao-msft
yao-msft previously approved these changes Feb 9, 2024
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Things we may want to consider in the future:
* Extend support for proxies to the Configuration feature
* Add proxy support to the COM API
* Add support for proxies that require authentication

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is an option to use DefaultNetworkCredentials when creating a proxy connection. Will this / should this be used in the initial implementation to enable domain-joined accounts to use their domain proxy? Just thinking that it may reduce the need to fully support authentication while providing a solution that addresses many enterprise security items

Comment threaddoc/specs/#190 - Proxy Support.md Outdated

Proxies will not be used for the configuration features for now.

If a proxy is configured, it will be used for accessing sources and downloading installers.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I started implementing the feature and just now realized that this is not possible in all cases the way we currently do things. I was assuming it would be basically what Zuo Zongyuan (@eternalphane) did in #1776, i.e., adding the proxy argument in the call to InternetOpen(), but we have several other ways of fetching remote content and not all of them expose functionality to specify proxy.

  • Delivery Optimization cannot use a custom proxy, only the system-wide one.
  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.
  • The MSIX deployment APIs take a URI and have no option to configure a custom proxy. (I was assuming they took a stream and I could pass the proxied stream, but was wrong..)
  • cpprestsdk can take a custom proxy to use
  • Windows.Web.Http.HttpClient that we use for getting headers (for source update), downloading source MSIX packages and some other things, only allows us to use the system-wide proxy, not to set a custom one.

So, we can implement the feature for REST API requests and for downloading non-msix installers with wininet.
We definitely cannot implement the feature for using DO, or for MSIX installers (unless we download them first, but then we lose streaming installs).
And for the things that use HttpClient, we can't unless we decide to re-implement it using wininet or something else.

Would we be comfortable with saying "proxy is only used for non-MSIX installers (where it also forces the use of wininet over DO) and REST sources"? Or how else could we move the feature forward?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flor Chacón (@florelis) these are fantastic call-outs.

I think we should proceed with an experimental feature for proxy with the parts we can implement, and clearly state and link to the remaining details in Issues here (even if they are just to track work external to WinGet so the community can see as they are resolved).

Those other issues should be referenced in "Future Considerations" with links to the issues and we can continue to make progress over time. I have a fairly strong belief that anything we can implement will add value, and it will just continue getting better as we are able to track and close any remaining gaps.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • wininet can use a custom proxy (that's InternetOpen()), but we basically only use it to download installers.

It is used to download things other than installers, like manifests and the index. Installers should be using DO.

Comment threaddoc/specs/#190 - Proxy Support.md Outdated
Comment on lines +47 to +53
To configure the default proxy, a new `proxy` subcommand will be added to the `settings` command, with options to `set` and `reset` the default.
This will require admin privileges and does not require `ProxyCommandLineArgument` to be enabled.

```
> winget settings proxy set https://127.0.0.1:2345
> winget settings proxy reset
```

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I actually implemented this in #4203 was having set and reset subcommands for settings so that we can do
winget settings set [--setting] <SomeAdminSetting> [--value] <SomeValue> or winget settings set [--setting] <SomeAdminSetting>. Currently the only admin setting that can be used there would be DefaultProxy, but I think it could be extensible.

Flor Chacón (florelis) added a commit that referenced this pull request Mar 14, 2024
For #190
See spec on #4152 See #1776 for a related PR for the feature with the core implementation
for proxies in wininet
This PR adds basic support for using proxies. Most of the changes are
for enabling the configuration and blocking of the feature. This feature
will be gated behind an experimental feature setting
* Added Group Policy and Admin settings for enabling/disabling the use
of proxy CLI arguments and for setting a default proxy.
+ Pending: Internal review for new Group Policy
+ Extended `AdminSettings` to support settings with string values,
instead of only bool flags. The implementation is mostly a copy of the
bool case. In the future we should look back at it to reduce duplication
of code.
+ Added a `set` subcommand to `settings` that can set the admin settings
* Added CLI arguments to select a proxy on each different invocation of
winget, or to disable the use of a default one.
* Updated calls to wininet and cpprestsdk to use the provided proxy, and
added plumbing to get the arguments from the command line to the point
of use.
* Changed the flow around downloads to force winget to use proxies if
available.
Manually tested on a VM using mitmproxy
Pending: Adding automated tests tests.
Co-authored-by: yao-msft <50888816+yao-msft@users.noreply.github.com>
yao-msft
yao-msft previously approved these changes Mar 15, 2024
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@florelis@JohnMcPMS@Trenly@yao-msft@denelon