Sabtu, 30 Maret 2013

Merubah cookie APP_USER secara permanen

Cookie APP_USER adalah sebuah penampung yang dibuat APEX untuk menyimpan nama user Aunthenticated. contoh username kita entry lutfi hedir. Lalu cookies tersebut bisa kita ubah didalam aplikasi menjadi lutfi.hedir dengan cara membuat sebuah proses dengan block seperti ini.
begin
--set user menjadi nama tertentu cara 1
apex_custom_auth.set_user('lutfi.hedir');
--set user menjadi nama tertentu cara 2
wwv_flow.g_user := 'lutfi.hedir';
end;

Yang harus diperhatikan adalah dimana akan dijalankan code tersebut. Jika anda tidak ingin secara permanen maka dapat dilakukan di proses page on load before header atau tempat lain sesuai keinginan. Namun jika ingin merubah secara permanen maka satu-satunya cara harus di lakukan pada Post-Authentication Procedure Name. Karena jika dilakukan diluar itu maka APP_USER akan tetap seperti USERNAME dimana kita entry pada saat login. meskipun kita lakukan proses di application proses on load before header, tetap APP_USER tidak berubah yang berubah disaat proses render saja, tapi jika digunakan dalam proses authorization APP_USER kembali seperti semula, atau jika digunakan dalam database trigger dengan memanggil v('APP_USER') maka kembali APP_USER akan dikenali sebagai lutfi hedir bukan lutfi.hedir.
Jadi anda harus buat sebuah procedure dalam database contoh my_post_login dengan code sbb:
create or replace procedure my_post_login is 
 begin 
   apex_custom_auth.set_user('lutfi.hedir'); 
 end my_post_login;

lalu gunakan my_post_login dalam Post-Authentication Procedure Name. Selamat mencoba
Sumber : Oracle APEX Forum

Rabu, 27 Maret 2013

Delete multiple file on APEX metadata

Untuk keperluan delete file yang ada di aplikasi APEX, APEX telah menyediakan tool untuk melakukan delete file, cuma masih harus satu persatu. jadi kalau kita ingin melakukan banyak file itu yang jadi masalah.

Namun di dalam apex sendiri telah diberikan script untuk melakukan delete metadata tsb contoh saat kita ingin menghapus image "xxx.jpg" maka scriptnya adalah
begin
    wwv_flow_api.create_or_remove_file( 
        p_location => 'APPLICATION',
        p_name     => 'xxx.jpg',
        p_mode     => 'REMOVE',
        p_type     => 'IMAGE');
end;
/

Yang perlu diperhatikan adalah p_type bisa 'IMAGE','CSS'atau 'STATIC'. jadi untuk hapus secara banyak contoh satu WS maka kita harus modifikasi seperti ini. contoh dibawah adalah saya ingin menghapus seluruh image yang tersimpan dalam WS='TEST'.

declare
 v_id number;
 v_ws varchar2(100):='TEST';
begin
--- cari workspace ID
select workspace_id into v_id
from apex_workspaces
where WORKSPACE=upper(v_ws);
---set security supaya bisa di exsekusi diluar apex 
wwv_flow_api.set_security_group_id(v_id);
---cursor 
FOR x IN (select *
from APEX_WORKSPACE_FILES
where MIME_TYPE like 'image/%') LOOP
    wwv_flow_api.create_or_remove_file( 
        p_location => 'WORKSPACE',
        p_name     => x.FILE_NAME,
        p_mode     => 'REMOVE',
        p_type     => 'IMAGE');
END LOOP;
commit;
end;
/

Minggu, 17 Maret 2013

Otentifikasi memakai custom LDAP

Kita jarang sekali memakai LDAP sebagai direktori yang menyimpan profile untuk aplikasi tertentu, hampir dipastikan profile dan akses ke dalam aplikasi di setup tersendiri didalam aplikasi itu sendiri.

