├── .dockerignore ├── .editorconfig ├── .envs └── .local │ ├── .django │ ├── .keycloak │ └── .postgres ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTORS.txt ├── FUNDING.yml ├── SECURITY.md ├── codeql │ └── codeql-config.yml ├── dependabot.yml └── workflows │ ├── ci.yml │ └── codeql.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pylintrc ├── .readthedocs.yml ├── COPYING.md ├── LICENSE.md ├── README.md ├── colander ├── __init__.py ├── conftest.py ├── contrib │ ├── __init__.py │ └── sites │ │ ├── __init__.py │ │ └── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_domain_unique.py │ │ ├── 0003_set_site_domain_and_name.py │ │ ├── 0004_alter_options_ordering_domain.py │ │ └── __init__.py ├── core │ ├── __init__.py │ ├── admin.py │ ├── api │ │ ├── __init__.py │ │ ├── security.py │ │ ├── serializers.py │ │ └── views.py │ ├── apps.py │ ├── artifact_utils.py │ ├── crons.py │ ├── datasets.py │ ├── es_utils.py │ ├── exporters │ │ ├── __init__.py │ │ ├── csv.py │ │ ├── json.py │ │ └── stix2.py │ ├── forms │ │ ├── __init__.py │ │ └── widgets.py │ ├── graph │ │ ├── __init__.py │ │ ├── serializers.py │ │ └── views.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── data │ │ │ ├── actor_types.json │ │ │ ├── artifact_types.json │ │ │ ├── data_fragment_types.json │ │ │ ├── detection_rule_types.json │ │ │ ├── device_types.json │ │ │ ├── event_types.json │ │ │ ├── observable_types.json │ │ │ └── threat_types.json │ │ │ ├── fix_contributor_id.py │ │ │ ├── fix_entity_relations.py │ │ │ └── insert_default_data.py │ ├── middlewares.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20230217_1713.py │ │ ├── 0003_auto_20230217_1727.py │ │ ├── 0004_auto_20230217_1728.py │ │ ├── 0005_auto_20230217_1747.py │ │ ├── 0006_auto_20230221_1301.py │ │ ├── 0007_alter_entityrelation_updated_at.py │ │ ├── 0008_pirogueexperiment_aes_trace.py │ │ ├── 0009_entityrelation_attributes.py │ │ ├── 0010_backendcredentials.py │ │ ├── 0011_auto_20230409_1113.py │ │ ├── 0012_alter_detectionrule_targeted_observables.py │ │ ├── 0013_alter_case_documentation.py │ │ ├── 0014_uploadrequest.py │ │ ├── 0015_alter_artifact_file.py │ │ ├── 0016_uploadrequest_target_artifact_id.py │ │ ├── 0017_auto_20230420_0859.py │ │ ├── 0018_auto_20230420_1134.py │ │ ├── 0019_auto_20230421_1311.py │ │ ├── 0020_colanderteam_name.py │ │ ├── 0021_auto_20230502_1339.py │ │ ├── 0022_case_shared_with.py │ │ ├── 0023_auto_20230502_1401.py │ │ ├── 0024_alter_colanderteam_name.py │ │ ├── 0025_auto_20230601_0823.py │ │ ├── 0026_alter_detectionruleoutgoingfeed_content_type.py │ │ ├── 0027_alter_detectionruleoutgoingfeed_content_type.py │ │ ├── 0028_alter_entityoutgoingfeed_content_type.py │ │ ├── 0029_alter_entityoutgoingfeed_content_type.py │ │ ├── 0030_auto_20230601_0919.py │ │ ├── 0031_auto_20230601_0929.py │ │ ├── 0032_alter_detectionruleoutgoingfeed_content_type.py │ │ ├── 0033_alter_detectionruleoutgoingfeed_content_type.py │ │ ├── 0034_auto_20230602_0857.py │ │ ├── 0035_auto_20230603_0729.py │ │ ├── 0036_datafragment_datafragmenttype.py │ │ ├── 0037_case_overrides.py │ │ ├── 0038_alter_case_description.py │ │ ├── 0039_auto_20230918_1354.py │ │ ├── 0040_auto_20230918_1357.py │ │ ├── 0041_alter_event_involved_observables.py │ │ ├── 0042_alter_artifact_attributes_alter_device_attributes_and_more.py │ │ ├── 0043_actortype_default_attributes_and_more.py │ │ ├── 0044_droppedfile.py │ │ ├── 0045_droppedfile_filename_droppedfile_name.py │ │ ├── 0046_actortype_type_hints_artifacttype_type_hints_and_more.py │ │ ├── 0047_alter_actortype_type_hints_and_more.py │ │ ├── 0048_droppedfile_target_artifact_id.py │ │ ├── 0049_droppedfile_mime_type.py │ │ ├── 0050_alter_entity_source_url.py │ │ ├── 0051_subgraph.py │ │ ├── 0052_entity_thumbnail.py │ │ ├── 0053_alter_entity_thumbnail.py │ │ ├── 0054_alter_case_parent_case_alter_entity_thumbnail_and_more.py │ │ └── __init__.py │ ├── models.py │ ├── observable_enrichment.py │ ├── observable_tasks.py │ ├── rest │ │ ├── __init__.py │ │ ├── commons.py │ │ ├── serializers.py │ │ └── views.py │ ├── scarlet_utils.py │ ├── serializers │ │ ├── __init__.py │ │ ├── generic.py │ │ └── upload_request_serializers.py │ ├── signals.py │ ├── tasks │ │ ├── __init__.py │ │ ├── artifact_tasks.py │ │ ├── experiment_tasks.py │ │ └── experiment_to_har.py │ ├── templatetags │ │ ├── __init__.py │ │ └── colander_tags.py │ ├── tests │ │ ├── __init__.py │ │ └── security │ │ │ ├── __init__.py │ │ │ ├── test_collect.py │ │ │ └── test_teams.py │ ├── threatr.py │ ├── utils.py │ └── views │ │ ├── __init__.py │ │ ├── actor_views.py │ │ ├── artifact_views.py │ │ ├── collaborate_views.py │ │ ├── comment_views.py │ │ ├── data_fragment_views.py │ │ ├── detection_rule_views.py │ │ ├── device_views.py │ │ ├── documentation_views.py │ │ ├── dropped_files_views.py │ │ ├── enrich_view.py │ │ ├── event_views.py │ │ ├── experiment_views.py │ │ ├── graph_views.py │ │ ├── investigate_views.py │ │ ├── obversable_views.py │ │ ├── outgoing_feeds_views.py │ │ ├── relation_views.py │ │ ├── status_views.py │ │ ├── subgraphs_views.py │ │ ├── threat_views.py │ │ ├── threatr_proxy.py │ │ ├── upload_views.py │ │ └── views.py ├── frontend │ ├── README.md │ ├── colander-dgraph │ │ ├── default-settings.js │ │ └── utils.js │ ├── colander-vue-components │ │ ├── ArtifactUploader.vue │ │ ├── ConfirmButton.vue │ │ ├── DocumentationPane.vue │ │ ├── DropfileTriage.vue │ │ ├── DynamicTypeSelector.vue │ │ ├── GeoMap.vue │ │ ├── GraphEditor.vue │ │ ├── HStoreTable.vue │ │ ├── InvestigateView.vue │ │ ├── Suggester.vue │ │ ├── ThumbnailInputField.vue │ │ ├── ToolbarSearch.vue │ │ ├── graph-editor │ │ │ ├── EntitiesTablePane.vue │ │ │ ├── EntityEditPane.vue │ │ │ ├── EntityOverviewPane.vue │ │ │ ├── RelationEditPane.vue │ │ │ ├── SubgraphCreationPane.vue │ │ │ ├── engine.js │ │ │ └── refs │ │ │ │ ├── default-style.js │ │ │ │ ├── functional-styles.js │ │ │ │ └── graph-templates.js │ │ ├── importers │ │ │ └── CsvImporter.vue │ │ └── legacy │ │ │ └── file_upload.js │ ├── colander-widgets │ │ ├── cache.js │ │ └── index.js │ ├── colander │ │ ├── index.js │ │ ├── legacy │ │ │ ├── async-codemirror.js │ │ │ ├── colander-text-editor.js │ │ │ └── project.js │ │ ├── plugins │ │ │ ├── Cache.js │ │ │ ├── EventBus.js │ │ │ ├── Logger.js │ │ │ └── i18n.js │ │ └── theme-preset.js │ └── scss │ │ ├── _custom_bootstrap_variables.scss │ │ ├── _graph-context-menu.scss │ │ ├── graph.scss │ │ ├── primevue │ │ └── _primevue_variables.scss │ │ └── project.scss ├── static │ ├── css │ │ ├── flag-icons.min.css │ │ ├── fork-awesome.min.css │ │ └── nf.min.css │ ├── flags │ │ ├── 1x1 │ │ │ ├── ac.svg │ │ │ ├── ad.svg │ │ │ ├── ae.svg │ │ │ ├── af.svg │ │ │ ├── ag.svg │ │ │ ├── ai.svg │ │ │ ├── al.svg │ │ │ ├── am.svg │ │ │ ├── ao.svg │ │ │ ├── aq.svg │ │ │ ├── ar.svg │ │ │ ├── as.svg │ │ │ ├── at.svg │ │ │ ├── au.svg │ │ │ ├── aw.svg │ │ │ ├── ax.svg │ │ │ ├── az.svg │ │ │ ├── ba.svg │ │ │ ├── bb.svg │ │ │ ├── bd.svg │ │ │ ├── be.svg │ │ │ ├── bf.svg │ │ │ ├── bg.svg │ │ │ ├── bh.svg │ │ │ ├── bi.svg │ │ │ ├── bj.svg │ │ │ ├── bl.svg │ │ │ ├── bm.svg │ │ │ ├── bn.svg │ │ │ ├── bo.svg │ │ │ ├── bq.svg │ │ │ ├── br.svg │ │ │ ├── bs.svg │ │ │ ├── bt.svg │ │ │ ├── bv.svg │ │ │ ├── bw.svg │ │ │ ├── by.svg │ │ │ ├── bz.svg │ │ │ ├── ca.svg │ │ │ ├── cc.svg │ │ │ ├── cd.svg │ │ │ ├── cefta.svg │ │ │ ├── cf.svg │ │ │ ├── cg.svg │ │ │ ├── ch.svg │ │ │ ├── ci.svg │ │ │ ├── ck.svg │ │ │ ├── cl.svg │ │ │ ├── cm.svg │ │ │ ├── cn.svg │ │ │ ├── co.svg │ │ │ ├── cp.svg │ │ │ ├── cr.svg │ │ │ ├── cu.svg │ │ │ ├── cv.svg │ │ │ ├── cw.svg │ │ │ ├── cx.svg │ │ │ ├── cy.svg │ │ │ ├── cz.svg │ │ │ ├── de.svg │ │ │ ├── dg.svg │ │ │ ├── dj.svg │ │ │ ├── dk.svg │ │ │ ├── dm.svg │ │ │ ├── do.svg │ │ │ ├── dz.svg │ │ │ ├── ea.svg │ │ │ ├── ec.svg │ │ │ ├── ee.svg │ │ │ ├── eg.svg │ │ │ ├── eh.svg │ │ │ ├── er.svg │ │ │ ├── es-ct.svg │ │ │ ├── es-ga.svg │ │ │ ├── es-pv.svg │ │ │ ├── es.svg │ │ │ ├── et.svg │ │ │ ├── eu.svg │ │ │ ├── fi.svg │ │ │ ├── fj.svg │ │ │ ├── fk.svg │ │ │ ├── fm.svg │ │ │ ├── fo.svg │ │ │ ├── fr.svg │ │ │ ├── ga.svg │ │ │ ├── gb-eng.svg │ │ │ ├── gb-nir.svg │ │ │ ├── gb-sct.svg │ │ │ ├── gb-wls.svg │ │ │ ├── gb.svg │ │ │ ├── gd.svg │ │ │ ├── ge.svg │ │ │ ├── gf.svg │ │ │ ├── gg.svg │ │ │ ├── gh.svg │ │ │ ├── gi.svg │ │ │ ├── gl.svg │ │ │ ├── gm.svg │ │ │ ├── gn.svg │ │ │ ├── gp.svg │ │ │ ├── gq.svg │ │ │ ├── gr.svg │ │ │ ├── gs.svg │ │ │ ├── gt.svg │ │ │ ├── gu.svg │ │ │ ├── gw.svg │ │ │ ├── gy.svg │ │ │ ├── hk.svg │ │ │ ├── hm.svg │ │ │ ├── hn.svg │ │ │ ├── hr.svg │ │ │ ├── ht.svg │ │ │ ├── hu.svg │ │ │ ├── ic.svg │ │ │ ├── id.svg │ │ │ ├── ie.svg │ │ │ ├── il.svg │ │ │ ├── im.svg │ │ │ ├── in.svg │ │ │ ├── io.svg │ │ │ ├── iq.svg │ │ │ ├── ir.svg │ │ │ ├── is.svg │ │ │ ├── it.svg │ │ │ ├── je.svg │ │ │ ├── jm.svg │ │ │ ├── jo.svg │ │ │ ├── jp.svg │ │ │ ├── ke.svg │ │ │ ├── kg.svg │ │ │ ├── kh.svg │ │ │ ├── ki.svg │ │ │ ├── km.svg │ │ │ ├── kn.svg │ │ │ ├── kp.svg │ │ │ ├── kr.svg │ │ │ ├── kw.svg │ │ │ ├── ky.svg │ │ │ ├── kz.svg │ │ │ ├── la.svg │ │ │ ├── lb.svg │ │ │ ├── lc.svg │ │ │ ├── li.svg │ │ │ ├── lk.svg │ │ │ ├── lr.svg │ │ │ ├── ls.svg │ │ │ ├── lt.svg │ │ │ ├── lu.svg │ │ │ ├── lv.svg │ │ │ ├── ly.svg │ │ │ ├── ma.svg │ │ │ ├── mc.svg │ │ │ ├── md.svg │ │ │ ├── me.svg │ │ │ ├── mf.svg │ │ │ ├── mg.svg │ │ │ ├── mh.svg │ │ │ ├── mk.svg │ │ │ ├── ml.svg │ │ │ ├── mm.svg │ │ │ ├── mn.svg │ │ │ ├── mo.svg │ │ │ ├── mp.svg │ │ │ ├── mq.svg │ │ │ ├── mr.svg │ │ │ ├── ms.svg │ │ │ ├── mt.svg │ │ │ ├── mu.svg │ │ │ ├── mv.svg │ │ │ ├── mw.svg │ │ │ ├── mx.svg │ │ │ ├── my.svg │ │ │ ├── mz.svg │ │ │ ├── na.svg │ │ │ ├── nc.svg │ │ │ ├── ne.svg │ │ │ ├── nf.svg │ │ │ ├── ng.svg │ │ │ ├── ni.svg │ │ │ ├── nl.svg │ │ │ ├── no.svg │ │ │ ├── np.svg │ │ │ ├── nr.svg │ │ │ ├── nu.svg │ │ │ ├── nz.svg │ │ │ ├── om.svg │ │ │ ├── pa.svg │ │ │ ├── pe.svg │ │ │ ├── pf.svg │ │ │ ├── pg.svg │ │ │ ├── ph.svg │ │ │ ├── pk.svg │ │ │ ├── pl.svg │ │ │ ├── pm.svg │ │ │ ├── pn.svg │ │ │ ├── pr.svg │ │ │ ├── ps.svg │ │ │ ├── pt.svg │ │ │ ├── pw.svg │ │ │ ├── py.svg │ │ │ ├── qa.svg │ │ │ ├── re.svg │ │ │ ├── ro.svg │ │ │ ├── rs.svg │ │ │ ├── ru.svg │ │ │ ├── rw.svg │ │ │ ├── sa.svg │ │ │ ├── sb.svg │ │ │ ├── sc.svg │ │ │ ├── sd.svg │ │ │ ├── se.svg │ │ │ ├── sg.svg │ │ │ ├── sh.svg │ │ │ ├── si.svg │ │ │ ├── sj.svg │ │ │ ├── sk.svg │ │ │ ├── sl.svg │ │ │ ├── sm.svg │ │ │ ├── sn.svg │ │ │ ├── so.svg │ │ │ ├── sr.svg │ │ │ ├── ss.svg │ │ │ ├── st.svg │ │ │ ├── sv.svg │ │ │ ├── sx.svg │ │ │ ├── sy.svg │ │ │ ├── sz.svg │ │ │ ├── ta.svg │ │ │ ├── tc.svg │ │ │ ├── td.svg │ │ │ ├── tf.svg │ │ │ ├── tg.svg │ │ │ ├── th.svg │ │ │ ├── tj.svg │ │ │ ├── tk.svg │ │ │ ├── tl.svg │ │ │ ├── tm.svg │ │ │ ├── tn.svg │ │ │ ├── to.svg │ │ │ ├── tr.svg │ │ │ ├── tt.svg │ │ │ ├── tv.svg │ │ │ ├── tw.svg │ │ │ ├── tz.svg │ │ │ ├── ua.svg │ │ │ ├── ug.svg │ │ │ ├── um.svg │ │ │ ├── un.svg │ │ │ ├── us.svg │ │ │ ├── uy.svg │ │ │ ├── uz.svg │ │ │ ├── va.svg │ │ │ ├── vc.svg │ │ │ ├── ve.svg │ │ │ ├── vg.svg │ │ │ ├── vi.svg │ │ │ ├── vn.svg │ │ │ ├── vu.svg │ │ │ ├── wf.svg │ │ │ ├── ws.svg │ │ │ ├── xk.svg │ │ │ ├── xx.svg │ │ │ ├── ye.svg │ │ │ ├── yt.svg │ │ │ ├── za.svg │ │ │ ├── zm.svg │ │ │ └── zw.svg │ │ └── 4x3 │ │ │ ├── ac.svg │ │ │ ├── ad.svg │ │ │ ├── ae.svg │ │ │ ├── af.svg │ │ │ ├── ag.svg │ │ │ ├── ai.svg │ │ │ ├── al.svg │ │ │ ├── am.svg │ │ │ ├── ao.svg │ │ │ ├── aq.svg │ │ │ ├── ar.svg │ │ │ ├── as.svg │ │ │ ├── at.svg │ │ │ ├── au.svg │ │ │ ├── aw.svg │ │ │ ├── ax.svg │ │ │ ├── az.svg │ │ │ ├── ba.svg │ │ │ ├── bb.svg │ │ │ ├── bd.svg │ │ │ ├── be.svg │ │ │ ├── bf.svg │ │ │ ├── bg.svg │ │ │ ├── bh.svg │ │ │ ├── bi.svg │ │ │ ├── bj.svg │ │ │ ├── bl.svg │ │ │ ├── bm.svg │ │ │ ├── bn.svg │ │ │ ├── bo.svg │ │ │ ├── bq.svg │ │ │ ├── br.svg │ │ │ ├── bs.svg │ │ │ ├── bt.svg │ │ │ ├── bv.svg │ │ │ ├── bw.svg │ │ │ ├── by.svg │ │ │ ├── bz.svg │ │ │ ├── ca.svg │ │ │ ├── cc.svg │ │ │ ├── cd.svg │ │ │ ├── cefta.svg │ │ │ ├── cf.svg │ │ │ ├── cg.svg │ │ │ ├── ch.svg │ │ │ ├── ci.svg │ │ │ ├── ck.svg │ │ │ ├── cl.svg │ │ │ ├── cm.svg │ │ │ ├── cn.svg │ │ │ ├── co.svg │ │ │ ├── cp.svg │ │ │ ├── cr.svg │ │ │ ├── cu.svg │ │ │ ├── cv.svg │ │ │ ├── cw.svg │ │ │ ├── cx.svg │ │ │ ├── cy.svg │ │ │ ├── cz.svg │ │ │ ├── de.svg │ │ │ ├── dg.svg │ │ │ ├── dj.svg │ │ │ ├── dk.svg │ │ │ ├── dm.svg │ │ │ ├── do.svg │ │ │ ├── dz.svg │ │ │ ├── ea.svg │ │ │ ├── ec.svg │ │ │ ├── ee.svg │ │ │ ├── eg.svg │ │ │ ├── eh.svg │ │ │ ├── er.svg │ │ │ ├── es-ct.svg │ │ │ ├── es-ga.svg │ │ │ ├── es-pv.svg │ │ │ ├── es.svg │ │ │ ├── et.svg │ │ │ ├── eu.svg │ │ │ ├── fi.svg │ │ │ ├── fj.svg │ │ │ ├── fk.svg │ │ │ ├── fm.svg │ │ │ ├── fo.svg │ │ │ ├── fr.svg │ │ │ ├── ga.svg │ │ │ ├── gb-eng.svg │ │ │ ├── gb-nir.svg │ │ │ ├── gb-sct.svg │ │ │ ├── gb-wls.svg │ │ │ ├── gb.svg │ │ │ ├── gd.svg │ │ │ ├── ge.svg │ │ │ ├── gf.svg │ │ │ ├── gg.svg │ │ │ ├── gh.svg │ │ │ ├── gi.svg │ │ │ ├── gl.svg │ │ │ ├── gm.svg │ │ │ ├── gn.svg │ │ │ ├── gp.svg │ │ │ ├── gq.svg │ │ │ ├── gr.svg │ │ │ ├── gs.svg │ │ │ ├── gt.svg │ │ │ ├── gu.svg │ │ │ ├── gw.svg │ │ │ ├── gy.svg │ │ │ ├── hk.svg │ │ │ ├── hm.svg │ │ │ ├── hn.svg │ │ │ ├── hr.svg │ │ │ ├── ht.svg │ │ │ ├── hu.svg │ │ │ ├── ic.svg │ │ │ ├── id.svg │ │ │ ├── ie.svg │ │ │ ├── il.svg │ │ │ ├── im.svg │ │ │ ├── in.svg │ │ │ ├── io.svg │ │ │ ├── iq.svg │ │ │ ├── ir.svg │ │ │ ├── is.svg │ │ │ ├── it.svg │ │ │ ├── je.svg │ │ │ ├── jm.svg │ │ │ ├── jo.svg │ │ │ ├── jp.svg │ │ │ ├── ke.svg │ │ │ ├── kg.svg │ │ │ ├── kh.svg │ │ │ ├── ki.svg │ │ │ ├── km.svg │ │ │ ├── kn.svg │ │ │ ├── kp.svg │ │ │ ├── kr.svg │ │ │ ├── kw.svg │ │ │ ├── ky.svg │ │ │ ├── kz.svg │ │ │ ├── la.svg │ │ │ ├── lb.svg │ │ │ ├── lc.svg │ │ │ ├── li.svg │ │ │ ├── lk.svg │ │ │ ├── lr.svg │ │ │ ├── ls.svg │ │ │ ├── lt.svg │ │ │ ├── lu.svg │ │ │ ├── lv.svg │ │ │ ├── ly.svg │ │ │ ├── ma.svg │ │ │ ├── mc.svg │ │ │ ├── md.svg │ │ │ ├── me.svg │ │ │ ├── mf.svg │ │ │ ├── mg.svg │ │ │ ├── mh.svg │ │ │ ├── mk.svg │ │ │ ├── ml.svg │ │ │ ├── mm.svg │ │ │ ├── mn.svg │ │ │ ├── mo.svg │ │ │ ├── mp.svg │ │ │ ├── mq.svg │ │ │ ├── mr.svg │ │ │ ├── ms.svg │ │ │ ├── mt.svg │ │ │ ├── mu.svg │ │ │ ├── mv.svg │ │ │ ├── mw.svg │ │ │ ├── mx.svg │ │ │ ├── my.svg │ │ │ ├── mz.svg │ │ │ ├── na.svg │ │ │ ├── nc.svg │ │ │ ├── ne.svg │ │ │ ├── nf.svg │ │ │ ├── ng.svg │ │ │ ├── ni.svg │ │ │ ├── nl.svg │ │ │ ├── no.svg │ │ │ ├── np.svg │ │ │ ├── nr.svg │ │ │ ├── nu.svg │ │ │ ├── nz.svg │ │ │ ├── om.svg │ │ │ ├── pa.svg │ │ │ ├── pe.svg │ │ │ ├── pf.svg │ │ │ ├── pg.svg │ │ │ ├── ph.svg │ │ │ ├── pk.svg │ │ │ ├── pl.svg │ │ │ ├── pm.svg │ │ │ ├── pn.svg │ │ │ ├── pr.svg │ │ │ ├── ps.svg │ │ │ ├── pt.svg │ │ │ ├── pw.svg │ │ │ ├── py.svg │ │ │ ├── qa.svg │ │ │ ├── re.svg │ │ │ ├── ro.svg │ │ │ ├── rs.svg │ │ │ ├── ru.svg │ │ │ ├── rw.svg │ │ │ ├── sa.svg │ │ │ ├── sb.svg │ │ │ ├── sc.svg │ │ │ ├── sd.svg │ │ │ ├── se.svg │ │ │ ├── sg.svg │ │ │ ├── sh.svg │ │ │ ├── si.svg │ │ │ ├── sj.svg │ │ │ ├── sk.svg │ │ │ ├── sl.svg │ │ │ ├── sm.svg │ │ │ ├── sn.svg │ │ │ ├── so.svg │ │ │ ├── sr.svg │ │ │ ├── ss.svg │ │ │ ├── st.svg │ │ │ ├── sv.svg │ │ │ ├── sx.svg │ │ │ ├── sy.svg │ │ │ ├── sz.svg │ │ │ ├── ta.svg │ │ │ ├── tc.svg │ │ │ ├── td.svg │ │ │ ├── tf.svg │ │ │ ├── tg.svg │ │ │ ├── th.svg │ │ │ ├── tj.svg │ │ │ ├── tk.svg │ │ │ ├── tl.svg │ │ │ ├── tm.svg │ │ │ ├── tn.svg │ │ │ ├── to.svg │ │ │ ├── tr.svg │ │ │ ├── tt.svg │ │ │ ├── tv.svg │ │ │ ├── tw.svg │ │ │ ├── tz.svg │ │ │ ├── ua.svg │ │ │ ├── ug.svg │ │ │ ├── um.svg │ │ │ ├── un.svg │ │ │ ├── us.svg │ │ │ ├── uy.svg │ │ │ ├── uz.svg │ │ │ ├── va.svg │ │ │ ├── vc.svg │ │ │ ├── ve.svg │ │ │ ├── vg.svg │ │ │ ├── vi.svg │ │ │ ├── vn.svg │ │ │ ├── vu.svg │ │ │ ├── wf.svg │ │ │ ├── ws.svg │ │ │ ├── xk.svg │ │ │ ├── xx.svg │ │ │ ├── ye.svg │ │ │ ├── yt.svg │ │ │ ├── za.svg │ │ │ ├── zm.svg │ │ │ └── zw.svg │ ├── fonts │ │ ├── .gitkeep │ │ ├── forkawesome-webfont.eot │ │ ├── forkawesome-webfont.svg │ │ ├── forkawesome-webfont.ttf │ │ ├── forkawesome-webfont.woff │ │ ├── forkawesome-webfont.woff2 │ │ └── nf.woff2 │ ├── images │ │ ├── cyberchef_hat.svg │ │ ├── favicons │ │ │ ├── favicon-16x16.png │ │ │ └── favicon.ico │ │ ├── icons │ │ │ ├── Actor.svg │ │ │ ├── DataFragment.svg │ │ │ ├── Device.svg │ │ │ ├── Observable.svg │ │ │ ├── Threat.svg │ │ │ ├── caret-right.svg │ │ │ ├── eye-slash.svg │ │ │ ├── eye.svg │ │ │ ├── hubzilla.svg │ │ │ ├── link.svg │ │ │ ├── magic.svg │ │ │ ├── map-marker.svg │ │ │ ├── pencil-square-o.svg │ │ │ ├── pencil.svg │ │ │ ├── plus-circle.svg │ │ │ ├── selection-add.svg │ │ │ └── trash.svg │ │ ├── no-thumbnail-yet-256x144.png │ │ └── pts_logo.svg │ ├── js │ │ └── .gitkeep │ └── pts-assets │ │ ├── README.txt │ │ ├── config.json │ │ ├── css │ │ ├── animation.css │ │ ├── pts-assets-codes.css │ │ ├── pts-assets-embedded.css │ │ ├── pts-assets-ie7-codes.css │ │ ├── pts-assets-ie7.css │ │ └── pts-assets.css │ │ ├── demo.html │ │ └── font │ │ ├── pts-assets.eot │ │ ├── pts-assets.svg │ │ ├── pts-assets.ttf │ │ ├── pts-assets.woff │ │ └── pts-assets.woff2 ├── templates │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── account │ │ ├── account_inactive.html │ │ ├── base.html │ │ ├── email.html │ │ ├── email_confirm.html │ │ ├── login.html │ │ ├── logout.html │ │ ├── password_change.html │ │ ├── password_reset.html │ │ ├── password_reset_done.html │ │ ├── password_reset_from_key.html │ │ ├── password_reset_from_key_done.html │ │ ├── password_set.html │ │ ├── root_base_copy.html │ │ ├── signup.html │ │ ├── signup_closed.html │ │ ├── verification_sent.html │ │ └── verified_email_required.html │ ├── actor │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── allauth_2fa │ │ ├── authenticate.html │ │ ├── backup_tokens.html │ │ ├── remove.html │ │ └── setup.html │ ├── artifact │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── base.html │ ├── base_error.html │ ├── case │ │ ├── controls.html │ │ ├── create_update.html │ │ ├── details.html │ │ ├── documentation_form.html │ │ ├── graph.html │ │ ├── list.html │ │ └── list_item.html │ ├── comment │ │ ├── form.html │ │ └── list_item.html │ ├── data_fragment │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── detection_rule │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── device │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── entity_relation │ │ ├── controls.html │ │ ├── details.html │ │ ├── list_item.html │ │ ├── related_entities.html │ │ └── table_item.html │ ├── event │ │ ├── compact_list_item.html │ │ ├── controls.html │ │ ├── details.html │ │ ├── list_item.html │ │ └── timeline.html │ ├── experiment │ │ ├── analysis_list_item.html │ │ ├── analysis_report.html │ │ ├── analysis_summary.html │ │ ├── controls.html │ │ ├── details.html │ │ ├── experiment_list_item.html │ │ ├── list_item.html │ │ ├── m_analysis_report_artifact_details.html │ │ └── m_analysis_report_flow_list_item.html │ ├── feed │ │ ├── detection_rule_out_feed_controls.html │ │ ├── entity_out_feed_controls.html │ │ └── list_item.html │ ├── forms │ │ └── widgets │ │ │ └── thumbnail_input_file.html │ ├── helpers │ │ ├── date_since.html │ │ ├── dynamic_type_selector.html │ │ ├── dynamic_type_selector_js.html │ │ ├── entity_comments.html │ │ ├── extra_attributes.html │ │ ├── extra_attributes_light.html │ │ ├── square_pill.html │ │ └── tags.html │ ├── icons │ │ ├── actor_icon.html │ │ ├── artifact_icon.html │ │ ├── case_icon.html │ │ ├── color_icon.html │ │ ├── comment_icon.html │ │ ├── data_fragment_icon.html │ │ ├── date_icon.html │ │ ├── detection_rule_icon.html │ │ ├── device_icon.html │ │ ├── event_icon.html │ │ ├── experiment_icon.html │ │ ├── id_icon.html │ │ ├── mimetype_icon.html │ │ ├── observable_icon.html │ │ ├── out_feed_icon.html │ │ ├── pills.html │ │ ├── relation_icon.html │ │ ├── since_icon.html │ │ ├── team_icon.html │ │ ├── threat_icon.html │ │ ├── traffic_light_icon.html │ │ └── user_icon.html │ ├── import │ │ └── csv.html │ ├── observable │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── pages │ │ ├── about.html │ │ ├── analyze │ │ │ └── base.html │ │ ├── case │ │ │ ├── base.html │ │ │ └── details.html │ │ ├── collaborate │ │ │ ├── base.html │ │ │ ├── detection_rule_out_feeds.html │ │ │ ├── entity_out_feeds.html │ │ │ ├── team_details.html │ │ │ └── teams.html │ │ ├── collect │ │ │ ├── actor_details.html │ │ │ ├── actors.html │ │ │ ├── artifact_details.html │ │ │ ├── artifacts.html │ │ │ ├── base.html │ │ │ ├── case_details.html │ │ │ ├── cases.html │ │ │ ├── data_fragment_details.html │ │ │ ├── data_fragments.html │ │ │ ├── detection_rule_details.html │ │ │ ├── detection_rules.html │ │ │ ├── device_details.html │ │ │ ├── devices.html │ │ │ ├── entity_relations.html │ │ │ ├── event_details.html │ │ │ ├── events.html │ │ │ ├── experiment_details.html │ │ │ ├── experiments.html │ │ │ ├── observable_details.html │ │ │ ├── observables.html │ │ │ ├── relation_details.html │ │ │ ├── relations.html │ │ │ ├── threat_details.html │ │ │ └── threats.html │ │ ├── document │ │ │ └── base.html │ │ ├── drops_triage │ │ │ └── base.html │ │ ├── evidences.html │ │ ├── feeds │ │ │ ├── base.html │ │ │ ├── detection_rule_out_feeds.html │ │ │ └── entity_out_feeds.html │ │ ├── graph │ │ │ ├── base.html │ │ │ ├── subgraph.html │ │ │ └── subgraphs.html │ │ ├── home.html │ │ ├── investigate │ │ │ ├── base.html │ │ │ ├── generic_entity_details.html │ │ │ ├── generic_entity_details_list.html │ │ │ ├── generic_event_row.html │ │ │ └── m_observable_table_row.html │ │ ├── quick_creation │ │ │ └── base.html │ │ ├── quick_search │ │ │ ├── m_result_table.html │ │ │ └── result_list.html │ │ ├── status │ │ │ ├── base.html │ │ │ ├── module_card.html │ │ │ └── module_row.html │ │ ├── swager.html │ │ └── workspace │ │ │ └── base.html │ ├── subgraph │ │ ├── controls.html │ │ ├── list_item.html │ │ └── pin_toggler.html │ ├── team │ │ ├── add_contributor.html │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── threat │ │ ├── controls.html │ │ ├── details.html │ │ └── list_item.html │ ├── tlp │ │ ├── badge_pap.html │ │ ├── badge_tlp.html │ │ └── show_tlp_pap.html │ └── users │ │ ├── user_detail.html │ │ └── user_form.html ├── users │ ├── __init__.py │ ├── adapters.py │ ├── admin.py │ ├── api │ │ ├── serializers.py │ │ └── views.py │ ├── apps.py │ ├── context_processors.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_user_type.py │ │ ├── 0003_user_contributor_id.py │ │ ├── 0004_user_preferences.py │ │ └── __init__.py │ ├── models.py │ ├── signals.py │ ├── tests │ │ ├── __init__.py │ │ ├── factories.py │ │ ├── test_admin.py │ │ ├── test_forms.py │ │ ├── test_models.py │ │ ├── test_urls.py │ │ └── test_views.py │ ├── urls.py │ └── views.py ├── utils │ ├── __init__.py │ └── storages.py └── websocket │ ├── __init__.py │ └── consumers.py ├── compose ├── local │ ├── django │ │ ├── Dockerfile │ │ ├── django-q │ │ │ └── start │ │ └── start │ └── docs │ │ ├── Dockerfile │ │ └── start └── production │ ├── django │ ├── Dockerfile │ ├── django-q │ │ └── start │ ├── entrypoint │ └── start │ ├── postgres │ ├── Dockerfile │ └── maintenance │ │ ├── _sourced │ │ ├── constants.sh │ │ ├── countdown.sh │ │ ├── messages.sh │ │ └── yes_no.sh │ │ ├── backup │ │ ├── backups │ │ └── restore │ └── traefik │ ├── Dockerfile │ └── traefik.yml ├── config ├── __init__.py ├── api_router.py ├── asgi_local.py ├── asgi_production.py ├── rest_router.py ├── settings │ ├── __init__.py │ ├── base.py │ ├── local.py │ ├── production.py │ └── test.py ├── urls.py ├── ws_router.py └── wsgi.py ├── deploy_package ├── .envs │ └── .tpl │ │ ├── .base │ │ ├── .colander │ │ ├── .colander-postgres │ │ ├── .keycloak │ │ ├── .keycloak-postgres │ │ ├── .minio │ │ ├── .threatr │ │ └── .threatr-postgres ├── compose │ └── production │ │ ├── postgres │ │ ├── Dockerfile │ │ └── maintenance │ │ │ ├── _sourced │ │ │ ├── constants.sh │ │ │ ├── countdown.sh │ │ │ ├── messages.sh │ │ │ └── yes_no.sh │ │ │ ├── backup │ │ │ ├── backups │ │ │ └── restore │ │ └── traefik │ │ ├── Dockerfile │ │ └── traefik.yml.tpl ├── gen.sh └── no-sso.yml ├── docs ├── Makefile ├── __init__.py ├── conf.py ├── howto.rst ├── index.rst ├── make.bat ├── pycharm │ ├── configuration.rst │ └── images │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 7.png │ │ ├── 8.png │ │ ├── f1.png │ │ ├── f2.png │ │ ├── f3.png │ │ ├── f4.png │ │ ├── issue1.png │ │ └── issue2.png └── users.rst ├── local.yml ├── locale └── README.rst ├── manage.py ├── merge_production_dotenvs_in_dotenv.py ├── package-lock.json ├── package.json ├── production.yml ├── pyproject.toml ├── pytest.ini ├── requirements ├── base.txt ├── local.txt └── production.txt ├── setup.cfg └── webpack.config.js /.dockerignore: -------------------------------------------------------------------------------- 1 | .editorconfig 2 | .gitattributes 3 | .github 4 | .gitignore 5 | .gitlab-ci.yml 6 | .idea 7 | .pre-commit-config.yaml 8 | .readthedocs.yml 9 | .travis.yml 10 | venv 11 | node_modules 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.{py,rst,ini}] 12 | indent_style = space 13 | indent_size = 4 14 | 15 | [*.{html,css,scss,js,json,yml,xml}] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false 21 | 22 | [Makefile] 23 | indent_style = tab 24 | 25 | [nginx.conf] 26 | indent_style = space 27 | indent_size = 2 28 | -------------------------------------------------------------------------------- /.envs/.local/.django: -------------------------------------------------------------------------------- 1 | # General 2 | # ------------------------------------------------------------------------------ 3 | USE_DOCKER=yes 4 | USE_MANDOLIN=yes 5 | IPYTHONDIR=/app/.ipython 6 | 7 | REDIS_URL=redis://redis:6379/0 8 | 9 | MINIO_ACCESS_KEY=KBP6WXGPS387090EZMG8 10 | MINIO_SECRET_KEY=DRjFXylyfMqn2zilAr33xORhaYz5r9e8r37XPz3A 11 | -------------------------------------------------------------------------------- /.envs/.local/.keycloak: -------------------------------------------------------------------------------- 1 | DB_VENDOR=postgres 2 | KEYCLOAK_DATABASE_HOST=keycloak-db 3 | KEYCLOAK_DATABASE_PORT=5432 4 | # Database name (replace with yours) 5 | KEYCLOAK_DATABASE_NAME=keycloakdb 6 | # Database user (replace with yours) 7 | KEYCLOAK_DATABASE_USER=hhGArHWVrVQjuDcgBUNNlQqZNfqyNPfQ 8 | # Database password (replace with yours) 9 | KEYCLOAK_DATABASE_PASSWORD=vW9WtXmFWpsq5tATgcYNAi62cC1tWar1BsSrksBodMrra2bv4NHVvRyIm9k29Ro9 10 | 11 | # Keycloak user (replace with yours) 12 | KEYCLOAK_USER=keycloakadmin 13 | # Keycloak password (replace with yours) 14 | KEYCLOAK_PASSWORD=rwXPqspCABJzqh47i723wf9 15 | 16 | PROXY_ADDRESS_FORWARDING='true' 17 | KEYCLOAK_LOGLEVEL=DEBUG 18 | -------------------------------------------------------------------------------- /.envs/.local/.postgres: -------------------------------------------------------------------------------- 1 | # PostgreSQL 2 | # ------------------------------------------------------------------------------ 3 | POSTGRES_HOST=postgres 4 | POSTGRES_PORT=5432 5 | POSTGRES_DB=colander 6 | POSTGRES_USER=hhGArHWVrVQjuDcgBUNNlQqZNfqyNPfQ 7 | POSTGRES_PASSWORD=vW9WtXmFWpsq5tATgcYNAi62cC1tWar1BsSrksBodMrra2bv4NHVvRyIm9k29Ro9 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | Esther Onfroy 2 | Abir Ghattas 3 | Christophe Andral 4 | -------------------------------------------------------------------------------- /.github/codeql/codeql-config.yml: -------------------------------------------------------------------------------- 1 | name: "PTS CodeQL config" 2 | 3 | paths-ignore: 4 | # Ignore static, compiled JS files 5 | - "colander/static/js/*.min.js" 6 | - "colander/static/js/*.min.mjs" 7 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MASTER] 2 | load-plugins=pylint_django 3 | django-settings-module=config.settings.local 4 | ignore=migrations 5 | 6 | [FORMAT] 7 | max-line-length=120 8 | 9 | [MESSAGES CONTROL] 10 | disable=missing-docstring,invalid-name,line-too-long,wrong-import-order,fixme 11 | 12 | [DESIGN] 13 | max-parents=13 14 | 15 | [TYPECHECK] 16 | generated-members=REQUEST,acl_users,aq_parent,"[a-zA-Z]+_set{1,2}",save,delete 17 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | sphinx: 4 | configuration: docs/conf.py 5 | 6 | build: 7 | image: testing 8 | 9 | python: 10 | version: 3.9 11 | install: 12 | - requirements: requirements/local.txt 13 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) 2022, Defensive Lab Agency 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | -------------------------------------------------------------------------------- /colander/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.1.0" 2 | __version_info__ = tuple( 3 | int(num) if num.isdigit() else num 4 | for num in __version__.replace("-", ".", 1).split(".") 5 | ) 6 | -------------------------------------------------------------------------------- /colander/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from colander.users.models import User 4 | from colander.users.tests.factories import UserFactory 5 | 6 | 7 | @pytest.fixture(autouse=True) 8 | def media_storage(settings, tmpdir): 9 | settings.MEDIA_ROOT = tmpdir.strpath 10 | 11 | 12 | @pytest.fixture 13 | def user(db) -> User: 14 | return UserFactory() 15 | -------------------------------------------------------------------------------- /colander/contrib/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | To understand why this file is here, please read: 3 | 4 | http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django 5 | """ 6 | -------------------------------------------------------------------------------- /colander/contrib/sites/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | To understand why this file is here, please read: 3 | 4 | http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django 5 | """ 6 | -------------------------------------------------------------------------------- /colander/contrib/sites/migrations/0002_alter_domain_unique.py: -------------------------------------------------------------------------------- 1 | import django.contrib.sites.models 2 | from django.db import migrations, models 3 | 4 | 5 | class Migration(migrations.Migration): 6 | 7 | dependencies = [("sites", "0001_initial")] 8 | 9 | operations = [ 10 | migrations.AlterField( 11 | model_name="site", 12 | name="domain", 13 | field=models.CharField( 14 | max_length=100, 15 | unique=True, 16 | validators=[django.contrib.sites.models._simple_domain_name_validator], 17 | verbose_name="domain name", 18 | ), 19 | ) 20 | ] 21 | -------------------------------------------------------------------------------- /colander/contrib/sites/migrations/0004_alter_options_ordering_domain.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1.7 on 2021-02-04 14:49 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sites", "0003_set_site_domain_and_name"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name="site", 15 | options={ 16 | "ordering": ["domain"], 17 | "verbose_name": "site", 18 | "verbose_name_plural": "sites", 19 | }, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /colander/contrib/sites/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | To understand why this file is here, please read: 3 | 4 | http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django 5 | """ 6 | -------------------------------------------------------------------------------- /colander/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/__init__.py -------------------------------------------------------------------------------- /colander/core/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/api/__init__.py -------------------------------------------------------------------------------- /colander/core/api/security.py: -------------------------------------------------------------------------------- 1 | from rest_framework.authentication import TokenAuthentication 2 | 3 | 4 | class BearerTokenAuthentication(TokenAuthentication): 5 | keyword = 'Bearer' 6 | """Some external requesters use 'Authorization: Bearer' preamble 7 | to authenticate and not the 'non standard' 'Token' one used by DRF. 8 | """ 9 | -------------------------------------------------------------------------------- /colander/core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | from colander.core.es_utils import create_geoip_pipeline 5 | 6 | 7 | class CoreConfig(AppConfig): 8 | name = "colander.core" 9 | verbose_name = _("Core") 10 | 11 | def ready(self): 12 | print('Ready') 13 | create_geoip_pipeline() 14 | try: 15 | import colander.users.signals # noqa F401 16 | except ImportError: 17 | pass 18 | -------------------------------------------------------------------------------- /colander/core/exporters/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/exporters/__init__.py -------------------------------------------------------------------------------- /colander/core/forms/widgets.py: -------------------------------------------------------------------------------- 1 | from django.forms.widgets import ClearableFileInput 2 | 3 | 4 | class ThumbnailFileInput(ClearableFileInput): 5 | template_name = "forms/widgets/thumbnail_input_file.html" 6 | thumbnail_url = None 7 | 8 | def get_context(self, name, value, attrs): 9 | context = super().get_context(name, value, attrs) 10 | context['widget'].update(dict(thumbnail_url=self.thumbnail_url)) 11 | return context 12 | -------------------------------------------------------------------------------- /colander/core/graph/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/graph/__init__.py -------------------------------------------------------------------------------- /colander/core/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/management/__init__.py -------------------------------------------------------------------------------- /colander/core/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/management/commands/__init__.py -------------------------------------------------------------------------------- /colander/core/management/commands/data/data_fragment_types.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"short_name": "CODE", "name": "Piece of code", "description": "", "svg_icon": "", "nf_icon": "nf-md-code_braces"}, 3 | {"short_name": "PATTERN", "name": "Pattern", "description": "", "svg_icon": "", "nf_icon": "nf-fa-puzzle_piece"}, 4 | {"short_name": "TEXT", "name": "Piece of text", "description": "", "svg_icon": "", "nf_icon": "nf-fa-file_text"}, 5 | {"short_name": "PAYLOAD", "name": "Raw payload", "description": "", "svg_icon": "", "nf_icon": "nf-oct-file_binary"} 6 | ] 7 | -------------------------------------------------------------------------------- /colander/core/management/commands/data/detection_rule_types.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"short_name": "YARA", "name": "Yara rule", "description": "", "svg_icon": "", "nf_icon": "nf-cod-server_process"}, 3 | {"short_name": "SURICATA", "name": "Suricata rule", "description": "", "svg_icon": "", "nf_icon": "nf-cod-server_process"} 4 | ] 5 | -------------------------------------------------------------------------------- /colander/core/management/commands/fix_contributor_id.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | 3 | from django.core.management.base import BaseCommand 4 | 5 | from colander.users.models import User 6 | 7 | 8 | class Command(BaseCommand): 9 | help = 'Fix/rotate contributor IDs.' 10 | 11 | def handle(self, *args, **options): 12 | for user in User.objects.all(): 13 | user.contributor_id = uuid.uuid4() 14 | user.save() 15 | -------------------------------------------------------------------------------- /colander/core/migrations/0007_alter_entityrelation_updated_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.15 on 2023-02-21 13:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0006_auto_20230221_1301'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='entityrelation', 15 | name='updated_at', 16 | field=models.DateTimeField(auto_now=True, help_text='Latest modification of this object.'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0008_pirogueexperiment_aes_trace.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.15 on 2023-03-01 13:23 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('core', '0007_alter_entityrelation_updated_at'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='pirogueexperiment', 16 | name='aes_trace', 17 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pirogue_aes_trace', to='core.artifact'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /colander/core/migrations/0009_entityrelation_attributes.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-09 18:16 2 | 3 | import django.contrib.postgres.fields.hstore 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('core', '0008_pirogueexperiment_aes_trace'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='entityrelation', 16 | name='attributes', 17 | field=django.contrib.postgres.fields.hstore.HStoreField(blank=True, null=True), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /colander/core/migrations/0012_alter_detectionrule_targeted_observables.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-09 11:17 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0011_auto_20230409_1113'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='detectionrule', 15 | name='targeted_observables', 16 | field=models.ManyToManyField(blank=True, null=True, to='core.Observable'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0013_alter_case_documentation.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-13 08:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0012_alter_detectionrule_targeted_observables'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='case', 15 | name='documentation', 16 | field=models.TextField(blank=True, help_text='Case documentation.', null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0015_alter_artifact_file.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-19 13:50 2 | 3 | import colander.core.models 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('core', '0014_uploadrequest'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='artifact', 16 | name='file', 17 | field=models.FileField(blank=True, max_length=512, null=True, upload_to=colander.core.models._get_evidence_upload_dir), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /colander/core/migrations/0016_uploadrequest_target_artifact_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-19 14:05 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0015_alter_artifact_file'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='uploadrequest', 15 | name='target_artifact_id', 16 | field=models.CharField(blank=True, max_length=36, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0020_colanderteam_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-05-02 13:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0019_auto_20230421_1311'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='colanderteam', 15 | name='name', 16 | field=models.CharField(default='', help_text='Give a meaningful name to this type of artifact.', max_length=512, verbose_name='name'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0022_case_shared_with.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-05-02 13:45 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0021_auto_20230502_1339'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='case', 15 | name='shared_with', 16 | field=models.ManyToManyField(related_name='shared_cases', to='core.ColanderTeam'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0024_alter_colanderteam_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-05-15 12:41 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0023_auto_20230502_1401'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='colanderteam', 15 | name='name', 16 | field=models.CharField(default='', help_text='Give a meaningful name to this team.', max_length=512, verbose_name='name'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0026_alter_detectionruleoutgoingfeed_content_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-06-01 08:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0025_auto_20230601_0823'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='detectionruleoutgoingfeed', 15 | name='content_type', 16 | field=models.CharField(max_length=512), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0027_alter_detectionruleoutgoingfeed_content_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-06-01 08:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0026_alter_detectionruleoutgoingfeed_content_type'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='detectionruleoutgoingfeed', 15 | name='content_type', 16 | field=models.CharField(choices=[('SURICATA', 'Suricata rule'), ('YARA', 'Yara rule')], max_length=512), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0032_alter_detectionruleoutgoingfeed_content_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-06-01 09:30 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0031_auto_20230601_0929'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='detectionruleoutgoingfeed', 15 | name='content_type', 16 | field=models.CharField(choices=[('8a9537cc-1bbb-4d8e-8a0f-b8bb08c4cb20', 'Suricata rule'), ('07ecd6d3-e89e-4f9a-a794-06b7692f22c1', 'Yara rule')], max_length=512), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0033_alter_detectionruleoutgoingfeed_content_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-06-01 10:40 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('core', '0032_alter_detectionruleoutgoingfeed_content_type'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='detectionruleoutgoingfeed', 16 | name='content_type', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.detectionruletype'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /colander/core/migrations/0037_case_overrides.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-07-07 09:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0036_datafragment_datafragmenttype'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='case', 15 | name='overrides', 16 | field=models.JSONField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0038_alter_case_description.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-09-18 13:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0037_case_overrides'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='case', 15 | name='description', 16 | field=models.TextField(help_text='Add more details about the case here.'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0041_alter_event_involved_observables.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-09-20 10:53 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0040_auto_20230918_1357'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='event', 15 | name='involved_observables', 16 | field=models.ManyToManyField(blank=True, help_text='Select the observables involved with this event.', null=True, related_name='events', to='core.Observable'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0048_droppedfile_target_artifact_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.8 on 2024-12-11 08:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("core", "0047_alter_actortype_type_hints_and_more"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="droppedfile", 15 | name="target_artifact_id", 16 | field=models.CharField(blank=True, max_length=36, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0049_droppedfile_mime_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.8 on 2024-12-11 12:53 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("core", "0048_droppedfile_target_artifact_id"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="droppedfile", 15 | name="mime_type", 16 | field=models.CharField(blank=True, max_length=512, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/core/migrations/0052_entity_thumbnail.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.8 on 2025-02-04 13:43 2 | 3 | import colander.core.models 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ("core", "0051_subgraph"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="entity", 16 | name="thumbnail", 17 | field=models.FileField( 18 | blank=True, max_length=512, null=True, upload_to=colander.core.models._get_entity_thumbnails_storage_dir 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /colander/core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/migrations/__init__.py -------------------------------------------------------------------------------- /colander/core/rest/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/rest/__init__.py -------------------------------------------------------------------------------- /colander/core/scarlet_utils.py: -------------------------------------------------------------------------------- 1 | 2 | def __remove_geojson(elt): 3 | try: 4 | elt['network']['location'].pop('geojson') 5 | except: 6 | pass 7 | return elt 8 | 9 | 10 | def clean_results(api_response): 11 | if api_response['result_code'] != 1: 12 | return True, api_response['result'] 13 | else: 14 | # Remove geojson 15 | if type(api_response['result']) is list: 16 | data = api_response['result'][0] 17 | else: 18 | data = api_response['result'] 19 | data = __remove_geojson(data) 20 | return False, data 21 | -------------------------------------------------------------------------------- /colander/core/serializers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/serializers/__init__.py -------------------------------------------------------------------------------- /colander/core/tasks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/tasks/__init__.py -------------------------------------------------------------------------------- /colander/core/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/templatetags/__init__.py -------------------------------------------------------------------------------- /colander/core/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/tests/__init__.py -------------------------------------------------------------------------------- /colander/core/tests/security/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/tests/security/__init__.py -------------------------------------------------------------------------------- /colander/core/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/core/views/__init__.py -------------------------------------------------------------------------------- /colander/core/views/documentation_views.py: -------------------------------------------------------------------------------- 1 | from django.contrib import messages 2 | from django.contrib.auth.decorators import login_required 3 | from django.shortcuts import redirect, render 4 | 5 | 6 | @login_required 7 | def write_documentation_view(request): 8 | #active_case = get_active_case(request) 9 | active_case = request.contextual_case 10 | if not active_case: 11 | messages.add_message(request, messages.WARNING, 12 | "In order to write case documentation, you must first select a case to work on") 13 | return redirect('case_create_view') 14 | 15 | return render(request, 16 | 'pages/document/base.html') 17 | -------------------------------------------------------------------------------- /colander/core/views/graph_views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.decorators import login_required 2 | from django.shortcuts import render 3 | 4 | from colander.core.models import SubGraph 5 | 6 | 7 | @login_required 8 | def graph_base_view(request): 9 | ctx = { 10 | 'pinned_subgraphs': SubGraph.get_pinned(user=request.user, case=request.contextual_case).order_by('created_at') 11 | } 12 | return render(request, 'pages/graph/base.html', context=ctx) 13 | -------------------------------------------------------------------------------- /colander/core/views/status_views.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.shortcuts import render 3 | 4 | from colander.core.threatr import ThreatrClient 5 | 6 | 7 | def colander_status_view(request): 8 | client = ThreatrClient() 9 | colander_git_commit_hash = '' 10 | try: 11 | colander_git_commit_hash = settings.GIT_COMMIT_HASH 12 | except: pass 13 | return render( 14 | request, 15 | 'pages/status/base.html', 16 | context={ 17 | 'threatr': client.get_status(), 18 | 'colander': { 19 | 'git_commit_hash': colander_git_commit_hash 20 | } 21 | } 22 | ) 23 | -------------------------------------------------------------------------------- /colander/core/views/threatr_proxy.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from django.contrib.auth.decorators import login_required 4 | 5 | from colander.core.models import BackendCredentials 6 | 7 | THREAT_BACKEND_IDENTIFIER='threatr' 8 | logger = logging.getLogger(__name__) 9 | 10 | @login_required 11 | def request_threatr_view(request): 12 | credentials = BackendCredentials.objects.filter(backend=THREAT_BACKEND_IDENTIFIER) 13 | if not credentials: 14 | logger.error(f'No credentials found for module {THREAT_BACKEND_IDENTIFIER}') 15 | return None 16 | -------------------------------------------------------------------------------- /colander/frontend/colander-dgraph/default-settings.js: -------------------------------------------------------------------------------- 1 | export let cytoscape_settings = { 2 | userZoomingEnabled: true, 3 | userPanningEnabled: true, 4 | boxSelectionEnabled: true, 5 | wheelSensitivity: 0.5, 6 | }; 7 | 8 | export let cxtmenu_settings = { 9 | 10 | }; 11 | 12 | export let edgehandles_settings = { 13 | 14 | }; 15 | 16 | export let klay_settings = { 17 | 18 | }; 19 | 20 | -------------------------------------------------------------------------------- /colander/frontend/colander-dgraph/utils.js: -------------------------------------------------------------------------------- 1 | let locale_date_formatter = new Intl.DateTimeFormat({ 2 | timeStyle: 'long', 3 | year: 'numeric', 4 | month: 'long', 5 | day: 'numeric', 6 | hour: "numeric", 7 | minute: "numeric", 8 | }); 9 | export const date_str = (d) => { 10 | if (!(d instanceof Date)) { 11 | d = new Date(d); 12 | } 13 | return locale_date_formatter.format(d); 14 | }; 15 | -------------------------------------------------------------------------------- /colander/frontend/colander-vue-components/graph-editor/refs/graph-templates.js: -------------------------------------------------------------------------------- 1 | export const overlay_button = (icon, label, title) => { 2 | title = title || label; 3 | return $(``); 7 | }; 8 | 9 | -------------------------------------------------------------------------------- /colander/frontend/colander-widgets/cache.js: -------------------------------------------------------------------------------- 1 | export class Cache { 2 | #dictionary = {} 3 | constructor() {} 4 | store(domain, id, value) { 5 | this.#dictionary[domain] = this.#dictionary[domain] || {}; 6 | return this.#dictionary[domain][id] = value; 7 | } 8 | contains(domain, id) { 9 | return (domain in this.#dictionary) && (id in this.#dictionary[domain]); 10 | } 11 | get(domain, id) { 12 | return this.#dictionary[domain]?.[id]; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /colander/frontend/colander-widgets/index.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events'; 2 | import {Cache} from './cache'; 3 | 4 | let Event_System = new EventEmitter(); 5 | window.Colander = Object.assign( 6 | window.Colander || {}, 7 | {Bus: Event_System, Cache: new Cache()}); 8 | 9 | import ColanderBoot from '../colander'; 10 | 11 | function install_colander($) { 12 | ColanderBoot(); 13 | } 14 | 15 | jQuery(function ($) { 16 | // -- 17 | install_colander($); 18 | // -- 19 | }); 20 | -------------------------------------------------------------------------------- /colander/frontend/colander/legacy/async-codemirror.js: -------------------------------------------------------------------------------- 1 | export {basicSetup, EditorView} from "codemirror"; 2 | export {EditorState} from "@codemirror/state"; 3 | export {ayuLight} from 'thememirror'; 4 | -------------------------------------------------------------------------------- /colander/frontend/colander/plugins/EventBus.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events'; 2 | 3 | export default { 4 | install(app, options) { 5 | app.config.globalProperties.$bus = new EventEmitter(); 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ae.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/am.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/at.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ax.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/az.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/be.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ca.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ci.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/co.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/cz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/de.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/dj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/dk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/dz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ee.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/eh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/es-ct.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/es-pv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/fi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/fo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ga.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gb-eng.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gb-sct.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/gy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/hu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/id.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ie.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/is.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/it.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/jm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/jp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/kw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/la.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/lc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/lt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/lu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/lv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ly.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/mv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ne.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ng.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/nl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/pa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/pm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/pr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ps.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/pw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/qa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/re.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ru.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/se.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/so.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/sy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/td.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/th.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/tl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/to.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/tr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/tt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/tz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/vc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/vn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/wf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/xx.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/ye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/1x1/yt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ae.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/am.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/at.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ax.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/az.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/be.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ca.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ci.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/co.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/cz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/de.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/dj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/dk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/dz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ee.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/es-ct.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/es-pv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/fi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/fo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ga.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gb-eng.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gb-sct.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/gy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/hu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/id.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ie.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/is.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/it.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/jm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/jp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/kw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/la.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/lc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/lt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/lu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/lv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ly.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/mv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ne.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ng.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/nl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/nr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/pm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/pr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ps.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/pw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/qa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/re.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ru.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/se.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/so.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ss.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/sy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/td.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/th.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/tl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/to.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/tr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/tt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/tz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/vc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/vn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/wf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ws.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/xx.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/ye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/flags/4x3/yt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/static/fonts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/.gitkeep -------------------------------------------------------------------------------- /colander/static/fonts/forkawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/forkawesome-webfont.eot -------------------------------------------------------------------------------- /colander/static/fonts/forkawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/forkawesome-webfont.ttf -------------------------------------------------------------------------------- /colander/static/fonts/forkawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/forkawesome-webfont.woff -------------------------------------------------------------------------------- /colander/static/fonts/forkawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/forkawesome-webfont.woff2 -------------------------------------------------------------------------------- /colander/static/fonts/nf.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/fonts/nf.woff2 -------------------------------------------------------------------------------- /colander/static/images/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/images/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /colander/static/images/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/images/favicons/favicon.ico -------------------------------------------------------------------------------- /colander/static/images/icons/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /colander/static/images/no-thumbnail-yet-256x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/images/no-thumbnail-yet-256x144.png -------------------------------------------------------------------------------- /colander/static/js/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/js/.gitkeep -------------------------------------------------------------------------------- /colander/static/pts-assets/css/pts-assets-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-cyberchef_hat:before { content: '\e801'; } /* '' */ 3 | .icon-pts-project:before { content: '\e803'; } /* '' */ 4 | -------------------------------------------------------------------------------- /colander/static/pts-assets/css/pts-assets-ie7-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-cyberchef_hat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 3 | .icon-pts-project { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 4 | -------------------------------------------------------------------------------- /colander/static/pts-assets/css/pts-assets-ie7.css: -------------------------------------------------------------------------------- 1 | [class^="icon-"], [class*=" icon-"] { 2 | font-family: 'pts-assets'; 3 | font-style: normal; 4 | font-weight: normal; 5 | 6 | /* fix buttons height */ 7 | line-height: 1em; 8 | 9 | /* you can be more comfortable with increased icons size */ 10 | /* font-size: 120%; */ 11 | } 12 | 13 | .icon-cyberchef_hat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-pts-project { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | -------------------------------------------------------------------------------- /colander/static/pts-assets/font/pts-assets.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/pts-assets/font/pts-assets.eot -------------------------------------------------------------------------------- /colander/static/pts-assets/font/pts-assets.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/pts-assets/font/pts-assets.ttf -------------------------------------------------------------------------------- /colander/static/pts-assets/font/pts-assets.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/pts-assets/font/pts-assets.woff -------------------------------------------------------------------------------- /colander/static/pts-assets/font/pts-assets.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/static/pts-assets/font/pts-assets.woff2 -------------------------------------------------------------------------------- /colander/templates/403.html: -------------------------------------------------------------------------------- 1 | {% extends "base_error.html" %} 2 | 3 | {% block title %}Forbidden (403){% endblock %} 4 | 5 | {% block content %} 6 |

