15 Ağustos 2011 Pazartesi

pfSense - Captive Portal Admin Girişi Yapmadan Kullanıcı Açmak

Bir süredir pfSense ile ilgileniyorum, çeşitli konularda pfSense forumlarından yardım alıyorum. Türkçe bölümünde görevli arkadaşlar konuyla çok ilgililer bu nedenle bende ufak tefek katılar da bulunmak istedim. Captive Portal admin girişi yapmadan aşağıda hazırladığım dosya ile basit şekilde kullanıcı tanımlayabiliriniz.
<?php
/**
* Captive Portal'dan bagimsiz olarak kullanici eklenebilmesi icin hazirlanmistir.
* Test edilmedi, mevcut bir sistemden orneklenmistir. Kullanim icin PHP bilgisi gerekmektedir.
*
* 2011.08.13
* Aydin Yakar
*/
require("guiconfig_user.inc"); //guiconfig.inc dosyasi auth kaldirilarak guiconfig_user.inc isimle kaydedildi.

if($_POST) {

//kullanici adi ve sifreyi kucuk harf yapalim
$_username = strtolower($_POST['username']);
$_password = strtolower($_POST['password']);
$_bitistar = $_POST['bitistarihi'];
$_adsoyad = $_POST['adisoyadi'];

if (!is_array($config['captiveportal']['user']))
{
$config['captiveportal']['user'] = array();
}

captiveportal_users_sort();
$a_user = &$config['captiveportal']['user'];

//suresi dolan hesaplari sil
$changed = false;
for ($i = 0; $i < count($a_user); $i++) {
if ($a_user[$i]['expirationdate'] && (strtotime("-1 day") > strtotime($a_user[$i]['expirationdate']))) {
unset($a_user[$i]);
$changed = true;
}
}

if ($changed) {
write_config();
}

foreach ($a_user as $userent) {
if ($userent['name'] == $_username && $userent['password'] == md5($_password)) {
// login Ok, oturum ac
$loginok = true;
$loginDetay = $userent;
break;
}
}

//kullanici ve sifre var ayni zamanda dogru
if($loginok)
{
// Login
$orig_host = $_ENV['HTTP_HOST'];
$orig_request = $_POST['redirurl'];
$clientip = $_SERVER['REMOTE_ADDR'];

$clientmac = arp_get_mac_by_ip($clientip);
$macfilter = !isset($config['captiveportal']['nomacfilter']);
if (!$clientmac && $macfilter) {
captiveportal_logportalauth("unauthenticated","noclientmac",$clientip,"ERROR");
echo "An error occured. Please check the system logs for more information.";
log_error("Captive portal could not deterimine clients MAC address. Disable MAC address filtering in captive portal if you do not needs this functionality.");
exit;
}
captiveportal_logportalauth($loginDetay['name'],$clientmac,$clientip,"LOGIN");
portal_allow($clientip, $clientmac,$loginDetay['name']);
header("Location: $orig_request");

}
else
{
$userent['name'] = $_username;
$userent['fullname'] = $_adsoyad;
$userent['expirationdate'] = date("m/d/Y", strtotime($_bitistar));
$userent['password'] = md5($_password);

$a_user[] = $userent;

write_config();

// Login
$orig_host = $_ENV['HTTP_HOST'];
$orig_request = $_POST['redirurl'];
$clientip = $_SERVER['REMOTE_ADDR'];

$clientmac = arp_get_mac_by_ip($clientip);
$macfilter = !isset($config['captiveportal']['nomacfilter']);
if (!$clientmac && $macfilter) {
captiveportal_logportalauth("unauthenticated","noclientmac",$clientip,"ERROR");
echo "An error occured. Please check the system logs for more information.";
log_error("Captive portal could not deterimine clients MAC address. Disable MAC address filtering in captive portal if you do not needs this functionality.");
exit;
}
captiveportal_logportalauth($userent['name'],$clientmac,$clientip,"LOGIN");
portal_allow($clientip, $clientmac,$userent['name']);
}

}
else
{
/**
* Yeni kullanici olusturulmasi icin gerekli kayit formunu olusturunuz.
* username = kullanici adi.
* password = sifresi
* bitistarihi = kullanicinin kullanim suresi
* adisoyadi = adi ve soyadi
*
* Form POST methodu ile gonderilmelidir.
*/
?>
<form name="yeniUyelik" action="uye_kayit.php" method="post">
Kulllanici Adi: <input type="text" name="username"><br />
Sifre: <input type="text" name="password"><br />
Ad Soyad: <input type="text" name="adisoyadi"><br />
Uye Bitis Tarihi: <input type="text" name="bitistarihi"><br />
<input type="submit" name="gonder" value="Kaydet">
</form>
<?php
}

