Pemrograman Qt 18 – QTextStream untuk Membuat Aplikasi Proxy Changer


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoPernahkah Anda menggunakan koneksi internet yang berotentikasi (username dan password) melalui proxy server? Jika pernah, Anda akan mengalami kesulitan mengatur proxy server untuk browser (selain Firefox), apt-get, dan Ubuntu Software Center ketika ingin menginstal aplikasi. Selain itu, Anda juga akan kesulitan mengatur proxy server untuk selain apt-get secara system wide karena di Ubuntu sendiri belum ada GUI untuk mengatur otentikasinya, yang ada hanya kotak isian alamat proxy server dan nomor port. Otentikasinya justru tidak ada. Sementara Anda akan menemukan bahwa mudah sekali mengatur proxy server di Synaptic Package Manager karena dia memiliki pengaturan yang lengkap dalam hal ini. Selain Synaptic, Anda juga menemukan kemudahan mengatur otentikasi pada Firefox (atau browser yang memiliki pengaturan proxy independen lainnya). Kali ini saya akan menunjukkan program yang menjadi impian lama saya itu. Saya akan membuat satu aplikasi GUI yang mampu menerima masukan otentikasi (akun) proxy server Anda dan memasukkannya ke dalam berkas konfigurasi apt.conf. Program ini sudah layak coba sehingga Anda bisa menerapkannya langsung hari ini juga. Semoga tulisan ini bermanfaat.

Spesifikasi Sistem

  1. Ubuntu 12.04
  2. Qt Creator 2.4.1
  3. Qt 4.8

Daftar Kelas

  1. QLineEdit
  2. QIntValidator
  3. QTextStream
  4. QFile

Daftar Method

  1. setRange() <- milik QIntValidator
  2. setValidator() <- milik QLineEdit
  3. setEchoMode() <- milik QLineEdit
  4. setFileName() <- milik QFile
  5. open() <- milik QFile
  6. operator <<() <- milik QTextStream

Arah Tulisan Ini

Pertama-tama, perlu diketahui dulu bahwa Ubuntu memiliki minimal 3 berkas untuk konfigurasi koneksi melalui proxy server:

  1. /etc/apt/apt.conf : konfigurasi proxy untuk apt-get.
  2. ~/.bashrc : konfigurasi proxy untuk seluruh aplikasi Terminal secara umum untuk pengguna bash selain root.
  3. /etc/profile : konfigurasi proxy untuk seluruh aplikasi Terminal secara umum untuk root.

Kemudian, program yang akan dibuat harus mampu melakukan penulisan konfigurasi ke dalam berkas apt.conf. Sementara ini, solusi yang tersedia untuk pengguna hanyalah yang dilakukan oleh program-program GUI semisal KDE System Setting dan GNOME Control Center. Namun mereka berdua tidak memiliki opsi otentikasi sampai hari ini. Jika Anda butuh otentikasi proxy, Anda wajib menyunting sendiri lewat Terminal terhadap salah satu berkas di atas. Itulah masalahnya. Jika di sana opsi otentikasi tidak ada, maka pengguna pemula sudah harus menggunakan Terminal hanya untuk sekadar menggunakan Firefox, apt-get, atau Ubuntu Software Center. Ini adalah kekurangan.

ngite-kedelapanbelas

Perhatikan GNOME Control Center di atas. Lihat pengaturan koneksi proxy-nya. Tidak ada opsi otentikasinya, bukan? Itu kekurangannya. Sebenarnya Anda bisa mengaturnya di sini dengan menuliskan semua otentikasi dalam 1 baris dengan format berikut:

username:password@proxyaddress

tetapi ini sangat jelek untuk pengguna pemula. Ini bukan UX yang diharapkan dari sistem yang dikatakan user friendly. Mengapa? Karena pemula perlu belajar dulu untuk mengetahui bahwa ada format khusus (satu baris di atas) untuk sekadar otentikasi proxy. Kejelekannya bertambah dengan adanya teks password yang harus disertakan, yang tentunya GNOME Control Center tidak akan menyembunyikannya. Ini kekurangan yang berbahaya bagi saya. Sebagai perbandingan, lihatlah pengaturan otentikasi proxy milik Synaptic berikut. Jauh lebih cerdas dan jelas bagi pengguna (jelas di mana otentikasi harus dituliskan). Lebih penting lagi, ia menyembunyikan isian password dari pengguna.

ngite-kedelapanbelas1

Maka program kita kali ini bertujuan memberikan UX seperti Synaptic ini untuk mengatur koneksi proxy, yang menggantikan GNOME Control Center (juga KDE System Settings). Nantinya, program ini tidak hanya sanggup mengisi apt.conf tetapi juga berkas-berkas konfigurasi proxy lain di dalam sistem. Kita buat program untuk apt.conf dulu. Jika kita sudah berhasil, maka kita lanjut mengerjakan yang lain.