Jadi untuk memakai otentifikasi LDAP kita tidak mungkin secara polos memakainya tanpa mengkombinasikan dengan data otorisasi yang telah ada. Karena itu mari kita gunakan logika untuk memakai LDAP kedalam existing apps contoh kasus ini memakai windows server directory.
  1. Buatlah sebuah funsi untuk melakukan test otentifikasi dalam pl/sql dengan return varchar2.
  2. CREATE OR REPLACE function function_ldap_test(
    p_username in varchar2,
    p_password in varchar2)
    return varchar2
    as
    p_dn varchar2(50) := 'your_domain\'||p_username;
    p_ldap_host varchar2(50) := 'ldap_server_host_or_ip';
    p_ldap_port number := 389;
    l_retval pls_integer;
    l_retval2 pls_integer;
    l_session dbms_ldap.session;
    begin
    l_retval := -1;
    dbms_ldap.use_exception := TRUE;
    begin
    l_session := dbms_ldap.init( p_ldap_host, p_ldap_port );
    l_retval := dbms_ldap.simple_bind_s( l_session, p_dn, p_password );
    l_retval2 := dbms_ldap.unbind_s( l_session );
    return 'OK';
    exception when others then
    l_retval2 := dbms_ldap.unbind_s( l_session );
    return null;
    end;
    exception when others then
    return null;
    end function_ldap_test;
    /
    
  3. Gunakan fungsi tersebut dalam custom otentifikasi yang telah kita miliki.
  4. CREATE OR REPLACE function my_auth(
    p_username in varchar2,
    p_password in varchar2)
    return boolean
    as
     l_ldap_test varchar2(200);
    begin
     l_ldap_test:=function_ldap_test(p_username,p_password);
       if l_dap_test is null then
        return false;
       else
        return true;
       end if;
    
    end my_auth;
    /
    
Untuk kasus nyata biasanya kita harus menyimpan sebuah informasi penghubung data user di aplikasi kita dengan data LDAP, yang paling memungkinkan biasanya data email untuk itu kita bisa gunakan fungsi test LDAP seperti ini.
CREATE OR REPLACE function function_ldap_test(
p_username in varchar2,
p_password in varchar2)
return varchar2
as
   l_ldap_host   varchar2(256) := 'ldap_server_host_or_ip';
   l_ldap_port   varchar2(256) := '389';
   l_ldap_user   varchar2(256) := 'my_domain\'||p_username;
   l_ldap_passwd varchar2(256) := p_password;
   l_ldap_base   varchar2(256) := 'dc=my_domain,dc=com';
   l_filter      varchar2(100) := 'sAMAccountName='||p_username;
   l_retval      pls_integer;
   l_retval2    pls_integer;
   l_session     dbms_ldap.session;
   l_attrs       dbms_ldap.string_collection;
   l_message     dbms_ldap.message;
   l_entry       dbms_ldap.message;
   l_attr_name   varchar2(256);
   l_ber_element dbms_ldap.ber_element;
   l_vals        dbms_ldap.string_collection;
   l_raw         dbms_ldap.binval_collection;
   l_result varchar2(100);
  begin
 
        -- Choose to raise exceptions.
       dbms_ldap.use_exception   := true;
       dbms_ldap.utf8_conversion := false;
     
       -- Connect to the LDAP server.
       l_session := dbms_ldap.init(hostname => l_ldap_host, portnum => l_ldap_port);
       l_retval := dbms_ldap.simple_bind_s(ld => l_session, dn => l_ldap_user, passwd => l_ldap_passwd);
     
       -- Get mail attributes
       l_attrs(1) :=nvl( p_attribute,'mail'); 
     
       l_retval := dbms_ldap.search_s(ld       => l_session
                                     ,base     => l_ldap_base
                                     ,scope    => dbms_ldap.scope_subtree
                                     ,filter   => l_filter
                                     ,attrs    => l_attrs
                                     ,attronly => 0
                                     ,res      => l_message);
     
       if dbms_ldap.count_entries(ld => l_session, msg => l_message) > 0
       then
          -- Get all the entries returned by our search.
          l_entry := dbms_ldap.first_entry(ld => l_session, msg => l_message);
       
          while l_entry is not null
          loop
             -- Get all the attributes for this entry.
             l_attr_name := dbms_ldap.first_attribute(ld        => l_session
                                                     ,ldapentry => l_entry
                                                     ,ber_elem  => l_ber_element);
             while l_attr_name is not null
             loop
                -- Get all the values for this attribute.
                l_vals := dbms_ldap.get_values(ld => l_session, ldapentry => l_entry, attr => l_attr_name);
            
                for i in l_vals.first .. l_vals.last
                loop
                   return substr(l_vals(i), 1, 200);
                end loop values_loop;
                l_attr_name := dbms_ldap.next_attribute(ld        => l_session
                                                       ,ldapentry => l_entry
                                                       ,ber_elem  => l_ber_element);
             end loop attibutes_loop;
             l_entry := dbms_ldap.next_entry(ld => l_session, msg => l_entry);
          end loop entry_loop;
       end if;
     
       -- Disconnect from the LDAP server.
       l_retval2 := dbms_ldap.unbind_s(ld => l_session);
      
    exception when others then   
    l_retval2 := dbms_ldap.unbind_s(ld => l_session);
     return null;
