Add TLS config mirroring

Description
Modify tlsconfig.py to mirror client's ciphersuites to server
Checklist

[ ] I have updated tests where applicable.
[ ] I have added an entry to the CHANGELOG.

That question is slightly confusing to me - when do you see SSL_MODE_SEND_FALLBACK_SCSV? I thought this would only show up on retries if the application sets it explicitly.

Not OP, but on my end SCSV suites are sent by pyOpenSSL on the client hello. Specifically,
TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff) is sent even when not included in the cipher list.

That's exactly like @LicketySpliket says - it always appears at the end of the ciphersuites' list, even if I comment it out in map (i.e. it's not copied from client request). Tested it by visiting https://howsmyssl.com with Chrome and Firefox with and without mitmproxy. Also, all requests using curl always send this CS (even without mitmproxy). I suppose this is from OpenSSL itself.

Thanks. I'm as smart as anyone here, but https://www.openssl.org/docs/manmaster/man3/SSL_get_secure_renegotiation_support.html#SECURE-RENEGOTIATION has two options that could at least be tried out.
SSL._lib.SSL_OP_LEGACY_SERVER_CONNECT and SSL._lib.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION are both available via cryptography.

I am also interested in this feature. I hope this will defeat TLS fingerprinting like cloudflare does which is annoyance for me. One question though: Is it enough to just clone the cipher list or are the extensions also part of the fingerprint?
I checked the current openssl source and in ssl_cipher_list_to_bytes() the addition of SSL3_CK_SCSV (openssl name for TLS_EMPTY_RENEGOTIATION_INFO_SCSV) is hard-coded if renegotiation is off. And renegotiation has to be off for HTTP/2 per RFC7540. Can we just turn on renegotiation and get away with it?
I think the best option is to post-process the client hello generated by the code above and remove that signaling cipher from the list and to additional corrections if needed. In the same process one could also verify if the mirroring could be successfully done and issue a warning if not. Any opinions?

One question though: Is it enough to just clone the cipher list or are the extensions also part of the fingerprint?

That depends on the fingerprint being used. https://github.com/salesforce/ja3 is common, although I'd suspect that Cloudflare uses their own thingy.

Can we just turn on renegotiation and get away with it?

(I know as much as you do here)

I think the best option is to post-process the client hello generated by the code above and remove that signaling cipher from the list and to additional corrections if needed. In the same process one could also verify if the mirroring could be successfully done and issue a warning if not. Any opinions?

I'm afraid we kind of need to get our TLS library (OpenSSL curently) to emit the right thing, otherwise the crypto operations will fail later (you can't just modify the ClientHello and expect to get away with it). I'm afraid the options are 1) coerce OpenSSL to do what we want (not sure if possible), or 2) switch to rustls as an alternative TLS backend and modify it to our needs. I refuse to ship a custom patched version of OpenSSL (too much pain), but PyO3 is actually very awesome to use.

One question though: Is it enough to just clone the cipher list or are the extensions also part of the fingerprint?

That depends on the fingerprint being used. https://github.com/salesforce/ja3 is common, although I'd suspect that Cloudflare uses their own thingy.

Thanks for the link. That implementation checks more than the cipher list so that is a no then and this PR alone will not solve anything.

Can we just turn on renegotiation and get away with it?

(I know as much as you do here)

With the answer from above this question became irrelevant.

I think the best option is to post-process the client hello generated by the code above and remove that signaling cipher from the list and to additional corrections if needed. In the same process one could also verify if the mirroring could be successfully done and issue a warning if not. Any opinions?

I'm afraid we kind of need to get our TLS library (OpenSSL curently) to emit the right thing, otherwise the crypto operations will fail later (you can't just modify the ClientHello and expect to get away with it).

Are you sure? As long as the modification of the client_helo does not advertise a feature that openssl does not support, this should work? The frame is AFAIK not cryptographically secured so any functional modification such as these should pass:

Remove or reorder ciphers, extensions, curves, etc.
Add GREASE
Add ciphers to the list that are unlikely to be picked because better ones are at the head of the list.

I'm afraid the options are 1) coerce OpenSSL to do what we want (not sure if possible), or 2) switch to rustls as an alternative TLS backend and modify it to our needs. I refuse to ship a custom patched version of OpenSSL (too much pain), but PyO3 is actually very awesome to use.

sounds like a larger project. If 1) is somehow feasible that would be the best.

Are you sure? As long as the modification of the client_helo does not advertise a feature that openssl does not support, this should work? The frame is AFAIK not cryptographically secured so any functional modification such as these should pass:

