JQuery preventDefault stopPropagation stopImmediatePropagation

Отличие в методах:
  • preventDefault() = прервать обработку действия по умолчанию на элементе текущего события
  • stopPropagation() = остановить всплытие(bubbling) события к родительским элементам
  • stopImmediatePropagation() = stopPropagation + прерывает передачу события во все последующие обработчики «слушающих» на текущем элементе

Авторизация учетными данными JIRA в PHP

В этом конкретном случае «прикручено» в Yii. Читаем непосредственно с таблицы пользователей Jira
<?php

namespace app\models;

class User extends \yii\base\Object implements \yii\web\IdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $authKey;
    public $accessToken;

    public $credential;
    public $first_name;
    public $last_name;
    public $gid;
    public $group_name;


    public static function _init() {
	if (empty(self::$users)) {
		$users = \Yii::$app->db->createCommand("select c.id, c.lower_user_name username, c.credential, c.first_name, c.last_name from cwd_user c where c.active = 1")
           			->cache(3600)
           			->queryAll();
           	foreach ($users as $u) {
			self::$users[$u['id']] = $u;
		}
	}

    }

    public static $users = [];
...............................
    /**
     * Validates password
     *
     * @param  string  $password password to validate
     * @return boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
	return JiraAuth::isValidPassword($password, $this->credential);
    }
} 

И сам класс проверки пароля
<?php

class JiraAuth {
	const DEFAULT_PREFIX = '{PKCS5S2}';
	const DEFAULT_SALT_LENGTH_BYTES = 16;

	public static function isValidPassword($password, $credential) {
		$ret = false;

		if ( strrpos($credential, JiraAuth::DEFAULT_PREFIX) === false)
			return $ret;

		$credential = substr($credential, strlen(JiraAuth::DEFAULT_PREFIX)-1);

		$binSaltAndKey = base64_decode($credential);
		
		if (strlen($binSaltAndKey)<48)
			return $ret;

		$salt = substr($binSaltAndKey,0,JiraAuth::DEFAULT_SALT_LENGTH_BYTES);
		$oldKey = bin2hex(substr($binSaltAndKey,JiraAuth::DEFAULT_SALT_LENGTH_BYTES));
		$newKey = hash_pbkdf2('sha1', $password, $salt, 10000, 64);

		return ($oldKey == $newKey);
	}
}
Замечание, PHP нужен от 5.5, а JIRA была версии v6.3

Загрузка файлов, параметр filename в HTTP заголовке Content-Disposition

«Крякозябры» вместо имени файла в IE или ошибка загрузки и сообщение о дублирующемся заголовке на движке WebKit.
if (file_exists($path . '/' . $dfi->hashedName)) {
	$response = new \Http\Response();
	$response->setHeader("X-UA-Compatible", 'IE=edge');
	$response->setHeader("Content-Type", isset($dfi->mimeType) && !$nomime  ? $dfi->mimeType : 'application/octet-stream');
	$response->setHeader("Content-Transfer-Encoding", 'binary');
	$response->setHeader("Content-Disposition", ($nomime ? 'attachment' : 'inline') . '; filename=' . str_replace(['\\','"','#','*',';',':','|','<','>','/','?',','], '_', mb_convert_encoding($dfi->originalName, 'CP1251', 'UTF-8')) . '; filename*=UTF-8\'\''.rawurlencode($dfi->originalName).'');

	$response->setHeader("Content-Length", (string)(filesize($fpath)));
	$response->sendHeaders();
	if ($file = fopen($fpath, 'rb')) {
		while(!feof($file) and (connection_status()==0 || 1)) {
			print(fread($file, 1024*8));
			flush();
		}
		fclose($file);
	}
	exit;
}

Определяем инициатора события (jQuery)

Определить программно вызвано событие $('#elem').trigger('clik') или пользователь «кликнул» по элементу. Варианты:
$( '#elem' ).on('click', function ( e ) {
    if ( e.originalEvent === undefined ) {
        alert( 'triggered programmatically' );   
    } else {
        alert( 'clicked by the user' );   
    }
})

или
$( '#elem' ).on('click', function ( e ) {
    if ( e.isTrigger !== undefined ) {
        alert( 'triggered programmatically' );   
    } else {
        alert( 'clicked by the user' );   
    }
})

или
$( '.elems' ).on('click', function ( e, a ) {
    if ( a !== undefined ) {
        alert( 'triggered programmatically ' + a.from );   
    } else {
        alert( 'clicked by the user' );   
    }
})
$( '#elem' ).trigger('click',{'from':'test'});