end function_ldap_test;
/

Sumber : Oracle APEX Forum

Implementasi APEX SSL dengan OHS 11g (3)

Setelah berhasil membuat wallet CSR dan CA certificate server. langkah selanjutnya adalah setup server OHS dan APEX untuk memakai SSL. OHS 11g adalah component dari weblogic server yang biasanya ssl telah di setup dengan port : 4443 untuk ssl dan 7777 untuk non-ssl, jadi anda sekarang akan merubahnya memakai memakai port ssl:443 dan non-ssl:80

  • Stop proses OPMN dan OHS.
  • Untuk memastikan SSL enable edit file opmn.xml : <data id="start-mode" value="ssl-enabled"/>
  • Ubah port ssl ke 443 di file ss.conf yang ada di <OHS_HOME>\instances\instance1\config\OHS\ohs1
  • Copy file ewallet.pt12 dan cwallet.sso di c:\mywallet ke <OHS_HOME>\instances\instance1\config\OHS\ohs1\keystores\default
  • Edit file konfigurasi hhtpd.conf yang ada di <OHS_HOME>\instances\instance1\config\OHS\ohs1 dengan merubah listen : 7777 menjadi 80 lalu pada bagian terbawah tambahkan.
  • RewriteEngine On
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}:443$1 [R,L]
    
  • Restart proses OPMN dan OHS.
  • Akses aplikasi memakai browser ke https://localhost/pls/apex.
  • Install certificate.server_cacert.crt di browser
  • Akses ke apex melali ws internal
  • Pada bagian manage instance>security : Require HTTPS=Yes
  • Pada bagian manage instance>Instance Settings
  • Wallet Path : C:\mywallet
    Wallet Password : enter your password here
    

Selesai.

Implementasi APEX SSL dengan OHS 11g (1)

Salah satu bagian dari security APEX adalah mengaktifkan mode SSL. dimana dalam proses nya data mengalami enkripsi terlebih dahulu sebelum di proses. untuk lebih jelasnya silahkan baca ini.

Proses merubah dari non ssl menjadi ssl dalam apex lumayan banyak langkah yang harus dilakukan yaitu:

  1. Mempersiapkan oracle wallet untuk membuat certificate request.
  2. Membuat trusted certificate dan user certificate.
  3. Memakai dalam wallet
  4. Mengakatifkan SSL pada OHS.
  5. Mengaktifkan SSL pada instance apex.
Karena banyaknya langkah tersebut maka akan saya bahas prosesnya secara bertahap. pada bagian ini kita akan membuat certificate request dari Wallet dan Membuat trusted certificate dan user certificate dengan OpenSSL.


  • Buatlah directory baru untuk menyimpan certificate contoh C:\mywallet.
  • Bukalah Oracle Wallet Manager.
  • Buatlah New , Standard.
  • Buat certificate request.
  • Save as wallet ke dalam C:\mywallet maka otomatis akan ada 1 file dalam direktori tersebut yaitu ewallet.p12.
  • Exporte certificate request ke dalam C:\mywallet dengan nama contoh : server.req
