tis-microsoft-todos
2.90.6411.0-24
Todo List is a list management and box ticking application.Todo List helps you organize your tasks, even without being permanently connected to the internet.
4362 downloads
See build result See VirusTotal scan
Description
- package : tis-microsoft-todos
- name : Microsoft Todos
- version : 2.90.6411.0-24
- categories : Utilities
- maintainer : WAPT Team,Tranquil IT,Gaëtan SEGAT,Jimmy PELÉ
- installed_size :
- editor : Microsoft
- licence : Proprietary
- signature_date : 2023-02-25T15:00:15.250418
- size : 87.31 Mo
- locale : all
- target_os : windows
- impacted_process :
- architecture : all
- Homepage : https://apps.microsoft.com/store/detail/9NBLGGH5R558
- Depends :
control
package : tis-microsoft-todos
version : 2.90.6411.0-24
architecture : all
section : base
priority : optional
name : Microsoft Todos
categories : Utilities
maintainer : WAPT Team,Tranquil IT,Gaëtan SEGAT,Jimmy PELÉ
description : Todo List is a list management and box ticking application.Todo List helps you organize your tasks, even without being permanently connected to the internet.
depends : tis-microsoft-services-store-engagement,tis-microsoft-net-native-runtime-2-2,tis-microsoft-net-native-framework-1-6,tis-microsoft-ui-xaml-2-7,tis-microsoft-vclibs-140-00,tis-microsoft-net-native-framework-2-2,tis-microsoft-net-native-runtime-1-6
conflicts :
maturity : PROD
locale : all
target_os : windows
min_wapt_version : 2.0
sources : https://apps.microsoft.com/store/detail/9NBLGGH5R558
installed_size :
impacted_process :
description_fr : Todo List est une application de gestion de listes et de cochage de cases.Todo List vous aide à organiser vos tâches, même sans être connecté en permanence à Internet
description_pl : Todo List to aplikacja do zarządzania listami i zaznaczania pól.Todo List pomaga organizować zadania, nawet bez stałego połączenia z internetem
description_de : Todo List ist eine Anwendung zur Verwaltung von Listen und zum Ankreuzen von Kästchen und hilft Ihnen, Ihre Aufgaben zu organisieren, auch wenn Sie nicht ständig mit dem Internet verbunden sind
description_es : Todo List es una aplicación de gestión de listas y marcación de casillas.Todo List te ayuda a organizar tus tareas, incluso sin estar permanentemente conectado a Internet
description_pt : A Todo List é uma aplicação de gestão de listas e de marcação de caixas. A Todo List ajuda-o a organizar as suas tarefas, mesmo sem estar permanentemente ligado à Internet
description_it : Todo List è un'applicazione per la gestione degli elenchi e delle caselle da spuntare. Todo List vi aiuta a organizzare le vostre attività, anche senza essere permanentemente connessi a Internet
description_nl : Todo List is een applicatie voor lijstbeheer en het aanvinken van vakjes.Todo List helpt u uw taken te organiseren, zelfs zonder permanent verbonden te zijn met het internet
description_ru : Todo List - это приложение для управления списками и проставления галочек. Todo List поможет вам организовать свои задачи, даже не имея постоянного подключения к Интернету
audit_schedule :
editor : Microsoft
keywords : tasks,list
licence : Proprietary
homepage : https://apps.microsoft.com/store/detail/9NBLGGH5R558
package_uuid : 4b9b44be-1868-47e2-b076-37c5b148f406
valid_from :
valid_until :
forced_install_on :
changelog :
min_os_version : 10.0
max_os_version :
icon_sha256sum : c4005a9901d9b7f0428c0dfa8ccab841a0cf314f0a7536cbcdbeea9febe78929
signer : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature : gNjgf0IcJNxAnzYgCH1uC/nO1MpCSPwweG3tik8FFg7MGy+kilwuE1iR6MeFTrpVU8QqcPfCIPnOaR/Bfotn98sW6zHt99C5N376d+sFZsJfcv4s+sGwRI9d202RLannoeiwPrZh8bvDViPC50yksuQcDu+SQ0k/IzLWoPFLlk2c5TxPGMToyu8tQrY/GkyOcHHipbu7s7EkQSkoX/so58V9WXdZquXC+DAs6QqG2RKqZeKAQi4A5o1oh5i8JcTWzZpCD+8SjhvYHsubyXpPsxAj0llT0YrAvVlppK3mp9E57RQQh7JjIDRYanko/pNGVXgrCQjpGgYEkNSazkDTlg==
signature_date : 2023-02-25T15:00:15.250418
signed_attributes : package,version,architecture,section,priority,name,categories,maintainer,description,depends,conflicts,maturity,locale,target_os,min_wapt_version,sources,installed_size,impacted_process,description_fr,description_pl,description_de,description_es,description_pt,description_it,description_nl,description_ru,audit_schedule,editor,keywords,licence,homepage,package_uuid,valid_from,valid_until,forced_install_on,changelog,min_os_version,max_os_version,icon_sha256sum,signer,signer_fingerprint,signature_date,signed_attributes
Setup.py
# -*- coding: utf-8 -*-
from setuphelpers import *
appx_package = "Microsoft.Todos"
appx_dir = makepath(programfiles, "WindowsAppsInstallers")
windows_min_os_version = WindowsVersions.Windows10v1607
def install():
# Declaring local variables
bin_name = glob.glob("%s*%s*" % (appx_package, control.get_software_version()))[0]
bin_path = makepath(appx_dir, bin_name)
# Checking minimum Windows version for this UWP application
if windows_version() >= windows_min_os_version:
if not isdir(appx_dir):
mkdirs(appx_dir)
else:
for appx_file in glob.glob(makepath(appx_dir, "%s*%s*" % (appx_package, control.get_software_version()))):
if not control.get_software_version() in appx_file:
remove_file(appx_file)
if not isfile(bin_path):
print("Copying: %s to: %s" % (bin_name, appx_dir))
filecopyto(bin_name, appx_dir)
else:
error(
"This Windows version (%s) need to be upgraded to minimum version (%s) to use this package" % (windows_version(), windows_min_os_version)
)
def session_setup():
# Declaring local variables
bin_path = glob.glob(makepath(appx_dir, "%s*%s*" % (appx_package, control.get_software_version())))[0]
# Installing the software in user env
appx_version = get_powershell_str("Get-AppxPackage -Name %s" % appx_package, "Version")
if not appx_version or appx_version < control.get_software_version() or force:
print("Installing: %s" % bin_path.split("\\")[-1])
run_powershell('Add-AppxPackage -Path "%s"' % bin_path)
else:
print("%s is installed in correct version (%s)" % (appx_package, appx_version))
def uninstall():
remove_appx(appx_package)
for appx_file in glob.glob(makepath(appx_dir, "%s*%s*" % (appx_package, control.get_software_version()))):
remove_file(appx_file)
if isdir(appx_dir) and dir_is_empty(appx_dir):
print("Removing: %s since he is empty" % (appx_dir))
remove_tree(appx_dir)
update_package.py
# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
try:
from setupdevhelpers import *
except:
from bs4 import BeautifulSoup
import json
import waptguihelper
import re
def update_package():
# Declaring local variables
package_updated = False
proxies = get_proxies()
if not proxies:
proxies = get_proxies_from_wapt_console()
store_url = control.sources
if not store_url:
store_id = waptguihelper.input_dialog(
"Choice of app", "Enter the windows store app id (foundable in package url: https://apps.microsoft.com/store/apps)", store_url
).split("/")[-1]
else:
store_id = store_url.split("/")[-1]
store_id = store_id.split("?")[0]
url_ms = "https://apps.microsoft.com/store/detail/%s" % store_id
control.sources = url_ms
control.save_control_to_wapt()
package_prefix = control.package.split("-")[0]
# check setup.py incase the package name doesnt match the installer file
with open("setup.py", "r") as f:
for line in f.readlines():
if line.startswith("appx_package"):
store_package_name = line.split("=")[1].split('"')[1]
break
# Getting info from adguard api
res = requests.post(
"https://store.rg-adguard.net/api/GetFiles",
"type=ProductId&url=%s&ring=RP&lang=fr-FR" % store_id,
headers={"content-type": "application/x-www-form-urlencoded"},
proxies=proxies,
)
all_files = []
page = BeautifulSoup.BeautifulSoup(res.content, features="html.parser")
for bs_search in page.find_all("a"):
if not "BlockMap" in bs_search.text and not "eappxbundle" in bs_search.text and not "emsixbundle" in bs_search.text:
version = bs_search.text.split("_")[1]
bin_name = bs_search.text.replace("~", "_")
download_url = bs_search["href"]
pkg_splitted = re.split(r"_\d+\.", bin_name)[0]
package_name = package_prefix + "-" + pkg_splitted.split("_")[0].replace(".", "-").lower()
software_name = bin_name.split("_")[0].replace("-", " ").replace(".", " ")
if "arm64" in bin_name:
package_arch = "arm64"
elif "arm" in bin_name:
package_arch = "arm"
elif "x64" in bin_name:
package_arch = "x64"
elif "x86" in bin_name:
package_arch = "x86"
else:
package_arch = "all"
file_dict = {
"version": version,
"bin_name": bin_name,
"package_name": package_name,
"software_name": software_name,
"package_arch": package_arch,
"download_url": download_url,
}
all_files.append(file_dict)
if "template-microsoft-store" in control.package:
selected = waptguihelper.grid_dialog(
"Please select the proper file",
json.dumps(all_files),
waptguihelper.GRT_SELECTED,
'{"columns":[{"propertyname":"version","datatype":"String","required":false,"readonly":false,"width":130},{"propertyname":"bin_name","datatype":"String","required":false,"readonly":false,"width":420},{"propertyname":"package_name","datatype":"String","required":false,"readonly":false,"width":190},{"propertyname":"software_name","datatype":"String","required":false,"readonly":false,"width":172},{"propertyname":"package_arch","datatype":"String","required":false,"readonly":false,"width":88},{"propertyname":"download_url","datatype":"String","required":false,"readonly":false,"width":1472}]}',
)
else:
selected = [a for a in all_files if (control.architecture in a["package_arch"] or control.architecture == "all")]
if len(selected) != 1:
higer_version = "0"
for a in all_files:
if Version(higer_version) < Version(a["version"]) and store_package_name in a["bin_name"]:
higer_version = a["version"]
selected = [a for a in selected if higer_version == a["version"] and store_package_name in a["bin_name"]]
bin_selected = selected[0]
latest_bin = bin_selected["bin_name"]
version = bin_selected["version"]
download_url = bin_selected["download_url"]
package_name = bin_selected["package_name"]
software_name = bin_selected["software_name"]
package_arch = bin_selected["package_arch"]
if download_url.split("/")[2].endswith("microsoft.com"):
if not isfile(latest_bin):
print("Downloading: %s" % latest_bin)
wget(download_url, latest_bin, proxies=proxies)
else:
print("Binary file version corresponds to online version")
else:
print("ERROR: The retrieved url will not download from microsoft's servers")
# Adding dependencies
control.depends = ""
for dependency in list(set(d["package_name"] for d in all_files)):
if dependency not in control.depends and package_name != dependency:
control.add_depends(dependency)
# Warn end-user that depencies are required
missing_depends = []
for d in control.depends.split(","):
if not WAPT.is_available(d) and d != "":
missing_depends.append(d)
if missing_depends and "template" in control.package:
waptguihelper.message_dialog(
control.package,
'The following packages are not found in your repo, you must import them or use "template-microsoft-store-dependency" to create them with the same Store ID as this package\n\n%s'
% "\n".join(a for a in missing_depends),
)
# Asking pkg infos if needed
ask_control_categories()
control.architecture = package_arch
ask_control_package(package_name, "template-microsoft-store", remove_base_files=True)
ask_control_name(software_name, "Template Microsoft Store")
ask_control_description("update_package")
# Changing setup.py appx_package variable
new_lines = []
with open("setup.py", "r") as f:
for line in f.readlines():
if line.startswith("appx_package"):
line = 'appx_package = "%s"\n' % latest_bin.split("_")[0]
new_lines.append(line)
with open("setup.py", "w") as f:
f.writelines(new_lines)
# Changing version of the package
if Version(version) > Version(control.get_software_version()):
print("Software version updated (from: %s to: %s)" % (control.get_software_version(), Version(version)))
package_updated = True
else:
print("Software version up-to-date (%s)" % Version(version))
control.set_software_version(version)
control.save_control_to_wapt()
# Deleting outdated binaries
remove_outdated_binaries(version, ["appxbundle", "msixbundle", "appx", "msix", "part"], latest_bin)
# Validating or not update-package-sources
return package_updated
def ask_control_description(blank_str=None):
"""Requesting that the user supply package description for the control.description field
Args:
blank_str (str): The description will be cleared if it includes the specified string to avoid using the template description (default: do not clear description)
"""
if not control.description:
control.description = waptguihelper.input_dialog("Description", "Please fill the description", control.description)
control.save_control_to_wapt()
if blank_str is not None and blank_str in control.description:
control.description = ""
control.save_control_to_wapt()
return control.description
def ask_control_categories():
"""Requesting that the user supply package categories for the control.categories field if empty or Template is selected"""
if control.categories == "" or control.categories == "Template":
categories = waptguihelper.grid_dialog(
"Select package categories",
[
"Internet",
"Utilities",
"Messaging",
"Security",
"System and network",
"Media",
"Development",
"Office",
"Drivers",
"Education",
"Configuration",
"CAD",
"Template",
"Dependencies",
"Extensions",
],
waptguihelper.GRT_SELECTED,
)
if categories:
control.categories = ",".join([a["unknown"] for a in categories])
else:
control.categories = ""
control.save_control_to_wapt()
return control.categories
def ask_control_package(control_package=control.package, conditionnal_package_name=None, remove_base_files=False):
"""Requesting that the user provide a package name to be entered into the control.package field, and offering the possibility of removing the base files (icon.png and changelog.txt) for template package usage
Args:
control_package (str) : prefilled control_package (default: actual control_package)
conditionnal_package_name (str) : only ask when the control.package contains conditionnal_package_name (default: always ask for control_package)
remove_base_files (bool) : removes base files if parameter is True and conditionnal_package_name is provided (default: False)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.package:
control.package = waptguihelper.input_dialog(control.package, "You can redefine the package name", control_package)
control.save_control_to_wapt()
# Removing template files
if conditionnal_package_name in control.package and remove_base_files:
if isfile("WAPT\\changelog.txt"):
remove_file("WAPT\\changelog.txt")
if isfile("WAPT\\icon.png"):
remove_file("WAPT\\icon.png")
return control.package
def ask_control_name(control_name=control.name, conditionnal_package_name=None):
"""Requesting that the user provide a package name to be entered into control.name field
Args:
control_name (str) : prefilled control_name (default: control.name)
conditionnal_package_name (str) : only ask when the control.name contains conditionnal_package_name (default: always ask for control_name)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.name:
control.name = waptguihelper.input_dialog(control.name, "You can redefine the name for the self-service", control_name)
control.save_control_to_wapt()
return control.name
b28cb193a93278db6aa27c6d307e2d89f7c9a43fcfb26a46f25ef4ff1f4ff993 : setup.py
bf9536e36eaeeabbb348ab7c288f5d2537fbd6ad5150e3d5f9f333ecfaa386f0 : Microsoft.Todos_2.90.6411.0_neutral___8wekyb3d8bbwe.appxbundle
b977f67d687cc923fa4e1ceb25432a6427a970b383e73b2b3cfdd6da8b43cd0b : update_package.py
c4005a9901d9b7f0428c0dfa8ccab841a0cf314f0a7536cbcdbeea9febe78929 : WAPT/icon.png
a5a97261381e1d0ad46ee15916abec9c2631d0201f5cc50ceb0197a165a0bbbf : WAPT/certificate.crt
acfdc1fd4f8712301350b5e459dc8215402a4ca88f404a50cf61ff023bbecbd1 : WAPT/changelog.txt
f3e81d8e02cbb6532295018b76dac083eed0a6896b535ab38ceb6d8ff9b28601 : luti.json
77c2074d99106c81c0b26a363f167c3c89ff2c8825eff35e12344d20e202c882 : WAPT/control