lift ios ver restriction; keyring fixes

This commit is contained in:
vyvir
2025-09-10 22:40:59 +03:00
parent b826703e7c
commit db35ea03dd
2 changed files with 55 additions and 45 deletions
+2 -18
View File
@@ -1,7 +1,7 @@
# althea # althea
<img src="https://github.com/vyvir/althea/blob/main/resources/screenshot.png" alt="althea screenshot"> <img src="https://github.com/vyvir/althea/blob/main/resources/screenshot.png" alt="althea screenshot">
althea is a GUI for AltServer-Linux that allows to easily sideload apps onto an iPhone, an iPad, or an iPod Touch. It supports iOS 15 and later. althea supports x86_64, aarch64, and armv7. althea is a GUI for AltServer-Linux that allows to easily sideload apps onto an iPhone, an iPad, or an iPod Touch. It supports x86_64, aarch64, and armv7.
This app is in a very early state, so if you're experiencing issues or want to help, you can create a [pull request](https://github.com/vyvir/althea/pulls), [report an issue](https://github.com/vyvir/althea/issues), or join [the Discord server](https://discord.gg/DZwRbyXq5Z). This app is in a very early state, so if you're experiencing issues or want to help, you can create a [pull request](https://github.com/vyvir/althea/pulls), [report an issue](https://github.com/vyvir/althea/issues), or join [the Discord server](https://discord.gg/DZwRbyXq5Z).
@@ -55,7 +55,7 @@ That's it! Have fun with althea!
## FAQ ## FAQ
### <b>Fedora 41 shows the following error:</b> <b>Fedora 41 shows the following error:</b>
`ERROR: Device returned unhandled error code -5` `ERROR: Device returned unhandled error code -5`
@@ -63,22 +63,6 @@ You can downgrade crypto policies to the previous Fedora version:
`sudo update-crypto-policies --set FEDORA40` `sudo update-crypto-policies --set FEDORA40`
### <b>Error No such object path '/modules/kwalletd'</b>
You can run the following commands:
```
python3 -m venv venv
source ./venv/bin/activate
pip install pygobject requests keyring
```
And then run althea:
```
python3 main.py
```
## Credits ## Credits
althea made by [vyvir](https://github.com/vyvir) althea made by [vyvir](https://github.com/vyvir)
+27 -1
View File
@@ -13,6 +13,7 @@ import threading
import keyring import keyring
from time import sleep from time import sleep
import platform import platform
from packaging import version
# PyGObject # PyGObject
@@ -101,7 +102,7 @@ def menu():
commands = [ commands = [
("About althea", on_abtdlg), ("About althea", on_abtdlg),
("Settings", lambda x: openwindow(SettingsWindow)), #("Settings", lambda x: openwindow(SettingsWindow)),
("Install AltStore", altstoreinstall), ("Install AltStore", altstoreinstall),
("Install an IPA file", altserverfile), ("Install an IPA file", altserverfile),
("Pair", lambda x: openwindow(PairWindow)), ("Pair", lambda x: openwindow(PairWindow)),
@@ -167,10 +168,26 @@ def paircheck(): # Check if the device is paired already
return True return True
def altstoreinstall(_): def altstoreinstall(_):
if version.parse(ios_version()) < version.parse("15.0"):
global Warnmsg
Warnmsg = f"""\niOS {ios_version()} is not supported by AltStore.\nThe lowest supported version is iOS 15.0.\nYou can still continue, but errors may occur.\n"""
ios_dialog = WarningDialog(parent=None)
ios_dialog.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
ios_response = ios_dialog.run()
if ios_response == Gtk.ResponseType.OK:
ios_dialog.destroy()
if paircheck(): if paircheck():
openwindow(PairWindow) openwindow(PairWindow)
else: else:
win1() win1()
elif ios_response == Gtk.ResponseType.CANCEL:
ios_dialog.destroy()
else:
if paircheck():
openwindow(PairWindow)
else:
win1()
def altserverfile(_): def altserverfile(_):
if paircheck(): if paircheck():
@@ -265,16 +282,22 @@ def use_saved_credentials():
dialog.destroy() dialog.destroy()
def win1(): def win1():
try:
if keyring.get_password("althea", "apple_id"): if keyring.get_password("althea", "apple_id"):
use_saved_credentials() use_saved_credentials()
else: else:
openwindow(Login) openwindow(Login)
except keyring.errors.KeyringError:
openwindow(Login)
def win2(_): def win2(_):
try:
if keyring.get_password("althea", "apple_id"): if keyring.get_password("althea", "apple_id"):
use_saved_credentials() use_saved_credentials()
else: else:
openwindow(Login) openwindow(Login)
except keyring.errors.KeyringError:
openwindow(Login)
def actionCallback(notification, action, user_data=None): def actionCallback(notification, action, user_data=None):
Gtk.show_uri_on_window( Gtk.show_uri_on_window(
@@ -522,6 +545,7 @@ class Login(Gtk.Window):
def on_click_me_clicked(self, button): def on_click_me_clicked(self, button):
silent_remove(f"{(altheapath)}/log.txt") silent_remove(f"{(altheapath)}/log.txt")
try:
if not keyring.get_password("althea", "apple_id"): if not keyring.get_password("althea", "apple_id"):
self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
dialog = Gtk.MessageDialog( dialog = Gtk.MessageDialog(
@@ -539,6 +563,8 @@ class Login(Gtk.Window):
keyring.set_password("althea", "apple_id", apple_id) keyring.set_password("althea", "apple_id", apple_id)
keyring.set_password("althea", "password", password) keyring.set_password("althea", "password", password)
dialog.destroy() dialog.destroy()
except keyring.errors.KeyringError:
pass
self.entry.set_progress_pulse_step(0.2) self.entry.set_progress_pulse_step(0.2)
# Call self.do_pulse every 100 ms # Call self.do_pulse every 100 ms
self.timeout_id = GLib.timeout_add(100, self.do_pulse, None) self.timeout_id = GLib.timeout_add(100, self.do_pulse, None)