The entire ClientHello directly feeds into the transcript hash (https://datatracker.ietf.org/doc/html/rfc8446#section-4.4.1), so modifications will be detected.

Are you sure? As long as the modification of the client_helo does not advertise a feature that openssl does not support, this should work? The frame is AFAIK not cryptographically secured so any functional modification such as these should pass:

The

Are you sure? As long as the modification of the client_helo does not advertise a feature that openssl does not support, this should work? The frame is AFAIK not cryptographically secured so any functional modification such as these should pass:

The entire ClientHello directly feeds into the transcript hash (https://datatracker.ietf.org/doc/html/rfc8446#section-4.4.1), so modifications will be detected.

You are right, my memory was a little rusty from the times where cipher downgrade attacks were still possible. :)
However, I did look at this a little more. Maybe it is possible to alter the client hello message by calling ssl3_init_finished_mac() and then  ssl3_finish_mac(altered client hello) to restart the MAC. This is internally also done in response to a HelloRetryRequest. I have not checked if the two functions are accessible from python though.
If that does not work, I think it will get tough, openssl just does not give enough control over the client hello construction process. And the use of TLS_EMPTY_RENEGOTIATION_INFO_SCSV is the way openssl solves the renegotiation vulnerability. iOS uses a regegotiation_info extension and you cannot get openssl to send that: https://github.com/openssl/openssl/issues/8143

Talking about fingerprinting, there's also Cloudflare's MALCOLM (https://github.com/cloudflare/mitmengine & https://malcolm.cloudflare.com/) which, as I get it, uses technique other than JA3
Anyway, I can say from my experience that ciphersuite list matters most in fingerprinting, but not everything (I've seen websites that also check extensions present).

Thanks for the pointer @fedosgad! I think it's not completely unintentional that OpenSSL does not support spoofing browser ClientHellos. Making rustls work would be a very fun undertaking, but also a considerable effort.

Talking about fingerprinting, there's also Cloudflare's MALCOLM (https://github.com/cloudflare/mitmengine & https://malcolm.cloudflare.com/) which, as I get it, uses technique other than JA3 Anyway, I can say from my experience that ciphersuite list matters most in fingerprinting, but not everything (I've seen websites that also check extensions present).

From my testings, the one actually matters the most is Extensions, I tried to match browser's ciphersuites, signature algorithms, ec point formats, supported groups and websites that use Cloudflare always return 403 status error because OpenSSL can't really spoof Extensions.
You can easily test with curl-impersonate, try to modify User-Agent, even ciphersuite of Chrome and it still passes Cloudflare's checks, because Extensions are still matched with Chrome. In fact I changed heavily chrome_104.config to:
`--ciphers TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-CHACHA20-POLY1305
--http2
--false-start
--compressed
--tlsv1.2
--no-npn
--alps
--cert-compression brotli
--location`
And chrome_104.headers to:
sec-ch-ua: "Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:102.0) Gecko/20100101 Goanna/5.2 Firefox/102.0 PaleMoon/31.3.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9
Test cmd (this website uses Cloudflare's anti bot settings):
curl_chrome104.bat https://alternativeto.net
And it stills works, even with heavily utterly modified Ciphersuite and User-agent.
Link: https://github.com/depler/curl-impersonate-win


BadgeFramework has potential bug in OpenBadge get_status

get_status gets seconds and milliseconds, but in two different commands. Since several milliseconds will elapse between these two commands, the milliseconds might belong to the next seconds.
For example, if the time for the first command is 1111.999, and it takes 20 ms to call the next command, the next command will get the millisecond for 1112.019, which is wrong

This might be a more general problems in more places

Yup, most of the functions in badge.py do that.

Another thing I should change (and test) is the way these functions can get timestamps as a variable. It's better if they get an actual timestamp and split it, instead of getting them as separate variables.

closed #102


Twitter does recognize the screen name and mentions the user. The tweet is being displayed properly otherwise. The tweet IDs check out too.
This is the responsible snippet.
user is a User object, previous_tweet is a status
tweet = api.update_status("@" + user.screen_name + " " + f.read(), in_repy_to_status_id=previous_tweet.id_str)

I've also tried .id instead of .id_str, but that didn't help either.
Additionally I've added a delay of 10 seconds between the previous_tweet and this tweet, just to make sure everything is registered at Twitter.

I'm unable to reproduce this issue.
Using either the id or id_str attribute both work, and the new Tweet is a reply to the specified Tweet.
Is user the author of previous_tweet? e.g. previous_tweet.user.screen_name should work.
If so, can you provide a reproducible example of what you're trying?

Yes,user is the author of previous_tweet.
I've got it to work in a simpler example and will now try to figure out what I got wrong in my og code.
import tweepy
import secrets

auth = tweepy.OAuthHandler(secrets.consumer_key, secrets.consumer_secret)
auth.set_access_token(secrets.access_token, secrets.access_token_secret)
api = tweepy.API(auth)

tweet = api.update_status("my name jeff")
api.update_status("@" + tweet.user.screen_name + " lol", in_reply_to_status_id=tweet.id)

No - I just can't seem to get it to work...

I'm going to close this since it seems to be an issue with your code rather than the library.
Feel free to provide your code, either here or in the official Discord server, if you want help debugging it.

I have the same issue.
It works perfectly when replying to my own tweets, but as of now, I've not managed to reply to somebody else's Tweets.
It is exactly what ogierm describes, the tweet will be pushed out and be visible on my profile under "Tweets & replies" but It will not show up when actually checking the original tweet.

I'm still unable to reproduce this.
Something like api.update_status("@Twitter Test Tweet", in_reply_to_status_id=1173652184405352449) works for me.
You need to provide a reproducible example (MCVE/SSCCE) of what you're trying, so that the issue can be pinpointed, not the other way around.

I have this issue too, exactly as described by "FBosler"

For me the reply seems to appear not in the thread but as a separate tweet. Any ideas why ?


deepin.deepin-icon-theme: 15.12.59 -> 15.12.60

Semi-automatic update generated by https://github.com/ryantm/nixpkgs-update tools. This update was made based on information from https://repology.org/metapackage/deepin-icon-theme/versions.
meta.description for deepin.deepin-icon-theme is: '"Icons for the Deepin Desktop Environment"'.
Compare changes on GitHub

Checks done (click to expand)

built on NixOS

0 of 0 passed binary check by having a zero exit code.

0 of 0 passed binary check by having the new version present in output.

found 15.12.60 with grep in /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60

directory tree listing: https://gist.github.com/a956d164e2fef0bdf40a6419121ccc67

du listing: https://gist.github.com/d636824fae67c46b1b38bd4e086f3e88

Outpath report (click to expand)

Outpath difference report
13 total rebuild paths
4 package rebuilds
4 x86_64-linux rebuilds
4 i686-linux rebuilds
1 x86_64-darwin rebuilds
4 aarch64-linux rebuilds
First ten rebuilds by attrpath
deepin.deepin-desktop-schemas
deepin.deepin-icon-theme
deepin.deepin-metacity
deepin.deepin-wm

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60 \
  --option binary-caches 'https://cache.nixos.org/ https://r-ryantm.cachix.org/' \
  --option trusted-public-keys '
  r-ryantm.cachix.org-1:gkUbLkouDAyvBdpBX0JOdIiD2/DP1ldF3Z3Y6Gqcc4c=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(r-ryantm's Cachix cache is only trusted for this store-path realization.)
Or, build yourself:
nix-build -A deepin.deepin-icon-theme https://github.com/r-ryantm/nixpkgs/archive/2fee653112a04e3396c01bbb3abf01d33eb59f4a.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60
ls -la /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60/bin

cc @romildo for testing.

Unexpected error: command failed with exit code 1 on x86_64-darwin (full log)
Attempted: deepin.deepin-icon-theme
Partial log (click to expand)

trying https://github.com/linuxdeepin/deepin-icon-theme/archive/15.12.60.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   139    0   139    0     0    780      0 --:--:-- --:--:-- --:--:--   780
100 11.6M    0 11.6M    0     0  7160k      0 --:--:--  0:00:01 --:--:--  9.9M
unpacking source archive /private/tmp/nix-build-source.drv-0/15.12.60.tar.gz
fixed-output derivation produced path '/nix/store/d3ikfbiaxfv61nfaxq3pc4yman0p98lm-source' with sha256 hash '01phj73njrivpjxf33q6v3gyzbbal6mhxkrjxdcc8ai2wsv3bmsh' instead of the expected hash '01iaxi4x4zic67yz9khjwl516wb3rnajcfqrkwaich8209isk6yf'
cannot build derivation '/nix/store/mbnjb2zc15vjc70vhrxnfslf6gdk71d8-deepin-icon-theme-15.12.60.drv': 1 dependencies couldn't be built
error: build of '/nix/store/mbnjb2zc15vjc70vhrxnfslf6gdk71d8-deepin-icon-theme-15.12.60.drv' failed

Success on aarch64-linux (full log)
Attempted: deepin.deepin-icon-theme
Partial log (click to expand)
create link /nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60/share/icons/deepin/apps/48/media-player.svg to //nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60/share/icons/hicolor/48x48/apps/media-player.svg
Fix icon files permission
find /nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60/share/icons -type f -exec chmod 644 {} \;
glibPreFixupPhase
post-installation fixup
shrinking RPATHs of ELF executables and libraries in /nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60
strip is /nix/store/p9akxn2sfy4wkhqdqa3li97pc6jaz3r1-binutils-2.30/bin/strip
patching script interpreter paths in /nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60
checking for references to /build in /nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60...
/nix/store/4gvgqf08vbrpjr1cz9g8qyjfxyhhf5x1-deepin-icon-theme-15.12.60

Success on x86_64-linux (full log)
Attempted: deepin.deepin-icon-theme
Partial log (click to expand)
create link /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60/share/icons/deepin/apps/48/media-player.svg to //nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60/share/icons/hicolor/48x48/apps/media-player.svg
Fix icon files permission
find /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60/share/icons -type f -exec chmod 644 {} \;
glibPreFixupPhase
post-installation fixup
shrinking RPATHs of ELF executables and libraries in /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60
strip is /nix/store/vcc4svb8gy29g4pam2zja6llkbcwsyiq-binutils-2.30/bin/strip
patching script interpreter paths in /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60
checking for references to /build in /nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60...
/nix/store/yh2rv69s2ggsgm2nw6762kxr5pskrvyb-deepin-icon-theme-15.12.60

duplicate of https://github.com/NixOS/nixpkgs/pull/49499


Computer brands feature request

Update the Computer faker with brands

Codecov Report

Merging #654 (32861bf) into main (a1e090e) will decrease coverage by 0.15%.
The diff coverage is 100.00%.

:mega: This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more
@@             Coverage Diff              @@
##               main     #654      +/-   ##
============================================
- Coverage     92.79%   92.64%   -0.15%
+ Complexity     2623     2621       -2
============================================
  Files           281      281
  Lines          5396     5397       +1
  Branches        589      589
============================================
- Hits           5007     5000       -7
- Misses          239      244       +5
- Partials        150      153       +3

Impacted Files
Coverage Δ

...in/java/net/datafaker/providers/base/Computer.java
100.00% <100.00%> (ø)

...ain/java/net/datafaker/idnumbers/EnZAIdNumber.java
83.33% <0.00%> (-8.34%)
:arrow_down:

.../main/java/net/datafaker/service/FakerContext.java
83.58% <0.00%> (-4.48%)
:arrow_down:

...ker/idnumbers/pt/br/IdNumberGeneratorPtBrUtil.java
92.59% <0.00%> (-3.71%)
:arrow_down:

.../java/net/datafaker/service/FakeValuesService.java
84.75% <0.00%> (-0.20%)
:arrow_down:

.../datafaker/transformations/sql/SqlTransformer.java
88.19% <0.00%> (+0.73%)
:arrow_up:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more

Looks great to me! Thank you! This is now available in the snapshot version.

Looks great to me! Thank you! This is now available in the snapshot version.

Thanks. I have some more fakers to add. Should I open an issue for each faker?

No, you don't have to. Feel free to contribute without opening issue for each faker


Make partial_fit force a single iteration

Currently partial_fit and fit + warm_start have the same behavior. I think it would be more useful if we followed SGD's example and trained for exactly one epoch when partial_fit is called, regardless of the value of epochs/n_iter passed to __init__.

I wanted to open an issue about it in relation to dask-ml HyperbandSearchCV.
I was studying the algorithm more in detail as well as the dask implementation of Hyperband.
My understanding is that when you specify the parameter max_iter in HyperbandSearchCV this corresponds to the maximum number of calls to partial_fit.
In theory one call to partial_fit should correspond to one epoch that is one pass through the whole dataset.
In the current implementation it seems that a call to partial fit still trains the model for all the epochs but instead of rebuilding the model it uses the same one that was previously fitted, having the effect of updating the current weights.
The workaround to making it work correctly with HyperbandSearchCV would be not to specify the epochs in the initialization so that epochs=1.
I also believe it would make sense to change the behavior as you mentioned.
I would also ask @TomAugspurger's opinion about my understanding of the issue.
Many thanks
Gio

@stsievert is probably better able to answer that.

The workaround to making [SciKeras] work correctly with HyperbandSearchCV would be not to specify the epochs in the initialization so that epochs=1.

Yes. That's correct. SciKeras should use epochs=1 to fit inside of HyperbandSearchCV's rule of thumb. I would probably specify this manually because I don't like relying on defaults.
Of course, epochs=2 will not throw any errors, but it will require a small modification of the rule of thumb.
Does that answer your question?

In the current implementation ...

I think you're largely correct. Here's what happens right now:

HyperbandSearchCV's treats one iteration in max_iter as one partial_fit call.*
In most Scikit-learn models, one partial_fit call corresponds to one pass through the dataset (e.g, MLPRegressor, SGDRegressor).
In the current implementation of SciKeras, partial_fit and fit perform the same action and train for all epochs, not a single pass through the dataset.

*As detailed in Hyperband's rule of thumb, the number of examples for each call should vary

In most Scikit-learn models, one partial_fit call corresponds to one pass through the dataset
learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor#sklearn.linear_model.SGDRegressor.partial_fit))

In the current implementation of SciKeras, partial_fit and fit perform the same action and train for all epochs

I think we should make these match. It should be as easy as having partial_fit inject epochs=1 into the Model.fit call, right?

Yup. I'm working on a PR for that right now, and it's pretty easy.

Thank you everyone for confirming, this change would rule out any possible doubt.

Yup. I'm working on a PR for that right now, and it's pretty easy.

Oh I just started too! I'll let you handle this one, I trust you'll come up with a better solution.


Flutter stops animations even when screen is only partially obscured

See: b/151332834
When showing native bottom sheet or alert dialogs, screen is only partially obscured. If there's an ongoing animation, it stops when the native UI starts displaying leading to jarring effects. See repro:
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(
    MaterialApp(
      home: MyApp(),
      theme: ThemeData(
        splashFactory: InkRipple.splashFactory,
      ),
    )
);

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  _launchURL() async {
    const url = 'tel://9000000';
    if (await canLaunch(url)) {
      // This uses url launcher plugin to display an overlay.
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter"),
      ),
      body: Center(
          child: FlatButton(
            child: Text("A long launch URL"),
            shape: RoundedRectangleBorder(
              side: BorderSide(
                color: Colors.blue,
                width: 1,
              ),
              borderRadius: BorderRadius.all(Radius.circular(24)),
            ),
            onPressed: _launchURL,
          )
      ),
    );
  }
}

Video is attached. Ripple gets stuck in the middle when the overlay is shown.
RPReplay_Final1583912940.mp4.gz

It looks like opening this bottom sheet is putting flutter into the paused or detached lifecycle state (https://github.com/flutter/engine/blob/d0c2418dfed3e828c1a003ff8ac4a1baaf5e7ae8/lib/ui/window.dart#L173) instead of "inactive".
The scheduler which controls frame will stop pumping them if  we're in these states:
https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/scheduler/binding.dart#L336
We would need to verify which lifecycle state they're in when the native UIView is shown

We have a lifecycle test here: https://github.com/flutter/engine/blob/1f1e2ba58e6f62ab9c3808fada9769a3f23a3a77/testing/scenario_app/ios/Scenarios/ScenariosTests/AppLifecycleTests.m
But its marked as skipped.
cc @xster @dnfield

Yes. The tricky part is we would likely want to be in detached state if the entire screen is obscured. Hopefully there's a way to distinguish that in all platforms we support.

The detached state is when flutter app is running without a view. In this example, the view is still there. I checked the lifecycle state sequence, it goes from resume -> inactive -> pause. We disabled frame when it become pause state. Ideally, the app should stay in inactive when the view is obscured but still visible.

I only have an iPad at home but in my case, it's only going from resume <-> inactive and I'm still seeing the same issue. Looks like we're having a mapping issue (though either way, unrelated to detached, which is the engine not having a VC attached, not this case).
Somewhat related to https://github.com/flutter/flutter/issues/45131 also.
We've been so historically defensive about stopping things because we're worried about triggering a background opengl crash.
I didn't spend a lot of time testing yet but inactive seems appropriate for this case and pseudo obstructions like control center etc.
Wonder what we're doing differently though @chunhtai

Seems related to https://github.com/flutter/flutter/issues/45595

Confirm this happens to my Flutter application on iOS 14 (haven't tested) other versions, when I open the control center


[e2e]: gcb push main default slsa3

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6007285128
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Tue Aug 29 02:50:43 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6019768950
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Wed Aug 30 02:19:48 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6032281918
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Thu Aug 31 02:21:23 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6044670729
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Fri Sep  1 02:25:41 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6055789526
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sat Sep  2 02:18:16 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6061921258
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sun Sep  3 02:22:23 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6068359556
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Mon Sep  4 02:21:55 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6079447696
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Tue Sep  5 02:21:16 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6091956127
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Wed Sep  6 02:21:16 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6104628645
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Thu Sep  7 02:21:30 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6116918660
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Fri Sep  8 02:21:58 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6128336509
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sat Sep  9 02:18:28 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6134567398
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sun Sep 10 02:22:56 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6141138451
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Mon Sep 11 02:21:22 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6154096561
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Tue Sep 12 02:20:02 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6167172651
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Wed Sep 13 02:21:00 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6180144735
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Thu Sep 14 02:21:00 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6193125405
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Fri Sep 15 02:22:04 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6204709493
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sat Sep 16 02:18:16 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6211041222
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sun Sep 17 02:22:22 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6217460914
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Mon Sep 18 02:21:04 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6230356932
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Tue Sep 19 02:24:00 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6243194984
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Wed Sep 20 02:21:51 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6256383666
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Thu Sep 21 02:21:13 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6269330362
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Fri Sep 22 02:21:48 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6281036213
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sat Sep 23 02:18:53 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6287464868
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sun Sep 24 02:24:13 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6294105109
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Mon Sep 25 02:23:24 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6307260801
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Tue Sep 26 02:23:05 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6320602438
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Wed Sep 27 02:22:39 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6333757058
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Thu Sep 28 02:21:25 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6346444510
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Fri Sep 29 02:21:55 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6359488554
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sat Sep 30 02:19:57 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6367384945
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Sun Oct  1 02:29:05 UTC 2023

Repo: https://github.com/slsa-framework/example-package/tree/main
Run: https://github.com/slsa-framework/example-package/actions/runs/6375196658
Workflow file: https://github.com/slsa-framework/example-package/tree/main/.github/workflows/e2e.gcb.push.main.default.slsa3.yml
Workflow runs: https://github.com/slsa-framework/example-package/actions/workflows/e2e.gcb.push.main.default.slsa3.yml
Trigger: schedule
Branch: main
Date: Mon Oct  2 02:23:55 UTC 2023
Tests are passing now. Closing this issue.


Use Travis CI build stages

https://docs.travis-ci.com/user/build-stages
This should allow us to prevent snapshot deployment until linux and mac os pass. The downside is that we can't easily share artifacts so we would have to rebuild on mac os to deploy everything as the final stage.
(Circle CI would let us do partial builds on multiple platforms, aggregate, and publish)

We can't rebuild everything on Mac OS because it doesn't have Android support... maybe time to look at Circle CI.


Is there any way to name test runs with httpexpect?

Hi,
Currently I'm doing end to end test with httpexpect. There are currently 100+ sequential url calls in the test. The problem is, when test failed, it just shows line number in the source code. If I can give name to test calls (in this case, single url request call), and httpexpect would print the name when failed or passed along side with source code line number, it would be better.

Hi,
There is no way to do it currently.
It would be a nice addition probably. We could add name field to chain struct and a  WithName() setter for it to Request struct (request contains a chain). The chain object is propagated to all nested objects and is used to report all errors, so it should be enought to report name in chain.fail() and that's all I hope. Pull requests are welcome :)
But maybe you can use Go subtests instead? Are there any problems with this approach?

Closing with respect to #69.


Prevent failure hook being called when restic returns -3

(file missing but backup completed) and no "incomplete" hook defined

Fixes #133

This is failing the following test;
backup script Runs failure command if backup is incomplete and incomplete command is not specified FAILED
Which seems like it is testing the wrong thing? I don't expect to get a failure notification if a backup returns -3, i.e. missing file, but successfully completes.

Closing as it will be a breaking change in its current state.


Blend modes not working in Canvas renderer

Version

Phaser Version:
3.24.1

Operating system:
MacOS

Description

When trying to use blend modes when using the canvas renderer, the blend modes are not applied.
Example Test Code

https://codepen.io/bartbarto/pen/yLeWgmM
When switching to the WebGL renderer the blend modes are applied correctly.
Additional Information

Hmm, interesting. Blend Modes are working fine in Canvas:
http://labs.phaser.io/view.html?src=src\bugs\blendc.js&v=dev
https://jsbin.com/zugecep/edit?html,js,output
However, if you don't wrap the code in an onload handler, they fail like on CodePen. If you add the window.onload handler to CodePen, it works fine.
I thought maybe because the Phaser namespace wasn't yet ready, so the blend mode resolved to undefined, but even if you hard-code the value 2 in there, it still doesn't work outside of a load handler. Basically, if Phaser hasn't downloaded, it fails. If it has, it works fine, which arguably you should do anyway, but even so, it's a weird one.


release_date method

Hi, I've rewritten the method to get a release dates. I'm fairly new to ruby/rails and would appreciate if someone would refactor my code.
I really need to get release dates properly for my app. So, if this method is called without an argument, it returns the first date from a movie /releaseinfo page. If country is given as an argument, it looks up the first date for that specific country. Date.parse returns 1st day of month if only month and year available. And it can't parse only year to a full date.

Sorry, didn't know that. I changed it back.

I checked out your changes, there are some problems that need to be resolved before I can pull this in:

Don't use ActiveSupport - it's a dependency we don't need - not even for testing.
Create a fixture files for the release-info you use in your spec. See spec_helper for details. Doing this makes 1. easier, because you can now exactly check the number of votes.
Please update your code with the latest changes from the main master branch - this will make merging your change easier.


Fuel Dataset Import error

Hi,
I am new to fuel. I am trying to import fuel.datasets.h5py but I am getting ModuleNotFoundError error.

ModuleNotFoundError                       Traceback (most recent call last)
 in ()
----> 1 from fuel.datasets.hdf5 import H5PYDataset
2 from fuel.schemes import ShuffledScheme, SequentialScheme
3 from fuel.streams import DataStream
ModuleNotFoundError: No module named 'fuel.datasets'

Restarting my ipython notebook , resolved the issue


fix: accessing property in proxy after modification should not throw error

here is a failing test case
this test produces the following error:
1) Zenstruck\Foundry\Tests\Integration\ORM\GenericEntityProxyFactoryTest::test_something
RuntimeException: Cannot auto refresh "Zenstruck\Foundry\Tests\Fixture\Entity\GenericEntity" as there are unsaved changes. Be sure to call ->_save() or disable auto refreshing (see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#auto-refresh for details).

/home/nikophil/works/zenstruck/foundry-next/src/Persistence/PersistenceManager.php:218
/home/nikophil/works/zenstruck/foundry-next/src/Persistence/IsProxy.php:68
/home/nikophil/works/zenstruck/foundry-next/src/Persistence/IsProxy.php:113
/home/nikophil/works/zenstruck/foundry-next/tests/Integration/ORM/GenericEntityProxyFactoryTest.php:33

this cannot be fixed and will be documented in the upgrade guide


"echo" when using new model

When I  using get-3.5-turbo-instruct, the error shows
Setting 'echo' and 'logprobs' at the same time is not supported for this model..
When I set 'echo' to false, the logic of code has some problem and new error shows.

Now you can try this repo which fixed this: https://github.com/liougehooa/automatic-prompt-engineer


The image does not open at runtime in Docker.

When we run the application in Docker.  Files from the webroot folder are not retrieved correctly and are not displayed at runtime.

I think that the images in webroot folder are stored with Git Large File Storage https://git-lfs.com/ and will not be downloaded when doing a checkout with git.
When checking out the git repo using actions/checkout@v4 we can according to the documentation tell it to include lfs files or not:
`
with:
Whether to download Git-LFS files
Default: false
lfs: true`

i've added lfs: true in maven.yml check https://github.com/fungover/storm/pull/223


ChannelData does not have teams object on first install of bot

Versions
What package version of the SDK are you using - 4.14.1
What nodejs version are you using - v14.17.6
What browser version are you using - Google Chrome Version 94.0.4606.61
What os are you using - Mac Big Sur 11.6
Describe the bug
The use case over here for me is that I need to get list of users and channels from an api. I show this data in my product for user/channel selection. For this I am trying to use connectorClient with following code.
    # to get list of channels, this method gives me 405 get not allowed. Any idea how to fix this?
    const channels = await connectorClient.conversations.getConversations({
        continuationToken: undefined
    });

    # to get members for the team
    const users = await connectorClient.conversations.getConversationPagedMembers('19:N-uFGo8tJSsGVI_Dwy1PDodBeICG6HDnnsyYFG_Uclg1@thread.tacv2');

Coming to the issue, I have created an azure bot and installed in my ms teams workspace using app studio. Now, I need to access the team object inside the channel data when the bot is installed for the first time, but it is undefined.
On App installation i get this event
{
    "action": "add",
    "type": "installationUpdate",
    "timestamp": "2021-10-14T12:47:18.795Z",
    "id": "f:3d3c5756-9e26-c0b7-c50e-7a0577ad515e",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/in/",
    "from": {
        "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
        "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
    },
    "conversation": {
        "conversationType": "personal",
        "tenantId": "c8fef0de-e240-4456-b523-3285ecc62087",
        "id": "a:1EuEBm_q9PXmaa9AUeEdOa8ZApi1u4NReYdDP8JABHtNCKVfA0eBnQH4h6H2XMH1GhpZO4OwwcoOzuFmNJO2CtHlVbS4Wwa2uNjJiMFa-8JCns3WBYrAZEE3Y0Df3cfmm"
    },
    "recipient": {
        "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5",
        "name": "Trick"
    },
    "entities": [
        {
            "locale": "en-US",
            "type": "clientInfo"
        }
    ],
    "channelData": {
        "settings": {
            "selectedChannel": {
                "id"<EMAIL_ADDRESS>            }
        },
        "tenant": {
            "id": "c8fef0de-e240-4456-b523-3285ecc62087"
        },
        "source": {
            "name": "message"
        }
    },
    "locale": "en-US"
}

But as the per the documentation following event should be fired which in my case is not get called at all.
Also, please see that my conversationType is personal while the following payload conversationType is channel.
{
    "membersAdded": [
        {
            "id": "28:f5d48856-5b42-41a0-8c3a-c5f944b679b0"
        }
    ],
    "type": "conversationUpdate",
    "timestamp": "2017-02-23T19:38:35.312Z",
    "localTimestamp": "2017-02-23T12:38:35.312-07:00",
    "id": "f:5f85c2ad",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/amer-client-ss.msg/",
    "from": {
        "id": "29:1I9Is_Sx0OIy2rQ7Xz1lcaPKlO9eqmBRTBuW6XzkFtcjqxTjPaCMij8BVMdBcL9L_RwWNJyAHFQb0TRzXgyQvA"
    },
    "conversation": {
        "isGroup": true,
        "conversationType": "channel",
        "id"<EMAIL_ADDRESS>    },
    "recipient": {
        "id": "28:f5d48856-5b42-41a0-8c3a-c5f944b679b0",
        "name": "SongsuggesterBot"
    },
    "channelData": {
        // for me this object is empty
        "team": {
            "id"<EMAIL_ADDRESS>        },
        "eventType": "teamMemberAdded",
        "tenant": {
            "id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
        }
    }
}

I would like to mention here that the bot, in this context, is being installed for the first time in the teams workspace and according to https://github.com/microsoft/botbuilder-dotnet/issues/5095#issuecomment-762607953 the teams data should be available when the bot is installed for the first time. But the only data which I get is the tenant id.
I would also like to mention that on adding or removing the member from the team, I do get the teams info.
After a bit of further debugging I found following:-

When on the application add screen, If I choose the default option(just press add) the bot is only added to the personal scope and not the channel/group scope. I found this by looking at the ngrok logs.

In ngrok logs I could see the following:-
{
    "action": "add",
    "type": "installationUpdate",
    "timestamp": "2021-10-14T13:21:54.982Z",
    "id": "f:0e377db7-b924-a363-f244-d1e02904d595",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/in/",
    "from": {
        "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
        "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
    },
    "conversation": {
        "conversationType": "personal",
        "tenantId": "c8fef0de-e240-4456-b523-3285ecc62087",
        "id": "a:1EuEBm_q9PXmaa9AUeEdOa8ZApi1u4NReYdDP8JABHtNCKVfA0eBnQH4h6H2XMH1GhpZO4OwwcoOzuFmNJO2CtHlVbS4Wwa2uNjJiMFa-8JCns3WBYrAZEE3Y0Df3cfmm"
    },
    "recipient": {
        "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5",
        "name": "Trick"
    },
    "entities": [
        {
            "locale": "en-US",
            "type": "clientInfo"
        }
    ],
    "channelData": {
        "settings": {
            "selectedChannel": {
                "id"<EMAIL_ADDRESS>            }
        },
        "tenant": {
            "id": "c8fef0de-e240-4456-b523-3285ecc62087"
        },
        "source": {
            "name": "message"
        }
    },
    "locale": "en-US"
}

{
    "membersAdded": [
        {
            "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
            "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
        },
        {
            "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5"
        }
    ],
    "type": "conversationUpdate",
    "timestamp": "2021-10-14T13:21:54.3736765Z",
    "id": "f:3aab0478-e37d-ba6d-3a66-4f45ca00ed84",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/in/",
    "from": {
        "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
        "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
    },
    "conversation": {
        "conversationType": "personal",
        "tenantId": "c8fef0de-e240-4456-b523-3285ecc62087",
        "id": "a:1EuEBm_q9PXmaa9AUeEdOa8ZApi1u4NReYdDP8JABHtNCKVfA0eBnQH4h6H2XMH1GhpZO4OwwcoOzuFmNJO2CtHlVbS4Wwa2uNjJiMFa-8JCns3WBYrAZEE3Y0Df3cfmm"
    },
    "recipient": {
        "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5",
        "name": "Trick"
    },
    "channelData": {
        "tenant": {
            "id": "c8fef0de-e240-4456-b523-3285ecc62087"
        }
    }
}

When on the application add screen, if I choose the dropdown icon and choose Add to a team then bot is added to personal as well the channel scope and in this I can get the team id.

In this case ngrok logs also show a third entry for channels
{
    "action": "add",
    "type": "installationUpdate",
    "timestamp": "2021-10-14T13:22:02.028Z",
    "id": "f:14461f4d-ff50-90de-9b1e-cdbef8b12209",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/in/",
    "from": {
        "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
        "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
    },
    "conversation": {
        "isGroup": true,
        "conversationType": "channel",
        "tenantId": "c8fef0de-e240-4456-b523-3285ecc62087",
        "id"<EMAIL_ADDRESS>    },
    "recipient": {
        "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5",
        "name": "Trick"
    },
    "entities": [
        {
            "locale": "en-US",
            "type": "clientInfo"
        }
    ],
    "channelData": {
        "settings": {
            "selectedChannel": {
                "id"<EMAIL_ADDRESS>            }
        },
        "channel": {
            "id"<EMAIL_ADDRESS>        },
        "team": {
            "id"<EMAIL_ADDRESS>        },
        "tenant": {
            "id": "c8fef0de-e240-4456-b523-3285ecc62087"
        },
        "source": {
            "name": "message"
        }
    },
    "locale": "en-US"
}

{
    "membersAdded": [
        {
            "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5"
        }
    ],
    "type": "conversationUpdate",
    "timestamp": "2021-10-14T13:22:01.6072361Z",
    "id": "f:4ebc9a41-5140-7621-33f5-31d97275ce00",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/in/",
    "from": {
        "id": "29:17ZGff4Pvqz_zSNqEexg-86uBFcB6vnOBZzCwu4_puGdDsrYWCW_DdlB15PrcjC--nLlqD5CwtLMJyzXPY5OSsg",
        "aadObjectId": "eac26e98-104a-4785-87aa-bcf77ea1d7c1"
    },
    "conversation": {
        "isGroup": true,
        "conversationType": "channel",
        "tenantId": "c8fef0de-e240-4456-b523-3285ecc62087",
        "id"<EMAIL_ADDRESS>    },
    "recipient": {
        "id": "28:64564f44-dd7c-441a-b427-efcd662f21b5",
        "name": "Trick"
    },
    "channelData": {
        "team": {
            "aadGroupId": "5bc77aa9-9487-49ae-958f-b37b2191e64d",
            "name": "test 5",
            "id"<EMAIL_ADDRESS>        },
        "eventType": "teamMemberAdded",
        "tenant": {
            "id": "c8fef0de-e240-4456-b523-3285ecc62087"
        }
    }
}

One quick question to ask here. Is there any way to disable the dropdown will adding an application/bot to teams and by default install it in both channel + user.
To Reproduce
Steps to reproduce the behavior

Create an azure bot
Change the messaging endpoint of the bot to the ngrok url which tunnels to localhost.
Add the event listener mentioned in the documentation.
Add the application to microsoft teams using app studio and install.
Upon installation the above listener is hit but no teams data is present.

Expected behavior
The teams data should be available when the bot is installed for the first time.

@harkiratsaluja Can you confirm that you're using the TeamsActivityHandler? Does this reproduce with one of the Teams samples (like #57 for example)?


Refactored interface

I was looking at the interface with the many parameters and I thought that it is superfluous hence the alternative taking the RenderOptions object. I think that is the more suitable approach. Basically I've set the other method deprecated and swapped the signatures so that the deprecated method now calls the one taking the InputStream and the RenderOptions.
I also wanted to refactor the render() method itself a bit. I tried to make it a little more readable and for the validity check I added BeanValidation (JSR-303).
I did some additional refactorings e.g. in naming.
Hope you like the PR.

I like making the old interface deprecated and making it call the better interface but bringing in the hibernate validator to save a couple of lines of very easy to understand code doesn't seem worth it IMO, and I think it's valuable for options objects to be immutable.
I'd consider maybe a builder class separate from the options objects to remove the with functions from the options objects, but that's a marginal improvement (and some people might say it's not an improvement)

Thank you for your time reviewing my PR. I will amend the fixed array. I'd like to hear your opinion on my comments above.

I think I got all your comments covered. Need to figure out why rendering is succesful for the test which expects rendering to fail due to timeout settings.


⚠ Spryr has degraded performance

In 7be5f9d, Spryr (https://spryr.com) experienced degraded performance:

HTTP code: 200
Response time: 20321 ms

Resolved: Spryr performance has improved in a3f71de after 11 minutes.


Added terms page

#Fixed Issue : #236

@Luson045 please add the labels and assign to me

@luson my other pr #262  is not labeld and is not assigned to me please do that to

@Rizvi-Faiz sorry i didn't noticed... anyway there are still conflicts.... and it's past 1 now

@Luson045  but i gave pr before 12 and if you had seen then i would have resolved the branch conflict can you merge it now and add the labels

are you sure? this pr still have conflicts. and deployment has failed.

@Rizvi-Faiz resolve the conflicts by today night ... else we would have to close this pr

@ROKUMATE sure sir

@ROKUMATE i am having a lot of errors
So I am thinking to make a new PR .


Need post URL scheme

Love that you guys are allowing the ability to invoke the Vimeo app and load a video for viewing.  Any plans for including a URL scheme for posting video to the user's account?

The Vimeo application adds a share extension, which should be available through the native share sheet. If a video is shared to this extension, it should automatically open the Vimeo app and start uploading to the logged-in users account.
Additionally, the VIMNetworking library provides a robust system for handling uploads on your own, but this requires the user to log in to your app.
Do either of these work for you? Or do you have a third usecase? If so, I would love to hear more.

Also worth adding, if the user does not have the Vimeo iOS app installed and thus does not have the extension installed, the user can still use the OS integrated "post to Vimeo" extension.
Fyi, our deeplinking taxonomy will expand significantly later this summer. It'll include deeplinking to upload related views. But deeplinking to initiate an upload raises issues related to the Vimeo App being able to access the video to be uploaded / sandboxing etc. Definitely something we'd like to explore.

@imiller-gpfw We do have a deeplink to open the Vimeo iOS app and navigate to the beginning of the upload flow. Otherwise, if you're talking about uploading a video file that resides in a different app's directory we can't do that at the moment. We could probably add support for passing a PHAsset identifier to the Vimeo iOS app and initiating an upload from there.


SQL export is missing

Should include dev and test databases

SQL Export is not necessary since database migrations will be implemented.


Thank you for your work, when will the code be made public？

I added neccessary file for training & inference. Evaluation code and our pretrained model will be uploaded asap.


Developinng new interactions is too difficult

Registering and unregistering properties and applying them to the active object is way too convoluted. It's all abstracted away in the inspector, which is great, but, for developers writing new events and event handlers, it's way too much. Need to simplify the architecture to make writing new events and event handlers simpler.

Use the Unity event system: https://docs.unity3d.com/Manual/EventSystem.html


Consider generic ModelBuilder and new OnModelCreating

So we can add context-strongly-typed fluent APIs.

See also #11040


tau_psy.f90 added to build

I am surprised that we don't see this problem on NCI. When I install lfric-baf, it copies the tau_psy.f90 files into the infrastructure files, which means this file will be compiled (which then results in linking errors).

Any idea why we don't see this on NCI? I need to manually remove this file from infrastructure/soure/psydata.
Depending on the answer for 1. above, it might be better to move this file out of the infrastructure/source tree, add it to infrastructure/build/psyclone (which doesn't exist here yet, but it is in LFRic core). And then if requested (i.e. tau selected), then grab that file?

The latter approach would also make it easier to support different profiling libs (e.g. Vernier), where atm I am manually copying the psyclone wrapper file into the sources. We could all there wrapper to the psyclone directories, and let fab copy the right file.

I just realised that on NCI atm we don't trigger any profiling. So no psy_data calls are added to the code, so the fab dependency analysis will never include this file to be compiled.
Still, it would be a better solution if baf grabs up the wrapper files explicitly (depending on command line options).

Fixed in e5e82de7b75f97ca2f3f1f396a516d8c73dd7270 (part of vernier branch).


EXSWHTEC-114 - Implement tests for hipExtLaunchKernel APIs

Negative parameter tests for hipExtLaunchKernel and hipExtLaunchMultiKernelMultiDevice
Positive parameter tests for hipExtLaunchKernel
Basic positive scenarios for hipExtLaunchKernel and hipExtLaunchMultiKernelMultiDevice
Negative scenario for hipExtLaunchMultiKernelMultiDevice with multiple kernels on the same device.

Depends-on: #59

@mirza-halilcevic
Will you please resolve the merge conflicts for this PR?

PR has been merged into develop branch via commit 3f65d7a4104d7a181a79d0f37a9c70abf0421fc8.


added my picture in assets/pictures

@vinitshahdeo can this picture be added in the poster too now?

@vinitshahdeo plz merge


Fixed #11929 -- Make dump data output YAML in a sane order.

Thanks to sampablokuper for the report.

Is this rejected? I think this is really a good improvement!

I guess the test failures weren't ever fixed. Feel free to update the patch if you're able.

The tests that were suggested are a bit overly tied to the exact strings output, which seems a bit odd to me. The other test failures were for a similar reason.

I've just upgrade to 1.8.8 and didn't find anything in this patch.
I would like to try to fix this after fixing my current work.


[NEW ICON] Proxmox, VMware, VirtualBox

Skill Name
Proxmox, VMware, VirtualBox
Why?
While there are icons for Cloud Computing (aws, gcp, azure), virtualization technologies are still relevant for roles in Cybersecurity, IT infrastructure management and DevOps.
Reference Image
Proxmox, VMware, VirtualBox New/Old

I suggest the old icon for virtualbox

I can add them if owner assign me to it
I can add packet tracer, ubunto server, windows server gns3 and more..
and for cybersecurity I can add tools like nmap, wireshark, zproxy, metasploit...

and for cybersecurity I can add tools like nmap, wireshark, zproxy, metasploit...

Introducing icons like nmap, metasploit, burp could actually be good.
However I think that the icons can be added only by owners, or at least the note in the README "... we don't accept pull requests for icon submissions. If you would like an icon added, please open an issue." suggests this.

Skill Name
Proxmox, VMware, VirtualBox
Why?
While there are icons for Cloud Computing (aws, gcp, azure), virtualization technologies are still relevant for roles in Cybersecurity, IT infrastructure management and DevOps.
Reference Image
Proxmox, VMware, VirtualBox New/Old

I suggest the old icon for virtualbox

I created a new project since this project is no longer updating & the author left it, proxmox, vmware & virtualbox are available skills-icons
https://skills-icons.vercel.app/api/icons?i=proxmox,vmware,virtualbox


iGrill V2 - Measurements

Hi,
I've been very noisy on this project-issue page in the last few hours...
So far I'm now able to connect my Raspberry Pi to my iGrill V2 (with some startup-problems).
My last problem is now that it seems, that the values are read wrong (I'm always getting a temperature of 202 or 190 something) - which is even in imperal-system crap... ;-)
Can you provide me some hints, how you identified the data-fields for your iGrill mini?
Thanks

What version of bluez did you end up using to get this working?
Are you using the following and what steps did you follow to get things going?
1 bluepy==0.9.11
2 pycrypto==2.6.1
3 kavntetore's main fork?
4 main.py (what updates?)
My setup is a Raspberry Pi3 (integrated Bluetooth) and iGrillV2
I don't seem to have much luck getting to any of the handles that require authentication.  Perhaps something to do with bonding.  I'm able to pair and get battery info using bluetoothctl and gatttools but no luck replicating the iGrill specific device authorization that I see in wireshark with the AES encryption that is in the python code.

iGrillV2 Wireshark Dump with Pairing and Bonding.xlsx

Hi, so far I've also got myself a raspberry pi3 - created an sd - installed all libraries and so on.
Finally I'm ending up with the following message:
Creating Scanner Connecting to InfluxDB server Scanning... Authenticating... Traceback (most recent call last):   File "main.py", line 41, in <module>     scanner.scan(30)   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 632, in scan     self.process(timeout)   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 621, in process     self.delegate.handleDiscovery(dev, (dev.updateCount <= 1), isNewData)   File "/usr/src/igrill-master/scan.py", line 10, in handleDiscovery     handler.handleDiscovery(scanEntry, isNewDev, isNewData)   File "/usr/src/igrill-master/igrill.py", line 43, in handleDiscovery     dev = IGrillMiniPeripheral(scanEntry.addr)   File "/usr/src/igrill-master/igrill.py", line 147, in __init__     IDevicePeripheral.__init__(self, address)   File "/usr/src/igrill-master/igrill.py", line 92, in __init__     if not self.authenticate():   File "/usr/src/igrill-master/igrill.py", line 114, in authenticate     self.characteristic(UUIDS.APP_CHALLENGE).write(challenge, True)   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 148, in write     self.peripheral.writeCharacteristic(self.valHandle, val, withResponse)   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 459, in writeCharacteristic     return self._getResp('wr')   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 334, in _getResp     resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)   File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 296, in _waitResp     raise BTLEException(BTLEException.COMM_ERROR, "Error from Bluetooth stack (%s)" % errcode) bluepy.btle.BTLEException: Error from Bluetooth stack (comerr)
When I'm running hcidump on an shell - when main.py is "crashing" I'll see the follwing
....lots of other crap 2017-04-12 19:36:10.229837 > ACL data: handle 64 flags 0x02 dlen 9     ATT: Error (0x01)       Error: Attribute not found (10)       Read By Type req (0x08) on handle 0x0052 2017-04-12 19:36:10.237729 < ACL data: handle 64 flags 0x00 dlen 23     ATT: Write req (0x12)       handle 0x0024 value  0x57 0xbf 0xa0 0x4f 0x61 0xba 0xad 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 2017-04-12 19:36:10.297478 > HCI Event: Number of Completed Packets (0x13) plen 5     handle 64 packets 2 **2017-04-12 19:36:10.364835 > ACL data: handle 64 flags 0x02 dlen 9     ATT: Error (0x01)       Error: Insufficient authentication (5)       Write req (0x12) on handle 0x0024** 2017-04-12 19:36:12.436949 < HCI Command: Disconnect (0x01|0x0006) plen 3     handle 64 reason 0x13     Reason: Remote User Terminated Connection 2017-04-12 19:36:12.437512 > HCI Event: Command Status (0x0f) plen 4     Disconnect (0x01|0x0006) status 0x00 ncmd 1 2017-04-12 19:36:12.457885 > HCI Event: Disconn Complete (0x05) plen 4     status 0x00 handle 64 reason 0x16     Reason: Connection Terminated by Local Host
Maybe the V2 has another key... maybe I can find it in the android app... or an bluetooth dump from my smartphone - I'm not very skilled in bluetooth debugging - maybe the key is transmitted in "plaintext" - which would be tooooooo nice....
Regarding the changes: see -> The other case
System is all updated so far - so bluez is 5.23-2+rpi2
What I've installed:
apt-get install python-pip libglib2.0-dev
pip install bluepy
apt-get install python-crypto
pip install influxdb
apt-get install bluez-hcidump
PS: Send wireshark files in pcap format - excel is so bad from the security and information perspective ;-)

From onlywade's fork:
# encryption key for the iGrill v2

encryption_key = [-33, 51, -32, -119, -12, 72, 78, 115, -110, -44, -49, -71, 70, -25, -123, -74]

I did confirm this with some sample runs of known APP challenges and Device responses and the py code for encryption.
I'll post the wireshark pcap when I can find the correct file. :)

I'm assuming you updated the bluetooth device address D4:81:CA:21:2E:2F in the code? The last half of the address will be different for each iGrill device found on a sticker on the PCB if you remove the front cover.

Yes, of course found mine with bluetooth-scanner...
I've also "found" the encryption keys in the Weber-App
´´´
encryption_key = [39, 98, -4, 94, -54, 19, 69, -27, -99, 17, -34, -74, -10, -13, -116, 28] - iGrill V3
encryption_key = [-33, 51, -32, -119, -12, 72, 78, 115, -110, -44, -49, -71, 70, -25, -123, -74] - iGrill V2
# encryption_key = [-19, 94, 48, -114, -117, -52, -111, 19, 48, 108, -44, 104, 84, 21, 62, -35] - iGrill Mini
I also ran into the problem when It tries to connect I'll get:
´´´
Traceback (most recent call last):
File "/usr/src/igrill-master/main.py", line 41, in
scanner.scan(30)
File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 632, in scan
self.process(timeout)
File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 621, in process
self.delegate.handleDiscovery(dev, (dev.updateCount <= 1), isNewData)
File "/usr/src/igrill-master/scan.py", line 10, in handleDiscovery
handler.handleDiscovery(scanEntry, isNewDev, isNewData)
File "/usr/src/igrill-master/igrill.py", line 43, in handleDiscovery
dev = IGrillMiniPeripheral(scanEntry.addr)
File "/usr/src/igrill-master/igrill.py", line 149, in init
IDevicePeripheral.init(self, address)
File "/usr/src/igrill-master/igrill.py", line 82, in init
btle.Peripheral.init(self, address)
File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 318, in init
self.connect(deviceAddr, addrType, iface)
File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 367, in connect
"Failed to connect to peripheral %s, addr type: %s" % (addr, addrType))
bluepy.btle.BTLEException: Failed to connect to peripheral d4:81:ca:23:67:a1, addr type: public
´´´
Currently I'm stucked - but I think maybe they'Ve changed the methode how the encryption key is "calculated" - as I'm currently a bit short in time - I maybe find a few moments where I can take a look in the extracted android app....
Maybe @kvantetore can provide me/us the source where he found it in the app.... ;-)
Cheers

Did you try any of the other forks to see if you could get those working?  Also, I noticed a comment about pairing/bonding outside of the igrill application.  Are you pairing up via the bt icon in the taskbar in desktop mode?

Yes, tried it with the forks - ended up with the same error... that's why I was thinking about the changed method of creating the encryption key....

Would be nice if someone posted steps to actually get some temp readings from the iGrill V2.  Here is the wireshark dump that I collected.  I first went into settings on my iPad and forgot the iGrill device so it would log all the pairing and bonding stuff and make use of the encryption keys to show the encrypted traffic.  I then went into the Webber app and connected the device.  Some valuable info on the actual handles used and the transfer of keys for authorization. Let me know if this helps.
Remove the txt extention.
iGrillV2 with pairing and bonding.pcap.txt

Hi,
I've invested some time to stick together some code-parts, which does the essential work...
import bluepy.btle as btle
import random

encryption_key = [-33, 51, -32, -119, -12, 72, 78, 115, -110, -44, -49, -71, 70, -25, -123, -74]

address = "12:34:56:78:90:12"

igrill = btle.Peripheral(address)
print "Attached"

igrill.setSecurityLevel("medium")
print "raised security level"

for charas in igrill.getCharacteristics() :
 print charas

key = "".join([chr((256 + x) % 256) for x in encryption_key])
challenge = str(bytearray([(random.randint(0, 255)) for i in range(8)] + [0] * 8))

app_uuid = igrill.getCharacteristics(uuid="64ac0002-4a4b-4b58-9f37-94d3c52ffdf7")[0]
app_uuid.write(challenge, True)

This code connects to the device with the mac-addrese and prints out the "characteristics" of the device (the UUID, which you find in the igrill.py).
If you enter the MAC of your iGrillv2 and run the script you will get an error:
Traceback (most recent call last):
  File "connect.py", line 22, in <module>
    app_uuid.write(challenge, True)
  File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 148, in write
    self.peripheral.writeCharacteristic(self.valHandle, val, withResponse)
  File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 459, in writeCharacteristic
    return self._getResp('wr')
  File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 334, in _getResp
    resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)
  File "/usr/local/lib/python2.7/dist-packages/bluepy/btle.py", line 296, in _waitResp
    raise BTLEException(BTLEException.COMM_ERROR, "Error from Bluetooth stack (%s)" % errcode)
bluepy.btle.BTLEException: Error from Bluetooth stack (comerr)

As the error comes from bluepy - i think this should be the next station to investigate....
I read some issues in bluepy where the almost have the same errors, where they tried to write to some characteristics which were not writeable... but as it was 4 in the morning, I could have missunderstood that also...
I will take a look at the pcap, maybe I can find some information, to which characteristic what values are send... but I'll take care about that later...

I think you should look at the pcap file.  Handle 0x0024 is the UUID you are writing to and it also fails to write on line 337 due to insufficient authentication.  The Webber app appears to then pair/bond then the writes to handle 0x0024 seem to work on line 733.  You can see the value as 5f4a7f27c6bf2e740000000000000000 with the first 8 hex values randomly selected.  So something between 337 and 733 doesn't seem to be working correctly and we are never allowed to write to that handle.  Are you familiar with bluetoothctl or gatttool?  I've also tried them just to figure out the sequencing but I never seem to be able to write to handle 0x0024.  Prob something simple...  How are you doing the pairing/bonding?  Is that part of the bluepy python code or do you do that on the pi desktop?

Solution found...
As this solution completely differs from this approach - I've created my own project...
https://github.com/bjoernhoefer/iGrill_bbqmqtt/tree/master
The solution came to me mind when I found out that the problem with the code above was that the read-request is not authenticate (error popped up when doing a hcidump).
Then I tried to recreate it with gatttool - and got the message again (not authenticated) - so I think maybe the V2 has a changed "logon-schema".
While thinking and googleing about such stuff I noticed that gatttool got some "information" sent form the V2 itself...
Taking a look at the new "information" I found out that the V2 is sending the probe-temperature to the connected bluetooth device...
Thats my solution now - I'm just connecting and waiting for updates which are send to me from the iGrill v2...
No possibility to change settings, or poll information in an self-defined rythm - but I'm good with that, that I'm getting at least this information...
Maybe I can get the battery-information or other stuff also - but for now, I'm f**king happy that I did not spend money on the "wrong" device...
In my "solution" I've also added mqtt-support which is nice, as most home-automation systems now support mqtt...
So, sorry for double adevertising on my solution - but you can find it here: https://github.com/bjoernhoefer/iGrill_bbqmqtt/tree/master
:-)
So, its almost 5 in the morning here, I think I deserve some sleep now...
Cheers!
PS: Answers to your questions:
You're right the authentication does not work as it is in the code here - maybe something special of the V2 - or maybe in this firmware.... Also I can't really see much in your pcap file as wireshark does'nt interpret them correct...
Yes, I know hcitool and gatttool now - 3-5 days ago I didn't ;-)
parining and bonding is done by "the code" - for instance igrill = btle.Peripheral(address) connects the device (http://ianharvey.github.io/bluepy-doc/index.html - very much good information, sometimes/often very frustrating... I've been there the last two days, veeeery often and looooong)

Ok something's off here.  You are looking at handles 52,57,62 and 67 which you say represent probes 1,2,3 and 4.  I'm not seeing handles past in the mid 50s or any in the 60s.  Are you using an iGrillV2 and what firmware is on it?  I'm running firmware 1.5 on my iGrillV2 according to the Webber app.  Perhaps your firmware is newer.  Also, are you using a pi3 and the integrated Bluetooth module or a separate USB Bluetooth adapter? Any idea on how to update the firmware if you are running something else?

If you're running gatttool you will see the handles.
I'm running the latest firmware - updates were installed with the weber-app.
I'm unsing the Pi3 embedded Bluetooth adapter

I actually don't see the same handles in gatttool that you are seeing.  I bet my V2 is about a year or two old so the firmware must be different.  When you get a chance can you post the reported firmware version from the Webber App?  I too was getting notifications on prove temps at one point in time.  Almost like it was previously paired/bonded and was subscribing to notifications on the correct handles.  (Not the same as what you have in your new code) Then for some reason they no longer worked.  Not sure if it was a power cycle or a pairing operation with the Webber app that mucked it up.  I'm afraid your solution may not be very robust.  Again the firmware version might be the key.

BTW, I get nothing from the Webber app allowing me to update from the 1.5 firmware version.

I also have the firmware version 1.5 - i found out how to "enable" the "push" settings:
You have to set an alarm for one of the 4 probes (i set mine to 400 - which is preeety unrealistic, so the device won't start beeping in the wrong time) - and if I connect me via gatttool to the the igrill and get the values from all probes (now with handle 0x0034 for probe1, 0x0035 for probe 2....) - interesting feature - but I can live with that...
syntax for gatttool: gatttool -I -b d4:81:ca:23:xx:xx
I'll get an update as soon as the temperature changes - I'll get an update via bluetooth
[d4:81:ca:23:xx:xx][LE]> connect
Attempting to connect to d4:81:ca:23:xx:xx
Connection successful
Notification handle = 0x0043 value: 49 00 00
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0052 value: 46
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0043 value: 4a 00 00
Notification handle = 0x0043 value: 4b 00 00
Notification handle = 0x0043 value: 30 f8 00

If you want fast value changes just cover one connected probe with your hand - and you see the numbers flying in...
I've also power cycled the device (removed batteries) - i think after that it is necessary to set alarms newly via the Weber app - and then do a bit "troubleshooting" via gatttool - everything in an acceptable range for me... - for now..
So I would suggest, if you have any further problem/questions we should discuss this in "my" project - as this is veeery off topic here.
Also please note - as this is my first time I do something with python (and also with bluetooth) - don't except any magic - I'm an completely newbie.... (to python :-) )
Any contribution from your side is warmly welcome too ;-)

Ok those handle numbers make more since compare to what I'm seeing. Handle 52 is the battery in hex so you should be able to see % remaining.  At one point over the last few weeks I was getting notification like you are seeing.  Was never able to reproduce them.  I'll give the alarms a try to see if that forces the notification on those handles. Thanks for checking the firmware and I'm also a newbie to buetooth and python. Lots of reading and trial and error over the last few months.

You're right - Handle 52 looks good an additional information I can push to my mqtt-environment.
I've tried is to remove all alarms which leads to silence on the gatttol...
One "strange" thing - you just have to set an alarm for one probe (in my case i've set it to 400 degrees celsius) and it sends values for any connected probe, even if the "alarming"-probe is disconnected.

Oh that's helpful info... I'm assuming you are setting the alarm in the Webber App.  I'll give that a go when I get home. 🙂

yes sure - you first must disconnect the raspberry pi, then start the weber app, connect the igrill, configure one alarm and you're good to go...
Please note, the set alarm will also trigger a audio alarm on the igrill itself... so if you set it "wrong" during a long job you might wake up your neighbors/kids/etc.... ;-)

Ok now I'm getting the notifications in gattool like you are after setting the alarm.  Wow how did you figure that one out???  When I get time I'll try and run wireshark during the setting of the alarm to see if we can then fully automate the process without the need for the alarm setup within the app. Did you try and change your Main.py to match the handles we are seeing to get a python version working?

I've always had some alarms set - as I like this alarm-feature very much...
Just like I said, I was googleing about some things when gatttool was connected - when the digits where suprising me :-)
I don't think the alarm settings will be so easy, as you have to authenticate yourself on the thermoter, which a found out is absolutely not working as is should... so if you'd like, go on and do it - I'm happy with my solution so far (maybe some minor improvements will get in - in the next few days as I'll find time....)

I probably won't spend much time auto setting the alarm.  My ultimate goal is to be able to monitor my temps from the web.  I plan on gathering the temps and hosting a web service on the PI to then relay those temps via a connected browser.  I should be able to monitor and set alarms from the web interface and then signal by email or SMS updates or alarms.  I was able tap into the uart on the pcb and feed that into the PI and parse all of the data being sent to the Bluetooth radio before any type of encryption.  This solution works but requires the PI to be out with my smoker.  The full wireless version allows me to keep the PI inside.  I was able to hook up a UART to Bluetooth module from adafruit and I got the same serial stream from the Bluetooth module.  Kind of a nice feature because you can have both the Webber app running on the original Bluetooth module and the stream from the uart to the PI.  You can even power the V2 from the PI.   Not sure if this helps with what your doing but I'd be interested in knowing you end goals.

I'll keep mine outside - as I'm thinking about an video-live-stream ;-)
regarding the web-ui and alerting and so on I can really recommend Node-Red I'm using it for my entire house... and it can do everything - and it can also run on raspberry pi if you don't have a server...
My goal is almost reached as I'm able to connect my Pi to the V2 and extract the "important" data and send them into my "infrastructure" - all other things will be done by my internal logic.

Would be nice if someone posted steps to actually get some temp readings from the iGrill V2. Here is the wireshark dump that I collected. I first went into settings on my iPad and forgot the iGrill device so it would log all the pairing and bonding stuff and make use of the encryption keys to show the encrypted traffic. I then went into the Webber app and connected the device. Some valuable info on the actual handles used and the transfer of keys for authorization. Let me know if this helps.
Remove the txt extention.
iGrillV2 with pairing and bonding.pcap.txt

How did you sniff the Bluetooth packets? On which device did you run wireshark?


intdir / outdir folders are created in the wrong folder

If --intdir=... / --outdir=... are not specified on the command line to cbuildgen, these folders will be created in the parent folder instead.
The reason for this is because the m_projectDir does not contain a trailing slash, which means that when concatenating it with a path, the result will be missing a separator for the last segment.
Steps to reproduce:

Create a test.cprj that specifies

<output intdir="int" outdir="out" ... />

Run .../test$ cbuildgen test.cprj cmake
Observe that ../testint and ../testout was created instead of ../test/int and ../test/out

Hi @slhultgren, thanks for reporting this!
The issue seems to be a side effect of the std::experimental::filesystem::path::remove_filename function that removes the last directory separator, while the std::filesystem::path::remove_filename preserves it.
Can you please confirm that you are building with std::experimental::filesystem?
std::experimental::filesystem is deprecated is will be removed by most compiler vendors.
If we still need to support the experimental version an alternative to your suggestion could be to replace string concatenations by std::filesystem::path::append operators that should properly handle the directory separator.
What do you think?

@brondani thanks, good catch, it does indeed seem to be an issue with the compiler itself.
I was originally building with "-G "Visual Studio 15 2017"", which resulted in "build engine 15.9" and this shows the issue.
I upgraded to "-G "Visual Studio 16 2019"" which has "build engine 16.11" and seems to solve the issue without the PR, so I closed my PR as invalid.
Maybe the README.md should update to only have "Visual Studio 2019"?

Maybe the README.md should update to only have "Visual Studio 2019"?

Agreed
https://github.com/Open-CMSIS-Pack/devtools/pull/56


fix(en/kickassanime): open correct page on webview

Checklist:

[x] Updated extVersionCode value in build.gradle for individual extensions
[x] Updated overrideVersionCode or baseVersionCode as needed for all multisrc extensions
[x] Referenced all related issues in the PR body (e.g. "Closes #xyz")
[x] Added the isNsfw = true flag in build.gradle when appropriate
[x] Have not changed source names
[x] Have explicitly kept the id if a source's name or language were changed
[x] Have tested the modifications by compiling and running the extension through Android Studio

@Programmer-0-0 the problem is that WebView calls the animeDetailsRequest function to get the url, and the extension needed that to be the api url. The solution is simple, albeit hacky, just override fetchAnimeDetails to use another function to get the url, and let animeDetailsRequest retrieve the url to show in webview

Side note: when extensions-lib v14 get released, we'll be able to use getAnimeUrl(anime) instead of overriding fetchAnimeDetails.
For now, we have to suffer >:(

@Secozzi
I see where the problem was now. This is a smart way of fixing it. Thanks for explaining the issue :)