?>

Konuyla ilgili pfSense forumunda sorular ve cevaplar yer almaktadır, yorum ve forum mesajları ile siz de katkıda bulunabilirsiniz.

NOT: Bu düzenleme pfSense 1.2.3 için yapılmışdır, şuanda mevcut sürüm olan pfSense 2.0 Release'de deneme şansım olmadı fakat onda da bu işlemden çok farklı değil.

11 yorum:

  1. Güzel yazı elinize sağlık Aydın Bey. Arkasında büyük bir emek olduğu anlaşılıyor.

    YanıtlaSil
  2. Aydın bey merhaba
    forumada yazdım ancak henüz problemi aşamadım.
    buradaki işlemleri sırasıyla yaptım ancak sayfayı actığımda " Fatal error: Call to undefined function is_subsystem_dirty() in /usr/local/www/guiconfig_user.inc on line 89" hatası veriyor.

    87 /* Some ajax scripts still need access to GUI */
    88 if(!$ignorefirmwarelock) {
    89 if (is_subsystem_dirty('firmwarelock')) {
    if (!$d_isfwfile) {
    header("Location: system_firmware.php");
    exit;
    } else {
    return;
    }
    }
    }
    guiconfig_user.inc içeriği bu şekilde 89 da bu satır var : if (is_subsystem_dirty('firmwarelock')) {

    yardımcı olabilirseniz sevinirim

    YanıtlaSil
  3. Hatadan anlaşıldığı üzere "is_subsystem_dirty()" fonksiyonu tanımlanmamış. Öncelikle WinSCP programıyla bağlanarak sistemdeki dosyaları bilgisayarınıza indirin ve Notepad++ tarzı bir program ile hata veren fonksiyonun tanımlandığı dosyayı bularak çalıştırdığınız dosyaya include ediniz sorun düzelecektir.

    YanıtlaSil
  4. hocam aynı mantıkla DHCP server statik ip atamak ve freeradius mac eklemek isityorum acaba hangi dosyaları işlem yapıyor buna göre php ile scirpt yazmak istiyorum fikrinizi alabilirmiyim...

    YanıtlaSil
  5. Yönetim panelinin adres satırından ilgili php dosyalarını incelemek gerekir. Radius kullanmıyorum, DHCP Server için ise zaten adres satırında ilgili php dosyasının adını bulabilir ve dosya detaylarını inceleyebilirsiniz. Takıldığınız yer olursa tekrar sorabilirsiniz.

    YanıtlaSil
  6. aydın bey iyi günler pfsense 2.0.1 gerekli ayarları yaptım internete cıkıyorum ama yeniuye_kayit.php ulasılamıyor

    YanıtlaSil
  7. Ulaşılamıyor konusunu biraz açmanız gerekiyor, sayfa bulunamadı şeklinde midir yoksa sizi yönetim paneline mi yönlendiriyor?

    YanıtlaSil
  8. Merhabalar Aydın bey,

    Çalışmayı attım sayfayada ulaşabiliyorum fakat kullanıcı oluştur dediğimde aşağıdaki hatayı alıyorum. Kullandığım PF versiyonu 2.0.1 Ne yapabilirim yardımcı olurmusunuz.

    CSRF check failed. Either your session has expired, this page has been inactive too long, or you need to enable cookies.
    Debug:

    YanıtlaSil
  9. cookies leri temizledim. Şimde ekran boş geliyor. Kullanıcı adı, şifre vs. giriş ekranları gelmiyor.

    YanıtlaSil
  10. Yeni versiyon da durumunu kontrol etmedim, kontrol edip gerekli düzenlemeleri belirteyim..

    YanıtlaSil