IsmaelMartinez / teams-for-linux

Unofficial Microsoft Teams for Linux client
GNU General Public License v3.0
2.88k stars 235 forks source link

Custom background images? #591

Closed nitro322 closed 1 year ago

nitro322 commented 2 years ago

Hello. I'm using your teams-for-linux client again after switching to the "official" client for a couple of years. With the recent news about Microsoft killing off the Linux client, was delighted to see that this project was still going strong, and even more so to learn that you're supporting background blur and images and various other features Microsoft apparently couldn't be bothered to support themselves on Linux. Very much appreciate what you've been doing here.

I'm trying to add a custom background image. My understanding from some basic searching is that there's supposed to be an Add Image option in the background image selector, but I don't seem to have that. Honestly not sure if this is a bug, known limitation, or if I'm just missing something since I've never done this before.

Can you please provide any guidance on whether this is supported and if so, how to use this feature? Apologies for the basic question here, but couldn't find a clear answer and not sure where else to ask. Thanks.

jijojosephk commented 2 years ago

Are you referring to background during video calls? If so, it's already working I believe.

nitro322 commented 2 years ago

Adding a custom background image during video calls, yes. If that's working for you, mind sharing how to do that? I'm expecting to see some kind of Add Image link or button in the "Show background effects" pane. I have the ability to select blur and various canned images, and get the Preview and Apply options, but nothing related to adding images.

jijojosephk commented 2 years ago

Ok, i understand now. I was referring to predefined backgrounds in the teams app. Never tried uploading image from local machine. Implementing this feature may be difficult. If it's present in web version, it could be possible here as well. I'd have it checked. Thanks.

jijojosephk commented 2 years ago

@nitro322

Can you check in chrome?

https://support.microsoft.com/en-us/office/change-your-background-for-a-teams-meeting-f77a2381-443a-499d-825e-509a140f4780

nitro322 commented 2 years ago

I tested with Vivaldi (not Chrome, but uses the same engine and I've never observed any compatibility issues between it and Chrome) and get the same behavior as the electron app. You bring up a good point about the web version - I was thinking of Teams as a desktop application, but if you're essentially re-packaging the web version then I could see where that feature wouldn't be supported. Checking the link you sent, for example, shows instructions for desktop and mobile clients, but not web.

So, looks like this may not be supported after all. Bummer, but not a big deal. Appreciate the dialog. Feel free to close this if you agree this isn't supported with the web app.

jijojosephk commented 2 years ago

It's sort of hidden. You can use the teams-for-linux app itself.

Screenshot from 2022-09-16 22-27-06 Screenshot from 2022-09-16 22-27-58

nitro322 commented 2 years ago

Right, I can find that part. I'm talking about custom images. Ie., this (from that same microsoft link you posted above):

You can also replace your background with one of the images provided, or with one of your own choosing. To use an image of your own, select Add new and then select one to upload from your computer. Make sure it's a .JPG, .PNG, or .BMP file.

That "Add new" option doesn't exist for me.

jijojosephk commented 2 years ago

Oh, I see. Have you had used the feature on the destop for linux or have you used windows or mac version?

nitro322 commented 2 years ago

It didn't exist in the Linux client. No background effects options existed. No, I've never used the Windows or Mac version, hence my general uncertainty in the OP as I've never actually used this feature myself before. But many of my work colleagues have used it, so I know it works under the right conditions. Seems like those conditions exclude the web client, unfortunately.

jijojosephk commented 2 years ago

Right, I see the images are dynamically loaded from a CDN. We might be able to do some hacks to achieve.

For example: https://static.cdn.microsoft.com/image1 request can be locally served using a different image. By faking the response and make the logic believe that it actually came from a web server. We can experiment.

malanvaneck commented 2 years ago

Hi there @jijojosephk, I really hope there is something we could do. Is there could you possibly point me to what specific URL I can overwrite to fake the images? I see the above DNS does not actually exist.

jijojosephk commented 2 years ago

@malanvaneck that was just a url I added while writing comment. Not an actual one.

Preview: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03_thumb.png?v=0.1

Background: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03.png?v=0.1

malanvaneck commented 2 years ago

Thanks @jijojosephk

Actually faking the URL locally will be a problem as its an HTTPS request:

[19537:1011/141457.927329:ERROR:ssl_client_socket_impl.cc(983)] handshake failed; returned -1, SSL error code 1, net_error -202 [ERROR] Unknown cert issuer for url: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/fluentSpaces4.png?v=0.1 [ERROR] Issuer Name: Internet Widgits Pty Ltd [ERROR] The unknown certificate fingerprint is: sha256/qF4veWeE4gVPvPp+5bV0ACX4JxChH39nMhTy+in7s3Q=

malanvaneck commented 2 years ago

Apologies, only just now saw the --customCACertsFingerprints option. Got around the cert issues like this: teams-for-linux --customCACertsFingerprints sha256/dRZpQs2cfMlKCdkKOMvGNHASikwm0WmHRtIhEypr880=

Images are not successfully being pulled from my mini python server: 127.0.0.1 - - [11/Oct/2022 16:49:08] "OPTIONS /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "GET /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "OPTIONS /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "GET /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 -

But black image on teams-for-linux

jijojosephk commented 2 years ago

@malanvaneck I think you're pretty close. I also get black background. You're not changing the protocol or scheme. You might be stuck in CORS issue. What do you see in the debugger?

I took a slightly different route. Looks like the approach I'm taking requires some help from electron dev I guess. I left a comment in bug here

What I tried is below with response ERR_UNKNOWN_URL_SCHEME

// In the main file
protocol.registerSchemesAsPrivileged([
    {
        scheme: 'atom',
        privileges: {
            bypassCSP: true,
            corsEnabled: true,
            secure: true,
            standard: true,
            supportFetchAPI: true
        }
    }
]);

// When app is ready
protocol.registerHttpProtocol('atom', (request, callback) => {
        request.url = path.join(__dirname, '../assets/bg/bg1.png');
        callback(request);
});

// Before request
window.webContents.session.webRequest.onBeforeRequest({ urls: ['https://*/*'] }, (details, callback) => {
    if (details.url === 'https://mywebsite.com/bg/bg1.png') {
        callback({
            redirectURL: 'atom://bg1.png'
        });
    } else {
        // Proceed normally
        callback({});
    }
});

net::ERR_UNKNOWN_URL_SCHEME

malanvaneck commented 2 years ago

Hi there @jijojosephk, I see these errors in the logs: 41818:1012/093045.034783:ERROR:ssl_client_socket_impl.cc(983)] handshake failed; returned -1, SSL error code 1, net_error -202

