-
Notifications
You must be signed in to change notification settings - Fork 2
/
Application.php
126 lines (100 loc) · 3.34 KB
/
Application.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
namespace IdnoPlugins\OAuth2 {
class Application extends \Idno\Common\Entity
{
/**
* Return URL of app
*/
public function getURL() {
return \Idno\Core\Idno::site()->config()->getDisplayURL() . 'oauth2/' . $this->key . '/';
}
/**
* Generate a new keypair
*/
public function generateKeypair()
{
$this->key = hash('sha256', mt_rand() . microtime(true) . $this->getTitle());
$this->secret = hash('sha256', mt_rand() . microtime(true) . $this->key);
}
/**
* Helper function to create a new application with a new keypair.
* @param type $title
* @return \IdnoPlugins\OAuth2\Application
*/
public static function newApplication($title)
{
$app = new Application();
$app->setTitle($title);
$app->generateKeypair();
$app->generateAsymetricKeypair();
return $app;
}
/**
* Get the public key
* @return string
*/
public function getPublicKey():string {
return $this->publickey;
}
/**
* Get the private key
* @return string
*/
public function getPrivateKey():string {
return $this->privatekey;
}
/**
* Generate a new public / private key pair suitable for asymetric OIDC tokens
*/
protected function generateAsymetricKeypair() {
$config = array(
"digest_alg" => "sha256",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// Create the private and public key
$res = openssl_pkey_new($config);
// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$this->publickey = $pubKey;
$this->privatekey = $privKey;
}
/**
* Saves changes to this object based on user input
* @return true|false
*/
function saveDataFromInput()
{
if (empty($this->_id)) {
$new = true;
} else {
$new = false;
}
$this->setTitle(\Idno\Core\site()->currentPage()->getInput('name'));
$this->setAccess('PUBLIC');
return $this->save();
}
function save($overrideAccess = true)
{
return parent::save($overrideAccess);
}
function jsonSerialize()
{
$json = [
'title' => $this->getTitle(),
'generated' => $this->getCreatedTime(),
'client_id' => $this->key,
];
// If we're logged in and we own this application, we can add some other stuff
if ($this->canEdit()) {
$json['secret'] = $this->secret;
}
$pk = $this->getPublicKey();
$json['public_key'] = $pk;
return $json;
}
}
}