Forbidden (403)

7 | 8 |

{% if exception %}{{ exception }}{% else %}You're not allowed to access this page.{% endif %}

9 | {% endblock content %} 10 | -------------------------------------------------------------------------------- /colander/templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base_error.html" %} 2 | 3 | {% block title %}Page not found{% endblock %} 4 | 5 | {% block content %} 6 |

Page not found

7 | 8 |

{% if exception %}{{ exception }}{% else %}This is not the page you were looking for.{% endif %}

9 | {% endblock content %} 10 | -------------------------------------------------------------------------------- /colander/templates/500.html: -------------------------------------------------------------------------------- 1 | {% extends "base_error.html" %} 2 | 3 | {% block title %}Server Error{% endblock %} 4 | 5 | {% block content %} 6 |

Ooops!!! 500

7 | 8 |

Looks like something went wrong!

9 | 10 |

We track these errors automatically, but if the problem persists feel free to contact us. In the meantime, try refreshing.

11 | {% endblock content %} 12 | -------------------------------------------------------------------------------- /colander/templates/account/account_inactive.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% translate "Account Inactive" %}{% endblock %} 6 | 7 | {% block inner %} 8 |

{% translate "Account Inactive" %}

9 | 10 |

{% translate "This account is inactive." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /colander/templates/account/base.html: -------------------------------------------------------------------------------- 1 | {% extends "account/root_base_copy.html" %} 2 | {% block title %}{% block head_title %}{% endblock head_title %}{% endblock title %} 3 | 4 | {% block content %} 5 |
6 |
7 | {% block inner %}{% endblock %} 8 |
9 |
10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /colander/templates/account/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% translate "Sign Out" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% translate "Sign Out" %}

