|
| 1 | +package auth |
| 2 | + |
| 3 | +import ( |
| 4 | + "net/http" |
| 5 | + "testing" |
| 6 | + |
| 7 | + "github.com/appbaseio/arc/model/category" |
| 8 | + "github.com/appbaseio/arc/model/op" |
| 9 | + "github.com/appbaseio/arc/model/permission" |
| 10 | + "github.com/appbaseio/arc/util" |
| 11 | + . "github.com/smartystreets/goconvey/convey" |
| 12 | +) |
| 13 | + |
| 14 | +var adminCategories = []category.Category{ |
| 15 | + category.Docs, |
| 16 | + category.Search, |
| 17 | + category.Indices, |
| 18 | + category.Cat, |
| 19 | + category.Clusters, |
| 20 | + category.Misc, |
| 21 | + category.User, |
| 22 | + category.Permission, |
| 23 | + category.Analytics, |
| 24 | + category.Streams, |
| 25 | + category.Rules, |
| 26 | + category.Templates, |
| 27 | + category.Suggestions, |
| 28 | + category.Auth, |
| 29 | +} |
| 30 | + |
| 31 | +var adminOps = []op.Operation{ |
| 32 | + op.Read, |
| 33 | + op.Write, |
| 34 | + op.Delete, |
| 35 | +} |
| 36 | + |
| 37 | +var defaultAdminLimits = permission.Limits{ |
| 38 | + IPLimit: 7200, |
| 39 | + DocsLimit: 30, |
| 40 | + SearchLimit: 30, |
| 41 | + IndicesLimit: 30, |
| 42 | + CatLimit: 30, |
| 43 | + ClustersLimit: 30, |
| 44 | + MiscLimit: 30, |
| 45 | + UserLimit: 30, |
| 46 | + PermissionLimit: 30, |
| 47 | + AnalyticsLimit: 30, |
| 48 | + RulesLimit: 30, |
| 49 | + TemplatesLimit: 30, |
| 50 | + SuggestionsLimit: 30, |
| 51 | + StreamsLimit: 30, |
| 52 | + AuthLimit: 30, |
| 53 | +} |
| 54 | + |
| 55 | +var createPermissionResponse = map[string]interface{}{ |
| 56 | + "owner": "foo", |
| 57 | + "creator": "foo", |
| 58 | + "role": "admin", |
| 59 | + "categories": adminCategories, |
| 60 | + "acls": category.ACLsFor(adminCategories...), |
| 61 | + "ops": adminOps, |
| 62 | + "indices": []string{"*"}, |
| 63 | + "sources": []string{"0.0.0.0/0"}, |
| 64 | + "referers": []string{"*"}, |
| 65 | + "ttl": -1, |
| 66 | + "limits": &defaultAdminLimits, |
| 67 | + "description": "TEST PERMISSION WITH ROLE", |
| 68 | + "include_fields": nil, |
| 69 | + "exclude_fields": nil, |
| 70 | +} |
| 71 | + |
| 72 | +var updatePermissionsRequest = map[string]interface{}{ |
| 73 | + "description": "TEST PERMISSION UPDATED", |
| 74 | + "categories": []string{ |
| 75 | + "docs", |
| 76 | + "search", |
| 77 | + "indices", |
| 78 | + "clusters", |
| 79 | + "misc", |
| 80 | + "user", |
| 81 | + "permission", |
| 82 | + "analytics", |
| 83 | + "streams", |
| 84 | + "rules", |
| 85 | + }, |
| 86 | + "acls": []string{ |
| 87 | + "reindex", |
| 88 | + "termvectors", |
| 89 | + "update", |
| 90 | + "create", |
| 91 | + "mtermvectors", |
| 92 | + "bulk", |
| 93 | + "delete", |
| 94 | + "source", |
| 95 | + "delete_by_query", |
| 96 | + "get", |
| 97 | + "mget", |
| 98 | + "update_by_query", |
| 99 | + "index", |
| 100 | + "exists", |
| 101 | + "field_caps", |
| 102 | + "msearch", |
| 103 | + "validate", |
| 104 | + "rank_eval", |
| 105 | + "render", |
| 106 | + "search_shards", |
| 107 | + "search", |
| 108 | + "count", |
| 109 | + "explain", |
| 110 | + "upgrade", |
| 111 | + "settings", |
| 112 | + "indices", |
| 113 | + "split", |
| 114 | + "aliases", |
| 115 | + "stats", |
| 116 | + "template", |
| 117 | + "open", |
| 118 | + "mapping", |
| 119 | + "recovery", |
| 120 | + "analyze", |
| 121 | + "cache", |
| 122 | + "forcemerge", |
| 123 | + "alias", |
| 124 | + "refresh", |
| 125 | + "segments", |
| 126 | + "close", |
| 127 | + "flush", |
| 128 | + "shrink", |
| 129 | + "shard_stores", |
| 130 | + "rollover", |
| 131 | + "remote", |
| 132 | + "cat", |
| 133 | + "nodes", |
| 134 | + "tasks", |
| 135 | + "cluster", |
| 136 | + "scripts", |
| 137 | + "ingest", |
| 138 | + "snapshot", |
| 139 | + }, |
| 140 | + "ops": []string{ |
| 141 | + "write", |
| 142 | + }, |
| 143 | + "ttl": 3600, |
| 144 | + "limits": map[string]interface{}{ |
| 145 | + "ip_limit": 7200, |
| 146 | + "docs_limit": 5, |
| 147 | + "search_limit": 2, |
| 148 | + "indices_limit": 10, |
| 149 | + "cat_limit": 0, |
| 150 | + "clusters_limit": 10, |
| 151 | + "misc_limit": 10, |
| 152 | + "user_limit": 10, |
| 153 | + "permission_limit": 10, |
| 154 | + "analytics_limit": 10, |
| 155 | + "rules_limit": 10, |
| 156 | + "templates_limit": 0, |
| 157 | + "suggestions_limit": 0, |
| 158 | + "streams_limit": 10, |
| 159 | + }, |
| 160 | +} |
| 161 | + |
| 162 | +var roleName = "admin" |
| 163 | + |
| 164 | +var savePublicKeyRequest = map[string]interface{}{ |
| 165 | + "public_key": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFuenlpczFaamZOQjBiQmdLRk1Tdgp2a1R0d2x2QnNhSnE3UzV3QStremVWT1ZwVld3a1dkVmhhNHMzOFhNL3BhL3lyNDdhdjcrejNWVG12RFJ5QUhjCmFUOTJ3aFJFRnBMdjljajVsVGVKU2lieXIvTXJtL1l0akNaVldnYU9ZSWh3clh3S0xxUHIvMTFpbldzQWtmSXkKdHZIV1R4WllFY1hMZ0FYRnVVdWFTM3VGOWdFaU5Rd3pHVFUxdjBGcWtxVEJyNEI4blczSENONDdYVXUwdDhZMAplK2xmNHM0T3hRYXdXRDc5SjkvNWQzUnkwdmJWM0FtMUZ0R0ppSnZPd1JzSWZWQ2hEcFlTdFRjSFRDTXF0dldiClY2TDExQldrcHpHWFNXNEh2NDNxYStHU1lPRDJRVTY4TWI1OW9TazJPQitCdE9McEpvZm1iR0VHZ3Ztd3lDSTkKTXdJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t", |
| 166 | + "role_key": roleName, |
| 167 | +} |
| 168 | + |
| 169 | +var savePublicKeyResponse = map[string]interface{}{ |
| 170 | + "message": "Public key saved successfully.", |
| 171 | +} |
| 172 | + |
| 173 | +func TestRBAC(t *testing.T) { |
| 174 | + var username string |
| 175 | + var password string |
| 176 | + var createdAt string |
| 177 | + Convey("Testing RBAC", t, func() { |
| 178 | + Convey("Save the public key", func() { |
| 179 | + response, err := util.MakeHttpRequest(http.MethodPut, "/_public_key", savePublicKeyRequest) |
| 180 | + |
| 181 | + if err != nil { |
| 182 | + t.Fatalf("savePublicKeyTest Failed %v instead\n", err) |
| 183 | + } |
| 184 | + |
| 185 | + So(response, ShouldResemble, savePublicKeyResponse) |
| 186 | + }) |
| 187 | + |
| 188 | + Convey("Get the public key", func() { |
| 189 | + response, err := util.MakeHttpRequest(http.MethodGet, "/_public_key", nil) |
| 190 | + |
| 191 | + if err != nil { |
| 192 | + t.Fatalf("getPublicKeyTest Failed %v instead\n", err) |
| 193 | + } |
| 194 | + |
| 195 | + So(response, ShouldResemble, savePublicKeyRequest) |
| 196 | + }) |
| 197 | + |
| 198 | + Convey("Create permission with role", func() { |
| 199 | + requestBody := permission.Permission{ |
| 200 | + Description: "TEST PERMISSION WITH ROLE", |
| 201 | + } |
| 202 | + response, err := util.MakeHttpRequest(http.MethodPost, "/_role/"+roleName, requestBody) |
| 203 | + |
| 204 | + parsedResponse, _ := response.(map[string]interface{}) |
| 205 | + |
| 206 | + if err != nil { |
| 207 | + t.Fatalf("createPermissionWithRoleTest Failed %v instead\n", err) |
| 208 | + } |
| 209 | + username, _ = parsedResponse["username"].(string) |
| 210 | + password, _ = parsedResponse["password"].(string) |
| 211 | + createdAt, _ = parsedResponse["created_at"].(string) |
| 212 | + |
| 213 | + delete(parsedResponse, "username") |
| 214 | + delete(parsedResponse, "password") |
| 215 | + delete(parsedResponse, "created_at") |
| 216 | + |
| 217 | + mockMap := util.StructToMap(createPermissionResponse) |
| 218 | + |
| 219 | + So(parsedResponse, ShouldResemble, mockMap) |
| 220 | + }) |
| 221 | + |
| 222 | + Convey("Get permission with role", func() { |
| 223 | + response, err := util.MakeHttpRequest(http.MethodGet, "/_role/"+roleName, nil) |
| 224 | + |
| 225 | + if err != nil { |
| 226 | + t.Fatalf("getPermissionWithRoleTest Failed %v instead\n", err) |
| 227 | + } |
| 228 | + var getPermissionResponse = createPermissionResponse |
| 229 | + getPermissionResponse["username"] = username |
| 230 | + getPermissionResponse["password"] = password |
| 231 | + getPermissionResponse["created_at"] = createdAt |
| 232 | + mockMap := util.StructToMap(getPermissionResponse) |
| 233 | + |
| 234 | + So(response, ShouldResemble, mockMap) |
| 235 | + }) |
| 236 | + |
| 237 | + Convey("Update permission with role", func() { |
| 238 | + response, err := util.MakeHttpRequest(http.MethodPatch, "/_role/"+roleName, updatePermissionsRequest) |
| 239 | + |
| 240 | + if err != nil { |
| 241 | + t.Fatalf("updatePermissionWithRoleTest Failed %v instead\n", err) |
| 242 | + } |
| 243 | + |
| 244 | + parsedResponse, _ := response.(map[string]interface{}) |
| 245 | + |
| 246 | + delete(parsedResponse, "_seq_no") |
| 247 | + |
| 248 | + var updatePermissionResponse = map[string]interface{}{ |
| 249 | + "_index": ".permissions", |
| 250 | + "_type": "_doc", |
| 251 | + "_id": username, |
| 252 | + "_version": 2, |
| 253 | + "result": "updated", |
| 254 | + "_shards": map[string]interface{}{ |
| 255 | + "total": 1, |
| 256 | + "successful": 1, |
| 257 | + "failed": 0, |
| 258 | + }, |
| 259 | + "_primary_term": 1, |
| 260 | + } |
| 261 | + |
| 262 | + mockMap := util.StructToMap(updatePermissionResponse) |
| 263 | + |
| 264 | + So(parsedResponse, ShouldResemble, mockMap) |
| 265 | + }) |
| 266 | + |
| 267 | + Convey("Delete permission with role", func() { |
| 268 | + response, err := util.MakeHttpRequest(http.MethodDelete, "/_role/"+roleName, nil) |
| 269 | + |
| 270 | + if err != nil { |
| 271 | + t.Fatalf("deletePermissionWithRoleTest Failed %v instead\n", err) |
| 272 | + } |
| 273 | + |
| 274 | + var deletePermissionResponse = map[string]interface{}{ |
| 275 | + "code": 200, |
| 276 | + "message": "permission with \"username\"=\"" + username + "\" deleted", |
| 277 | + "status": "OK", |
| 278 | + } |
| 279 | + |
| 280 | + mockMap := util.StructToMap(deletePermissionResponse) |
| 281 | + parsedResponse, _ := response.(map[string]interface{}) |
| 282 | + delete(parsedResponse, "_seq_no") |
| 283 | + |
| 284 | + So(parsedResponse, ShouldResemble, mockMap) |
| 285 | + }) |
| 286 | + }) |
| 287 | +} |
0 commit comments