Commit graph

801 commits

Author SHA1 Message Date
Maybe Waffle
2477a0f945 Fix infinite loop in read_from_rx 2022-04-10 19:04:30 +04:00
Maybe Waffle
af0dd99ef4 Use Duration instead of u32 as the RetryAfter field 2022-04-10 18:48:00 +04:00
Maybe Waffle
d259f8aa23 Add diargam explaining how ThrottlingRequest works
https://asciiflow.com/#/share/eJzFV71u2zAQfhWCkx0EDdqhRbUEGbpmCLoE0BBCpiPBEplSFBwhCFoEHTt0MNw%2BRKeMRZ9GT9KjrB8ykhj9pRUIWTR1d9%2Fdfcej7jAjEcUOS8LwGIckpQI7%2BM7Fty523r9%2Be%2BziFJ7evFNPkt5KmLj45AT1vrLdH9dlXRIffcGlDAN2fUE%2FJTSWBwm4b7nYULFYWoSHm4PVoaMENELUMgqM41Xsf8NdFDELYhRTJk20MaVFENGKe0kELxAZcHZ4a%2BL1uXZg9jATtkIejxTgGK25QBEX1Eit3QVztdQaMFAV5RFAMHy%2BRYEconXfppV4MiFhmOaRjo3157T2CQl6YfKNVIwKgkGiQu5tdKymbp%2FEFQcDujpV4j%2B%2BVnokL1ZbCe78Q196Z0Lng5Hhp3nuyvvkfBpWL1sodW53w0CRT44ich14R%2B3M7fKjq87m8cusNsNqsw712XA%2B1IEbRx0Tm2k%2FL5GAMeB%2FbWlLYONR%2B1pRGZqmOYKX1X2hBpjlxQY7FWx7ChQ0XCVY1qJTPaErVdGvEqZ%2BFsurSTGVPnSmBpjZPG0SYFIi7Zp7Ua5JUAtxTblubKNDZfUvp4lMBCttaFytUmaTjZNQlrJ5y%2Fapt4GeqjJerf1%2FPyHuj9qPkb4medo5oE8%2FCLG4oFKkZ2sJ51O2XD4vScOYTrHZTiGr7EwBtlnRcRA4oQGdREBjOF2dDpB8EURd3bhVss84r4zX12W7RuulJzfbfct2X0aN74Ns7nWbD%2Fl%2FT1r%2BQ7e%2B6fWobrtuX35ZPf15QDbCLOMyWKdlk5U%2B0b%2BPtOA8VhYUgdNy81OqtKNqXfKICgHNW4M06Kg6whN1ivbJzQ1ldKXTKOv%2B1p2etRHf3fge3%2F8FrCjqXw%3D%3D)
2022-04-10 17:34:15 +04:00
Maybe Waffle
ed48de2f75 Simplify freezing 2022-04-10 17:34:15 +04:00
Maybe Waffle
dcbef82e43 Cleanup throttling::request 2022-04-10 17:34:15 +04:00
Maybe Waffle
081b74edb0 Split Throttle implementation into modules 2022-04-10 17:34:02 +04:00
Maybe Waffle
439a345dee Use tokio's try_recv instead of hacks 2022-04-10 17:25:06 +04:00
Maybe Waffle
435181fa0b Improve sanity
Refactor `Throttle` send-future. Previously it was a hand-written future, but
this quickly escalated to an unreadable mess. This commit uses `box`ing and
`async fn` to mitigate this problem.