9 | 10 |

{% translate 'Are you sure you want to sign out?' %}

11 | 12 |
13 | {% csrf_token %} 14 | {% if redirect_field_value %} 15 | 16 | {% endif %} 17 | 18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /colander/templates/account/password_change.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load crispy_forms_tags %} 5 | 6 | {% block head_title %}{% translate "Change Password" %}{% endblock %} 7 | 8 | {% block inner %} 9 |

{% translate "Change Password" %}

10 | 11 |
12 | {% csrf_token %} 13 | {{ form|crispy }} 14 | 15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /colander/templates/account/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% translate "Password Reset" %}{% endblock %} 7 | 8 | {% block inner %} 9 |

{% translate "Password Reset" %}

10 | 11 | {% if user.is_authenticated %} 12 | {% include "account/snippets/already_logged_in.html" %} 13 | {% endif %} 14 | 15 |

{% blocktranslate %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktranslate %}

16 | {% blocktranslate %}Go back to login page{% endblocktranslate %} 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /colander/templates/account/password_reset_from_key_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block head_title %}{% translate "Change Password" %}{% endblock %} 5 | 6 | {% block inner %} 7 |

{% translate "Change Password" %}

8 |

{% translate 'Your password is now changed.' %}

9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /colander/templates/account/password_set.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load crispy_forms_tags %} 5 | 6 | {% block head_title %}{% translate "Set Password" %}{% endblock %} 7 | 8 | {% block inner %} 9 |