Also, I have noticed that overwriting the statics.teams.cdn.office.net DNS name to point to local causes Teams to sometimes be unresponsive.

Xisiqomelir commented 2 years ago

Hello, I'm extremely interested in this feature. I reboot to the other partition literally only to switch on the company-required background for departmental calls and all the rest of the time I'm peacefully in Linux reading chat. With the previous official client I can confirm it was impossible to switch the background, but for the Windows client it was fairly straightforward to add a custom bg.

Where are the default backgrounds stored? Perhaps one of them could be overwritten?

jijojosephk commented 2 years ago

@Xisiqomelir They're not stored locally, served from a MS CDN. I tried to fake the response from a local file but did not succeed. 32253 seems to be blocker from electron framework.

Xisiqomelir commented 2 years ago

Ahh that’s typically M$ and very annoying.

In any case, thanks for your work in keeping the client alive especially this year that they’re trying to kill it.

cpfeiffer commented 1 year ago

@jijojosephk It works if you serve the image via https with an Access-Control-Allow-Origin header (just setting it to * worked). Redirecting to a data: url might also work.

DerXteMensch commented 1 year ago

@cpfeiffer Could you tell us how exactly this can be used?

What code do we need given that we have a URL of a custom background picture? And where do we need to put that code?

Speaking as a user of teams-for-linux, not a developer.

amenk commented 1 year ago