Hopefully I'm not going insane now
2022-04-10 17:25:06 +04:00
Maybe Waffle
0a03431653 Make {Json,Multipart}Request clonable
This is required for the new `Throttle` design
2022-04-10 17:25:06 +04:00
Maybe Waffle
43802a5c41 Improve Throttling adoptor
- Freeze when getting `RetryAfter(_)` error
- Retry requests that previously returned `RetryAfter(_)` error
2022-04-10 17:24:57 +04:00
Maybe Waffle
6a91c44836 make errors module pub and add errors::AsResponseParameters trait 2022-04-10 17:23:33 +04:00
Maybe Waffle
51d6800a32 Make RequestError::RetryAfter::0 u32, instead of i32
(you can't really wait a negative amount of time, can you?)
2022-04-10 17:22:20 +04:00
Hirrolot
e1a47ef8c7
Merge pull request #201 from teloxide/add_missing_allowed_update
Add `AllowedUpdate::ChatJoinRequest`
2022-04-08 18:59:18 +06:00
Maybe Waffle
213db7b64c Add AllowedUpdate::ChatJoinRequest 2022-04-08 15:57:16 +04:00
Waffle Maybe
ac08117216
Merge pull request #197 from teloxide/convenience_user_and_me_methods
Add some convenience methods to `User` and `Me`
2022-04-04 03:35:07 +04:00
Maybe Waffle
d91863e1c3 Add some tests 2022-04-04 03:00:53 +04:00
Waffle Maybe
7da630e4c0
Merge pull request #200 from teloxide/hide_token_in_errors
Hide bot token in errors
2022-04-03 16:18:23 +04:00
Waffle Maybe
d1cf0e4f52
Merge branch 'master' into hide_token_in_errors 2022-04-03 16:14:34 +04:00
Maybe Waffle
05603560e6 Give a name to a magic number and document it 2022-04-03 14:47:10 +04:00
Maybe Waffle
daec5ee13e Hide bot token in errors
This fixes a potential[^1] security vulnerability -- if bot shows errors
from teloxide to the user & for some reason network error happened[^2]
the url of the request would be included in the error. Since TBA
includes bot token in the error this may lead to token leakage.

This commit fixes that issue by removing the token from the urls of
`reqwest::Error`, we try to only replace the token, but if we fail we
remove the whole url.

This can be tested by using a very low timeout value for the http
reqwest client:
```rust
let client = reqwest::Client::builder()
    .timeout(std::time::Duration::from_millis(1))
    .build()
    .unwrap();

let bot = Bot::from_env_with_client(client).auto_send();

// see if the token is redacted when network error (timeout) happens
// while sending common requests
let _ = dbg!(bot.get_me().await);

// see if the token is redacted when network error (timeout) happens
// while downloading files ("path" is unimportant as the timeout is so
// low the request probably won't even be sent)
let _ = dbg!(bot.download_file_stream("path").next().await);
```

For me this gives the following result:
```text
[t.rs:26] bot.get_me().await = Err(
    Network(
        reqwest::Error {
            kind: Request,
            url: Url {
                scheme: "https",
                cannot_be_a_base: false,
                username: "",
                password: None,
                host: Some(
                    Domain(
                        "api.telegram.org",
                    ),
                ),
                port: None,
                path: "/token:redacted/GetMe",
                query: None,
                fragment: None,
            },
            source: TimedOut,
        },
    ),
)
[t.rs:31] bot.download_file_stream("path").next().await = Some(
    Err(
        reqwest::Error {
            kind: Request,
            url: Url {
                scheme: "https",
                cannot_be_a_base: false,
                username: "",
                password: None,
                host: Some(
                    Domain(
                        "api.telegram.org",
                    ),
                ),
                port: None,
                path: "/file/token:redacted/path",
                query: None,
                fragment: None,
            },
            source: TimedOut,
        },
    ),
)
```

Note that this commits parent is `d0be260` and not the current master
the master branch currently contains breaking changes (we'll need to
make a release from this brach directly).

[^1]: Note that there are recorded cases where the token got exposed.
[^2]: Note that this can be theoretically be controlled by the user when
      sending/downloading bigger files.
2022-04-03 13:34:17 +04:00
Maybe Waffle
b3c0d00b7d "override" mention and tme_url on Me
That's not **really** an override, but by adding an inherent methods
we "hide" methods from `Deref<Target = User>`, that allows us to return
non-option types from `me.mention()` and `me.tme_url()` -- bots must
always have usernames.
2022-04-02 22:56:32 +04:00
Maybe Waffle
df9ffe8918 Add Me::username and Deref<Target = User> impl for Me 2022-04-02 22:43:55 +04:00
Maybe Waffle
55f753a201 Add User::{tme_url, preferably_tme_url} functions 2022-04-02 21:09:34 +04:00
Maybe Waffle
705083c2d9 Add UserId::{url, is_anonymous, is_channel, is_telegram} functions 2022-04-02 20:59:41 +04:00
Waffle Maybe
1746be2b7f
Merge pull request #194 from teloxide/chat_id_refactor
Chat and user id refactor
2022-04-02 19:11:42 +04:00
Waffle Maybe
c250a9b327
Merge pull request #193 from teloxide/telergam
Fix a typo in documentation
2022-04-02 18:40:06 +04:00
Maybe Waffle
9b3c0d88d2 restart CI 2022-04-02 18:36:06 +04:00
Hirrolot
ef21aa38af
Merge pull request #195 from teloxide/typooooooooos
Fix some more typos
2022-04-02 07:32:49 -07:00
Maybe Waffle
ea72267959 restart CI 2022-04-02 18:28:38 +04:00
Maybe Waffle
380ebde98b Update changelog 2022-04-02 18:26:18 +04:00
Maybe Waffle
c2d2a15ef1 Split derives because rustfmt hates me 2022-04-02 18:13:32 +04:00
Maybe Waffle
71dee3b563 Use Into<ChatId> in methods 2022-04-02 18:10:47 +04:00
Maybe Waffle
4fbec56674 Impl From<UserId> for ChatId and Recipient 2022-04-02 18:10:47 +04:00
Maybe Waffle
036c46caaa reformat code a bit 2022-04-02 18:10:46 +04:00
Maybe Waffle
f2378935b7 Make chat id typed (add ChatId)
Note that this is different from the previous `ChatId` (that was renamed
to `Recipient`), since it can't hold @channelusername.

Reason: same as w/ `UserId`
2022-04-02 18:10:46 +04:00
Maybe Waffle
41e09159a6 Make user id typed (add UserId)
Reason: when user id is just an integer, it's easy to accidentally
use a "random" integer instead of actual user id, typed APIs make code
less prone to some mistakes.

This commit also fixes an issue when a wrong integer type was used for
`user_id` in `Contact`.

Another option that this addition unlocks is adding methods/implementing
foreign trait for `UserId`.
2022-04-02 18:10:46 +04:00
Maybe Waffle
0a1d73c223 Rename ChatId => Recipient
Reason: it isn't _really_ a chat id, it can also be a channel username.
2022-04-02 18:10:46 +04:00
Waffle Maybe
189ef968e6
Merge pull request #196 from teloxide/pin_ci_yet_again
Pin nightly compiler version in CI
2022-03-25 13:17:25 +04:00
Maybe Waffle
ad56195e52 Fix name of the nightly CI job 2022-03-25 13:12:26 +04:00
Maybe Waffle
35e5bac766 Pin nightly compiler version in CI 2022-03-24 21:40:00 +04:00
Maybe Waffle
22cfffc704 Fix some more typos 2022-03-24 21:32:01 +04:00
Waffle Maybe
ecf90c8c05
Fix a typo in documentation 2022-03-24 17:51:34 +04:00
Waffle Maybe
b9df9abe9b
Merge pull request #192 from teloxide/fix_unmark
Fix chat unmark
2022-03-23 03:46:44 +04:00
Maybe Waffle
3d69d96182 Fix chat unmark 2022-03-22 22:08:47 +04:00
Hirrolot
d0be260575
Merge pull request #191 from teloxide/r044
Release 0.4.4
2022-03-21 08:27:02 -07:00
Maybe Waffle
1a61d02858 Release 0.4.4 2022-03-21 19:22:22 +04:00
Waffle Maybe
36a54a86e4
Merge pull request #190 from teloxide/not_found_error
Add `NotFound` error
2022-03-21 19:15:29 +04:00
Maybe Waffle
923be2221d Add NotFound error 2022-03-21 19:10:12 +04:00
Waffle Maybe
961e5aef9d
Merge pull request #189 from teloxide/with_payload
Add `HasPayload::with_payload_mut` function
2022-03-20 19:12:31 +04:00
Hirrolot
2c0748f3ae
Merge branch 'master' into with_payload 2022-03-20 08:08:52 -07:00