{% translate "Set Password" %}

10 | 11 |
12 | {% csrf_token %} 13 | {{ form|crispy }} 14 | 15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /colander/templates/account/signup_closed.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% translate "Sign Up Closed" %}{% endblock %} 6 | 7 | {% block inner %} 8 |

{% translate "Sign Up Closed" %}

9 | 10 |

{% translate "We are sorry, but the sign up is currently closed." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /colander/templates/account/verification_sent.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% translate "Verify Your E-mail Address" %}{% endblock %} 6 | 7 | {% block inner %} 8 |

{% translate "Verify Your E-mail Address" %}

9 | 10 |

{% blocktranslate %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktranslate %}

11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /colander/templates/case/graph.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | {% if subgraph %} 4 |
9 | {% else %} 10 |
14 | {% endif %} 15 | -------------------------------------------------------------------------------- /colander/templates/feed/detection_rule_out_feed_controls.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | 4 |
5 | 7 | 8 | {% translate "Edit" %} 9 | 10 | 13 | 14 | Delete 15 | 16 |
17 | -------------------------------------------------------------------------------- /colander/templates/feed/entity_out_feed_controls.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | 4 |
5 | 7 | 8 | {% translate "Edit" %} 9 | 10 | 13 | 14 | Delete 15 | 16 |
17 | -------------------------------------------------------------------------------- /colander/templates/helpers/date_since.html: -------------------------------------------------------------------------------- 1 | {% include "icons/date_icon.html" with c="text-primary" %} 2 | {{ date }} 3 | 4 | {% include "icons/since_icon.html" with c="text-muted" %} 5 | {{ date|timesince }} ago 6 | 7 | -------------------------------------------------------------------------------- /colander/templates/helpers/dynamic_type_selector.html: -------------------------------------------------------------------------------- 1 |
2 |