Kemudian, perlu diketahui pula bahwa konfigurasi koneksi proxy apt.conf itu memiliki format sebagai berikut:

Acquire::http::proxy "http://username:password@proxyaddress:port/";

Pengguna harus menuliskannya sendiri jika mereka ingin apt terhubung ke internet. Ini sangat tidak praktis. Namun sebaris teks inilah yang akan dikerjakan oleh program yang kita buat. Kita buat dia menerima 4 masukan (username, password, proxyaddress, dan port) lalu menggabungkannya (append) jadi 1 baris menurut format di atas. Kita buat dia otomatis menuliskannya ke dalam berkas apt.conf.

Jika Anda sanggup memahami program kali ini, maka Anda bisa memanfaatkannya untuk membuat aplikasi yang mampu mem-parse masukan dari QLineEdit menjadi isi dari berkas teks. Tidak hanya terbatas pada pengaturan proxy server.

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QPushButton *tombolPasang;

    QLabel      *labelUser;
    QLabel      *labelPass;
    QLabel      *labelProxy;
    QLabel      *labelPort;

    QLineEdit   *teksUser;
    QLineEdit   *teksPass;
    QLineEdit   *teksProxy;
    QLineEdit   *teksPort;
    QGridLayout *layoutUtama;
    QString     *username;

