openmoko: spedire sms da terminale

ho fatto uno script in python per mandare sms, non ho usato dbus visto che sono incapace ma ho usato un altro metodo empirito che e’ il risultato di un po’ di reversing :)
si, forse facevo prima a studiarmi da capo dbus… ma tant’e’ :)

in pratica volevo fare un programmino che tramite una semplice pressione sull’apposita icona mandasse un sms preimpostato a mia morosa. il testo del messaggio e’ semplicemente “<3″, un cuore in ascii :)

ho fatto un po’ di reversing (che magari e’ tutto documentato ma io non mi sono nemmeno messo a cercare) di qtmail che e’ il coso di qtopia che spedisce i messaggi.
in pratica qtmail ha un suo database, con sqlite3, per storare gli sms, o almeno gli indici degli sms, il database sta in /home/root/Applications/qtmail/qtopia_db.sqlite e che va aperto con comando sqlite3 ./qtopia_db.sqlite
dentro poi accetta i comandi sql standard (tranne che alcune piccolezze tipo describe per vedere lo schema di una tabelle, che comunque si puo’ esportare in formato csv)
oltre al database ha una directory /home/root/Applications/qtmail/mail dove tiene un file per ogni sms (inviato o ricevuto che sia, il formato cambia a seconda che sia stato inviato o ricevuto)

quindi, scoperto cio’, bisogna prima scrivere una query nuova che inserisce un sms nella “cartella” Outbox, che corrisponde al parentfolderid 5. la mia query e’: insert into mailmessages values(’99′,’4′,’5′,null,’12345678′,’<3′,null,’194′,null,null,’sms.tmp’,null,’0′);
dove “12345678″ e’ il numero di telefono, “99″ e’ un id autoincrement a cui io presumo non arrivero’ mai con gli sms (sarebbe figo fare in modo di incrementare al volo l’indice ma poi bisognerebbe ripescarlo quando poi faccio la query delete), il 4 non lo so, il 5 e’ l’id che indica che deve andare in Outbox, il “<3″ sono le prime lettere perche’ il messaggio vero e proprio sta nel file che dicevo prima dentro la directory mail.
194 indica che il messaggio e’ da spedire (una volta spedito lo fa diventare 193) mentre sms.tmp e’ il nome del file temporaneo che gli ho specificato io, e che creo dentro la directory apposita.

questo file temporaneo, nel formato per spedire gli sms, e’ fatto cosi’:
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
To: 12345678
Cc:
Bcc:
Subject: <3
Date:
MIME-Version: 1.0

PDM=

(nell’ultima riga non c’e’ nessun ritorno a capo)
che e’ piuttosto chiaro tranne la parte che dice “PDM=” che non e’ altro che la stringa di testo encodata con base64, la stringa di testo e’ “<3″
un’altra cosa scomodissima e’ che i ritorni a capo non sono semplici LF tipici dei sistemi unix, ma CR/LF, come accade nei file di testo su windows, per la conversione c’e’ un’apposita libreria in python.

il Subject indica solo le lettere iniziali del messaggi, che poi vengono mostrare nell’alterpima nella lista dei messaggi. se il messaggio fosse stato piu’ lungo li avremo avuto pochi caratteri mentre tutto quanto il messaggi starebbe nella stringa encodata

dunque, quindi, concettualmente, bisogna scrivere la query e creare il file di testo e poi lanciare qtmail perche’ e’ lui che si occupa di spedire i messaggi. qtmail, quando lo lanci, va a leggere dentro Outbox e, nel caso, spedisce i messaggi. finita questa operazione ci serve di chiudere qtmail.

ecco il mio sorgente in python:

#!/usr/bin/python

import sqlite3
import os
import time
import re

fileout=”””Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
To: 12345678
Cc:
Bcc:
Subject: <3
Date:
MIME-Version: 1.0

PDM=”””
newfileout = re.sub(“\r?\n”, “\r\n”, fileout)

os.system(“rm /home/root/Applications/qtmail/mail/sms.tmp”)
f = open(“/home/root/Applications/qtmail/mail/sms.tmp”, “w”)
f.write (newfileout)
f.close()

con = sqlite3.connect(“/home/root/Applications/qtmail/qtopia_db.sqlite”)
cur = con.cursor()

cur.execute(“insert into mailmessages values(’99′,’4′,’5′,null,’12345678′,’<3′,null,’194′,null,null,’sms.tmp’,null,’0′);”)
con.commit()
time.sleep(1)
os.system(“qtmail &”)
time.sleep(5)
os.system(“killall qtmail”)
cur.execute(“delete from mailmessages where id = ’99′”)
con.commit()
cur.close()

il killall qtmail dopo un time.sleep(5) forse non e’ troppo elegante, anzi, sicuramente non le e’ affatto, pero’ funziona :)

detto questo allego anche uno screenshot con l’icona pronta a mandare l’sms :)

openmoko screenshot

openmoko screenshot

About these ads

Una risposta »

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...