sputnick a écrit 92 commentaires

  • # audit

    Posté par  (site web personnel, Mastodon) . En réponse au journal J'ai failli le faire. Évalué à 10 (+12/-1).

    C'est un sujet que j’essaye de traiter/implémenter en ce moment en utilisant un script Python.

    A la fin, j'obtiens une note de 0 à 100.

    0 est fiable selon mes critères, non zéro, il faut se poser des questions.

    Le script:

    #!/usr/bin/env python3
    
    import zipfile
    import json
    import re
    import os
    import sys
    from collections import defaultdict
    
    # -----------------------------------------
    # YARA-like malicious patterns
    # -----------------------------------------
    yara_rules = {
        "eval_obfuscation": r"eval\s*\(",
        "function_constructor": r"new Function\s*\(",
        "xhr_suspicious": r"XMLHttpRequest\s*\(",
        "websocket": r"new WebSocket\s*\(",
        "crypto_mining": r"(CoinHive|cryptonight|miner)",
        "tracking_fingerprinting": r"(canvas\.toDataURL|audioContext|mediaDevices\.enumerateDevices)",
        "url_beacon": r"(navigator\.sendBeacon)",
        "shadow_dom_injection": r"(attachShadow)",
        "encoded_payload": r"(atob\(|btoa\()",
        "exfiltration_fetch": r"fetch\s*\([^)]*(http|https):\/\/",
        "suspicious_iframe": r"<iframe[^>]+src="
    }
    
    # -----------------------------------------
    # Sensitive Firefox permissions → explanations
    # -----------------------------------------
    permission_explanations = {
        "tabs": "Access to all browser tabs (privacy sensitive).",
        "cookies": "Can read/write cookies across sites.",
        "webRequest": "Can monitor/modify all network requests.",
        "webRequestBlocking": "Can block and alter network requests (highly sensitive).",
        "history": "Can read browsing history.",
        "downloads": "Full access to all downloads.",
        "nativeMessaging": "Can communicate with external apps (critical).",
        "management": "Can manage extensions (dangerous).",
        "proxy": "Can alter browser network proxy settings.",
        "storage": "Can store arbitrary data (may include tracking identifiers)."
    }
    
    # -----------------------------------------
    # Known tracker domains for filtering endpoints
    # -----------------------------------------
    TRACKERS = ["google-analytics", "doubleclick", "facebook", "fbcdn",
                "hotjar", "mixpanel", "matomo", "segment.io",
                "sentry", "amplitude", "snowplow"]
    
    # -----------------------------------------
    # Utility functions
    # -----------------------------------------
    def detect_minification(content):
        line_lengths = [len(line) for line in content.split("\n")]
        long_lines = sum(1 for l in line_lengths if l > 300)
        ratio = long_lines / max(1, len(line_lengths))
        return ratio > 0.30  # heuristic
    
    def detect_obfuscation(content):
        suspicious = 0
        if re.search(r"[A-Za-z_$]{1,2}\d{3,}", content):
            suspicious += 1
        if re.search(r"function\(\w,\w,\w\)\{", content):
            suspicious += 1
        if re.search(r"while\s*\(\!\!\[\]\)", content):
            suspicious += 1
        return suspicious >= 2
    
    def yara_scan(content):
        matches = []
        for name, pattern in yara_rules.items():
            if re.search(pattern, content, re.IGNORECASE):
                matches.append(name)
        return matches
    
    def extract_urls(content):
        pattern = r"https?://[A-Za-z0-9\.\-_/~\?#=%]+(?=[\s\"\'\)\]\}<>]|$)"
        return re.findall(pattern, content)
    
    def classify_urls(urls):
        classified = {"trackers": [], "api": [], "other": []}
        for u in urls:
            if any(t in u for t in TRACKERS):
                classified["trackers"].append(u)
            elif re.search(r"/api/|/v\d+/|token|auth", u):
                classified["api"].append(u)
            else:
                classified["other"].append(u)
        return classified
    
    # -----------------------------------------
    # Compute global risk score
    # -----------------------------------------
    def compute_risk_score(permissions, minified_files, obfuscated_files, yara_hits, urls):
        score = 0
    
        # Permissions
        if "<all_urls>" in permissions:
            score += 25
        if "webRequest" in permissions:
            score += 10
        if "cookies" in permissions:
            score += 10
        if "history" in permissions:
            score += 10
        if "nativeMessaging" in permissions:
            score += 20
    
        # File metrics
        score += len(minified_files) * 5
        score += len(obfuscated_files) * 10
    
        # YARA hits
        for hits in yara_hits.values():
            score += len(hits) * 10
    
        # URLs
        score += min(len(urls), 10)  # up to 10 points
    
        # Cap at 100
        return min(score, 100)
    
    # -----------------------------------------
    # Main analysis
    # -----------------------------------------
    def analyze_xpi(file_path):
        report = []
        js_files = {}
        urls_found = set()
        yara_hits = defaultdict(list)
        minified_files = []
        obfuscated_files = []
    
        with zipfile.ZipFile(file_path, 'r') as z:
            # -------------------------
            # 1. MANIFEST EXTRACTION
            # -------------------------
            manifest_data = None
            for name in z.namelist():
                if name.endswith("manifest.json"):
                    manifest_data = json.loads(z.read(name).decode("utf-8", errors="ignore"))
                    break
    
            if manifest_data is None:
                report.append("No manifest.json found → invalid extension.")
                return "\n".join(report)
    
            # -------------------------
            # 2. Inspect manifest.json
            # -------------------------
            report.append("=== MANIFEST ANALYSIS ===\n")
    
            # Permissions
            permissions = manifest_data.get("permissions", [])
            host_permissions = manifest_data.get("host_permissions", [])
    
            report.append("Permissions declared:")
            if not permissions:
                report.append("  None")
            else:
                for perm in permissions:
                    explanation = permission_explanations.get(perm, "No specific risk info.")
                    report.append(f"  - {perm}: {explanation}")
    
            report.append("\nHost permissions:")
            if not host_permissions:
                report.append("  None")
            else:
                for host in host_permissions:
                    report.append(f"  - {host}")
    
            # Data collection declaration
            dcp = manifest_data.get("data_collection_permissions", {})
            report.append("\nData collection permissions:")
    
            if dcp:
                report.append(f"  Raw: {json.dumps(dcp, indent=4)}")
                if dcp.get("required") == ["none"]:
                    report.append("  → The extension claims to collect NO DATA.")
            else:
                report.append("  No data collection declaration found.")
    
            report.append("\n")
    
            # -------------------------
            # 3. FILE CONTENT ANALYSIS
            # -------------------------
            report.append("=== FILE ANALYSIS ===\n")
    
            for name in z.namelist():
                if not name.endswith((".js", ".html", ".css")):
                    continue
    
                content = z.read(name).decode("utf-8", errors="ignore")
    
                # JS only
                if name.endswith(".js"):
                    js_files[name] = content
    
                    # Minification detection
                    if detect_minification(content):
                        minified_files.append(name)
    
                    # Obfuscation detection
                    if detect_obfuscation(content):
                        obfuscated_files.append(name)
    
                    # YARA-like scan
                    for hit in yara_scan(content):
                        yara_hits[name].append(hit)
    
                # URL extraction (JS/HTML/CSS)
                for url in extract_urls(content):
                    urls_found.add(url)
    
            # Minified
            report.append("Potentially minified files:")
            if minified_files:
                for f in minified_files:
                    report.append(f"  - {f}")
            else:
                report.append("  None")
            report.append("")
    
            # Obfuscated
            report.append("Potentially obfuscated files:")
            if obfuscated_files:
                for f in obfuscated_files:
                    report.append(f"  - {f}")
            else:
                report.append("  None")
            report.append("")
    
            # YARA hits
            report.append("YARA-like detection results:")
            if yara_hits:
                for f, hits in yara_hits.items():
                    report.append(f"  {f}: {', '.join(hits)}")
            else:
                report.append("  No suspicious patterns detected.")
            report.append("")
    
            # URLs
            classified = classify_urls(urls_found)
            report.append("External endpoints found:")
            for cat, urls in classified.items():
                report.append(f"  {cat.capitalize()}:")
                if urls:
                    for u in urls:
                        report.append(f"    - {u}")
                else:
                    report.append("    None")
            report.append("")
    
            # -------------------------
            # 4. Global risk score
            # -------------------------
            risk_score = compute_risk_score(permissions, minified_files, obfuscated_files, yara_hits, urls_found)
            report.append(f"=== GLOBAL RISK SCORE: {risk_score}/100 ===\n")
    
            # -------------------------
            # 5. Final Privacy Warning
            # -------------------------
            report.append("=== PRIVACY RECOMMENDATION ===")
            report.append(
                "Always disable automatic updates for extensions when conducting security reviews. "
                "Updates may replace safe code with unsafe content without user confirmation."
            )
    
            return "\n".join(report)
    
    if __name__ == "__main__":
        if len(sys.argv) != 2:
            print("Usage: python3 audit_xpi.py extension.xpi")
            sys.exit(1)
    
        filePath = sys.argv[1]
        print(analyze_xpi(filePath))

    Le report me donne pour tampermonkey:

    === MANIFEST ANALYSIS ===
    
    Permissions declared:
      - alarms: No specific risk info.
      - notifications: No specific risk info.
      - tabs: Access to all browser tabs (privacy sensitive).
      - idle: No specific risk info.
      - webNavigation: No specific risk info.
      - webRequest: Can monitor/modify all network requests.
      - webRequestBlocking: Can block and alter network requests (highly sensitive).
      - unlimitedStorage: No specific risk info.
      - storage: Can store arbitrary data (may include tracking identifiers).
      - contextMenus: No specific risk info.
      - clipboardWrite: No specific risk info.
      - cookies: Can read/write cookies across sites.
      - downloads: Full access to all downloads.
      - <all_urls>: No specific risk info.
    
    Host permissions:
      None
    
    Data collection permissions:
      No data collection declaration found.
    
    
    === FILE ANALYSIS ===
    
    Potentially minified files:
      - content.js
      - extension.js
      - page.js
      - editor.js
      - lint.js
      - cache.js
      - background.js
      - vendor/saveas/filesaver.js
      - vendor/eslint/eslint.js
      - vendor/jsdiff/diff.js
    
    Potentially obfuscated files:
      - content.js
      - extension.js
      - editor.js
      - background.js
      - vendor/eslint/eslint.js
    
    YARA-like detection results:
      content.js: shadow_dom_injection, encoded_payload
      extension.js: function_constructor, crypto_mining, suspicious_iframe
      background.js: eval_obfuscation, function_constructor, crypto_mining, encoded_payload
      vendor/eslint/eslint.js: eval_obfuscation, function_constructor, tracking_fingerprinting
    
    External endpoints found:
      Trackers:
        - https://www.facebook.com/tampermonkey
        - https://a.tampermonkey.net/matomo.php
        - https://www.facebook.com/groups/SocialFixerUsersSupport/
        - https://www.facebook.com/fluffbustingpurity
      Api:
        - https://api.dropboxapi.com/2/auth/token/revoke
        - https://cloud-api.yandex.net/v1/disk/
        - https://www.googleapis.com/drive/v3/changes/startPageToken
        - https://www.googleapis.com/auth/drive.appdata
        - https://oauth.yandex.com/authorize
        - https://login.live.com/oauth20_authorize.srf
        - https://www.googleapis.com/drive/v3/files?
        - https://www.googleapis.com/drive/v3/changes/?
        - https://accounts.google.com/o/oauth2/v2/auth
        - https://www.googleapis.com/drive/v3/files/
        - https://www.dropbox.com/oauth2/authorize
        - https://accounts.tampermonkey.net/e/oauth2/v1
      Other:
        - https://eslint.org/docs/rules/no-process-env
        [...] filtered tons of eslint URLs
        - http://coffeescript.org/browser-compiler/coffeescript.js
        - https://eslint.org/docs/rules/no-new-native-nonconstructor
        - https://www.tampermonkey.net/faq#Q406
        - https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js
        - https://greasyfork.org/scripts/
        - https://eslint.org/docs/rules/prefer-spread
        - https://eslint.org/docs/rules/no-undef-init
        - http://xkcd.com/970/
        - https://api.dropboxapi.com/2/files/delete
        - https://api.onedrive.com/v1.0/drive/special
        - https://forum.userstyles.org/post/discussion?Discussion/StyleID=
        - http://json-schema.org/draft-07/schema#
        - https://eslint.org/docs/rules/no-negated-condition
        - https://www.tampermonkey.net/privacy.php#extension
        - https://bitbucket.org/
        - https://content.dropboxapi.com/2/files/upload
        - https://github.com/openstyles/stylus
        - http://feross.org
        - https://userstyles.org/styles/
        - http://userscripts.com/
        - https://eslint.org/docs/rules/indent
        - https://eslint.org/docs/rules/require-unicode-regexp
        - http://socialfixer.com
        - http://contactbyweb.com/userscripts-mirror
        - https://github.com/zloirock/core-js/blob/v3.27.2/LICENSE
        - https://github.com/mysticatea
        - https://github.com/zloirock/core-js
        - http://www.w3.org/1999/xhtml
        - http://userscripts-mirror.org/scripts/review/
        - http://www.w3.org/1999/xlink
        - https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#
        - https://eslint.org/docs/rules/space-before-function-paren
        - https://github.com/eslint/doctrine
        - http://www.w3.org/2000/svg
        - http://tampermonkey.net/
        - https://www.tampermonkey.net/bug
        - https://opencollective.com/eslint
        - https://github.com/narcolepticinsomniac
        - https://www.tampermonkey.net/faq.php#Q204
        - https://www.instagram.com/der_jan_b/
        - http://userscripts-mirror.org/scripts/show/
        - https://www.googleapis.com/
        - https://github.com/estools/esrecurse
        - https://www.google.com/s2/favicons
        - http://json-schema.org/draft-04/schema#
        - https://blacklist.tampermonkey.net/get.php
        - https://www.fbpurity.com/
        - https://www.tampermonkey.net/faq.php#Q500
        - http://tmnk.net/faq#Q208
        - https://api.dropboxapi.com/2/files/list_folder
        - https://www.tampermonkey.net/privacy.php
        - https://www.tampermonkey.net/scripts.php
        - https://www.nczonline.net
        - https://eslint.org/docs/rules/no-multiple-empty-lines
        - https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js
        - https://www.tampermonkey.net/faq.php?
        - http://userscripts.org/
        - https://icons.duckduckgo.com/ip2/
        - https://github.com/estools/esrecurse.git
        - https://www.tampermonkey.net
        - http://json-schema.org/draft-07/schema
        - https://github.com/Constellation
        - https://gitlab.com/
        - https://vscode.dev/?connectTo=tampermonkey
        - https://api.onedrive.com/v1.0/drive/items/
        - https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js
        - http://github.com/garycourt/uri-js
        - https://github.com/derjanb
        - https://notify.dropboxapi.com/2/files/list_folder/longpoll
        - https://www.tampermonkey.net/documentation.php#_connect
        - https://sleazyfork.org/scripts/
        - https://www.tampermonkey.net/qr/
        - https://content.dropboxapi.com/2/files/download
        - https://www.tampermonkey.net/changelog.php?
        - https://openuserjs.org/scripts/
        - https://webdav.yandex.ru
        - https://stuk.github.io/jszip/documentation/howto/read_zip.html
        - https://www.tampermonkey.net/contrib.php?embedded=2
        - http://json-schema.org/schema
        - https://www.tampermonkey.net/installed.php?
        - https://www.tampermonkey.net/faq.php#Q207
    
    === GLOBAL RISK SCORE: 100/100 ===
    
    === PRIVACY RECOMMENDATION ===
    Always disable automatic updates for extensions when conducting security reviews. Updates may replace safe code with unsafe content without user confirmation.
    
    

    On ne peut pas mettre d'array dans le string...

  • # routeur

    Posté par  (site web personnel, Mastodon) . En réponse au lien Que sont les « TRM » ? Après les LLM, comprendre la future révolution de l’IA . Évalué à 2 (+1/-0).

    Les LLM (Large Language Models) modernes implémentent déjà des routeurs (ou “gating networks”) permettant de sélectionner dynamiquement des sous-modèles spécialisés (“experts”) à partir d’un modèle généraliste — une architecture connue sous le nom de Mixture of Experts (MoE).

    C’est notamment le cas avec Mixtral (de Mistral AI), un LLM “sparse MoE” dans lequel chaque couche est constituée de 8 « experts » (des blocs FFN), mais seulement 2 experts sont activés par token pendant l’inférence. (ictjournal.ch)

    Grâce à ce mécanisme, bien que le modèle total ait environ 46,7 G paramètres, seuls ~13 G sont utilisés par token actif, ce qui permet de combiner expressivité et efficacité. (uplatz.com)

    Des études ont montré que les experts de Mixtral peuvent être sélectionnés de manière “plutôt équilibrée” selon les tokens et qu’il existe des séquences de plusieurs tokens routées vers le même expert, ce qui suggère une certaine spécialisation fonctionnelle. (aclanthology.org)

    L’architecture MoE repose donc sur deux composants fondamentaux :

    1. Les experts, des sous-réseaux spécialisés apprenant chacun différentes “facettes” du problème. (birow.com)

    2. Le routeur, qui, pour chaque token, décide quels experts activer — souvent selon un schéma “top‑k” (par exemple “top‑2” pour Mixtral) pour sélectionner les meilleurs experts. (ibm.com)

    De plus, cette approche n’est pas seulement théorique : des recherches récentes explorent des variantes comme Self‑MoE, qui transforme un LLM monolithique en un système modulaire d’experts auto-spécialisés (MiXSE), en utilisant des données synthétiques générées par le modèle lui-même, avec un routage optimisé. (arxiv.org)

    D’autres travaux examinent les défis du routage, comme la cohérence locale du routage, ce qui a des implications pour l’efficacité mémoire et le déploiement. (arxiv.org)

    On ne peut pas mettre d'array dans le string...

  • # init=/bin/bash

    Posté par  (site web personnel, Mastodon) . En réponse au message mot de passe user oublié. Évalué à 5 (+4/-0). Dernière modification le 19 novembre 2025 à 19:01.

    Su t'a Grub, au boot, il faut arriver à taper:

    init=/bin/bash
    

    après avoir tapé 'e' pour edit.

    ensuite, une fois en root:

    mount -o remount,rw /
    passwd  user25
    

    Et voilà =)

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: modif pdf

    Posté par  (site web personnel, Mastodon) . En réponse au message Rendre un PDF sans formulaires -> avec formulaires interactifs. Évalué à 2 (+1/-0).

    Je viens d'ouvrir un PDF dans Firefox, il n'y a rien d'éditable

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: xournal(++) ?

    Posté par  (site web personnel, Mastodon) . En réponse au message Rendre un PDF sans formulaires -> avec formulaires interactifs. Évalué à 2 (+1/-0).

    Whoah; c'est exactement ce que j'aurais aimé trouver plus tôt. Merci!

    https://github.com/xournalpp/xournalpp

    On ne peut pas mettre d'array dans le string...

  • # C'est un scandaaaaale!

    Posté par  (site web personnel, Mastodon) . En réponse au message Rendre un PDF sans formulaires -> avec formulaires interactifs. Évalué à 3 (+2/-0).

    Sérieux, en 2025, la DGFIP n'est pas foutue de nous pondre un PDF avec des formulaires interactifs ?

    Ils nous coûtent 'un pognon de dingue' pourtant!

    Ca m'a pris un temps fou avec Draw. Mon rêve était du code pour rendre un PDF 'flat' éditable, mais ce n'est qu'un rêve.

    On ne peut pas mettre d'array dans le string...

  • # awk+python

    Posté par  (site web personnel, Mastodon) . En réponse au message Récupérer la valeur entière d'un double. Évalué à 3. Dernière modification le 07 avril 2025 à 23:08.

    avec awk:

    $ awk 'BEGIN{w=250.49;print int(w)}'
    250
    

    avec python

    $ python -c 'w = 250.49; print(int(w))'
    250
    

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: craquer

    Posté par  (site web personnel, Mastodon) . En réponse au message Cherche RETEX visio-conférences sous Linux. Évalué à 1.

    Pas d'enregistrement, non.

    La prise jack est prévue pour y brancher micro ET headphone en même temps?

    Ça semble moins compliqué que les combinés USB du coup.

    On ne peut pas mettre d'array dans le string...

  • # concis et propre...

    Posté par  (site web personnel, Mastodon) . En réponse au message besoin d'aide pour un script : extraire un nombre et le réutiliser. Évalué à 1.

    Mieux vaut tard que jamais ^

    xinput | awk -F'id=| +' '/EPSON/{print $(NF-3)}'
    16
    17
    18
    19
    

    On ne peut pas mettre d'array dans le string...

  • # avx?!

    Posté par  (site web personnel, Mastodon) . En réponse au message Problème installation MongoDB dans Ubuntu. Évalué à 1.

    Oui, il faut faire un

    systemctl status mongod
    Si ça coince, vérifier que tu a bien le support de avx avec ton CPU:

    lscpu | grep -x avx
    obligatoire au dessus des versions > 4.4.16

    On ne peut pas mettre d'array dans le string...

  • # suite...

    Posté par  (site web personnel, Mastodon) . En réponse au message Cherche API SMS pour pas cher ou gratuit. Évalué à -1.

    Je finis mon message malgré le timeout:

    Aussi, le prix est en accord avec ce que je gagne. Si j'étais salarié sur ce projet et/ou bien payé, j'utiliserais des SMS. Des fois, il faut faire des compromis pour un projet intéressant techniquement.

    Là le but est de scraper Facebook marketplace, Offerup et Craiglist. Ca m'a pris un temps considérable en R&D, en conception et en implémentation.

    J'ai trouvé des super tricks pour me créer mes propres proxy (rotatifs) à base de Docker et de ProtonVPN/OpenVPN. C'est économique et ça fonctionne.

    J'espère pouvoir scaler et avoir d'autres clients avec le même besoin si je vois que ça tiens sur la longueur.

    Des pistes pour utiliser WhatsApp de façon programmatique: https://stackoverflow.com/questions/47243154/how-to-send-whatsapp-message-via-javascript

    On ne peut pas mettre d'array dans le string...

  • # WhatsApp?!#~%*£ Vindioooou!!!

    Posté par  (site web personnel, Mastodon) . En réponse au message Cherche API SMS pour pas cher ou gratuit. Évalué à -5.

    Bon, ben désolé de vous décevoir (encore…), mais j'ai choisis WhatsApp:

    • le client l'a déjà, et c'est notre moyen de communiquer
    • je garde XMPP en backup, mais c'est chiant de demander à mon client d'installer une appli IOS et de la configurer. Je n'ai pas de matériel Mac en plus pour faire une doc, et je ne suis pas branché Apple du tout du tout… (Trop fermé).
    • pour finir, ça va peut-être vous rassurer (ou pas…), mais je suis flexitarien en tout:
      • je mange de tout, mais j'évite de manger de la viande tous les jours
      • si il n'y a pas de solutions libres satisfaisantes, oui, j'utilise du proprio
      • je suis engagé dans le Libre par ailleurs, et je n'ai pas à me justifier, j’espérai plus de tolérance…

    On ne peut pas mettre d'array dans le string...

  • # Rageux

    Posté par  (site web personnel, Mastodon) . En réponse au message Cherche API SMS pour pas cher ou gratuit. Évalué à 1.

    Vous faites les rageux à downvoter parce-que je gagne trois pépettes?

    Ma question est mal formulée?

    On ne peut pas mettre d'array dans le string...

  • # flock

    Posté par  (site web personnel, Mastodon) . En réponse au message accès concurrentiel aux fichiers. Évalué à 6. Dernière modification le 09 mars 2023 à 20:39.

    Dans le doute, tu peux utiliser flock pour n'autoriser qu'une instance.

    exec 9>/path/to/lock/file
    if ! flock -n 9; then
        printf 'another instance is running\n';
        exit 1
    fi

    (dans les 2 scripts, le même lock bien sur)

    On ne peut pas mettre d'array dans le string...

  • # En prod'

    Posté par  (site web personnel, Mastodon) . En réponse au message App(lication) et compte SIP pour ordiphone de Pauvre©®™ . Évalué à 6.

    La solution OVH a été adoptée. C'est très bien avec LinPhone. J'avais un peu peur en tapant UDP dans la case, mais je n'ai pas ressenti de dégradation dans les communications.

    Un grand merci, reste à explorer le trick https://www.reddit.com/r/bell/comments/rzvszu/wifi_calling_while_abroad_through_a_vpn/ parmi tant d'autres projets en tête.

    Merci à tous!

    On ne peut pas mettre d'array dans le string...

  • [^] # Pas queue

    Posté par  (site web personnel, Mastodon) . En réponse au message App(lication) et compte SIP pour ordiphone de Pauvre©®™ . Évalué à 1.

    Mobiles et lignes fixes.

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: 8 ans ...

    Posté par  (site web personnel, Mastodon) . En réponse au message Qu'est devenu Lolix v2?. Évalué à 1. Dernière modification le 21 février 2023 à 17:58.

    8 435 € == 200% de la demande…

    Rendez nous les Sioux!

    On ne peut pas mettre d'array dans le string...

  • [^] # Wow

    Posté par  (site web personnel, Mastodon) . En réponse au message App(lication) et compte SIP pour ordiphone de Pauvre©®™ . Évalué à 1.

    Hé, j'y avais pas pensé :D

    Sérieusement, j'essaye d'appeller des numéros réels

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: 8 ans ...

    Posté par  (site web personnel, Mastodon) . En réponse au message Qu'est devenu Lolix v2?. Évalué à 2.

    Non mais WTF? Le projet à récolté la totalité de la somme en 24h, et 10 ans après il n'y a rien?

    Rodolphe Quiédeville, est-tu vivant?

    Son linkedin semble actif, commenté un post il y a 6 jours: https://www.linkedin.com/feed/update/urn:li:activity:7031573433838661632/

    On a tous en nous quelque chose de T… Lolix.

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: 8 ans ...

    Posté par  (site web personnel, Mastodon) . En réponse au message Qu'est devenu Lolix v2?. Évalué à 1.

    OK, mais où est le site en prod?

    On ne peut pas mettre d'array dans le string...

  • # kimsufi

    Posté par  (site web personnel, Mastodon) . En réponse au message Quel hébergeur/type d'hébergement pour installer NextCloud ?. Évalué à 1.

    Salut,

    pour moins de 10€ tu peut avoir un serveur dédié OVH kimsufi.

    Pour des besoins comme nextcloud + pas mal d'autres choses, c'est très bien.

    ++sputnick;

    On ne peut pas mettre d'array dans le string...

  • # no upper case !

    Posté par  (site web personnel, Mastodon) . En réponse au message Mettre en commentaire une liste de varaibles dans plusieurs scripts. Évalué à 1.

    Salut,

    en shell il est déconseillé d'utiliser des variables en MAJUSCULES, car elle sont réservées au système.

    Ça va fonctionner, jusqu'au jour où tu va t'arracher les cheveux par ce que tu aura pris une variable $SECONDS par exemple. (temps écoulé depuis l'ouverture du shell courant).

    ++sputnick;

    On ne peut pas mettre d'array dans le string...

  • # xrdp

    Posté par  (site web personnel, Mastodon) . En réponse au message x2go serveur sous Mint 19.3. Évalué à 1.

    Salut,

    le mieux que je connaisse c'est le daemon GNU Linux xrdp et un client rdesktop.

    J'ai testé plusieurs solutions (dont xgo) avant de retenir celle là.

    ++sputnick;

    On ne peut pas mettre d'array dans le string...

  • # Méééé

    Posté par  (site web personnel, Mastodon) . En réponse au message brave (le butineur) est il si respectueux de la privacy qu'il l'annonce ?. Évalué à 1.

    Salut,

    pourquoi autant de moinssage ? Peut-on m'expliquer ?

    On ne peut pas mettre d'array dans le string...

  • [^] # Re: XPrivacy

    Posté par  (site web personnel, Mastodon) . En réponse au message Est-ce que google parse les emails hors gmail ?. Évalué à 1.