From 22a059978dfbf5a489fe51ba86699f7a27779dc3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 12 Jul 2025 20:07:40 +0100 Subject: [PATCH] added check for unsupported browsers --- gui/__main__.py | 43 ++++++++++++------ .../images/unsupported_browser_only.png | Bin 0 -> 25659 bytes 2 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 gui/resources/images/unsupported_browser_only.png diff --git a/gui/__main__.py b/gui/__main__.py index eae6c38..a4bfdf5 100644 --- a/gui/__main__.py +++ b/gui/__main__.py @@ -50,7 +50,7 @@ profile_observer = ProfileObserver() class WorkerThread(QThread): text_output = pyqtSignal(str) - sync_output = pyqtSignal(list, list, bool, bool, list, bool) + sync_output = pyqtSignal(list, list, bool, bool, list, list) invoice_output = pyqtSignal(object, str) invoice_finished = pyqtSignal(bool) profiles_output = pyqtSignal(dict) @@ -235,10 +235,10 @@ class WorkerThread(QThread): browser = ApplicationVersionController.get_all() all_browser_versions = [f"{browser.application_code}:{browser.version_number}" for browser in browser if browser.supported] all_location_codes = [f"{location.country_code}_{location.code}" for location in locations] - self.sync_output.emit(all_location_codes, all_browser_versions, True, False, locations, False) + self.sync_output.emit(all_location_codes, all_browser_versions, True, False, locations, browser) except Exception as e: print(e) - self.sync_output.emit([], False, False, [], False) + self.sync_output.emit([], [], False, False, [], []) @@ -456,10 +456,10 @@ class CustomWindow(QMainWindow): menu_page = self.page_stack.findChild(MenuPage) menu_page.on_update_check_finished() - def update_values(self, available_locations, available_browsers, status, is_tor, locations, is_os_error): + def update_values(self, available_locations, available_browsers, status, is_tor, locations, all_browsers): sync_screen = self.page_stack.findChild(SyncScreen) if sync_screen: - sync_screen.update_after_sync(available_locations, available_browsers, locations) + sync_screen.update_after_sync(available_locations, available_browsers, locations, all_browsers) @@ -1383,14 +1383,19 @@ class MenuPage(Page): else: new_profile['connection'] = 'just proxy' - - - browser = profile.application_version.application_code if hasattr(profile, 'application_version') else 'unknown' + if isinstance(profile, SessionProfile): + browser = profile.application_version.application_code + else: + browser = 'unknown' if browser != 'unknown': new_profile['browser'] = browser new_profile['browser_version'] = profile.application_version.version_number + new_profile['browser_supported'] = profile.application_version.supported else: new_profile['browser'] = 'unknown browser' + new_profile['browser_supported'] = False + + resolution = profile.resolution if hasattr(profile, 'resolution') else 'None' new_profile['dimentions'] = resolution @@ -1625,12 +1630,15 @@ class MenuPage(Page): # Crear QLabel con la imagen os.path.join(self.btn_path, "browser only.png") detrás del label_principal label_background = QLabel(self) label_background.setGeometry(0, 60, 410, 354) # Geometría según necesidades - pixmap = QPixmap(os.path.join(self.btn_path, "browser only.png")) + is_supported = profile.get('browser_supported', False) + image_name = "browser only.png" if is_supported else "unsupported_browser_only.png" + pixmap = QPixmap(os.path.join(self.btn_path, image_name)) label_background.setPixmap(pixmap) label_background.show() label_background.setScaledContents(True) label_background.lower() self.additional_labels.append(label_background) + if protocol.lower() == "residential" and connection.lower() == "tor": label_background = QLabel(self) @@ -1984,12 +1992,13 @@ class ConnectionManager: def store_locations(self, locations): self._location_list = locations - def store_browsers(self, browsers): self._browser_list = browsers def get_browser_list(self): return self._browser_list + + def get_location_list(self): if self.is_synced(): @@ -3521,7 +3530,8 @@ class ResumePage(Page): main_label.show() self.labels_creados.append(main_label) if profile_1.get("connection", "") == "browser-only": - image_path = os.path.join(self.btn_path, "browser only.png") + image_name = "browser only.png" + image_path = os.path.join(self.btn_path, image_name) label_background = QLabel(self) label_background.setGeometry(10, 50, 535, 460) label_background.setPixmap(QPixmap(image_path)) @@ -3854,6 +3864,9 @@ class EditorPage(Page): self.display.setPixmap(QPixmap(os.path.join(self.btn_path, f"wireguard_{location}.png"))) self.garaje.hide() if connection == "browser-only": + is_supported = data_profile.get('browser_supported', False) + image_name = "browser only.png" if is_supported else "unsupported_browser_only.png" + self.brow_disp.setPixmap(QPixmap(os.path.join(self.btn_path, image_name))) self.brow_disp.show() else: self.brow_disp.hide() @@ -5432,8 +5445,8 @@ class SyncScreen(Page): self.worker_thread.sync_output.connect(self.update_output) self.worker_thread.start() - def update_output(self, available_locations, available_browsers, status, is_tor, locations, is_os_error): - if is_os_error: + def update_output(self, available_locations, available_browsers, status, is_tor, locations, all_browsers): + if isinstance(all_browsers, bool) and not all_browsers: install_page = self.page_stack.findChild(InstallSystemPackage) install_page.configure(package_name='tor', distro='debian', is_sync=True) self.page_stack.setCurrentIndex(self.page_stack.indexOf(install_page)) @@ -5457,11 +5470,11 @@ class SyncScreen(Page): menu_page.on_update_check_finished() - self.update_after_sync(available_locations, available_browsers, locations) + self.update_after_sync(available_locations, available_browsers, locations, all_browsers) self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(ProtocolPage))) - def update_after_sync(self, available_locations, available_browsers, locations): + def update_after_sync(self, available_locations, available_browsers, locations, all_browsers=None): self.connection_manager.set_synced(True) diff --git a/gui/resources/images/unsupported_browser_only.png b/gui/resources/images/unsupported_browser_only.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f75a862ea7f0933588e7757419ecd0d5459a8d GIT binary patch literal 25659 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%0AU08 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

    c=1DE3Ogb0tCeoV&Ure~f z#SC1OVuIJUA~6)HsLaQe!H6@a_Hp>=_f0dqgO`zUOIQo?xZ|II+RqS_PhQ}p=9y~t98zfp@m8>o>XyO zh}d00kz{XVhUBKcdDay%`n4SR{r=!9sfVTPhaz?^aOe;sW*=2C9h(x+f5#qvNA~s3 z+}#0*U+r9i&Ria1Omf8*0#mW5?~jR@#p7PjK4WkyGV3MNmnKEAuHBcNtd!V&r$zTv zV@5Ow-K$F0ADxs+)F+WjSX+SkKJ8r})Ow)cRa5lED3BPu&mbry9w+tnO6IAbZqHd(0)#B^w8c4P-<_I1xQAMbo=8Ugd?yAmfm!h2(5j@{iT!U1T zu>nIcevLa&^;VbZVv)#sD_&rl)k10WR`I8p@^_M=EEglU3*A!@+LQ#Lrv50)4hJ<# zPdbiR-`2w^WG1L(sSd1Ka7J3%O0c$MI=SX8D;302jAU2pVT7JVWF(^PaHd|pzr9k@ zILBo(-PW&EyPupw$@lXwvu2fg zx^wiC+o~<)p5K3U*POS=#`4G05BLwzr$ssaa;Nqs%jrkA}b>C0e)ajy)V(;Oz-tN#E0VS$g^q@Exc*}QHH z7{!{20H(HSTN`qw@Xf#?3ZVFQdEk04zdzV}^F&po{0%rP!$8;smNhbu-Sk%tg~n#$ z0t1iIbIA%0#@(+83Ip`u;s5GpWAcp&;E!3fupRRef+AzExdDL}0PJov*ujO%uJ(+$ zX=8+`WKig}JtFuwF3)lRZ(Qgzi%*es1r+g~#yGj(@8d#}j=I0o^p8)Xv)-Yurc{fv>eZ;p|)>P|{LbKQ6P0_ef1V@3~+7QT(f_z(yL zi44z}zu*b5Z#Yp2qYBh_!FMl?w#3P~)Pfu(tM3Z*eZ(Xve+BE7|wgMAoX6CKs#gOe`K-OjPSLw%x0An}stHpzmlb!hA0s<=e8QU68 zr&^FE5NF%mO)S_s&-}Qmu zeT1A#LE06`QRAhFHnU)MNs>)u(B&Tl?FaF0D;6xg($s$d5@5p2GSupNr8|iOPPmc% z&*r-!46NQqX-N(sI-1Rb%TM$#bNgKnVxx0()WSZ0fhO_^brhDCmSX@D*K&s+0$DsK zB(y>UGlj4cH2~MP9Ac*qJvY(a_kbHi_V)pwYEukhztcV$k2DkSFL7O8h)zYuI?p%) zCqo*}lbo_1Fl~RHJo(~Z2cl$c=AH2K>FMd>aXe2Da3^&*>?kd}j^kHMO%|1p0^2M3 z(uvoB$$;|fqgSW7KkqJG{|4}pAz(%eN0*xB=8eSyXUq;}b8WtSYOr`UEVB9a)Qbsc z-aj;EVWPz8w*<}Oa^^Ca#GMGWS)W-aFhsjiV#3U* z>tB!uSo!1>I(KA2>Ub9mZ~DQpDuCGx87cmwO-Cm6B&)mj`IiPu4UUc!N>U2@ZF1rP zz8fTiwE*b;RbXxlaFo4JExeDwB+Begrv!4kOZS`$+I0qeSLjqxQ{|&@XliV4#x)|E%yOj?_9*7cu|NBNTx2s{+V&G~RkHb5y~_01XP< zF*?6C--l#zeW&)`O0v$#j}to6|Dj=7bY-vL@(DiFnff0P2F{ZyF?gv^4T}?5zddn;E933kOKNa-hmnVNV~|UpBBDblaff~M zYxlnjP=Ph_G9Vz}^CBaQvzfFqjEqMA^<{7+fSKa62gl5+kNWQ2x3B=sv8#T;Mk%77 zKk?o*xDkb(IHDB9Ax)|vr+03f0Lbl0 zDaYwv7lp)DRUdT3{Xd`*pxrq^@^?WQtU(!yrH0c&#$*KVpeY2{ExL|Cnf27WyC^ZLIoA}dBgK7V){