From 19b1dc8d652be857f471b7e802deb4aa2e2db9ed Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 9 May 2025 09:56:07 +0200 Subject: [PATCH] Add backup tests showing that unknown files are not ciphered (#144529) --- .../c0cb53bd.tar.decrypted_skip_core2 | Bin 0 -> 10240 bytes .../c0cb53bd.tar.encrypted_skip_core2 | Bin 0 -> 10240 bytes tests/components/backup/test_util.py | 74 ++++++++++++++---- 3 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 create mode 100644 tests/components/backup/fixtures/test_backups/c0cb53bd.tar.encrypted_skip_core2 diff --git a/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 b/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 new file mode 100644 index 0000000000000000000000000000000000000000..ba53b103b03c80ef0741ffcba9c2796279d63155 GIT binary patch literal 10240 zcmdPXPfASAE-lc@D$dVipbanp0y7g61`rJd=(K^ksVPhhB5!D5WNOHuU_cw^pqg4* zT#{G>v>sJ-#PF(>lJj#5ic*Vn_8L~>KXv~21-D+sTCzfi9p5GN||}Uu*^$Njn4!brDT?5Vrpz|Y@A}0 zVs4URlxUflYGQ1ZmS&Wel$e-kW&+Y&o>`I+pIBOwpPN{cnH*o7T2hjkmtG9io|c$X zoLUQ1l98XAnpj+%2{O9`Y)@)Ma!zSVYCO=DiAjmYAeTbjU6xu@oSB~ovK{1fJtI8> zy_D2410|3_d5O7TPdNjlJU>?flI|5y)d7_i6y=wsCYOMN1MCQ(SaD8iI>^vugXAPr zlqxCO)vb%bLn&t$8QJW5S5HadBAeG{&Py%so_RVc%6$$v^Kz|A}N z&yKBLf~#(y`M>3ixc%Mocfa=k{r95&%m0J_g|0N*6lih$U*2&1;@b~(N4g>p|1lNFHyjCh&*1p!{MGD@XTp1@ZvXr5{H@~O_WPMk z!w>a0i#Q2u9XiZ-t^SMsFZsXyCQs`#cCi0A{qO$7|2rp2{jR_J(Z1%h{q`6C!~U$_ z|KMRDfQF;#QUDE3Er&rTl#)fJQ0Kho-6R5ELA zX1>g>I{)8aFC6~jAi&}{q5BE%tH4VY3>w(tjGAJj_5a9j|6{HHjV&zA%q>Rie`;p5 zL26bqs6#@ddLQOx((8W%Lo;CepDum!5#IhEt^Y^s|AFuS8zaU7K;s0!@jpZ0_}^&% zA6A0Wjy5vK(*HLxG%_|Gt^R2j>VwB*Q2lQ-!1cemi2+*wf3*ImR|*MEO)f1;4M{9w zLbj1{5scSe74f8hz20x-mblGg&P@-zH4>vD_ge^^{kNvI(A?64pVzgp_{klv8La-o zSKNQ395}bDYxeu?TdPz9;zUsgmdzVAk4AdWTWPFUR>`eUo>-U-P#rj!S zb6k&><;-*9GC#DPy-aSS__Uj>JJ(FQ#BUk2I<#3ts6ZzUTA}t`f8Kf!w}d_YGns9#2)By!FjgXA76T*G(^XsP%`6|5du4uum{%VcmwPsvR5e zuN1o8ziGDM#bEV^Nx56TRq%@BeK#r#HhNH#{q9@3u#V);`P!lXdDT?q=O0ru&U?&2o|x*k`D~_wOETkbS>xaOrFNNStBqg&nq>H~QugYFJCQFh zTd+0n*V-E=UG_=~so%)#J=IlXceB%Oh1b*lJk!*&*sj;;W#l~-QCpr~ztK$EQ~$ft uUES;$ZKJS|7rd}|9HmD?U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLjVBYMb8NU literal 0 HcmV?d00001 diff --git a/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.encrypted_skip_core2 b/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.encrypted_skip_core2 new file mode 100644 index 0000000000000000000000000000000000000000..40216194671268d8120c8b3c7fe9f6c66019ae12 GIT binary patch literal 10240 zcmeH~c~BEq9LEE7L@6o)iX3VPQjjC;m0J`kMjeWvfYnlsn`D6iImm7}Lh%5^L4|r$ ztqv{7VH_`-3Zi&Zr6PEYA}TN<;z=tVsUv7byNgAoUemF3+OqGTH}AK<_kF+jdGEKs zUADIrmBr{Z>}XuAV)RV|$i_tw2Gx`8&pp87Jb(7=IS4=;fWZX%CY;`?I-EeYWJtZO z{brQRlBty%Er#QmoF!xuS{>%eWXVwiBS$QVJP0oU^a7DkkRt?OA;f2MV2*$bdI97Z zV3EF9BB4b|=VX>bMY2@MFo}YaVsWJi2j;=B9Fp@8IfM#O41uAD2q;2|q9_-kCMPI} zC<&?~)Jl|4$Rs#M5DHZ!PELR;NN|Lu`O8$KnANC8R=?-JANDJaV;?`Rv{^d;5`Y8m*eZWW>uj@K{|W zr6~hsQVuMYQ;`!%nr<}>swEU?EMNHb`qYWVj$)EJQmWx?6$m^ z%mUcmU~z?>T7evq(f8JXUeV~byj5df%IhvQ+nep}8;mAS!%#VAoF*_qdorX1bV$) z*<>kXN9zCXJyH4p*7}bC3=rWV5QuQN)VBZ#0Wg{W|42>l=lLIk$#hyQ6xEu(eCj6o zJ)?t2tGY@w(B`zhy(Az=@M*-b@#>*FTon)Rgl=hwS-n3s%&Bm>SBBq8C+iX1y&TWh zmiu)FhF#2@1xqsRT4WzoUQ^C#_%>_4u<*C0{1T6x^r?~C59Mx(igPQfI6UjjLOX1N zcCEO!C7$zubE^xF;FgyTfq>ikV`bJJ387caj_zacQ7&(=lz6R+o|dwrz}l<5(KirV z;4-leFq&Ew7uGKhYrV)smN_2Hy3lgh)Bcbf z*@{ za)PR}VBuA(l42()m`Imv@{A`(3o{PZZfJ9M$TZYcKYG%<`Y^cMoCU+R7sjr#LjPNZ(sj0X-ctbNirC_Pow}nd2%?^qk|HdbW`$4>V6NVzh3_VkPFiFzlUF6_V23yR_p6J!e)5x8DG%o zn_Auy>p^@ayvkd02H)#)sUthNZG(5KXr67ByJvDrV*txRN9(NwRl@%X+#aH})b zt=TNCG{)c(A>3e-lM4*#D9)OZQF~_gw0&8-Om3VC8Cz->qnL9s#&1z#h5ND9U18H< zTq`nWe^;)EcOA^cnMaZuk7O=d*3o%4et7*IzOZzBd{TiG<8-(HnZM%bAb85aXpUlx zzxDOANwG=JyCcDoqO6pgW!VmM1&l*2ra6v*+rAu_CoG{Lhfg2KqU6|5u{_Ltp(t)Nj#jjDeD-VGC zY=mixEZWY=&3A^+OJazHv+^hC@sah%7xm@cp|xoOGy$3bO@Jmq6QBvu1ZV;@0h$0! UfF?i_pb5|fXaY2We>Z{O0lIRksQ>@~ literal 0 HcmV?d00001 diff --git a/tests/components/backup/test_util.py b/tests/components/backup/test_util.py index a999672e7f6..229e25c312d 100644 --- a/tests/components/backup/test_util.py +++ b/tests/components/backup/test_util.py @@ -167,17 +167,37 @@ def test_validate_password_no_homeassistant() -> None: assert validate_password(mock_path, "hunter2") is False -async def test_decrypted_backup_streamer(hass: HomeAssistant) -> None: +@pytest.mark.parametrize( + ("addons", "padding_size", "decrypted_backup"), + [ + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + AddonInfo(name="Core 2", slug="core2", version="1.0.0"), + ], + 40960, # 4 x 10240 byte of padding + "test_backups/c0cb53bd.tar.decrypted", + ), + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + ], + 30720, # 3 x 10240 byte of padding + "test_backups/c0cb53bd.tar.decrypted_skip_core2", + ), + ], +) +async def test_decrypted_backup_streamer( + hass: HomeAssistant, + addons: list[AddonInfo], + padding_size: int, + decrypted_backup: str, +) -> None: """Test the decrypted backup streamer.""" - decrypted_backup_path = get_fixture_path( - "test_backups/c0cb53bd.tar.decrypted", DOMAIN - ) + decrypted_backup_path = get_fixture_path(decrypted_backup, DOMAIN) encrypted_backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN) backup = AgentBackup( - addons=[ - AddonInfo(name="Core 1", slug="core1", version="1.0.0"), - AddonInfo(name="Core 2", slug="core2", version="1.0.0"), - ], + addons=addons, backup_id="1234", date="2024-12-02T07:23:58.261875-05:00", database_included=False, @@ -189,7 +209,7 @@ async def test_decrypted_backup_streamer(hass: HomeAssistant) -> None: protected=True, size=encrypted_backup_path.stat().st_size, ) - expected_padding = b"\0" * 40960 # 4 x 10240 byte of padding + expected_padding = b"\0" * padding_size async def send_backup() -> AsyncIterator[bytes]: f = encrypted_backup_path.open("rb") @@ -325,17 +345,39 @@ async def test_decrypted_backup_streamer_wrong_password(hass: HomeAssistant) -> assert isinstance(decryptor._workers[0].error, securetar.SecureTarReadError) -async def test_encrypted_backup_streamer(hass: HomeAssistant) -> None: +@pytest.mark.parametrize( + ("addons", "padding_size", "encrypted_backup"), + [ + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + AddonInfo(name="Core 2", slug="core2", version="1.0.0"), + ], + 40960, # 4 x 10240 byte of padding + "test_backups/c0cb53bd.tar", + ), + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + ], + 30720, # 3 x 10240 byte of padding + "test_backups/c0cb53bd.tar.encrypted_skip_core2", + ), + ], +) +async def test_encrypted_backup_streamer( + hass: HomeAssistant, + addons: list[AddonInfo], + padding_size: int, + encrypted_backup: str, +) -> None: """Test the encrypted backup streamer.""" decrypted_backup_path = get_fixture_path( "test_backups/c0cb53bd.tar.decrypted", DOMAIN ) - encrypted_backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN) + encrypted_backup_path = get_fixture_path(encrypted_backup, DOMAIN) backup = AgentBackup( - addons=[ - AddonInfo(name="Core 1", slug="core1", version="1.0.0"), - AddonInfo(name="Core 2", slug="core2", version="1.0.0"), - ], + addons=addons, backup_id="1234", date="2024-12-02T07:23:58.261875-05:00", database_included=False, @@ -347,7 +389,7 @@ async def test_encrypted_backup_streamer(hass: HomeAssistant) -> None: protected=False, size=decrypted_backup_path.stat().st_size, ) - expected_padding = b"\0" * 40960 # 4 x 10240 byte of padding + expected_padding = b"\0" * padding_size async def send_backup() -> AsyncIterator[bytes]: f = decrypted_backup_path.open("rb")