Entity

3 | 12 |
13 |
14 |

Type

15 | 24 |
25 | -------------------------------------------------------------------------------- /colander/templates/helpers/entity_comments.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
4 |
5 |
{% translate "Comments" %}
6 |
7 | {% for comment in entity.sorted_comments %} 8 | {% include "comment/list_item.html" %} 9 | {% empty %} 10 | {% translate "No comment" %} 11 | {% endfor %} 12 |
13 |
14 | {% include "comment/form.html" with elt_id=entity.id %} 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /colander/templates/helpers/extra_attributes_light.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% load colander_tags %} 3 | 4 | 5 | 6 | {% for k,v in attributes.items %} 7 | {% if v %} 8 | 9 | 10 | 11 | 12 | {% endif %} 13 | {% endfor %} 14 | 15 |
{{ k|to_title }}{{ v }}
16 | -------------------------------------------------------------------------------- /colander/templates/helpers/square_pill.html: -------------------------------------------------------------------------------- 1 | {{ value }} 2 | -------------------------------------------------------------------------------- /colander/templates/helpers/tags.html: -------------------------------------------------------------------------------- 1 | {% load colander_tags %} 2 | 3 | {% if entity.attributes.tags %} 4 | {% for t in entity.attributes.tags|split:"," %} 5 | {{ t }} 6 | {% endfor %} 7 | {% endif %} 8 | -------------------------------------------------------------------------------- /colander/templates/icons/actor_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/artifact_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/color_icon.html: -------------------------------------------------------------------------------- 1 | {% if elt and elt.color %} 2 | 3 | {% else %} 4 | 5 | {% endif %} 6 | -------------------------------------------------------------------------------- /colander/templates/icons/comment_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/data_fragment_icon.html: -------------------------------------------------------------------------------- 1 | {##} 2 | 3 | -------------------------------------------------------------------------------- /colander/templates/icons/date_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/detection_rule_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/device_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/event_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/experiment_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/id_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/mimetype_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/observable_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/out_feed_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/relation_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/since_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/team_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/threat_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/traffic_light_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/icons/user_icon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /colander/templates/import/csv.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/workspace/base.html" %} 2 | {% load i18n %} 3 | {% load static %} 4 | {% load crispy_forms_tags %} 5 | {% load crispy_forms_field %} 6 | {% load colander_tags %} 7 | 8 | {% block content %} 9 | {% block inner-content %} 10 |
11 |
12 |
13 |
14 |
15 | {% endblock %} 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /colander/templates/pages/about.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | -------------------------------------------------------------------------------- /colander/templates/pages/case/details.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block content %} 7 | {% include "case/details.html" %} 8 | {% endblock content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collaborate/team_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collaborate/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "team/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/actor_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "actor/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/artifact_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "artifact/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/case_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "case/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/data_fragment_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "data_fragment/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/detection_rule_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "detection_rule/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/device_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "device/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/event_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "event/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/experiment_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "experiment/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/observable_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "observable/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/relation_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "entity_relation/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/collect/threat_details.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load crispy_forms_field %} 4 | {% load i18n %} 5 | 6 | {% block inner-content %} 7 | {% include "threat/details.html" %} 8 | {% endblock inner-content %} 9 | -------------------------------------------------------------------------------- /colander/templates/pages/document/base.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/workspace/base.html" %} 2 | {% load static %} 3 | 4 | {% block offcanvas %}{% endblock offcanvas %} 5 | {% block content %} 6 | {% block inner-content %} 7 |
8 |
9 |