Oke langkah pertama sudah kita lakukan selanjutnya kita akan membuat CA.

Implementasi APEX SSL dengan OHS 11g (2)

Setelah certificate request (CR) telah terbentuk dalam c:\mywallet maka selanjutnya kita akan membuat certificate authority memakai OpenSSL. untuk versi windows bisa di download disini.
Dalam kasus ini saya sudah terinstall openssl 64 bit di C:\OpenSSL-Win64.
  • Masuk ke working direktory C:\mywallet.
  • Jalankan perintah berikut untuk mengatur configurasi yg dipakai: set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg
  • Jalankan perintah untuk membuka openssl : C:\OpenSSL-Win64\bin\openssl.
  • Buat key : genrsa -out mykey.pem 2048
  • Buat CA : req -new -x509 -key mykey.pem -out server_cacert.crt -days 3650
  • Membuat server certifikate memakai requet dari wallet (server.req) : x509 -req -in server.req -CA server_cacert.crt -CAkey mykey.pem -CAcreateserial -out server.crt 
  • Buka kembali Oracle wallet manager lalu open wallet di direktori c:/mywallet.
  • Gunakan server_cacert.crt sebagai trusted certificate melalui import trusted certificate.
  • Gunakan server.crt sebagai user certificate melalui import user certificate.
  • Simpan kembali wallet jangan lupa auto login di centang.

Disini anda telah berhasil mempersiapkan certifate yang diperlukan dalam proses SSL. selanjutnya anda akan merubah setting OHS dan apex.

Jumat, 01 Maret 2013

Hide Show Region by default is SHOW

Ketika kita memakai sebuah template region "Hide Show" maka secara default ketika page di load maka posisi region dalam keadaan "Hide". Bagaimana jika butuh sebaliknya?.

Lakukan langkah-langkah berikut:

  1. Copy template "Hide and Show Region".
  2. Beri nama baru "Hide and Show Region 2".
  3. Lakukan perubahan berikut :
    • Template Asli :
    • <div class="hide-show-region" id="#REGION_STATIC_ID#" #REGION_ATTRIBUTES#>
        <div class="hide-show-top">
          <div class="hide-show-title"><a href="javascript:hideShow('region#REGION_SEQUENCE_ID#','shIMG#REGION_SEQUENCE_ID#','#IMAGE_PREFIX#themes/theme_21/images/right_arrow.png','#IMAGE_PREFIX#themes/theme_21/images/down_arrow.png');" class="t1HideandShowRegionLink"><img src="#IMAGE_PREFIX#themes/theme_21/images/right_arrow.png" 
        id="shIMG#REGION_SEQUENCE_ID#" alt="" /></a> #TITLE#</div>
          <div class="hide-show-buttons">#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#</div>
        </div>
      <div class="hide" id="region#REGION_SEQUENCE_ID#" style="float:left;">#BODY#</div>
      </div>
      
    • Template Setelah Perubahan :
    • <div class="hide-show-region" id="#REGION_STATIC_ID#" #REGION_ATTRIBUTES#>
        <div class="hide-show-top">
          <div class="hide-show-title"><a href="javascript:hideShow('region#REGION_SEQUENCE_ID#','shIMG#REGION_SEQUENCE_ID#','#IMAGE_PREFIX#themes/theme_21/images/right_arrow.png','#IMAGE_PREFIX#themes/theme_21/images/down_arrow.png');" class="t1HideandShowRegionLink"><img src="#IMAGE_PREFIX#themes/theme_21/images/down_arrow.png" 
        id="shIMG#REGION_SEQUENCE_ID#" alt="" /></a> #TITLE#</div>
          <div class="hide-show-buttons">#CLOSE##PREVIOUS##NEXT##DELETE##EDIT##CHANGE##CREATE##CREATE2##EXPAND##COPY##HELP#</div>
        </div>
      <div class="show" id="region#REGION_SEQUENCE_ID#" style="clear:both;display:block;">#BODY#</div>
      </div>
      
  4. Gunakan dalam aplikasi contoh disini