private slots:
    void on_tombolPasang_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    QPushButton *tombolPasang   =   new     QPushButton("PASANG");

    QLabel      *labelUser      =   new     QLabel("USERNAME");
    QLabel      *labelPass      =   new     QLabel("PASSWORD");
    QLabel      *labelProxy     =   new     QLabel("PROXY");
    QLabel      *labelPort      =   new     QLabel("PORT");

                 teksUser       =   new     QLineEdit;
                 teksPass       =   new     QLineEdit;
                 teksProxy      =   new     QLineEdit;
                 teksPort       =   new     QLineEdit;
    QGridLayout *layoutUtama    =   new     QGridLayout;
    QWidget     *widgetUtama    =   new     QWidget;

    QIntValidator   *validator  =   new     QIntValidator;
    validator->setRange(0, 9999);
    teksPort->setValidator(validator);

    //istimewakan password dengan menampilkan tanda asterisk
    //dipasang pada Saturday, March 22, 2014 07:57 PM
    teksPass->setEchoMode(QLineEdit::Password);

    layoutUtama->addWidget(labelUser, 1,1);
    layoutUtama->addWidget(labelPass, 2,1);
    layoutUtama->addWidget(labelProxy, 3,1);
    layoutUtama->addWidget(labelPort, 4,1);

    layoutUtama->addWidget(teksUser, 1,2);
    layoutUtama->addWidget(teksPass, 2,2);
    layoutUtama->addWidget(teksProxy, 3,2);
    layoutUtama->addWidget(teksPort, 4,2);
    layoutUtama->addWidget(tombolPasang, 5,1,1,2);

    widgetUtama->setLayout(layoutUtama);
    widgetUtama->setMinimumSize(333,333);
    this->setCentralWidget(widgetUtama);

    connect(tombolPasang, SIGNAL(clicked()), this, SLOT(on_tombolPasang_clicked()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_tombolPasang_clicked()
{
    QFile berkasku;
    berkasku.setFileName("apt.conf");
    if(berkasku.open(QFile::WriteOnly)){  //gara-gara satu baris ini, aku tidak bisa menulis ke dalam berkas teks
                                          //kode QFile::WriteOnly bertugas menyetel mode pada objek QFile untuk menulis
                                          //jika tidak disetel, maka QFile tidak akan melakukan apa-apa
                                          //ditemukan pada Saturday, March 22, 2014 07:37 PM
                                          //sumber: contoh program textedit di dalam Qt Documentation

     //cara kerja penulisan teks dengan kerja sama QFile dan QTextStream ini unik
     //dibuat dulu objek QFile
     //lalu dibuat objek QTextStream yang dikaitkan dengan objek QFile tadi
     //lalu objek QTextStream ditulisi dengan method operator <<()
     //maka perubahan terhadap objek QTextStream juga terjadi pada objek QFile
     //ditemukan pada Saturday, March 22, 2014 07:50 PM

     QTextStream out(&berkasku);
     out.operator <<("Acquire::http::proxy \"http://");  //pendahuluan wajib untuk apt.conf
     out.operator <<(teksUser->text());  //username
     out.operator <<(":");  //pemisah
     out.operator <<(teksPass->text());  //password
     out.operator <<("@");  //et
     out.operator <<(teksProxy->text()); //proxy
     out.operator <<(":");  //pemisah
     out.operator <<(teksPort->text());  //port
     out.operator <<("\";");  //port
    }
}

Qt Creator dan Kode

ngite-kedelapanbelas2

Hasil

ngite-kedelapanbelas3

ngite-kedelapanbelas5

Analisis

Saya berusaha memberikan Anda analisis dimulai dari kode paling penting.

1. Appending

Kode appending ini ditangani oleh fungsi on_tombolPasang_clicked(). Kode ini berfungsi menerjemahkan 4 isi dari kotak isian ke dalam 1 baris kode konfigurasi. Kode ini melakukan appending berurutan mulai dari username sampai port.

     QTextStream out(&berkasku);
     out.operator <<("Acquire::http::proxy \"http://");  //pendahuluan wajib untuk apt.conf
     out.operator <<(teksUser->text());  //username
     out.operator <<(":");  //pemisah
     out.operator <<(teksPass->text());  //password
     out.operator <<("@");  //et
     out.operator <<(teksProxy->text()); //proxy
     out.operator <<(":");  //pemisah
     out.operator <<(teksPort->text());  //port
     out.operator <<("\";");  //port

Logika yang saya lakukan dalam kode ini sebagai berikut:

  1. Pertama-tama, menulis kode pendahuluan konfigurasi proxy Ubuntu yakni Acquire::http::proxy beserta spasi dan awalan “http:// ke dalam berkas apt.conf.
  2. Kedua, mengambil isi dari teksUser (isian username) lalu meng-append-kannya pada apt.conf.
  3. Ketiga, meng-append-kan teks “:” (titik dua) sebagai pemisah antara username dan password pada apt.conf.
  4. Keempat, mengambil isi dari teksPass (isian password) lalu meng-append-kannya pada apt.conf.
  5. Kelima, meng-append-kan teks “@” (at) sebagai pemisah antara otentikasi dengan alamat proxy.
  6. Keenam, mengambil isi dari teksProxy (isian alamat proxy) lalu meng-append-kannya pada apt.conf.
  7. Ketujuh, meng-append-kan teks “:” (titik dua) sebagai pemisah antara alamat proxy dengan port.
  8. Kedelapan, mengambil isi dari teksPort (isian port) lalu meng-append-kannya pada apt.conf.
  9. Kesembilan, meng-append-kan teks akhiran “; sebagai penutup baris dalam apt.conf.

2. Pembuatan Berkas apt.conf

Pembuatan berkas teks dikerjakan oleh kelas QFile di dalam Qt Framework. Pengisian teks ke dalamnya dilakukan oleh kelas QTextStream. Oleh karena itu, di dalam program ini, pertama-tama dibuat dulu objek QFile yang bernama berkasku. Lalu objek berkasku diberi nama berkas apt.conf dengan method setFileName(). Lalu yang paling penting, objek berkasku diberi izin QFile:WriteOnly yang berada dalam sebuah kerangka if. Kode appending di atas sebenarnya berada di dalam kerangka if ini. Lihat kode berikut.

    QFile berkasku;
    berkasku.setFileName("apt.conf");
    if(berkasku.open(QFile::WriteOnly)){  //gara-gara satu baris ini, aku tidak bisa menulis ke dalam berkas teks
                                          //kode QFile::WriteOnly bertugas menyetel mode pada objek QFile untuk menulis
                                          //jika tidak disetel, maka QFile tidak akan melakukan apa-apa
                                          //ditemukan pada Saturday, March 22, 2014 07:37 PM
                                          //sumber: contoh program textedit di dalam Qt Documentation

     //cara kerja penulisan teks dengan kerja sama QFile dan QTextStream ini unik
     //dibuat dulu objek QFile
     //lalu dibuat objek QTextStream yang dikaitkan dengan objek QFile tadi
     //lalu objek QTextStream ditulisi dengan method operator <<()
     //maka perubahan terhadap objek QTextStream juga terjadi pada objek QFile
     //ditemukan pada Saturday, March 22, 2014 07:50 PM

    }

Kerangka if di sini bersyaratkan method open() untuk berkasku. Method ini gunanya untuk membuka berkas. Di dalam argumennya, kita bisa isikan QFile::ReadOnly untuk membaca saja, QFile::WriteOnly untuk menulis saja, atau QFile::ReadWrite untuk baca-tulis. Karena kebutuhan kita kali ini cuma mengisi berkasnya dengan teks, maka kita memilih mode QFile::WriteOnly. Salah satu tugas dari mode QFile::WriteOnly adalah jika berkas yang dimaksud belum ada pada folder yang ditentukan, maka ia akan membuatnya terlebih dahulu.

Kemudian, karena yang kita inginkan adalah appending teks ke dalam berkas, amak kita menggunakan QTextStream sebagai solusinya. Dia akan melakukan pembacaan masukan dari QTextEdit lalu meng-apend-kan ke dalam berkas yang dibuat oleh QFile tadi. Ini dikerjakan dengan method operator <<(). Jangan kaget, bentuk method yang aneh ini bagian dari pemrograman Qt juga. Method ini dipasangkan pada objek QTextStream yang bernama out. Sedangkan objek out sendiri pada argumennya ketika (inisialisasi) diisi dengan objek berkasku. tanda “&” (ampersand) sebelum nama objek berkasku sebagai argumen artinya pass by reference.

3. Input Validation

Ada 2 jenis input validation di sini yaitu password dan nomor port. Maksudnya, program harus bisa mengenali bahwa kotak isian tertentu harus disembunyikan teksnya karena berisi password dan kotak isian yang lain hanya bisa diisi oleh angka (selain angka tidak bisa masuk). Ini mudah dilakukan dengan method setRange() dan setValidator() kepada objek teksPort untuk validasi angka. Sedangkan untuk validasi password, kita menggunakan method setEchoMode() pada objek QLineEdit teksPass. Perhatikan dua potongan kode berikut.

    validator->setRange(0, 9999);
    teksPort->setValidator(validator);

Argumen range di atas maksudnya jangkauan angka yang bisa dimasukkan. Dalam hal ini, saya atur mulai angka 0 sampai 9999. Cukup luaslah untuk sekadar port. Sedangkan validator yang digunakan adalah objek bernama validator dari kelas QIntValidator. Tentunya objek ini harus dibuat dulu sebelum digunakannya setValidator().

    teksPass->setEchoMode(QLineEdit::Password);

Dengan mengatur mode dalam argumen setEchoMode, kita bisa menyembunyikan password dengan bintang-bintang.

Kesimpulan

  1. Program ini menciptakan berkas apt.conf pada direktori tempat dia di-build. Untuk membuatnya mengonfigurasi sistem sungguhan, maka alamat pembuatan berkas harus ditetapkan pada /etc/apt/.
  2. Program ini bisa dikembangkan dengan penambahan history dan profil akun. Mungkin hal ini bisa dilakukan dengan QCompleter.
  3. Program ini juga bisa dikembangkan dengan menambahkan fitur system tray dengan kelas QSystemTrayIcon.
  4. QTextStream bisa digunakan untuk membuat suatu stream teks (yakni teks yang belum menjadi berkas) dan bisa menjadi berkas sungguhan jika dipakai bersama QFile.
  5. Pembuatan kotak isian password dengan bintang-bintang untuk menyembunyikan karakter bisa dilakukan dengan method setEchoMode() dengan argumen QLineEdit::Password, pada kelas QLineEdit.
  6. Pembuatan berkas teks dengan QFile tidak akan berhasil kecuali dengan method open(), dengan argumen selain QFile::ReadOnly.
  7. Appending dengan QTextStream bisa dilakukan dengan method aneh bernama operator <<() dengan string untuk argumennya.

Unduh Kode Sumber

Program kali ini bernama Proxifia. Sebenarnya nama ini menyalahi standar penamaan saya, yang seharusnya murni menggunakan Bahasa Indonesia. Hanya saja, saya belum menemukan kata yang bermakna perubahan selain Metamorfosis yang sudah saya pakai. Silakan unduh dan buka di Qt Creator Anda.

Penutup

Program ini masih memiliki kesempatan untuk dikembangkan lagi. Misalnya dengan ditambahi kemampuan menyimpan akun-akun, mengubah pengaturan selain apt.conf, dan lain-lain. Anda bisa mengubah sendiri hal itu dengan memodifikasi sedikit kode sumbernya. Tentu Anda juga bisa menggabungkannya dengan teknik pemaketan Debian yang telah Anda pelajari.

Referensi

The C++ Language Tutorial, revisi Juni 2007, Juan Soulie,  halaman 47-48.

2 thoughts on “Pemrograman Qt 18 – QTextStream untuk Membuat Aplikasi Proxy Changer

  1. Slamet Badwi

    lama saya tidak membaca tulisan-tulisan kang Malsasa. ternyata sudah semakin banyak tutorial-tutorial Qt.
    jadi, project kali ini intinya mengubah ‘apt.conf’ untuk setting apt-get. itu yang saya tangkap.
    dan tentunya memang bisa dikembangkan lebih lanjut, seperti yang sudah dijelaskan. juga ada beberapa ilmu yang saya ambil dari tulisan ini, terima kasih kang.

    Balas

Dilarang menggunakan emotikon

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s