Case documentation

10 | {% include "case/documentation_form.html" with documentation_form=request.documentation_form %} 11 |
12 |
13 | {% endblock inner-content %} 14 | {% endblock content %} 15 | 16 | -------------------------------------------------------------------------------- /colander/templates/pages/graph/subgraph.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/graph/base.html" %} 2 | {% load static %} 3 | 4 | {% block inner-content %} 5 |
6 |
7 |

{{ subgraph.name }}

8 | {% include "case/graph.html" with subgraph=subgraph %} 9 |
10 |
11 | {% endblock inner-content %} 12 | 13 | -------------------------------------------------------------------------------- /colander/templates/pages/quick_search/result_list.html: -------------------------------------------------------------------------------- 1 | {% extends "pages/collect/base.html" %} 2 | {% load i18n %} 3 | 4 | {% block inner-content %} 5 |
6 |
7 | {% include "pages/quick_search/m_result_table.html" with results=results %} 8 |
9 |
10 | {% endblock inner-content %} 11 | 12 | 13 | 14 | 15 | {% block inline_javascript %} 16 | {% comment %} 17 | 25 | {% endcomment %} 26 | {% endblock inline_javascript %} 27 | -------------------------------------------------------------------------------- /colander/templates/pages/status/module_row.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if module.configured > 0 %} 4 | 5 | {% else %} 6 | 7 | {% endif %} 8 | {{ module.vendor }} 9 | 10 | {{ module.id }} 11 | 12 | {% include "helpers/square_pill.html" with value=module.configured %} 13 | API key{{ module.configured|pluralize }} configured 14 | 15 | {{ module.description }} 16 | 17 | -------------------------------------------------------------------------------- /colander/templates/subgraph/pin_toggler.html: -------------------------------------------------------------------------------- 1 | {% load colander_tags %} 2 | {% pinned subgraph as is_pinned %} 3 | 8 | -------------------------------------------------------------------------------- /colander/templates/tlp/show_tlp_pap.html: -------------------------------------------------------------------------------- 1 | 2 | {% include "tlp/badge_tlp.html" with tlp=element.tlp %} 3 | {% if break %}
{% endif %} 4 | {% include "tlp/badge_pap.html" with pap=element.pap %} 5 |
6 | 7 | 8 | -------------------------------------------------------------------------------- /colander/templates/users/user_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load crispy_forms_tags %} 3 | 4 | {% block title %}{{ user.username }}{% endblock %} 5 | 6 | {% block content %} 7 |