I tried a data URL (that's some Cat Picutre)

window.webContents.session.webRequest.onBeforeRequest({ urls: ['https://*/*'] }, (details, callback) => {
    if (details.url === 'https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03.png?v=0.1') {
        callback({
            redirectURL: 'data:image/png;base64,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'
        });
    } else {
        // Proceed normally
        callback({});
    }
});

But I am getting

Uncaught TypeError: Cannot read properties of undefined (reading 'session')
    at <anonymous>:1:20

(I tried this in the dev tools )

EDIT: tried inserting it into onBeforeRequestHandler / app/mainAppWindow/index.js:135

UNSAFE_REDIRECT .. happens also for data urls

kw-pr commented 1 year ago

@amenk UNSAFE_REDIRECT : Maybe you need to add the Access-Control-Allow-Origin: * header

Not sure how... I found this https://stackoverflow.com/a/52243138/956397

amenk commented 1 year ago

I tried a lot with CORS and the request but it all caused UNSAFE_REDIRECTS or made everything stop working.

But now I found another way to change the background to a custom one, using the debugger.

image

  1. Search for the function configureEffect
  2. Open a new meeting in a channel
  3. Click any of the built-in backgrounds
  4. Code should stop now at that function
  5. Paste A.backgroundImageUrl = "data: ....." with your image into the console, press enter (probably a hosted image works as well?)
  6. Continue the code

The custom image should show in the preview and I tested that it is also visible to the other party in a call.

Unfortunately that custom background is not preserved after restarts.

The other question is if this can be made usable in a nice way - i.e. is the Electron app able to inject / patch Javascript code?

cpfeiffer commented 1 year ago

@DerXteMensch Sorry, this is nothing for end-users, yet. I was merely trying to check if it works at all, because all previous attempts in this thread appeared to have been unsuccessful. All I did was patch the onBeforeRequestHandler(), check the URL for one of the default background images and redirect to a custom image of my own. The only "special" thing I had to do was return the Access-Control-Allow-Origin: * policy from my custom server.

To make this usable for end-users, one would

jijojosephk commented 1 year ago

Well I have something interesting :smile: Once the page is loaded. Open debug->console and execute the script below.

Replace args[0]=<daturl> with base64 converted image of your choice. You may use https://www.base64-image.de/ to convert.

Click calendar Meet Now Select background effect Click any image

May be we're very close :smile:

const controller = typeof window.angular !== 'undefined' ? window.angular.element(document.documentElement).controller() : null;
const x = controller.callingService._deviceManagerService.setBackgroundImageOnDevice;
controller.callingService._deviceManagerService.setBackgroundImageOnDevice = (...args) => {
    args[0] = '<daturl>'; x.apply(controller.callingService._deviceManagerService, [...args]);
};
jijojosephk commented 1 year ago

@amenk @cpfeiffer try the above.

amenk commented 1 year ago

@jijojosephk Seems to work pretty well. It replaces all the in-built images with the custom one. Draft pull request incoming ...

jijojosephk commented 1 year ago

Breakthrough :tada: Now I need to stitch everything together as a feature. Hooray!

The car image is hosted in apache. So we need to have a light weight web server starting with application at a custom port. Then things are pretty doable.

https://user-images.githubusercontent.com/11662148/236913080-4f5ee054-bf76-431b-a17f-511a24643ada.mp4

jijojosephk commented 1 year ago

@nitro322 @malanvaneck @Xisiqomelir @cpfeiffer @DerXteMensch @amenk @kw-pr try 1.0.84 pre-release. Read https://github.com/IsmaelMartinez/teams-for-linux/tree/develop/app/config

RolandRosenfeld commented 1 year ago

It seems to work, really great!

But I have some annotations:

My custom_bg.json:

[
    {
        "filetype": "jpg",
        "id": "Custom_bg01",
        "name": "Regatta",
        "src": "/teams-for-linux/custom-bg/regatta.jpg",
        "thumb_src": "/teams-for-linux/custom-bg/regatta-thumb.jpg"
    }
]

results in the following apache log:

::1 - - [09/May/2023:09:05:29 +0200] "GET /regatta-thumb.jpg HTTP/1.1" 200 35755 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.199 Safari/537.36"
::1 - - [09/May/2023:09:05:34 +0200] "GET /regatta.jpg HTTP/1.1" 200 522403 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.199 Safari/537.36"

while curl http://localhost/teams-for-linux/custom-bg/regatta.jpg gives:

::1 - - [09/May/2023:09:14:16 +0200] "GET /teams-for-linux/custom-bg/regatta.jpg HTTP/1.1" 200 522347 "-" "curl/7.74.0"

No idea, why teams-for-linux strips the path on request...

RolandRosenfeld commented 1 year ago

Seems that I misinterpreted the documentation. /teams-for-linux/custom-bg in src and and thumb_src of the custom_bg.json seem to be fixed strings that can not be changed, while <image-path> is really the path (not only the filename). So now I changed src to "/teams-for-linux/custom-bg/teams/regatta.jpg" and placed regatta.jpg in directory teams below the webserver root and everything works as expected.

jijojosephk commented 1 year ago

@RolandRosenfeld I guess the comment you're talking about is sample in the readme. They were added for the understanding. JSON file can't have comments. Sorry if that was misleading. And for the url, what's given in the json file /teams-for-linux/custom-bg/ will be replaced withhttp://localhost. So, /teams-for-linux/custom-bg/regatta.jpg becomes http://localhost/regatta.jpg

DerXteMensch commented 1 year ago

Thanks so much for your effort. However it's not yet completely working for me.

I have put two jpgs into folder /var/www/html. apache2 is running. And I can view the jpgs in my browser under http://localhost/Teamshintergrund.jpg and http://localhost/Teamshintergrund_thumb.jpg. I have put a newly created custom_bg.json to /home/user/.config/teams-for-linux/custom_bg.json. The json contains:

[

{
    "filetype": "jpg",
    "id": "Teamshintergrund",
    "name": "Teamshintergrund",
    "src": "/teams-for-linux/custom-bg/Teamshintergrund.jpg",
    "thumb_src": "/teams-for-linux/custom-bg/Teamshintergrund_thumb.jpg"
}

]

When I open teams-for-linux, I see the thumbnail. But when I select it, the preview remains with the beforehand selected image (see screenshot). Also when I enter the meeting, it's still the beforehand selected image, not the image from localhost.

Bildschirmfoto vom 2023-05-09 16-29-49

What am I doing wrong?

RolandRosenfeld commented 1 year ago

Are you sure, that you enabled Access-Control-Allow-Origin: *? Try curl -v -s http://localhost/Teamshintergrund.jpg , which should show it in the server headers. Without this header I only see the thumb but not the background...

DerXteMensch commented 1 year ago

I guess I forgot to stop and restart apache2.

First I got an error while restarting:

Mai 09 17:56:18 malte-ThinkPad-X380-Yoga apachectl[50213]: AH00526: Syntax error on line 171 of /etc/apache2/apache2.conf: Mai 09 17:56:18 malte-ThinkPad-X380-Yoga apachectl[50213]: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

This did the trick:

sudo a2enmod headers

Thanks everybody! That's really great to have custom background images working!

jijojosephk commented 1 year ago

With right configuration mostly people find this working now. Please follow the instructions on release 1.0.84. Closing this now.

jijojosephk commented 1 year ago

Minor breaking change in 1.0.87, read https://github.com/IsmaelMartinez/teams-for-linux/tree/develop/app/config#custom-backgrounds. custom_bg.json to be moved to server.

BzSpi commented 1 year ago

Hi,

I can have it working with the binary download but not with Snap (1.0.88 - edge channel). Is there a limitation ? I have all permissions enabled.

jijojosephk commented 1 year ago

@BzSpi if things are ok with native, stick with that. We don't know what issues are there with snap. Are you using a local server or a remote one?

BzSpi commented 1 year ago

A local one. I can't see any request coming to the server when using snap and nothing in logs.

jijojosephk commented 1 year ago

Can you run the app from the command line? See if there are errors.

BzSpi commented 1 year ago

No error in the command line output and no request have been made to the HTTP server.

$ $ teams-for-linux --appLogLevels error,warn,info,debug
configPath = /home/xxxx/.config/teams-for-linux
configFile = {
  customBGServiceBaseUrl: 'http://localhost/msteams/',
  minimized: true,
  appLogLevels: 'debug'
}
processArgs [
  '/opt/teams-for-linux/teams-for-linux',
  '--appLogLevels',
  'error,warn,info,debug'
]
[180740:0516/084936.761534:ERROR:browser_main_loop.cc(270)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed
[180740:0516/084936.761664:ERROR:browser_main_loop.cc(270)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed
[180740:0516/084936.761711:ERROR:browser_main_loop.cc(270)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed
[180740:0516/084936.761747:ERROR:browser_main_loop.cc(270)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed
[180740:0516/084936.761784:ERROR:browser_main_loop.cc(270)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed
did-finish-load
did-finish-load
jijojosephk commented 1 year ago

@BzSpi you need to open debug tools. From the tray icon menu choose debug and go to network tab. see what response you're getting for http://localhost/msteams/<your-image>

BzSpi commented 1 year ago

Hi @jijojosephk

My bad, I had a deb version of the application along with the snap version. I've uninstalled everything all and reinstalled the snap version and this is working file.

Sorry for the inconvenience.