{{ user.username }}

8 |
9 | {% csrf_token %} 10 | {{ form|crispy }} 11 |
12 |
13 | 14 |
15 |
16 |
17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /colander/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/users/__init__.py -------------------------------------------------------------------------------- /colander/users/adapters.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 4 | from allauth_2fa.adapter import OTPAdapter 5 | from django.conf import settings 6 | from django.http import HttpRequest 7 | 8 | 9 | class AccountAdapter(OTPAdapter): 10 | def is_open_for_signup(self, request: HttpRequest): 11 | return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) 12 | 13 | 14 | class SocialAccountAdapter(DefaultSocialAccountAdapter): 15 | def is_open_for_signup(self, request: HttpRequest, sociallogin: Any): 16 | return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) 17 | -------------------------------------------------------------------------------- /colander/users/api/serializers.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from rest_framework import serializers 3 | 4 | User = get_user_model() 5 | 6 | 7 | class UserSerializer(serializers.ModelSerializer): 8 | class Meta: 9 | model = User 10 | fields = ["username", "name", "url"] 11 | 12 | extra_kwargs = { 13 | "url": {"view_name": "api:user-detail", "lookup_field": "username"} 14 | } 15 | -------------------------------------------------------------------------------- /colander/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | 5 | class UsersConfig(AppConfig): 6 | name = "colander.users" 7 | verbose_name = _("Users") 8 | 9 | def ready(self): 10 | try: 11 | import colander.users.signals # noqa F401 12 | except ImportError: 13 | pass 14 | -------------------------------------------------------------------------------- /colander/users/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | def allauth_settings(request): 5 | """Expose some settings from django-allauth in templates.""" 6 | return { 7 | "ACCOUNT_ALLOW_REGISTRATION": settings.ACCOUNT_ALLOW_REGISTRATION, 8 | } 9 | -------------------------------------------------------------------------------- /colander/users/migrations/0002_user_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.15 on 2022-09-29 16:08 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='type', 16 | field=models.CharField(choices=[('USER', 'Regular user'), ('APP', 'External application'), ('DEVICE', 'External device')], default='USER', max_length=16), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/users/migrations/0003_user_contributor_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-05-15 12:41 2 | 3 | from django.db import migrations, models 4 | import uuid 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0002_user_type'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='user', 16 | name='contributor_id', 17 | field=models.UUIDField(default=uuid.uuid4, editable=False, help_text='Contributor ID.'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /colander/users/migrations/0004_user_preferences.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.20 on 2025-05-22 15:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("users", "0003_user_contributor_id"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="user", 15 | name="preferences", 16 | field=models.JSONField(blank=True, null=True, verbose_name="User preferences"), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /colander/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/users/migrations/__init__.py -------------------------------------------------------------------------------- /colander/users/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/users/tests/__init__.py -------------------------------------------------------------------------------- /colander/users/tests/test_models.py: -------------------------------------------------------------------------------- 1 | from colander.users.models import User 2 | 3 | 4 | def test_user_get_absolute_url(user: User): 5 | assert user.get_absolute_url() == f"/users/{user.username}/" 6 | -------------------------------------------------------------------------------- /colander/users/tests/test_urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import resolve, reverse 2 | 3 | from colander.users.models import User 4 | 5 | 6 | def test_detail(user: User): 7 | assert ( 8 | reverse("users:detail", kwargs={"username": user.username}) 9 | == f"/users/{user.username}/" 10 | ) 11 | assert resolve(f"/users/{user.username}/").view_name == "users:detail" 12 | 13 | 14 | def test_update(): 15 | assert reverse("users:update") == "/users/~update/" 16 | assert resolve("/users/~update/").view_name == "users:update" 17 | 18 | 19 | def test_redirect(): 20 | assert reverse("users:redirect") == "/users/~redirect/" 21 | assert resolve("/users/~redirect/").view_name == "users:redirect" 22 | -------------------------------------------------------------------------------- /colander/users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from colander.users.views import ( 4 | user_detail_view, 5 | user_redirect_view, 6 | user_update_view, 7 | regenerate_token_api, 8 | ) 9 | 10 | app_name = "users" 11 | urlpatterns = [ 12 | path("~redirect/", view=user_redirect_view, name="redirect"), 13 | path("~update/", view=user_update_view, name="update"), 14 | path("/", view=user_detail_view, name="detail"), 15 | path("/regenerate-token", view=regenerate_token_api, name="regenerate_token"), 16 | ] 17 | -------------------------------------------------------------------------------- /colander/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/utils/__init__.py -------------------------------------------------------------------------------- /colander/utils/storages.py: -------------------------------------------------------------------------------- 1 | from storages.backends.gcloud import GoogleCloudStorage 2 | 3 | 4 | class StaticRootGoogleCloudStorage(GoogleCloudStorage): 5 | location = "static" 6 | default_acl = "publicRead" 7 | 8 | 9 | class MediaRootGoogleCloudStorage(GoogleCloudStorage): 10 | location = "media" 11 | file_overwrite = False 12 | -------------------------------------------------------------------------------- /colander/websocket/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/colander/websocket/__init__.py -------------------------------------------------------------------------------- /compose/local/django/django-q/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | 6 | 7 | python manage.py qcluster 8 | -------------------------------------------------------------------------------- /compose/local/django/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o pipefail 5 | set -o nounset 6 | 7 | 8 | python manage.py migrate --skip-checks 9 | python manage.py insert_default_data --skip-checks 10 | 11 | #exec gunicorn config.asgi_local:application --bind 0.0.0.0:8000 --reload-engine 'inotify' --reload -k uvicorn.workers.UvicornWorker 12 | exec uvicorn config.asgi_local:application --host 0.0.0.0 --port 8000 --reload --reload-include '*.html' 13 | -------------------------------------------------------------------------------- /compose/local/docs/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o pipefail 5 | set -o nounset 6 | 7 | make livehtml 8 | -------------------------------------------------------------------------------- /compose/production/django/django-q/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | 6 | 7 | python manage.py migrate --skip-checks 8 | python manage.py qcluster 9 | -------------------------------------------------------------------------------- /compose/production/postgres/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:14 2 | 3 | COPY ./compose/production/postgres/maintenance /usr/local/bin/maintenance 4 | RUN chmod +x /usr/local/bin/maintenance/* 5 | RUN mv /usr/local/bin/maintenance/* /usr/local/bin \ 6 | && rmdir /usr/local/bin/maintenance 7 | -------------------------------------------------------------------------------- /compose/production/postgres/maintenance/_sourced/constants.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | BACKUP_DIR_PATH='/backups' 5 | BACKUP_FILE_PREFIX='backup' 6 | -------------------------------------------------------------------------------- /compose/production/postgres/maintenance/_sourced/countdown.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | countdown() { 5 | declare desc="A simple countdown. Source: https://superuser.com/a/611582" 6 | local seconds="${1}" 7 | local d=$(($(date +%s) + "${seconds}")) 8 | while [ "$d" -ge `date +%s` ]; do 9 | echo -ne "$(date -u --date @$(($d - `date +%s`)) +%H:%M:%S)\r"; 10 | sleep 0.1 11 | done 12 | } 13 | -------------------------------------------------------------------------------- /compose/production/postgres/maintenance/_sourced/messages.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | message_newline() { 5 | echo 6 | } 7 | 8 | message_debug() 9 | { 10 | echo -e "DEBUG: ${@}" 11 | } 12 | 13 | message_welcome() 14 | { 15 | echo -e "\e[1m${@}\e[0m" 16 | } 17 | 18 | message_warning() 19 | { 20 | echo -e "\e[33mWARNING\e[0m: ${@}" 21 | } 22 | 23 | message_error() 24 | { 25 | echo -e "\e[31mERROR\e[0m: ${@}" 26 | } 27 | 28 | message_info() 29 | { 30 | echo -e "\e[37mINFO\e[0m: ${@}" 31 | } 32 | 33 | message_suggestion() 34 | { 35 | echo -e "\e[33mSUGGESTION\e[0m: ${@}" 36 | } 37 | 38 | message_success() 39 | { 40 | echo -e "\e[32mSUCCESS\e[0m: ${@}" 41 | } 42 | -------------------------------------------------------------------------------- /compose/production/postgres/maintenance/_sourced/yes_no.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | yes_no() { 5 | declare desc="Prompt for confirmation. \$\"\{1\}\": confirmation message." 6 | local arg1="${1}" 7 | 8 | local response= 9 | read -r -p "${arg1} (y/[n])? " response 10 | if [[ "${response}" =~ ^[Yy]$ ]] 11 | then 12 | exit 0 13 | else 14 | exit 1 15 | fi 16 | } 17 | -------------------------------------------------------------------------------- /compose/production/postgres/maintenance/backups: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | ### View backups. 5 | ### 6 | ### Usage: 7 | ### $ docker-compose -f .yml (exec |run --rm) postgres backups 8 | 9 | 10 | set -o errexit 11 | set -o pipefail 12 | set -o nounset 13 | 14 | 15 | working_dir="$(dirname ${0})" 16 | source "${working_dir}/_sourced/constants.sh" 17 | source "${working_dir}/_sourced/messages.sh" 18 | 19 | 20 | message_welcome "These are the backups you have got:" 21 | 22 | ls -lht "${BACKUP_DIR_PATH}" 23 | -------------------------------------------------------------------------------- /compose/production/traefik/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM traefik:v2.11.2 2 | RUN mkdir -p /etc/traefik/acme \ 3 | && touch /etc/traefik/acme/acme.json \ 4 | && chmod 600 /etc/traefik/acme/acme.json 5 | COPY ./compose/production/traefik/traefik.yml /etc/traefik 6 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/config/__init__.py -------------------------------------------------------------------------------- /config/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/config/settings/__init__.py -------------------------------------------------------------------------------- /config/ws_router.py: -------------------------------------------------------------------------------- 1 | from django.urls import re_path, path 2 | 3 | from colander.websocket.consumers import CaseContextConsumer 4 | 5 | websocket_urlpatterns = [ 6 | #path('global/', GlobalContextConsumer.as_asgi()), 7 | re_path(r'(ws/(?P[0-9A-Fa-f-]+)/)?.*', CaseContextConsumer.as_asgi()), 8 | ] 9 | -------------------------------------------------------------------------------- /deploy_package/.envs/.tpl/.colander-postgres: -------------------------------------------------------------------------------- 1 | # PostgreSQL 2 | # ------------------------------------------------------------------------------ 3 | POSTGRES_HOST=colander-postgres 4 | POSTGRES_PORT=5432 5 | POSTGRES_DB=colander 6 | POSTGRES_USER=$(pwgen -B 32 1) 7 | POSTGRES_PASSWORD=$(pwgen -B 64 1) 8 | -------------------------------------------------------------------------------- /deploy_package/.envs/.tpl/.keycloak: -------------------------------------------------------------------------------- 1 | DB_VENDOR=postgres 2 | KEYCLOAK_DATABASE_HOST=keycloak-postgres 3 | KEYCLOAK_DATABASE_PORT=5432 4 | KEYCLOAK_DATABASE_NAME=keycloak 5 | KEYCLOAK_DATABASE_USER=$(pwgen -B 32 1) 6 | KEYCLOAK_DATABASE_PASSWORD=$(pwgen -B 64 1) 7 | 8 | KEYCLOAK_USER=keycloakadmin 9 | KEYCLOAK_PASSWORD=$(pwgen -B 32 1) 10 | 11 | PROXY_ADDRESS_FORWARDING='true' 12 | KEYCLOAK_LOGLEVEL=WARNING 13 | -------------------------------------------------------------------------------- /deploy_package/.envs/.tpl/.keycloak-postgres: -------------------------------------------------------------------------------- 1 | # PostgreSQL 2 | # ------------------------------------------------------------------------------ 3 | POSTGRES_HOST=keycloak-postgres 4 | POSTGRES_PORT=5432 5 | POSTGRES_DB=keycloak 6 | POSTGRES_USER=${KEYCLOAK_DATABASE_USER} 7 | POSTGRES_PASSWORD=${KEYCLOAK_DATABASE_PASSWORD} 8 | -------------------------------------------------------------------------------- /deploy_package/.envs/.tpl/.minio: -------------------------------------------------------------------------------- 1 | # Minio 2 | # ------------------------------------------------------------------------------ 3 | MINIO_ACCESS_KEY=$(pwgen -B 21 1) 4 | MINIO_SECRET_KEY=$(pwgen -B 42 1) 5 | -------------------------------------------------------------------------------- /deploy_package/.envs/.tpl/.threatr-postgres: -------------------------------------------------------------------------------- 1 | # PostgreSQL 2 | # ------------------------------------------------------------------------------ 3 | POSTGRES_HOST=threatr-postgres 4 | POSTGRES_PORT=5432 5 | POSTGRES_DB=threatr 6 | POSTGRES_USER=$(pwgen -B 32 1) 7 | POSTGRES_PASSWORD=$(pwgen -B 64 1) 8 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:14 2 | 3 | COPY ./compose/production/postgres/maintenance /usr/local/bin/maintenance 4 | RUN chmod +x /usr/local/bin/maintenance/* 5 | RUN mv /usr/local/bin/maintenance/* /usr/local/bin \ 6 | && rmdir /usr/local/bin/maintenance 7 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/maintenance/_sourced/constants.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | BACKUP_DIR_PATH='/backups' 5 | BACKUP_FILE_PREFIX='backup' 6 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/maintenance/_sourced/countdown.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | countdown() { 5 | declare desc="A simple countdown. Source: https://superuser.com/a/611582" 6 | local seconds="${1}" 7 | local d=$(($(date +%s) + "${seconds}")) 8 | while [ "$d" -ge `date +%s` ]; do 9 | echo -ne "$(date -u --date @$(($d - `date +%s`)) +%H:%M:%S)\r"; 10 | sleep 0.1 11 | done 12 | } 13 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/maintenance/_sourced/messages.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | message_newline() { 5 | echo 6 | } 7 | 8 | message_debug() 9 | { 10 | echo -e "DEBUG: ${@}" 11 | } 12 | 13 | message_welcome() 14 | { 15 | echo -e "\e[1m${@}\e[0m" 16 | } 17 | 18 | message_warning() 19 | { 20 | echo -e "\e[33mWARNING\e[0m: ${@}" 21 | } 22 | 23 | message_error() 24 | { 25 | echo -e "\e[31mERROR\e[0m: ${@}" 26 | } 27 | 28 | message_info() 29 | { 30 | echo -e "\e[37mINFO\e[0m: ${@}" 31 | } 32 | 33 | message_suggestion() 34 | { 35 | echo -e "\e[33mSUGGESTION\e[0m: ${@}" 36 | } 37 | 38 | message_success() 39 | { 40 | echo -e "\e[32mSUCCESS\e[0m: ${@}" 41 | } 42 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/maintenance/_sourced/yes_no.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | yes_no() { 5 | declare desc="Prompt for confirmation. \$\"\{1\}\": confirmation message." 6 | local arg1="${1}" 7 | 8 | local response= 9 | read -r -p "${arg1} (y/[n])? " response 10 | if [[ "${response}" =~ ^[Yy]$ ]] 11 | then 12 | exit 0 13 | else 14 | exit 1 15 | fi 16 | } 17 | -------------------------------------------------------------------------------- /deploy_package/compose/production/postgres/maintenance/backups: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | ### View backups. 5 | ### 6 | ### Usage: 7 | ### $ docker-compose -f .yml (exec |run --rm) postgres backups 8 | 9 | 10 | set -o errexit 11 | set -o pipefail 12 | set -o nounset 13 | 14 | 15 | working_dir="$(dirname ${0})" 16 | source "${working_dir}/_sourced/constants.sh" 17 | source "${working_dir}/_sourced/messages.sh" 18 | 19 | 20 | message_welcome "These are the backups you have got:" 21 | 22 | ls -lht "${BACKUP_DIR_PATH}" 23 | -------------------------------------------------------------------------------- /deploy_package/compose/production/traefik/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM traefik:v2.11.2 2 | RUN mkdir -p /etc/traefik/acme \ 3 | && touch /etc/traefik/acme/acme.json \ 4 | && chmod 600 /etc/traefik/acme/acme.json 5 | COPY ./compose/production/traefik/traefik.yml /etc/traefik 6 | -------------------------------------------------------------------------------- /deploy_package/gen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ENV_TPL_FILES=./.envs/.tpl/ 4 | ENV_OUT_DIR=./.envs/.production/ 5 | 6 | mkdir -p $ENV_OUT_DIR 7 | 8 | source $ENV_TPL_FILES/.base 9 | 10 | for f in `find $ENV_TPL_FILES -type f` 11 | do 12 | filename=$(basename $f) 13 | eval "cat < $ENV_OUT_DIR/$filename 16 | source $ENV_OUT_DIR/$filename 17 | done 18 | 19 | eval "cat < ./compose/production/traefik/traefik.yml 22 | -------------------------------------------------------------------------------- /docs/__init__.py: -------------------------------------------------------------------------------- 1 | # Included so that Django's startproject comment runs against the docs directory 2 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. colander documentation master file, created by 2 | sphinx-quickstart. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to colander's documentation! 7 | ====================================================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | howto 14 | pycharm/configuration 15 | users 16 | 17 | 18 | 19 | Indices and tables 20 | ================== 21 | 22 | * :ref:`genindex` 23 | * :ref:`modindex` 24 | * :ref:`search` 25 | -------------------------------------------------------------------------------- /docs/pycharm/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/1.png -------------------------------------------------------------------------------- /docs/pycharm/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/2.png -------------------------------------------------------------------------------- /docs/pycharm/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/3.png -------------------------------------------------------------------------------- /docs/pycharm/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/4.png -------------------------------------------------------------------------------- /docs/pycharm/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/7.png -------------------------------------------------------------------------------- /docs/pycharm/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/8.png -------------------------------------------------------------------------------- /docs/pycharm/images/f1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/f1.png -------------------------------------------------------------------------------- /docs/pycharm/images/f2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/f2.png -------------------------------------------------------------------------------- /docs/pycharm/images/f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/f3.png -------------------------------------------------------------------------------- /docs/pycharm/images/f4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/f4.png -------------------------------------------------------------------------------- /docs/pycharm/images/issue1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/issue1.png -------------------------------------------------------------------------------- /docs/pycharm/images/issue2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PiRogueToolSuite/colander/711a1d41a9036ba8461be80d778244160c1d71b8/docs/pycharm/images/issue2.png -------------------------------------------------------------------------------- /docs/users.rst: -------------------------------------------------------------------------------- 1 | .. _users: 2 | 3 | Users 4 | ====================================================================== 5 | 6 | Starting a new project, it’s highly recommended to set up a custom user model, 7 | even if the default User model is sufficient for you. 8 | 9 | This model behaves identically to the default user model, 10 | but you’ll be able to customize it in the future if the need arises. 11 | 12 | .. automodule:: colander.users.models 13 | :members: 14 | :noindex: 15 | 16 | -------------------------------------------------------------------------------- /locale/README.rst: -------------------------------------------------------------------------------- 1 | Translations 2 | ============ 3 | 4 | Translations will be placed in this folder when running:: 5 | 6 | python manage.py makemessages 7 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts = --ds=config.settings.test --reuse-db 3 | python_files = tests.py test_*.py 4 | -------------------------------------------------------------------------------- /requirements/production.txt: -------------------------------------------------------------------------------- 1 | # PRECAUTION: avoid production dependencies that aren't in development 2 | 3 | -r base.txt 4 | 5 | psycopg2==2.9.9 # https://github.com/psycopg/psycopg2 6 | 7 | # Django 8 | # ------------------------------------------------------------------------------ 9 | # django-storages[google]==1.13.1 # https://github.com/jschneier/django-storages 10 | django-anymail==10.3 # https://github.com/anymail/django-anymail 11 | --------------------------------------------------------------------------------